zoukankan      html  css  js  c++  java
  • STM8避坑—串口中断

      STM8库函数开发方式中,串口中断的类型有很多,头文件中的定义入下:

    typedef enum { UART1_IT_TXE        = (uint16_t)0x0277, /*!< Transmit interrupt */
                   UART1_IT_TC         = (uint16_t)0x0266, /*!< Transmission Complete interrupt */
                   UART1_IT_RXNE       = (uint16_t)0x0255, /*!< Receive interrupt */
                   UART1_IT_IDLE       = (uint16_t)0x0244, /*!< IDLE line interrupt */
                   UART1_IT_OR         = (uint16_t)0x0235, /*!< Overrun Error interrupt */
                   UART1_IT_PE         = (uint16_t)0x0100, /*!< Parity Error interrupt */
                   UART1_IT_LBDF       = (uint16_t)0x0346, /**< LIN break detection interrupt */
                   UART1_IT_RXNE_OR    = (uint16_t)0x0205  /*!< Receive/Overrun interrupt */
                 } UART1_IT_TypeDef;

      我们经常使用的串口中断是,接收中断和发送中断,但是从头文件中来看比较模糊。

      发送中断到底是用UART1_IT_TXE(TXE的意思是发送寄存器为空),还是用UART1_IT_TC(TC的意思是发送完成),接收中断到底是用UART1_IT_RXNE(RXNE的意思是接收寄存器非空),还是用UART1_IT_RXNE_OR(OR的意思是接收寄存器超载溢出),又要怎么使用呢?

      经过实践,总结如下:

      发送中断只能使用UART1_IT_TXE,并且与51单片机的方式有很大不同,51单片机中发送中断的工作流程是:1)给SBUF赋值,2)硬件自动发送,3)发送完成进入串口中断,4)在中断中判断中断是发送还是接受,清楚对应标志位;

      STM8中对串口进行了初始化之后,

    UART1_Init((uint32_t)115200,
                UART1_WORDLENGTH_8D,
                UART1_STOPBITS_1,
                UART1_PARITY_NO,
                UART1_SYNCMODE_CLOCK_DISABLE,
                UART1_MODE_TXRX_ENABLE);
    UART1_Cmd(ENABLE);

      在需要发送数据时再对发送中断进行使能,比如在主函数中,

    UART1_ITConfig(UART1_IT_TXE,ENABLE);

      然后在发送中断服务函数中执行发送函数,最后关闭发送中断,一定要关闭发送中断,不然就会一直反复进入发送中断,退不出来;

    /**
      * @brief UART1 TX Interrupt routine.
      * @param  None
      * @retval None
      */
     INTERRUPT_HANDLER(UART1_TX_IRQHandler, 17)
     {
        /* In order to detect unexpected events during development,
           it is recommended to set a breakpoint on the following instruction.
        */
            UART1_SendData8('A');
            UART1_ITConfig(UART1_IT_TXE,DISABLE);
     }

      接收中断只能使用UART1_IT_RXNE_OR,可以在串口初始化之后直接使能,因为只有在接收到数据才会进入中断,这里和51单片机基本一致,

    UART1_ITConfig(UART1_IT_RXNE_OR,ENABLE);

      接收中断服务中,如果接收数据量比较大的,需要查询超载溢出的对应标志,因为超载溢出也会触发此中断,一旦是溢出,就要软件清除对应的标志位,取出接收到的数据使用UART1_ReceiveData8()函数。

  • 相关阅读:
    CStdioFile的Writestring无法写入中文的问题
    Warning: skipping non-radio button in group. 的处理
    Linux命令 改变文档权限及所有者
    动态链接库dll的 静态加载 与 动态加载
    switch的方便用法
    mysql 安装过程中的错误:my-template.ini could not be processed and written to XXXmy.ini.Error code-1
    HDU 3790 最短路径问题 (SPFA)
    container_of用法及实现
    ZXing工具类v1.0
    基于MapReduce的HBase开发
  • 原文地址:https://www.cnblogs.com/sk3241/p/13096652.html
Copyright © 2011-2022 走看看