配置串口
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 */