历史上的今天
返回首页

历史上的今天

今天是:2024年09月08日(星期日)

2020年09月08日 | STM8避坑—串口中断

2020-09-08 来源:eefocus

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()函数。

推荐阅读

史海拾趣

C&K Components公司的发展小趣事

进入千禧年代,随着全球经济的融合和科技的快速发展,ITT Industries看中了C&K在开关领域的领先地位和强大实力,决定对其进行收购。这次并购使C&K成为ITT的开关部门,但公司仍然保留了C&K的名称和品牌。并购后的C&K借助ITT的全球资源和平台优势,进一步提升了自身的研发能力和市场竞争力,实现了更快速的发展。

EXCELSEMI [ EXCEL SEMICONDUCTOR INC. ]公司的发展小趣事

EXCELSEMI公司深知技术创新对于企业发展的重要性。因此,公司始终保持对研发的重视和投入。公司不仅设立了专门的研发中心,还引进了一批高素质的研发人才。通过持续的研发投入和技术创新,EXCELSEMI在半导体领域取得了多项专利和技术成果,为公司的发展提供了源源不断的动力。

Apex Tool Group公司的发展小趣事

随着公司产品的不断成熟和市场认可度的提高,EXCELSEMI开始积极拓展市场。公司通过参加国际展会、举办技术研讨会等方式提高品牌知名度,并积极寻求与全球知名企业的战略合作。这些合作不仅为公司带来了更多的业务机会,还进一步提升了公司的技术实力和品牌影响力。

星海公司的发展小趣事

随着国内市场的饱和,星海公司开始实施国际化战略,积极拓展海外市场。公司积极参加国际展览和比赛,展示星海钢琴的品质和实力。同时,星海公司还与国际知名音乐院校和乐团建立合作关系,推动星海钢琴在国际市场的知名度和影响力。目前,星海钢琴已出口到世界60多个国家和地区,成为国际市场上备受瞩目的中国品牌。

Cyrustek公司的发展小趣事

在电子行业的发展过程中,Cyrustek公司始终能够精准把握市场需求的变化。无论是智能家居、物联网还是可穿戴设备等领域,Cyrustek都能够迅速推出符合市场需求的产品。这种敏锐的市场洞察力和快速响应能力,使得Cyrustek在电子行业中始终保持领先地位。同时,Cyrustek还注重与客户的沟通和合作,不断收集客户反馈,优化产品设计,提高客户满意度。

Aavid Thermalloy公司的发展小趣事

在Cyrustek公司的发展过程中,人才一直是其最重要的资产。Cyrustek注重人才的培养和引进,建立了一支高素质、专业化的技术团队。这些人才不仅具备丰富的行业经验和专业知识,还具备创新精神和团队协作能力。在Cyrustek公司的发展过程中,这些人才发挥了至关重要的作用,推动了公司的不断发展和壮大。

问答坊 | AI 解惑

学习单片机需要掌握的硬件问题,大家一起分享

学习单片机需要掌握的硬件问题,大家一起分享 就单片机学习过程中硬件设计方面的几个基本问题一起分享 1、电阻电容的封装形式如何选择,有没有什么原则?比如,同样是 104 的电容有 0603、0805 的封装,同样是 10uF 电容有 3216、0805、3528 ...…

查看全部问答>

施耐德触摸屏XBTGT5330之COM1或COM2口进行串口通讯得进

想利用XBTGT5330的COM口(com1或com2口)与第三方厂家的仪表进行串行通讯 该第三方的通讯协议符合modbus协议。其具体协议数据格式为: 开始符       指令代码          ...…

查看全部问答>

高人求救

请问A/D转换显示 S3C44BO 4路LCD显示曲线 屏幕显示三分钟 超过三分钟将右半屏移到左半屏 每秒采样60次,外接5V电压 请高手指点…

查看全部问答>

关于IAR Embeded 串行下载

我用的芯片是ADuC7026,开发工具为IAR Embeded 当我用RS-232下载程序时,能够成功。 也可在线调试,运行无误,但是拔下电源后,再插上电源程序没有保存在芯片中,反复试过很多次,都不成功。 希望各位高手能给指点一下。先谢谢了。 …

查看全部问答>

msp430c程序

最近得到一段这样的程序,请高手指点一下它的功能:加上注释就好了 interrupt [TIMERA0_VECTOR] void Timer_A(void) { float i,j; PidIntNo++; if(PidIntNo>25){PidEn=1;PidIntNo=0;} KeyLedIntNo++; if(KeyLedIntNo>10){KeyLedE ...…

查看全部问答>

关于P1011的DDR内存配置的问题

我使用的CPU :P1011 DDR3:H5TQ1G63BFR      两片共(256M byte)       MCS0片选 我想知道:CONFIG_SYS_DDR_CS0_BNDS 这个怎么配置呢、? 看了资料是这样说的:Starting address for chip select (ban ...…

查看全部问答>

求助

用msp430g2452怎么接受莫尔斯秘密,捕获比较怎么用啊?????求帮助啊~~~~有谁有相关的程序啊,可以参考参考啊~~…

查看全部问答>

请问am335x如何在CCS下debug Linux的内核?

本人使用的环境是vmware+ubuntu10.04+CCS5.1,starter kit直接通过网线和电脑相连, 请问在这种环境下,am335x如何 debug Linux的内核?具体步骤如何? 目前已经成功debug SPL和u-boot了,谢谢…

查看全部问答>

always的敏感信号是clk,描述语句中可以是“="的赋值语句吗?

[讨论] always的敏感信号是clk,描述语句中可以是“=\"的赋值语句吗?always, reg DE1的开发板有个LED灯控PWM IP核实验。在PWM核中,有个always的敏感信号是psedge CLK时,描述语句中的左边的寄存器被“=\"赋值成什么电路?而且该描述语句怎么 ...…

查看全部问答>

LPC1500体验+(4)使用SWM将功能动态分配到任意引脚

本帖最后由 mars4zhu 于 2014-9-23 11:14 编辑 LPCXpresso1549试用报告——(3)使用SWM将功能动态分配到任意引脚 文档编号AN-0001-A0关键字LPCXpresso1549, LPCOpen, LPC1549, Keil MDK, ARM Cortex-M, SWM, 功能分配任意引脚摘要本文记 ...…

查看全部问答>