? ? ? ? STM32的串口是相當豐富的,功能也很強勁。最多可提供5 路串口,有分數波特率發生器、支持單線光通信和半雙工單線通訊、支持LIN、智能卡協議和IrDA SIRENDEC 規范(僅串口3支持)、具有DMA等。
? ? ? ? 串口最基本的設置,就是波特率的設置。STM32的串口使用起來還是蠻簡單的,只要你開啟了串口時鐘,并設置相應IO口的模式,然后配置一下波特率,數據位長度,奇偶校驗位等信息,就可以使用了。下面,我們就簡單介紹下這幾個與串口基本配置直接相關的寄存器。
1,串口時鐘使能。串口作為STM32的一個外設,其時鐘由外設始終使能寄存器控制,這里我們使用的串口1是在APB2ENR寄存器的第14位。除了串口1的時鐘使能在APB2ENR寄存器,其他串口的時鐘使能位都在APB1ENR。
2,串口復位。當外設出現異常的時候可以通過復位寄存器里面的對應位設置,實現該外設的復位,然后重新配置這個外設達到讓其重新工作的目的。一般在系統剛開始配置外設的時候,都會先
執行復位該外設的操作。串口1的復位是通過配置APB2RSTR 寄存器的第14位來實現的。
?3,串口波特率設置。每個串口都有一個自己獨立的波特率寄存器USART BRR,通過設置該寄存器達到配置不同波特率的目的。該寄存器的各位描述如下:
?
4.串口控制。STM32 的每個串口都有3個控制寄存器USART CR1~3 ,串口的很多配置 都是通過這 3個寄存器來設置的。
5,數據發送與接收。STM32的發送與接收是通過數據寄存器USART _DR來實現的,這是一個雙寄存器,包含了TDR和RDR當向該寄存器寫數據的時候,串口就會自動發送,當收到數據的時
候,也是存在該寄存器內。
可以看出,雖然是一個32 位寄存器,但是只用了低9位(DR[8:0]),其他都是保留。 DR[8:0]為串口數據,包含了發送或接收的數據。由于它是由兩個寄存器組成的,一個給發送用(TDR),一個給接收用(RDR),該寄存器兼具讀和寫的功能。TDR寄存器提供了內部總線和輸出移位寄存器之間的并行接口。RDR寄存器提供了輸入移位寄存器和內部總線之間的并行接口。
當使能校驗位(USART CR1 種PCE 位被置位)進行發送時,寫到MSB的值(根據數據的長度不同,MSB是第7位或者第8位)會被后來的校驗位該取代。當使能校驗位進行接收時,讀到的MSB位是接收到的校驗位。
6. 串口的狀態可以通過狀態寄存器 USART SR 讀取串口狀態。
這里我們關注一下兩個位,第5、6 位RXNE 和TC。
RXNE(讀數據寄存器非空),當該位被置1的時候,就是提示已經有數據被接收到了,并且可以讀出來了。這時候我們要做的就是盡快去讀取USART DR,通過讀USART DR可以將該位清零,也可以向該位寫0,直接清除。
TC(發送完成),當該位被職位的時候,表示USARTDR內的數據已經被發送完成了。如果設置了這個位的中斷,則會產生中斷。該位也有兩種清零方式:1:讀USART SR,寫USARTDR。2:直接向該位寫0。
void uart_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissar
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp;//得到整數部分
fraction=(temp-mantissa)*16://得到小數部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENRI=1<<2;//使能PORTA口時鐘
RCC->APB2ENRI=1<<14;//使能串口時鐘
GPIOA->CRH&=0XFFFFF00F;
GPIOA->CRH|=0X000008B0;//IO狀態設置
RCC->APB2RSTRI=1<<14;//復位串口1
RCC->APB2RSTR&=~(1<<14)://停止復位
//波特率設置
USART1->BRR=mantissa;//波特率設置
USART1->CR1|=0X200C;//1位停止,無校驗位,USART1->CR1|=1<<8;//PE中斷使能
USART1->CR11=1<<5;//接收緩沖區非空中斷使能
MY_NVIC_Init(3,3,USART1 IRQChannel,2);//組2,最低優先級
}
初始化串口硬件設備,啟用中斷:
配置步驟:
(1)打開GPI0和USART1的時鐘
(2)設置USART1兩個管腳GPI0模式
(3)配置USART1數據格式、波特率等參數
(4)使能USART1接收中斷功能
(5)最后使能USART1功能