STM32 进阶教程 20 - 串口+DMA实现OneWire总线
前言
????? One-wire總線使用一根并聯總線完成對于多個設備的訪問,通過上拉的OD門實現多設備的讀寫操作,通過ID區別設備,通過CRC5完成數據校驗。常見對于one-wire總線的操作代碼主要使用包含基礎循環的延時函數實現位讀寫時序控制,進而實現總線讀寫(字節讀寫)。這也產生了以下的問題:
1. 浪費了大量的MCU時鐘周期做等待。
2. 在不同編譯器優化級別下,設定的延時計數值常量有可能產生不精確的延時。
3. 需要針對時序設定每個狀態機的延時參數,參數調整復雜且不穩定。
4. 延時容易被中斷任務介入,導致延時不準確,程序功能不穩定
?
本節將帶領大家用單片機的串口實現OneWire總線操作,將stm32的串口的TX引腳與RX引腳短接后與1-Wire總線相連,其理論實現原理如下:
1) 總線復位
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1-wrie總線復位時序圖
使用9600-8-N-1的UART配置,在TX引腳發送0XF0并在RX引腳讀取返回0X10~0X90實現總線復位時序。返回其他值標示總線上無設備掛載。
?
2) 總線位讀操作
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1-wrie總線讀時序圖
使用115200-8-N-1的UART配置,在TX引腳發送0XFF并在RX引腳讀取返回0XFF(表示讀取bit為1)或其他(表示讀取為0)實現總線讀時序。
?
3) 總線位寫操作
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1-wrie總線讀時序圖
?
使用115200-8-N-1的UART配置,在TX引腳發送0XFF并在RX引腳讀取返回0XFF(表示寫入bit為1)或發送0X00并返回0X00(表示寫入為0)實現總線位寫時序。
?
4)DMA方式實現One-wire總線讀寫實現
除了復位操作外,對于one-wire總線的操作通常以1個字節為讀寫單位,即連續的8個位操作。如果由用戶代碼實現多位操作,則需要用戶代碼不斷響應UART中斷函數,實現對于UART發送、接收數據寄存器的讀寫。這會導致代碼復雜且打斷系統其它操作。而采用DMA方式則很容易實現one-wire總線8bit數據的連續讀寫。其具體實現原理如下:
a. 設定一個寬度為byte容量為8的緩沖。UART的TX/RX DMA傳輸存儲器地址都指向此緩沖。
b. 對于byte寫操作,將要寫入的byte通過上述的位寫操作將每一bit轉換成發送數據byte順序存入緩沖,啟動兩個DMA,通過等待RX DMA的完成標志(TC)完成一次寫操作。
c. 對于byte讀操作,將0xFF連續8次存入緩沖,啟動兩個DMA,通過等待RX DMA完成標志(TC)完成一次讀操作,讀取的數據通過上述的位讀操作,將bit轉換成輸出的byte數據。
下面開始具體實現!!
?
示例詳解
基于硬件平臺: STM32F10C8T6最小系統板, MCU 的型號是?STM32F103c8t6, 使用stm32cubemx 工具自動產生的配置工程,使用KEIL5編譯代碼。
?
?
本示例所用的最小系統板原理圖:
?
?
開啟發送DMA
開啟中斷
同時可以在后面生成代碼時高級選項中可以勾選不生成代碼:
?
同時在usart.c源文件中加入一個函數,并在頭文件中申明函數:
全速運行后可以看到變找到一個DS18B20設備,ROM為:28 2a fa df 0a 00 00 8d,當前溫度為27.5度(下圖顯示2750是放大100倍后的溫度)。
可以看到程序功能正常,再來看看用串口實現OneWire總線的代碼:
是不是很簡單,很清爽!!
OK,本期實驗完成!下期見!同時如果大家有什么疑問或是有想了解的其它內容,也歡迎大家留言!!最后喜歡這個公眾號的同學們記得加關注了,每天都會有技術干貨推出!!
?
文中資料下載,在公眾號里給十三發消息:
下載|STM32進階教程 20
?
關注十三公眾號
?
總結
以上是生活随笔為你收集整理的STM32 进阶教程 20 - 串口+DMA实现OneWire总线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IQmath中文手册
- 下一篇: matlib 7 在Win10上运行 r