STM8串口接收中断无法进入问题(STM8L051/101F3)

前言

最近弄了一块STM8L051/101F3开发板,打算简单玩一玩。在我IO和定时器都没问题后我开始配置串口UART时发现接收中断始终无法进入,发送中断都是没问题的,之后我就开始了为期两天的问题排查,几乎排查所有可能的问题点。


STM8串口接收中断无法进入问题(STM8L051/101F3)_第1张图片
STM8L051/101F3开发板

代码

我这里的MCU是STM8L051F3,使用的STM8库开发,代码如下仅供参考:
main.c

#include "stm8l15x.h"

void Clock_Config(void) 
{
    CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);           //系统时钟分频器
    CLK_SYSCLKSourceSwitchCmd(ENABLE);              //开启系统时钟开关
    CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);   //系统时钟源设置为内部高速时钟16MHz
    
    while(CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSI);       //等待时钟切换
    
}

void GPIO_Config(void)
{
    //USART GPIO
    GPIO_Init(GPIOC, GPIO_Pin_6, GPIO_Mode_In_PU_No_IT);
    GPIO_Init(GPIOC, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Fast);
    SYSCFG_REMAPPinConfig(REMAP_Pin_USART1TxRxPortC, ENABLE);
}

void Usart_Config(void)
{
    CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);
    USART_Init(USART1, (uint32)9600, USART_WordLength_8b, USART_StopBits_1, USART_Parity_No, (USART_Mode_TypeDef)(USART_Mode_Tx | USART_Mode_Rx));
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    USART_ITConfig(USART1, USART_IT_TC, ENABLE);
    USART_Cmd(USART1, ENABLE);
}

void main( void )
{
    Clock_Config();
    GPIO_Config();
    Usart_Config();
    enableInterrupts();
    USART_SendData8(USART1, 0x55);
    while(1)
    {

    }
}

void Usart1_RX_Callback(uint8_t data)
{
    USART_SendData8(USART1, data);
}

stm8l15x_it.c

extern void Usart1_RX_Callback(uint8_t data);

/**
  * @brief USART1 RX / Timer5 Capture/Compare Interrupt routine.
  * @param  None
  * @retval None
  */
INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler,28)
{
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
    if(USART_GetITStatus(USART1, USART_IT_RXNE))
    {
//        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        Usart1_RX_Callback(USART_ReceiveData8(USART1));
    }
}

问题排查

首先可以肯定的代码是没问题的,我已经对过规格书查看了仿真时的寄存器,所有的配置都是正确的。
接下来我偶然发现开发板是可以USB串口烧录程序的,使用的烧录口正是我使用的串口IO,随后我就在想是不是板载USB转串口芯片和外部USB转串口冲突了?
最后我拔下了板载的RXD跳线,结果串口接收中断进入了。。。


STM8串口接收中断无法进入问题(STM8L051/101F3)_第2张图片
拔掉RXD跳线

总结

如果开发板有板子USB转串口就不要再插USB转串口模块了(这不是废话嘛),否则有可能对串口收发产生影响导致无法接收串口数据。

你可能感兴趣的:(STM8串口接收中断无法进入问题(STM8L051/101F3))