Renesas R7FA8D1BH (Cortex?-M85) 控制DS18B20

目錄

概述

1 軟硬件

1.1 軟硬件環境信息

1.2 開發板信息

1.3 調試器信息

2 FSP和KEIL配置

2.1 硬件接口電路

2.2? FSB配置DS18B20的IO

2.3 生成Keil工程文件

3 DS18B20驅動代碼

3.1 DS18B20介紹

3.2 DS18B20驅動實現

3.2.1 IO狀態定義

3.2.2 讀IO狀態函數

3.2.3 其他函數

4 測試程序

4.1 應用程序設計

4.2 測試?

5 附件


Renesas R7FA8D1BH (Cortex?-M85) 控制DS18B20和ADC,實現兩個頁面的跳轉功能

概述

本文主要介紹Renesas R7FA8D1BH (Cortex?-M85)設計一個綜合的應用案例:應用R7FA8D1BH的IO實現單總線協議,實現驅動ds18b20的功能,其主要完成讀取溫度值,并將該值格式化顯示在OLED屏幕上。還通過串口終端將溫度數據發送至串口終端上。

1 軟硬件

1.1 軟硬件環境信息

軟硬件信息版本信息
Renesas MCUR7FA8D1BH
KeilMDK ARM 5.38
FSP 版本5.3.0
調試工具:N32G45XVL-STBDAP-LINK

1.2 開發板信息

筆者選擇使用野火耀陽開發板_瑞薩RA8,該板塊的主控MCU為R7FA8D1BHECBD,7FA8D1BHECBD的內核為ARM Contex-M85。

1.3 調試器信息

對于R7FA8D1BHECBD芯片,其使用的內核為Cortex?-M85?Core,?ST-LINK-V2或者J-LINK-V9不支持下載和調試功能。筆者經過多次嘗試,發現N32G45XVL-STB板卡上自帶的DAP-LINK可以下載和調試R7FA8D1BHECBD。

下圖為N32G45XVL-STB開發板實物圖:

2 FSP和KEIL配置

2.1 硬件接口電路

耀陽開發板_瑞薩RA8上已經設計了DS18B20的接口電路,其使用P809接口作為DS18B20的DQ控制信號。

2.2? FSB配置DS18B20的IO

配置P809為普通的IO接口,然后在代碼中動態配置該IO的輸出或者輸出狀態

2.3 生成Keil工程文件

?完成FSP的參數配置之后,就可以Generate Project。打開項目文件,其架構如下:

創建ds18b20.c文件,實現驅動代碼

3 DS18B20驅動代碼

3.1 DS18B20介紹

筆者在之前的文章中,已經詳細分析過DS18B20的時序以及實現邏輯,這里不在做介紹。

DS18B20應用筆記_ds18b20讀取數據的波形-CSDN博客

3.2 DS18B20驅動實現

3.2.1 IO狀態定義

代碼第14行:定義us步長延時函數

代碼第15行:定義ms步長延時函數

代碼第18行:定義DS18B20的IO PIN

代碼第21行:輸入端口配置

代碼第22行:輸出端口配置

代碼第24行:設置IO低電平

代碼第25行:設置IO高電平

3.2.2 讀IO狀態函數

代碼第47行:讀取輸入模式下IO的狀態

?3.2.3 其他函數

函數:ds18b20Init, 檢測DS18B20是否在線

函數:ds18b20BlockModeProcess。 讀取DS18B20的數值

/*** @brief  reset DS18B20* @note   if reset ds18b20 sucess, the return value is TRUE* @param  None* @retval True or Flalse*/
static uint8_t ds18b20Init( void )
{uint16_t tempCnt = 0;bsp_io_level_t status;// Set PIN mode outputDS_Mode_Out_PP();// Master pin is high DQ_SET_HIGH;timeDelayUS(10);// Master pin is low DQ_SET_LOW;// wait for 600 us timeDelayUS(750);// Set PIN mode inputDS_Mode_IN_PUT();while(1){status = DQ_RAD_PIN();if( status == 0){tempCnt = 0;return TRUE;}else{timeDelayUS(1);tempCnt++;if( tempCnt > 480 )return FALSE;}}
}static uint8_t readBit( void )
{uint8_t readCnt = 2;uint8_t bitVal = 1;DQ_SET_LOW;timeDelayUS(3);DQ_SET_HIGH;timeDelayUS(5); // 15 us while(readCnt-- ){//read DQ value if( DQ_RAD_PIN() == 0){bitVal = 0;}timeDelayUS(2);  // 15 us }timeDelayUS(30);      // 15 us return  bitVal;
}static uint8_t ds18b20ReadByte( void )
{uint8_t byteVal = 0;for ( uint8_t i = 0; i < 8; i++ ){byteVal >>= 1;uint8_t bitVal = readBit(); if( bitVal > 0){byteVal |= 0x80;}}return  byteVal;
}/*** @brief  write one byte to DS18B20* @note   * @param  byte: the data that is sended to ds18b20* @retval None*/
void ds18b20WriteByte( uint8_t byte)
{unsigned char k;// Set PIN mode outputDS_Mode_Out_PP();for ( k = 0; k < 8; k++ ){if (byte & (1<<k)){DQ_SET_LOW;timeDelayUS(2); DQ_SET_HIGH;timeDelayUS(65); }else{DQ_SET_LOW;timeDelayUS(65); DQ_SET_HIGH;timeDelayUS(2); }}
}uint8_t ds18b20BlockModeProcess( void )
{uint16_t tempValue;uint8_t tempL, tempH;if (ds18b20Init() == FALSE){return FALSE;}// wait for 600 us timeDelayUS(600);ds18b20WriteByte(0xcc);ds18b20WriteByte(0x44);  // start convert temperature if (ds18b20Init() == FALSE){return FALSE;}// wait for 600 us timeDelayUS(600);ds18b20WriteByte(0xcc);ds18b20WriteByte(0xbe);  // read temperature data registertempL = ds18b20ReadByte();tempH = ds18b20ReadByte();if (tempH > 0x7f) {tempL    = ~tempL;tempH    = ~tempH+1; st_ds1b20val.sign = 1;}tempValue = (uint16_t)((tempH << 8) | tempL);st_ds1b20val.temperatureVal = (float)(tempValue * 0.0625);return TRUE;
}// NO blocking mode operate ds18b20 
uint8_t ds18b20NoBlockingProcess( void )
{uint16_t tempValue;static uint16_t waitCnt = 0;uint8_t tempL, tempH;static  uint8_t runState = 0;switch( runState ){default:case INIT_DQ:if (ds18b20Init() == FALSE){return FALSE;}runState = WAIT_READY;break;case WAIT_READY:timeDelayUS(2);       // IDEL runState = SKIDROM_CMD;break;case SKIDROM_CMD:ds18b20WriteByte(0xcc);ds18b20WriteByte(0x44);  // begin to convert temperature datawaitCnt = 0;runState = WAIT_CONVERT;break;case WAIT_CONVERT:waitCnt++;if( waitCnt > WAIT_CNT_CONVERT){waitCnt = 0;runState = RESET_CMD;}break;case RESET_CMD:if (ds18b20Init() == FALSE){return FALSE;}runState = WAIT_DATA_READY;break;case WAIT_DATA_READY: timeDelayUS(2);     // IDEL runState = READ_CMD;break;case READ_CMD:ds18b20WriteByte(0xcc);ds18b20WriteByte(0xbe);  // read temperature data registerrunState = GET_VALUE;break;case GET_VALUE:tempL = ds18b20ReadByte();tempH = ds18b20ReadByte();if (tempH > 0x7f) {tempL    = ~tempL;tempH    = ~tempH+1; st_ds1b20val.sign = 1;}tempValue = (uint16_t)((tempH << 8) | tempL);st_ds1b20val.temperatureVal = (float)(tempValue * 0.0625);runState = INIT_DQ;return TRUE;}return FALSE;
}

4 測試程序

4.1 應用程序設計

代碼113行:讀取ds18b20的值

代碼130行:獲得ds18b20的結果數據

代碼131行:格式化顯示數據

代碼132行:顯示數據到OLED上

4.2 測試?

編譯代碼,并下載代碼到板卡中,其運行結果如下:

5 附件

DS18B20的驅動代碼

1)創建ds18b20.c文件,編寫如下代碼

 /*FILE NAME  :  ds18b20.cDescription:  user ds18b20 interface Author     :  tangmingfei2013@126.comDate       :  2024/06/03*/
#include "ds18b20.h" 
#include "hal_data.h"typedef enum{INPUT = 0,OUTPUT = 1,
}IO_TYPE;typedef enum{FALSE = 0,TRUE = 1,
}RETURN_RESULT;typedef enum{INIT_DQ = 0,WAIT_READY,SKIDROM_CMD,WAIT_CONVERT,RESET_CMD,READ_CMD,WAIT_DATA_READY,GET_VALUE,IDLE_NULL
}RUN_STATE;ds18b20Struc st_ds1b20val;ds18b20Struc get_ds18b20_value( void )
{return st_ds1b20val;
}static bsp_io_level_t DQ_RAD_PIN(void)
{bsp_io_level_t state;// READ ioR_IOPORT_PinRead(&g_ioport_ctrl, DS_IO_PORT_PIN, &state);return state;
}/*** @brief  reset DS18B20* @note   if reset ds18b20 sucess, the return value is TRUE* @param  None* @retval True or Flalse*/
static uint8_t ds18b20Init( void )
{uint16_t tempCnt = 0;bsp_io_level_t status;// Set PIN mode outputDS_Mode_Out_PP();// Master pin is high DQ_SET_HIGH;timeDelayUS(10);// Master pin is low DQ_SET_LOW;// wait for 600 us timeDelayUS(750);// Set PIN mode inputDS_Mode_IN_PUT();while(1){status = DQ_RAD_PIN();if( status == 0){tempCnt = 0;return TRUE;}else{timeDelayUS(1);tempCnt++;if( tempCnt > 480 )return FALSE;}}
}static uint8_t readBit( void )
{uint8_t readCnt = 2;uint8_t bitVal = 1;DQ_SET_LOW;timeDelayUS(3);DQ_SET_HIGH;timeDelayUS(5); // 15 us while(readCnt-- ){//read DQ value if( DQ_RAD_PIN() == 0){bitVal = 0;}timeDelayUS(2);  // 15 us }timeDelayUS(30);      // 15 us return  bitVal;
}static uint8_t ds18b20ReadByte( void )
{uint8_t byteVal = 0;for ( uint8_t i = 0; i < 8; i++ ){byteVal >>= 1;uint8_t bitVal = readBit(); if( bitVal > 0){byteVal |= 0x80;}}return  byteVal;
}/*** @brief  write one byte to DS18B20* @note   * @param  byte: the data that is sended to ds18b20* @retval None*/
void ds18b20WriteByte( uint8_t byte)
{unsigned char k;// Set PIN mode outputDS_Mode_Out_PP();for ( k = 0; k < 8; k++ ){if (byte & (1<<k)){DQ_SET_LOW;timeDelayUS(2); DQ_SET_HIGH;timeDelayUS(65); }else{DQ_SET_LOW;timeDelayUS(65); DQ_SET_HIGH;timeDelayUS(2); }}
}uint8_t ds18b20BlockModeProcess( void )
{uint16_t tempValue;uint8_t tempL, tempH;if (ds18b20Init() == FALSE){return FALSE;}// wait for 600 us timeDelayUS(600);ds18b20WriteByte(0xcc);ds18b20WriteByte(0x44);  // start convert temperature if (ds18b20Init() == FALSE){return FALSE;}// wait for 600 us timeDelayUS(600);ds18b20WriteByte(0xcc);ds18b20WriteByte(0xbe);  // read temperature data registertempL = ds18b20ReadByte();tempH = ds18b20ReadByte();if (tempH > 0x7f) {tempL    = ~tempL;tempH    = ~tempH+1; st_ds1b20val.sign = 1;}tempValue = (uint16_t)((tempH << 8) | tempL);st_ds1b20val.temperatureVal = (float)(tempValue * 0.0625);return TRUE;
}// NO blocking mode operate ds18b20 
uint8_t ds18b20NoBlockingProcess( void )
{uint16_t tempValue;static uint16_t waitCnt = 0;uint8_t tempL, tempH;static  uint8_t runState = 0;switch( runState ){default:case INIT_DQ:if (ds18b20Init() == FALSE){return FALSE;}runState = WAIT_READY;break;case WAIT_READY:timeDelayUS(2);       // IDEL runState = SKIDROM_CMD;break;case SKIDROM_CMD:ds18b20WriteByte(0xcc);ds18b20WriteByte(0x44);  // begin to convert temperature datawaitCnt = 0;runState = WAIT_CONVERT;break;case WAIT_CONVERT:waitCnt++;if( waitCnt > WAIT_CNT_CONVERT){waitCnt = 0;runState = RESET_CMD;}break;case RESET_CMD:if (ds18b20Init() == FALSE){return FALSE;}runState = WAIT_DATA_READY;break;case WAIT_DATA_READY: timeDelayUS(2);     // IDEL runState = READ_CMD;break;case READ_CMD:ds18b20WriteByte(0xcc);ds18b20WriteByte(0xbe);  // read temperature data registerrunState = GET_VALUE;break;case GET_VALUE:tempL = ds18b20ReadByte();tempH = ds18b20ReadByte();if (tempH > 0x7f) {tempL    = ~tempL;tempH    = ~tempH+1; st_ds1b20val.sign = 1;}tempValue = (uint16_t)((tempH << 8) | tempL);st_ds1b20val.temperatureVal = (float)(tempValue * 0.0625);runState = INIT_DQ;return TRUE;}return FALSE;
}/* End of this file */

2)創建ds18b20.h文件,編寫如下代碼

/*FILE NAME  :  ds18b20.hDescription:  user ds18b20 interface Author     :  tangmingfei2013@126.comDate       :  2024/06/03
*/
#ifndef DS18B20_H
#define DS18B20_H
#include "hal_data.h"#define WAIT_CNT_CONVERT     500 #define timeDelayUS(us)      R_BSP_SoftwareDelay(us, BSP_DELAY_UNITS_MICROSECONDS);
#define DS_DELAY_MS(ms)      R_BSP_SoftwareDelay(ms, BSP_DELAY_UNITS_MILLISECONDS);#define DS_IO_PORT_PIN       BSP_IO_PORT_08_PIN_09#define DS_Mode_IN_PUT()     R_IOPORT_PinCfg(&g_ioport_ctrl, DS_IO_PORT_PIN, IOPORT_CFG_PORT_DIRECTION_INPUT)
#define DS_Mode_Out_PP()     R_IOPORT_PinCfg(&g_ioport_ctrl, DS_IO_PORT_PIN, IOPORT_CFG_PORT_DIRECTION_OUTPUT)#define DQ_SET_LOW           R_IOPORT_PinWrite(&g_ioport_ctrl, DS_IO_PORT_PIN, BSP_IO_LEVEL_LOW)
#define DQ_SET_HIGH          R_IOPORT_PinWrite(&g_ioport_ctrl, DS_IO_PORT_PIN, BSP_IO_LEVEL_HIGH)typedef struct{float  temperatureVal; bool sign;
}ds18b20Struc;uint8_t ds18b20BlockModeProcess( void );
ds18b20Struc get_ds18b20_value( void );#endif   /* DS18B20_H */

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/45214.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/45214.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/45214.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenCV:python圖像旋轉,cv2.getRotationMatrix2D 和 cv2.warpAffine 函數

前言 僅供個人學習用&#xff0c;如果對各位朋友有參考價值&#xff0c;給個贊或者收藏吧 ^_^ 一. cv2.getRotationMatrix2D(center, angle, scale) 1.1 參數說明 parameters center&#xff1a;旋轉中心坐標&#xff0c;是一個元組參數(col, row) angle&#xff1a;旋轉角度…

Go-知識測試-模糊測試

Go-知識測試-模糊測試 1. 定義2. 例子3. 數據結構4. tesing.F.Add5. 模糊測試的執行6. testing.InternalFuzzTarget7. testing.runFuzzing8. testing.fRunner9. FuzzXyz10. RunFuzzWorker11. CoordinateFuzzing12. 總結 建議先看&#xff1a;https://blog.csdn.net/a1879272183…

一文入門【NestJs】Providers

Nest學習系列 ??一文入門【NestJS】 ??一文入門【NestJs】Controllers 控制器 &#x1f6a9; 前言 在NestJS的世界里&#xff0c;理解“Providers”是構建健壯、可維護的后端服務的關鍵。NestJS&#xff0c;作為Node.js的一個現代框架&#xff0c;采用了Angular的一些核…

Redis的安裝配置及IDEA中使用

目錄 一、安裝redis&#xff0c;配置redis.conf 1.安裝gcc 2.將redis的壓縮包放到指定位置解壓 [如下面放在 /opt 目錄下] 3.編譯安裝 4.配置redis.conf文件 5.開機自啟 二、解決虛擬機本地可以連接redis但是主機不能連接redis 1.虛擬機網絡適配器網絡連接設置為橋接模式…

VSCode上通過C++實現單例模式

單例模式實際上就是為了確保一個類最多只有一個實例&#xff0c;并且在程序的任何地方都可以訪問這個實例&#xff0c;也就是提供一個全局訪問點&#xff0c;單例對象不需要手動釋放&#xff0c;交給系統來釋放就可以了&#xff0c;單例模式的設計初衷就是為了在整個應用程序的…

vue 下拉菜單樹形結構——vue-treeselect的組件使用

參考&#xff1a; https://www.cnblogs.com/syjtiramisu/p/17672866.htmlhttps://www.cnblogs.com/syjtiramisu/p/17672866.html vue-treeselect的使用 - 簡書下載依賴 使用https://www.jianshu.com/p/459550e1477d 實際項目使用&#xff1a;

uni-app iOS上架相關App store App store connect 云打包有次數限制

相冊權限 uni-app云打包免費有次數 切換一個賬號繼續

使用SOAP與TrinityCore交互(待定)

原文&#xff1a;SOAP with TrinityCore | TrinityCore MMo Project Wiki 如何使用SOAP與TC交互 SOAP代表簡單對象訪問協議&#xff0c;是一種類似于REST的基于標準的web服務訪問協議的舊形式。只要必要的配置到位&#xff0c;您就可以利用SOAP向TrinityCore服務器發送命令。 …

Open3D 計算點云配準的精度和重疊度

目錄 一、概述 1.1計算配準精度 1.2計算點云重疊度 二、代碼實現 2.1關鍵函數 2.2完整代碼 三、實現效果 3.1原始點云 3.2計算結果 一、概述 在點云配準中,精度和重疊度是兩個重要的評價指標。精度通常用均方根誤差(RMSE)來衡量,而重疊度則表示兩個點云在…

centos環境啟動/重啟java服務腳本優化

centos環境啟動/重啟java服務腳本優化 引部分命令說明根據端口查詢服務進程殺死進程函數腳本接收參數 腳本注意重啟文檔位置異常 引 在離線環境部署的多個java應用組成的系統&#xff0c;測試階段需要較為頻繁的發布&#xff0c;因資源限制&#xff0c;沒有弄devops或CICD那套…

華為手機聯系人不見了怎么恢復?3個解決方案

華為手機聯系人列表就像是我們精心編織的社交網絡之網。然而&#xff0c;有時&#xff0c;這張網可能會因為各種原因而意外破損&#xff0c;聯系人信息消失得無影無蹤&#xff0c;讓我們陷入“人脈孤島”的困境。華為手機聯系人不見了怎么恢復&#xff1f;別擔心&#xff0c;我…

構建高質量數據集與智能數據工程平臺:播客AI Odyssey深度對話實錄

對話整數智能聯創和前IDEA研究員&#xff1a;構建高質量數據集與智能數據工程平臺 - AI Odyssey | 小宇宙 - 聽播客&#xff0c;上小宇宙 人工智能技術的日益深遠發展&#xff0c;對人工智能的性能提升與技術迭代提出了新的要求。在大模型訓練中&#xff0c;已有的研究和實踐表…

【操作系統】進程管理——用信號量機制解決問題,以生產者-消費者問題為例(個人筆記)

學習日期&#xff1a;2024.7.10 內容摘要&#xff1a;利用信號量機制解決幾個經典問題模型 目錄 引言 問題模型 生產者-消費者問題&#xff08;經典&#xff09; 多生產者-多消費者問題 吸煙者問題 讀者寫者問題&#xff08;難點&#xff09; 哲學家進餐問題&#xff0…

解決POST請求中文亂碼問題

解決POST請求中文亂碼問題 1、亂碼原因2、解決方法3、具體步驟 &#x1f496;The Begin&#x1f496;點點關注&#xff0c;收藏不迷路&#x1f496; 在Web開發中&#xff0c;處理POST請求時經常遇到中文亂碼問題&#xff0c;這主要是由于服務器在接收到POST請求的數據后&#x…

物聯網時代的等保測評:保障萬物互聯的安全

隨著物聯網&#xff08;IoT&#xff09;技術的飛速發展&#xff0c;我們的生活正逐漸進入一個萬物互聯的新時代。從智能家居到智慧城市&#xff0c;從無人駕駛到農業物聯網&#xff0c;IoT技術正在滲透到我們生活的方方面面。然而&#xff0c;隨著IoT設備數量的激增&#xff0c…

BUG解決:postman可以請求成功,但Python requests請求報403

目錄 問題背景 問題定位 問題解決 問題背景 使用Python的requests庫對接物聯數據的接口之前一直正常運行&#xff0c;昨天突然請求不通了&#xff0c;通過進一步驗證發現凡是使用代碼調用接口就不通&#xff0c;而使用postman就能調通&#xff0c;請求參數啥的都沒變。 接口…

SSL 證書錯誤:如何修復以及錯誤發生的原因

SSL證書可以提升網站的可信度。然而&#xff0c;如果您的SSL證書出現錯誤&#xff0c;您可能會得到一個“不安全”的標簽&#xff0c;這可能會導致訪問者失去對您網站的信任并轉向競爭對手。 本文將介紹SSL證書錯誤的原因及其對用戶的潛在影響。隨后&#xff0c;我們將提供詳細…

MybatisPlus 核心功能

MybatisPlus 核心功能 文章目錄 MybatisPlus 核心功能1. 條件構造器1.1 QueryWrapper1.2 LambdaQueryWrapper&#xff08;推薦&#xff09;1.3 UpdateWrapper1.4 LambdaUpdateWrapper 2. 自定義SQL3. Service接口 1. 條件構造器 當涉及到查詢或修改語句時&#xff0c;MybatisP…

界面組件Kendo UI for React 2024 Q2亮點 - 生成式AI集成、設計系統增強

隨著最新的2024年第二季度發布&#xff0c;Kendo UI for React為應用程序開發設定了標準&#xff0c;包括生成式AI集成、增強的設計系統功能和可訪問的數據可視化。新的2024年第二季度版本為應用程序界面提供了人工智能(AI)提示&#xff0c;從設計到代碼的生產力增強、可訪問性…

Java畢業設計 基于SSM vue圖書管理系統小程序 微信小程序

Java畢業設計 基于SSM vue圖書管理系統小程序 微信小程序 SSM 圖書管理系統小程序 功能介紹 用戶 登錄 注冊 首頁 圖片輪播 圖書信息推薦 圖書詳情 贊 踩 評論 收藏 系統公告 公告詳情 用戶信息修改 我的待還 圖書歸還 催還提醒 我的收藏管理 意見反饋 管理員 登錄 個人中心…