1.搭建一個基本工程:
具體請參考我的上一篇內容搭建:https://www.cnblogs.com/Engineer-Lai/p/10072673.html
2.Uart協議簡要: 分為通俗描述和概念性描述
通俗描述:
⭐1. 對於單片機入門的人來說,首先我們要明白 我們唯一可控的對象是IO口,IO有兩種狀態 0和1. 有兩種操作讀和寫(請務必確認自己明白並可以操控,我們便可繼續)
⭐2.在確認第一點后,硬件協議存在的意義是什么:A對象 把N個數據遵照特定的規則傳給 B對象.(這里數據的單位是字節,一個字節由8個位組成)
⭐3.接下來就是如何傳數據的問題了,我們只有0和1可以表示。所以我們必須制定一套雙方都遵循的可行游戲規則。如下:
准備工作:1.先將A對象的一個IO口和B對象的一個IO用一根線完成物理上的連接;
2.設數據由 A對象 發送給 B對象
i. 空閑狀態:通信線保持1(高電平)
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.接收:
//接收功能的描述待續...........(偷懶中)