STM8L串口中斷進不去

配置串口

void UART1_Config(void)
{
  /*Enable USART clock */
  CLK_PeripheralClockConfig(CLK_Peripheral_USART, ENABLE);
  
  USART_DeInit();

  USART_Init((uint32_t)9600, USART_WordLength_8D, USART_StopBits_1,
                USART_Parity_No, (USART_Mode_TypeDef)(USART_Mode_Rx | USART_Mode_Tx));

  /* 使能接收中斷 */
  USART_ITConfig(USART_IT_RXNE,ENABLE);	

  USART_Cmd(ENABLE);
  
  /* 使能所有中斷 */
  enableInterrupts();
}

中斷處理

從stm8l10x_it.c中找到INTERRUPT_HANDLER(USART_RX_IRQHandler, 28)函數並填充。

/**
  * @brief  USART RX Interrupt routine.
  * @param  None
  * @retval None
  */
INTERRUPT_HANDLER(USART_RX_IRQHandler, 28)
{
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
    if(USART_GetITStatus(USART_IT_RXNE) != RESET) {
        if (recv_len > 8) {
            recv_len = 0;
        }
        recv_buff[recv_len++] = USART->DR;
        //USART_SendData8(USART->DR);
        USART_ClearITPendingBit();
    }
}

代碼比較簡單,就是接收中斷被觸發後,把數據放到一個接收緩衝區中。

問題

通過調試,發現中斷沒有被觸發,一直進不到中斷中。網上也沒有相關問題。最後,找到了問題。需要在stm8_interrupt_vector.c文件中把串口接收中斷註冊到中斷向量表中。
找到下面這行代碼:

{0x82, NonHandledInterrupt}, /* irq28 */

修改爲:

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