历史上的今天
今天是: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()函数。
下一篇:STVD+COSMIC工程搭建
史海拾趣
|
学习单片机需要掌握的硬件问题,大家一起分享 就单片机学习过程中硬件设计方面的几个基本问题一起分享 1、电阻电容的封装形式如何选择,有没有什么原则?比如,同样是 104 的电容有 0603、0805 的封装,同样是 10uF 电容有 3216、0805、3528 ...… 查看全部问答> |
|
施耐德触摸屏XBTGT5330之COM1或COM2口进行串口通讯得进 想利用XBTGT5330的COM口(com1或com2口)与第三方厂家的仪表进行串行通讯 该第三方的通讯协议符合modbus协议。其具体协议数据格式为: 开始符 指令代码 ...… 查看全部问答> |
|
我用的芯片是ADuC7026,开发工具为IAR Embeded 当我用RS-232下载程序时,能够成功。 也可在线调试,运行无误,但是拔下电源后,再插上电源程序没有保存在芯片中,反复试过很多次,都不成功。 希望各位高手能给指点一下。先谢谢了。 … 查看全部问答> |
|
我使用的CPU :P1011 DDR3:H5TQ1G63BFR 两片共(256M byte) MCS0片选 我想知道:CONFIG_SYS_DDR_CS0_BNDS 这个怎么配置呢、? 看了资料是这样说的:Starting address for chip select (ban ...… 查看全部问答> |
|
请问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, 功能分配任意引脚摘要本文记 ...… 查看全部问答> |




