STM32學習筆記(四)——串口控制LED(中斷方式)


目錄:

一、時鍾使能,包括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(USART1USART_IT_TCENABLE); 同樣可以通過函數USART_GetITStatus(USART1, USART_IT_TC) 來判斷是否產生發送完成中斷。

 

參考資料

 

關於串口的使用可以參考之前發表的幾篇博文:

  1. STM32學習筆記(二)——串口控制LED
  2. STM32學習筆記(三)——外部中斷的使用

 

 以上是我學習過程的一些個人理解,有不對或不准確的地方,歡迎各位大神指正。

 

 2017年4月18日21:42:36

 

 

歡迎大家關注我的個人博客
微信掃碼關注我的公眾號

不定期更新個人學習筆記和技術總結,歡迎大家互相學習交流!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM