1.搭建一個基本工程:html
具體請參考個人上一篇內容搭建:https://www.cnblogs.com/Engineer-Lai/p/10072673.html異步
2.Uart協議簡要: 分爲通俗描述和概念性描述函數
通俗描述:測試
⭐1. 對於單片機入門的人來講,首先咱們要明白 咱們惟一可控的對象是IO口,IO有兩種狀態 0和1. 有兩種操做讀和寫(請務必確認本身明白並能夠操控,咱們即可繼續)ui
⭐2.在確認第一點後,硬件協議存在的意義是什麼:A對象 把N個數據遵守特定的規則傳給 B對象.(這裏數據的單位是字節,一個字節由8個位組成)spa
⭐3.接下來就是如何傳數據的問題了,咱們只有0和1能夠表示。因此咱們必須制定一套雙方都遵循的可行遊戲規則。以下:.net
準備工做:1.先將A對象的一個IO口和B對象的一個IO用一根線完成物理上的鏈接;3d
2.設數據由 A對象 發送給 B對象調試
i. 空閒狀態:通訊線保持1(高電平)htm
ii.起始信號:通訊線由發起方(A)控制IO口爲0,持續一個雙方約定的單位時間
iii.數據段(由8個數據位組成):將數據(字節)拆分紅最小單位 即8個二進制位,如字節0x41 拆分後就是 1 0 0 0 0 0 1 0;每一個數據照這個順序各自持續一個單位時間。
iv.結束信號:通訊線由發起方(A)控制IO口爲0,持續一個雙方約定的單位時間
總結就是:1.首先雙方約定一個單位時間 2.而後按照 起始位,數據位1,數據位2,數據位3,數據位4,數據位5,數據位6,數據位7,數據位8,中止位 執行
例子:傳輸0x41 (1 0 0 0 0 0 1 0).咱們這裏約定9600波特率(即時間軸一個單位時間是1/9600,即104微妙爲一個時間單位)示波器波形以下。
概念描述:(都是書本概念了這裏參考微雪)
PS:在明白原理的狀況下建議本身手寫一次模擬UART。明白了以後,代碼重複的事就由STM32芯片的硬件功能來實現就能夠了,你只須要會看邏輯分析儀或者示波器分析數據即可。 所謂硬件功能 就是你把數據填充到寄存器,而後配置好相關參數,他會自動幫你發送出去。
通俗點說,本身手寫整個協議代碼實現實現就像你本身把一個快件送到到別人那裏再回來,而硬件功能則是你把快件給快遞員,快遞員幫你送過去。 明顯 後者會幫你節省大量時間和精力。它是一個硬件組成,而且你也爲此付費了.一個芯片串口硬件功能的多和少也影響着它的價格.
下面讓咱們開始配置硬件功能
3.工程配置與生成:
1.啓用Uart功能:按照如下五個步驟配置好後,生成代碼便可(默認115200,若是須要改波特率則另外在第4步,選擇Paramrter Setting,修改波特率便可)
4.功能與使用:
1.發送:
HAL庫的使用說明都在 生成的工程 Drivers/STM32FXXX_Driver文件夾下匹配功能的.C文件中,裏面很是詳盡的描述了各個功能如何使用。在這裏咱們能夠看到針對串口的3種模式描述,分別是Polling mode 輪詢模式 / Interrupt mode 中斷模式 / DMA模式。 本次實例種,是寫一個用於調試的串口,因此這裏根據需求,咱們使用是Polling mode下的HAL_UART_Transmit();
鼠標拉選整個函數按F12能夠直接跳到函數位置具體看到這個的介紹描述。基本就能夠看懂如何使用了。
直接在main.c的while(1)下根據函數要求填入對應參數調用
編譯燒寫,咱們能夠在串口接收助手看到這句話不斷的被髮送出來,發送功能測試至此結束。
延伸知識點:重定向Printf
Printf通常咱們都要使用,重定向一下,而後重寫這個函數便可
創建一個專門管理串口的Uart_Controller.C 和 Uart_Controller.H文件
⭐在頭文件中進行如下定義(直接複製到頭文件就好)
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
⭐如下是重寫的函數(直接複製到.C文件就好)
/**==================================================================
@FuncitonName: PUTCHAR_PROTOTYPE(fputc)
@brief : 重定向Print函數
@param : (int) ch
@param : (FILE) *f
@retval : int
@Author : 一碗蛋花
//==================================================================*/
PUTCHAR_PROTOTYPE /* printf */
{
//===============================================================
// 發送
//===============================================================
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
🌙而後就能夠在main.C函數中使用printf 辣.
2.接收:
//接收功能的描述待續...........(偷懶中)