日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32 进阶教程 20 - 串口+DMA实现OneWire总线

發布時間:2025/4/5 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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編譯代碼。

?

?

本示例所用的最小系統板原理圖:

?

  • 從本節開始,關于CUBEMX工具及KEIL工具的操作將不再細講,如果還有不熟悉的可以查看之前的教程文檔。下面直接介紹工程配置:
  • ?

  • 系統時鐘樹
  • 串口配置
  • 開啟發送DMA

    開啟中斷

    同時可以在后面生成代碼時高級選項中可以勾選不生成代碼:

    ?

  • 引腳配置
  • 工程代碼
  • 加入事先準備好的OneWire.c及.h文件到工程(頭文件放在inc文件夾下即可):
  • 同時在usart.c源文件中加入一個函數,并在頭文件中申明函數:

  • 在main.c 中加入如下圖所示代碼
  • 接上DS18B20溫度傳感器看一下效果,記理將PA9,PA10引腳短接,仿真查看程序運行結果:
  • 全速運行后可以看到變找到一個DS18B20設備,ROM為:28 2a fa df 0a 00 00 8d,當前溫度為27.5度(下圖顯示2750是放大100倍后的溫度)。

    可以看到程序功能正常,再來看看用串口實現OneWire總線的代碼:

    是不是很簡單,很清爽!!

    OK,本期實驗完成!下期見!同時如果大家有什么疑問或是有想了解的其它內容,也歡迎大家留言!!最后喜歡這個公眾號的同學們記得加關注了,每天都會有技術干貨推出!!

    ?

    文中資料下載,在公眾號里給十三發消息:

    下載|STM32進階教程 20

    ?

    關注十三公眾號

    ?

    總結

    以上是生活随笔為你收集整理的STM32 进阶教程 20 - 串口+DMA实现OneWire总线的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。