目錄:
一、時鍾使能,包括GPIO的時鍾和串口的時鍾使能
二、設置引腳復用映射
三、GPIO的初始化配置,注意要設置為復用模式
四、串口參數初始化配置
五、中斷分組和中斷優先級配置
六、設置串口中斷類型並使能串口中斷
七、編寫中斷服務函數函數名格式為函數名格式為 USARTxIRQHandler(x 對應串口號)。
八、主函數的實現。
一、時鍾使能,包括GPIO的時鍾和串口的時鍾使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能端口時鍾
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //使能串口時鍾
二、設置引腳復用映射
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
、
三、GPIO的初始化配置,注意要設置為復用模式
/*GPIO配置*/
IO_Init.GPIO_Mode = GPIO_Mode_AF; //配置成復用模式
IO_Init.GPIO_OType = GPIO_OType_PP;
IO_Init.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
IO_Init.GPIO_PuPd = GPIO_PuPd_UP;
IO_Init.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &IO_Init);
四、串口參數初始化配置
/*串口初始配置*/
UT_Init.USART_BaudRate = 9600; //波特率
UT_Init.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //無硬件控制流
UT_Init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //發送接收
UT_Init.USART_Parity = USART_Parity_No; //無奇偶校驗
UT_Init.USART_StopBits = USART_StopBits_1; //停止位1
UT_Init.USART_WordLength = USART_WordLength_8b; //數據位8
USART_Init(USART1, &UT_Init);
五、中斷分組和中斷優先級配置
/*中斷優先級設置,中斷分組*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中斷優先級分組2 NC_Init.NVIC_IRQChannel=USART1_IRQn; //串口1中斷通道 NC_Init.NVIC_IRQChannelCmd=ENABLE; //使能中斷 NC_Init.NVIC_IRQChannelPreemptionPriority=0; //搶占優先級 NC_Init.NVIC_IRQChannelSubPriority=0; //響應優先級 NVIC_Init(&NC_Init);
六、設置串口中斷類型並使能串口中斷
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //配置串口中斷類型,接收數據中斷 USART_Cmd(USART1, ENABLE);
七、編寫中斷服務函數函數名格式為函數名格式為 USARTxIRQHandler(x 對應串口號)。
void USART1_IRQHandler(void) //串口1中斷服務程序 { u8 Receive_Data = 0; if(USART_GetITStatus(USART1, USART_IT_RXNE)) //由於只設置了一種接收中斷,判斷可以省略 { Receive_Data = USART_ReceiveData(USART1);//保存接收到的數據,RXNE自動清零 printf("Receive Succsed: %2x \r\n", Receive_Data);//回復接收完成 if(Receive_Data==0x01) LED0=!LED0; // USART_ClearFlag(USART1,USART_IT_RXNE); //手動清零 } }
由於本程序只使能串口接收到數據(USART_IT_RXNE)產生中斷,所以在執行中斷服務函數之前可以不用判斷,如果使能了多種串口中斷,則要先判斷產生中斷的類型,注意讀取數據后,RXNE寄存器自動清零,不需要再手動清零。
八、主函數的實現,這里仍然采用了LED閃爍和串口發送數據來顯示程序運行狀態的方法。
int main(void) { LED_Init(); delay_init(168); USART1_Config(); LED0_OFF; LED1_OFF; while(1) { LED1=!LED1; printf("Running....\r\n"); delay_ms(500); } }
以上工作做好后,就可以將程序下載到STM32了, 可以發現LED1在閃爍,同時串口發送來了running.....當電腦發送一個0x01時LED0的狀態會反轉。
總結
本程序只使用了串口接收完成后產生中斷,如果我們要讓數據發送完成后產生中斷,應該如何配置呢?方法是類似的,中斷配置時只需要設置為USART_ITConfig(USART1, USART_IT_TC, ENABLE); 同樣可以通過函數USART_GetITStatus(USART1, USART_IT_TC) 來判斷是否產生發送完成中斷。
參考資料
-
STM32F4xx中文參考手冊
-
STM32F4開發指南-庫函數版本_V1.1
-
USART_百度百科
關於串口的使用可以參考之前發表的幾篇博文:
以上是我學習過程的一些個人理解,有不對或不准確的地方,歡迎各位大神指正。
2017年4月18日21:42:36
歡迎大家關注我的個人博客
微信掃碼關注我的公眾號
不定期更新個人學習筆記和技術總結,歡迎大家互相學習交流!
