串口初始化

代碼來自正點原子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
}


其中:pclkPCLK2時鐘頻率(MHz

            bound:波特率                           

            mantissaUSARTDIV整數部分

            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; //復位串口1
RCC->APB2RSTR&=~(1<<14);//停止復位

3.串口波特率設置:將上面求出來的波特率值存進波特比率寄存器(USART_BRR)中
USART1->BRR=mantissa; // 波特率設置


4.串口控制:STM32 的每個串口都有 3 個控制寄存器 USART_CR1~3,串口的很多配置都是通過這 3 個寄存器來設置的。



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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章