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