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 */

你可能感兴趣的:(STM32)