?
數據是以幀為單位發的?
?
?USART和UART的區別就是有沒有同步功能
同步是兩端設備有時鐘連接,異步是沒時鐘連接,靠約定號的頻率(波特率)接收發送數據?
RTS和CTS是用來給外界發送已“可接收”或“可發送”信號的,一般用不到?,只用到TX 和 RX
從輸入引腳看框圖
編解碼模塊是把電平信號轉換為數字信號的,軟件只可操控DR寄存器
結構簡圖:
雖然有TDR,RDR兩個硬件層面的寄存器,但是軟件層面只有一個寄存器DR(F1系列),只不過讀和寫通向不同的寄存器
了解即可以下內容{
串口只需要看紅色圈住的部分:
數據采樣看8,9,10里有多少個1多少個0,如果全為0就是0,,2個0,1個1還是0,但是NE標志位會被置一??
?}到此
采樣率 = f(pclk2/1) / DIV
(f(pclk2/1)PCB2/PCB1的時鐘信號具體看手冊上USART1和USARTx有可能不一樣)
波特率 = 采樣率 / 16?
用戶給出波特率,算出DIV,然后整數部分寫入DIV_Mantissa,小數部分寫入DIV_Fraction(小數部分需要*16后再+0.5)(乘16相當于左移4位,+0.5是為了四舍五入)
即可完成波特率的設置(USART_BRR波特比率寄存器)
?U(S)ART寄存器
控制寄存器CR1
控制寄存器CR2
基本上只用到位13和12(配置為00即可)
控制寄存器CR3
用到位3
?數據寄存器DR
?狀態寄存器CR
TXE(發送寄存器為空標志位,可產生中斷)可產生中斷去寫DR寄存器
TC(發送完成(發送寄存器和發送移位寄存器都空)標志位)
RXNE(讀數據寄存器非空(收到了數據)標志位,可產生中斷去讀DR寄存器)
?HAL庫的MSP回調機制
(其實就是把外設初始化寫在mspinit函數里而已)
?例
要其他外設的話直接加就可以
PPP改成你要的外設名(找到指定函數)
HAL_UART_Init會自動調用MSPInit
?HAL共用中斷處理函數 and 中斷回調函數
?其實都是一樣的
?USART異步通信配置步驟
需要用到的1,3,6
?HAL_UART_Init()函數原型:
UART_HandleTypeDef是句柄(其實就是結構體里套結構體,標準庫是只有一個結構體的)
?一般只用到前兩個,Init又是一個結構體
?Init結構體成員
用法例:
信號空閑時要上拉?
中斷函數
usart1_rx_buf的大小在文件開頭宏定義為128了,可以修改,有兩個方法進這個中斷,一個是接收到數據,一個是數據接收完了。
HAL_UART_Receive
會自動清除接收標志位(RXNE
標志)
該函數可以讀取數據到用戶指定的變量中
剩余的函數及宏:?
?
?
?問題1:STM32初始化USART時,要使能USART時鐘和GPIO時鐘,為什么,不是使能USART就可以了嗎
答:
在 STM32 初始化 USART 時,除了使能 USART 外,還需要使能 GPIO 時鐘,原因如下:
-
USART 需要 GPIO 引腳進行數據傳輸
- USART 的 TX(傳輸)和 RX(接收)引腳通常映射到 GPIO 端口。例如,在 STM32F103 上,USART1 的 TX 可以是
PA9
,RX 可以是PA10
。 - 這些 GPIO 引腳默認是普通 I/O 模式,必須配置為 復用功能(AF),以使 USART 硬件能夠控制它們。
- USART 的 TX(傳輸)和 RX(接收)引腳通常映射到 GPIO 端口。例如,在 STM32F103 上,USART1 的 TX 可以是
-
GPIO 時鐘與復用功能的關系
- GPIO 端口是獨立的外設,受 RCC(時鐘控制)管理。
- 復用功能(AF)是 GPIO 的一部分,它需要 GPIO 時鐘處于打開狀態,否則 USART 無法正確驅動 TX/RX 引腳。
-
USART 只管理數據,不管理引腳
- USART 外設負責數據的收發,但它不會直接控制 GPIO 時鐘。
- GPIO 需要通過 RCC 使能時鐘后,才能配置為 USART 復用模式。
IO引腳復用功能和重映射
同一時間一個IO口只能用一種功能
重映射:
TIM1_CH1默認在PA8引腳
但是如果PA8已經被用作其他功能,那TIM1_CH1就用不了了,此時就要用到重映射了
可以看到TIM1_CH1可以重映射到PE9上?