美文网首页
STM8串口接收中断无法进入问题(STM8L051/101F3)

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

作者: 小歆Pro | 来源:发表于2019-07-23 22:42 被阅读0次

    前言

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


    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跳线,结果串口接收中断进入了。。。


    拔掉RXD跳线

    总结

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/fdvolctx.html