历史上的今天

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

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

发布者:EtherealBeauty 来源: eefocus关键字: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()函数。

关键字:STM8  串口中断  库函数 引用地址:STM8避坑—串口中断

上一篇:(八) stm8程序段定位,理解lkf文件
下一篇:STVD+COSMIC工程搭建

推荐阅读

  全球最大的汽车半导体供应商恩智浦半导体(NASDAQ:NXPI)1,宣布推出用于电动车辆牵引电机变频控制器和电池管理的新型汽车电源控制参考平台。这些新平台将恩智浦广泛的全球领先汽车微控制器(MCU)产品组合、电源管理系统基础芯片(SBC),以及特定应用先进模拟电源与能源管理器件集成到易于使用的参考设计中。预开发的应用平台表明,恩智浦致力于帮助客...
今日,在德国柏林举行的2019IFA展上,华为面向全球推出最新一代旗舰芯片麒麟990系列,包括麒麟990和麒麟990 5G两款芯片。其中,采用7nm+EUV工艺的麒麟990 5G是全球首款旗舰5G SoC芯片,创下六项业界第一。今日华为在北京同步举办了媒体沟通会,华为Fellow艾伟回答了媒体提问。艾伟表示,麒麟990是全球真正首款可商用的5G SoC,而因为目前没有看到毫米...
模拟万用表和数字万用表在测二极管、三极管和电容时的应用并比较。模拟万用表(电流黑出红入)1) 测二极管正负极:用黑、红表笔分别接触二极管的两极,观察表头指针,若指针有较大偏转,则黑表笔接触极为正极,红表笔接触极为负极;若指针无偏转则相反。2) 判断三极管的材料,e、b、c极并估计β值:首先判断基极并判断三极管类型是NPN型还是PNP型:试着将...
据业内消息人士透露,LCD驱动IC设计公司将上调报价,以反映芯片代工服务成本的持续上升,但由于面板价格自2021年第二季度末以来持续下跌,LCD面板制造商不愿接受更高的价格。据digitimes报道,消息人士称LCD驱动IC设计公司主要包括联咏科技、奇景光电、敦泰、矽创和瑞鼎科技。据悉,台积电已决定在今年第四季度提高晶圆代工价格,联电、力积电、世界先进也...

史海拾趣

问答坊 | AI 解惑

LCD黑屏问题调试[PXA310 bootloader]

LCD黑屏问题调试[PXA310 bootloader] 1. PXA310+DA9034+NXP5209架构的手机 2.Bug:LCD黑屏问题调试 3.任务级别:bootloader XXX:为保密公司做的项目 附件功能用不了,我用latex写的报告, 1.复制粘贴至另一个文件后,保存为一个文件,文 ...…

查看全部问答∨

基于nRF2401的无线信息发布平台

本帖最后由 paulhyde 于 2014-9-15 09:20 编辑 基于nRF2401的无线信息发布平台  …

查看全部问答∨

怎样把电脑上的文件传到arm里边的linux去?

请教一下,arm下linux正在运行,通过串口连接到电脑上,怎样把电脑上的文件传到arm里边的linux去?或者给个关键词我百度一下~…

查看全部问答∨

电子工程师,请不要为这五类人打工!

当初选择做技术,最主要的原因,是出于对科学技术的纯洁性的热爱,对人情世故的厌恶。但专于技术的工程师,要想有份有前途的工作,找到可以长久做下去的公司。“良禽择木而栖,贤臣择主而侍”,遇到下面五类性格的老板,能走多远就走多远。在此罗列 ...…

查看全部问答∨

C51 的一个问题

我碰到一个C51的问题 执行如下语句时: unsigned int xdata w; for(w=0;w<1000;w++); 程序会在这里死循环. 如果改成unsigned int data w;就不会 或者改成for(w=0;w<255;w++); 也不会出错 似乎C51在处理idata 或 Xdata中的双字节数时有点 ...…

查看全部问答∨

没天理了!STM32的定时器怎么这样啊?

想用TIM的外部时钟模式1的下做脉冲计数,可是仔细看了触发源很郁闷TS[2:0]:触发选择这3位选择用于同步计数器的触发输入。000:内部触发器0(ITR0),TIM1 001:内部触发器0(ITR1),TIM2 010:内部触发器0(ITR1),TIM3 011:内部 ...…

查看全部问答∨

唉 430解码红外失败好久了!

430解码红外好久勒  怎么也进展 ,这个程序不知道错哪了 调了好久也没调出来  纠结呀! #include  <msp430x14x.h>#include \"TFT_LCD24.h\"//#include \"char.h\"#include \"delay.h\" //数组a依次储存用户码、用户反码与键数 ...…

查看全部问答∨

求解

#ifdef  VECT_TAB_RAM         MY_NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else            MY_NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif 这段是什么意思~ ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved