【開源】STM32HAL庫移植Arduino OneWire庫驅動DS18B20和MAX31850

項目開源鏈接

github主頁https://github.com/snqx-lqh
本項目github地址https://github.com/snqx-lqh/STM32F103C8T6HalDemo
作者 VXQinghua-Li7

📖 歡迎交流 如果開源的代碼對你有幫助,希望可以幫我點個贊👍和收藏

項目說明

最近在做一個項目的時候,需要用到Max31850去讀取PT100的溫度值,使用的模塊如下
在這里插入圖片描述
由于店家給的資料只有Arduino的,然后我就把Arduino庫中的OneWire庫修改成了STM32可移植的C語言代碼,使用函數指針面向對象設計,使得代碼移植性更強。具體的操作以及演示我也有在B站進行講解,DS18B20和MAX31850一樣使用的單總線協議,所以可以共同使用這個代碼。

【開源】STM32F103讀取DS18B20溫度(移植Arduino的OneWire庫)

移植講解

如果想要使用我移植好的OneWire庫,首先需要修改u_one_wire.c文件開頭的宏定義。需要用戶提供延時微秒的函數,以及使能和失能單片機中斷的函數。

#include "u_one_wire.h"/**************用戶處理的區域*****************/
#include "delay.h"#define noInterrupts()         __disable_irq();  //失能單片機中斷
#define interrupts()           __enable_irq();   //使能單片機中斷
#define one_wire_delay_us      DWT_Delay_us
/********************************************/

然后在max_31850.c,也就是傳感器處理文件中,建立一個one_wire的對象,并且實現對象中的方法。主要是設置引腳方向,引腳電平和讀取引腳的電平,我這里由于是使用的HAL庫,CubeMX將我的GPIO以及初始化了,所以這部分就不用管了,但是如果使用標準庫的話,也要添加引腳初始化。

/***************    用戶處理區域    ****************/#define max31850_delay_ms DWT_Delay_msstatic uint8_t gpio_init(void)
{return 0;
}static uint8_t set_pin_dir(one_wire_dir_t one_wire_dir)
{if(one_wire_dir == ONE_WIRE_DIR_IN){GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8<<(4*0);}else if(one_wire_dir == ONE_WIRE_DIR_OUT){GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=3<<(4*0);}return 0;
}static  uint8_t set_pin_level(uint8_t level)
{if(0 == level){GPIOA->BRR  = GPIO_PIN_0;}else if(1 == level){GPIOA->BSRR = GPIO_PIN_0;}return 0;
}static uint8_t read_pin_level(void)
{uint8_t read_pin ;read_pin = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);return read_pin;
}one_wire_dev_t max31850={.init = gpio_init,.set_pin_dir = set_pin_dir,.set_pin_level= set_pin_level,.read_pin_level= read_pin_level,
};/**********************************************************/

最后在使用的時候,就可以參考Arduino中的步驟,先要定義一個初始化的函數,然后開始地址掃描、校驗、復位、選地址、轉換、讀取數據等一系列操作。

/*** @brief   初始化max31850,包含引腳初始化* @param   * @retval   **/
void max31850_init()
{one_wire_begin(&max31850);
}
/*** @brief   讀取max31850的溫度,帶掃描地址* @param   celsius:攝氏度 fahrenheit:華氏溫度* @retval  **/
int get_max31850_temp(float *celsius,float *fahrenheit)
{uint8_t i;uint8_t present = 0;uint8_t temptype;uint8_t data[12];uint8_t addr[8];if(celsius == NULL || fahrenheit == NULL)return -1;if ( !one_wire_search(&max31850,addr,true)) {one_wire_reset_search(&max31850);max31850_delay_ms(250);return -2;}if (crc8(addr, 7) != addr[7]) {return -3;}// the first ROM byte indicates which chipswitch (addr[0]) {case 0x10:temptype = TYPE_DS18S20;break;case 0x28:temptype = TYPE_DS18B20;break;case 0x22:temptype = TYPE_DS18S22;break;// ADDED SUPPORT FOR MAX31850!case 0x3B:temptype = TYPE_MAX31850;break;default:return -4;}one_wire_reset(&max31850);one_wire_select(&max31850,addr);one_wire_write(&max31850,0x44, 1);        // start conversion, with parasite power on at the endmax31850_delay_ms(1000);     // maybe 750ms is enough, maybe not// we might do a ds.depower() here, but the reset will take care of it.present = one_wire_reset(&max31850);one_wire_select(&max31850,addr);one_wire_write(&max31850,0xBE,0);         // Read Scratchpadfor ( i = 0; i < 9; i++) {           // we need 9 bytesone_wire_read(&max31850,&data[i]);}// Convert the data to actual temperature// because the result is a 16 bit signed integer, it should// be stored to an "int16_t" type, which is always 16 bits// even when compiled on a 32 bit processor.int16_t raw = (data[1] << 8) | data[0];if (temptype == TYPE_DS18S20) {raw = raw << 3; // 9 bit resolution defaultif (data[7] == 0x10) {// "count remain" gives full 12 bit resolutionraw = (raw & 0xFFF0) + 12 - data[6];}} else if (temptype == TYPE_MAX31850) {printf("--------------------------------\r\n");if (raw & 0x01) {return -4;}} else {uint8_t cfg = (data[4] & 0x60);// at lower res, the low bits are undefined, so let's zero themif (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 mselse if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 mselse if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms default is 12 bit resolution, 750 ms conversion time}*celsius = (float)raw / 16.0;*fahrenheit = *celsius * 1.8 + 32.0;return 0;
}

還可以跳過掃描階段,直接獲取數據,這種方式比較適合單節點的獲取。就是電路上只連接了一個DS18B20或者MAX31850。

/*** @brief   讀取max31850的溫度,跳過地址掃描* @param   celsius:攝氏度 fahrenheit:華氏溫度* @retval  **/
int get_max31850_temp_skiprom(float *celsius,float *fahrenheit)
{uint8_t i;uint8_t present = 0;uint8_t temptype;uint8_t data[12];uint8_t addr[8];if(celsius == NULL || fahrenheit == NULL)return -1;one_wire_reset(&max31850);one_wire_skip(&max31850);one_wire_write(&max31850,0x44, 1);        // start conversion, with parasite power on at the endmax31850_delay_ms(1000);     // maybe 750ms is enough, maybe not// we might do a ds.depower() here, but the reset will take care of it.present = one_wire_reset(&max31850);one_wire_skip(&max31850);one_wire_write(&max31850,0xBE,0);         // Read Scratchpadfor ( i = 0; i < 9; i++) {                // we need 9 bytesone_wire_read(&max31850,&data[i]);}int16_t raw = (data[1] << 8) | data[0];if (raw & 0x01) {return -4;}*celsius = (float)raw / 16.0;*fahrenheit = *celsius * 1.8 + 32.0;return 0;
}

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

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

相關文章

【合新通信】浸沒式液冷光模塊與冷媒兼容性測試技術報告

一、測試背景與核心挑戰 行業需求驅動 隨著800G/1.6T光模塊功耗突破30W/端口&#xff0c;傳統風冷已無法滿足散熱需求&#xff0c;浸沒式液冷成為超算/AI數據中心的主流方案。冷媒兼容性是系統可靠性的關鍵指標&#xff0c;涉及材料腐蝕、光學性能、長期穩定性等維度。 核心…

Pandas中的日期時間date處理

Pandas提供了強大的日期和時間處理功能&#xff0c;這對于時間序列分析至關重要。本教程將介紹Pandas中處理日期時間的主要方法。包括&#xff1a; 日期時間數據的創建和轉換日期時間屬性的提取時間差計算和日期運算重采樣和頻率轉換時區處理基于日期時間的索引操作 Pandas中…

Vue3文件上傳組件實戰:打造高效的Element Plus上傳解決方案,可以對文件進行刪除,查看,下載功能。

在現代Web開發中,文件上傳功能是許多應用的核心需求之一。無論是企業管理系統、內容管理系統還是醫療信息系統,上傳附件的功能都至關重要。本文將分享一個基于 Vue3 和 Element Plus 實現的文件上傳組件,結合父子組件的協作,展示如何構建一個功能強大、用戶體驗友好的文件上…

AI 工程師崛起:科技浪潮下的新興力量

在當今科技迅猛發展的時代&#xff0c;人工智能&#xff08;AI&#xff09;無疑是最熱門的領域之一。隨著基礎模型的涌現和開源 / API 的普及&#xff0c;一種新興的職業 ——AI 工程師&#xff0c;正逐漸嶄露頭角。他們在 AI 技術的應用和開發中扮演著關鍵角色&#xff0c;其崛…

人工智能與機器學習:Python從零實現邏輯回歸模型

&#x1f9e0; 向所有學習者致敬&#xff01; “學習不是裝滿一桶水&#xff0c;而是點燃一把火。” —— 葉芝 我的博客主頁&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 歡迎點擊加入AI人工智能社區&#xff01; &#x1f680; 讓我們一起努力&#xff0c;共創…

濟南國網數字化培訓班學習筆記-第二組-5節-輸電線路設計

輸電線路設計 工程設計階段劃分 35kv及以上輸變電工程勘測設計全過程 可行性研究&#xff08;包括規劃、工程選站&#xff09;&#xff08;包括電力系統一次二次&#xff0c;站址選擇及工程設想&#xff0c;線路工程選擇及工程設想&#xff0c;節能降耗分析&#xff0c;環境…

【Linux網絡】TCP服務中IOService應用與實現

&#x1f4e2;博客主頁&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客倉庫&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01; &…

Linux 怎么找Java程序的監聽的端口

Linux 怎么找Java程序的監聽的端口 1、假設你知道啟動該Java應用的進程ID (PID)&#xff0c;可以通過以下命令查找其監聽的端口&#xff1a; 首先找到該Java應用的PID&#xff1a; ps -ef | grep xxxx-1.0-RELEASE.jar或者&#xff0c;如果你知道啟動命令的一部分&#xff0…

解讀《數據資產質量評估實施規則》:企業數據資產認證落地的關鍵指南

隨著“數據要素市場”建設加速&#xff0c;數據資產逐步成為企業核心資產之一。2024年4月&#xff0c;由中國質量認證中心&#xff08;CQC&#xff09;發布的《數據資產質量評估實施規則》&#xff08;編號&#xff1a;CQC96-831160-2024&#xff09;正式實施&#xff0c;為企業…

[吾愛出品] 【鍵鼠自動化工具】支持識別窗口、識圖、發送文本、按鍵組合等

鍵鼠自動化工具 鏈接&#xff1a;https://pan.xunlei.com/s/VOOhDZkj-E0mdDZCvo3jp6s4A1?pwdfufb# 1、增加的找圖點擊功能&#xff08;不算增加&#xff0c;只能算縫補&#xff09;&#xff0c;各種的不完善&#xff0c;但是能運行。 2、因為受限于原程序的界面&#xff0c;…

【計算機視覺】CV實戰項目 - 基于YOLOv5的人臉檢測與關鍵點定位系統深度解析

基于YOLOv5的人臉檢測與關鍵點定位系統深度解析 1. 技術背景與項目意義傳統方案的局限性YOLOv5多任務方案的優勢 2. 核心算法原理網絡架構改進關鍵點回歸分支損失函數設計 3. 實戰指南&#xff1a;從環境搭建到模型應用環境配置數據準備數據格式要求數據目錄結構 模型訓練配置文…

IntelliJ IDEA 中配置 Spring MVC 環境的詳細步驟

以下是在 IntelliJ IDEA 中配置 Spring MVC 環境的詳細步驟&#xff1a; 步驟 1&#xff1a;創建 Maven Web 項目 新建項目 File -> New -> Project → 選擇 Maven → 勾選 Create from archetype → 選擇 maven-archetype-webapp。輸入 GroupId&#xff08;如 com.examp…

基于javaweb的SpringBoot+MyBatis通訊錄管理系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

EFISH-SBC-RK3588無人機地面基準站項目

一、核心技術組件解析 1. EFISH-SBC-RK3588 性能優勢&#xff1a;作為瑞芯微推出的高性能處理器&#xff0c;采用8nm 工藝&#xff0c;搭載ARM Cortex-A76/A55 八核架構&#xff0c;集成強大的 NPU&#xff08;神經網絡處理單元&#xff09;和 GPU&#xff08;圖形處理器&…

藍橋杯 4. 卡片換位

卡片換位 原題目鏈接 題目描述 你玩過華容道的游戲嗎&#xff1f; 這是一個類似的&#xff0c;但更簡單的游戲。 看下面的 3 2 格子&#xff1a; --------- | A | * | * | --------- | B | | * | ---------在其中放置了 5 張牌&#xff0c;其中&#xff1a; A 表示關…

7.Excel:單元格格式

一 案例 1.案例1 2.案例2 3.案例3 二 三種基本數據類型 補充&#xff1a;在沒有任何格式的情況下是這樣對齊的。 1.文本 默認左對齊&#xff0c;文本不可參與計算。 2.數值 默認右對齊&#xff0c;數值計算精度是15位。 若超出15位&#xff0c;超出部分顯示為0。 3.邏輯值 …

高效DCDC電源芯片在運動控制器中的應用:設計考量、性能評估與可靠性分析

摘要 隨著工業自動化的深入推進&#xff0c;運動控制器作為自動化系統的核心組件&#xff0c;對電源芯片的性能提出了極高要求。高效率DCDC電源芯片憑借其卓越的電能轉換效率、優異的負載響應特性和高功率密度&#xff0c;在運動控制器領域得以廣泛應用。本文以國科安芯的ASP3…

Action:Update your application‘s configuration

在使用Maven項目時&#xff0c;有一個報錯信息是&#xff1a;Update your applications configuration 這類問題&#xff0c;就是我們的application.yml文件 或者 application.properties文件 內容哪里寫錯了 最有可能就是對齊方式有問題

Pycharm(六):可變與不可變類型

一、引用 在java中既有值傳遞,也有引用傳遞,我們思考一下在python中值的傳遞方式是哪種類型呢? 答案是引用傳遞。 概述: Python中存儲變量是需要占用內存空間的,為了更好地管理這些空間,每塊空間都是有自己的地址值的。 格式: id(變量名/值) 可以查看變量/…

動態ip與靜態ip的概念、區別、應用場景

動態ip與靜態ip的區別 前言 一、IP地址的概念和作用 1.1、IP地址的定義 1.2、IP地址的作用 二、動態IP和靜態IP的區別 2.1、動態IP和靜態IP的定義 2.2、動態IP和靜態IP的特點 2.3、動態IP和靜態IP的優缺點比較 三、動態IP和靜態IP的應用場景 3.1. 動態IP的應用場景 3.2. 靜態IP…