代碼來自正點原子ALIENTEK
void uart_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整數部分
fraction=(temp-mantissa)*16; //得到小數部分
<span style="white-space:pre"> </span>mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口時鐘
RCC->APB2ENR|=1<<14; //使能串口時鐘
GPIOA->CRH&=0XFFFFF00F;//IO狀態設置
GPIOA->CRH|=0X000008B0;//IO狀態設置
RCC->APB2RSTR|=1<<14; //復位串口1
RCC->APB2RSTR&=~(1<<14);//停止復位
//波特率設置
USART1->BRR=mantissa; // 波特率設置
USART1->CR1|=0X200C; //1位停止,無校驗位.
#if EN_USART1_RX //如果使能了接收
//使能接收中斷
USART1->CR1|=1<<8; //PE中斷使能
USART1->CR1|=1<<5; //接收緩衝區非空中斷使能
MY_NVIC_Init(3,3,USART1_IRQChannel,2);//組2,最低優先級
#endif
}
其中:pclk:PCLK2時鐘頻率(MHz)
bound:波特率
mantissa:USARTDIV整數部分
fraction USARTDIV小數部分USARTDIV:USART分頻器除法因子
USART_BRR:波特比率寄存器
USART_CR1:控制寄存器1
參考手冊相關內容如下:
1.串口時鐘使能:串口作爲STM32的一個外設,其時鐘由外設時鐘使能寄存器(APB1ENR、APB2ENR、AHBENR等)控制,我們使用的是串口1,查看STM32參考手冊:
RCC_APB2ENR寄存器:
RCC->APB2ENR|=1<<14; //使能串口時鐘
2.串口復位:當外設出現異常的時候可以通過復位寄存器裏面的對應位設置,實現該外設的復位,然後重新配置這個外設達到讓其重新工作的目的。一般在系統剛開始配置外設的時候,都會先執行復位該外設的操作。串口 1 的復位是通過配置 APB2RSTR 寄存器的第 14 位來實現的。
RCC->APB2RSTR&=~(1<<14);//停止復位
#if EN_USART1_RX //如果使能了接收
//使能接收中斷
USART1->CR1|=1<<8; //PE中斷使能
USART1->CR1|=1<<5; //接收緩衝區非空中斷使能
MY_NVIC_Init(3,3,USART1_IRQChannel,2);//組2,最低優先級
#endif