历史上的今天
返回首页

历史上的今天

今天是:2025年04月11日(星期五)

正在发生

2019年04月11日 | STM8 UART中断发,中断收

2019-04-11 来源:eefocus

STM8 UART 初始化

配置STM8 UART的几个常用寄存器分别为: 

UART1_CR1:控制寄存器1 

UART1_CR3:控制寄存器3 

UART1_BRR2:波特率寄存器2 

UART1_BRR1:波特率寄存器1


利用控制寄存器1,2,3可以配置UART数据传输的具体帧格式,这里将UART配置为1个起始位,8个数据位,1个停止位,无校验位。具体操作代码如下:


      UART1_CR1=0x00;

      UART1_CR3=0x00;


在UART1_CR1中第4位,定义了数据字的长度,该位写0将设置UART为一个起始位,8个数据位,n个停止位,停止位n的数量可在UART1_CR3中设置。 

UART1_CR3的第4位和第五位用于设置停止位,这里写入00设置为1个停止位。


接下来,就是配置UART的波特率了.UART的波特率由UART的分频系数决定,波特率的计算公式为baudrate=Fmaster/UARTdiv,这里baudrate为要设置的波特率,Fmaster为主时钟频率,UARTdiv为UART分频系数。STM8上电主时钟默认使用经过8分频之后的内部16M HSI时钟源,即在不改变时钟配置的情况下,Fmaster=2MHz。 

如果要将波特率设置为9600,那么只要设置UART分频系数UARTdiv=2MHz/9600,约为:208.33333这里取整数208,其十六进制表示为0xD0,这要将这个值写入波特率寄存器中即可。


UART1_BRR2寄存器中的第0位到第3位存放了UART分频系数的第0位到第三位,UART1_BRR2寄存器中的第4位到第7位存放了UART分频系数的第12位到第15位。 

UART1_BRR1寄存器中的第0位到第7位存放了UART分频系数的第4位到第11位,


由此,我们可以得到写入波特率寄存器UART1_BRR1中的数据位0x0D,写入波特率寄存器UART1_BRR2中的数据位0x00。


另外,需要注意的是,必须先写寄存器UART1_BRR2,再写UART1_BRR1


 UART1_BRR2=0x00;

 UART1_BRR1=0x0d;


到这里就完成了对UART的配置过程,


STM8 UART 发送

对于STM8 UART发送,循环等待发送单个字节的方式这里不做详细解释。 

这里笔者利用UART的串口发送完成中断完成串口的发送过程。以提高CPU的工作效率以及降低功耗。 

首先必须要打开发送完成中断:


    UART1_CR2|=(1<<7);


打开发送完成中断之后,UART会发送一个空白帧,此时在我们的中断服务处理程序中会产生一个UART发送中断,我们只需要响应这个中断,并在产生这个中断中发送我们的数据,直到所有数据发送完毕,则禁止发送中断即可。UART中断发送部分完整代码如下:


u8* UartSendBuffer;

u8 UartSendDataLength;

void UART1_SendBuffer(u8* buffer){

  UartSendBuffer=buffer;

  UartSendDataLength=strlen((const char*)buffer);

  UART1_CR2|=(1<<7);

}

#pragma vector= UART1_T_TC_vector//UART1 Tx complete 中断

__interrupt void SYS_UART1_TX_IRQHandler(void){

  u8 status=UART1_SR;

  if(status & UART_IRQ_TXE){

    if(UartSendDataLength!=0){

      UART1_DR=*UartSendBuffer;

      UartSendBuffer++;

      UartSendDataLength--;

    }else{

      UART1_CR2&=~(1<<7);

    }

  }

}

注意:笔者使用的是IAR而不是STVP,使用STVP的童鞋,需要参照代码另做修改。


STM8 UART接收

STM8 UART中断接收只需要在初始化部分使能串口接收中断,响应中断服务程序读取数据即可:


UART1_CR2|=(1<<6);

推荐阅读

史海拾趣

ESTEK公司的发展小趣事

在电子行业竞争日益激烈的背景下,ESTEK公司也面临着诸多挑战和危机。然而,公司始终保持着清醒的头脑和坚定的信心。在面对市场波动、原材料价格上涨等挑战时,ESTEK公司迅速调整战略、优化生产流程、降低成本等措施,成功度过了危机。在危机中,ESTEK公司展现出了强大的韧性和生命力,为公司未来的发展奠定了坚实基础。

Amphenol(安费诺)公司的发展小趣事

在电子行业日益注重环保的背景下,ESTEK公司积极响应号召,致力于研发和生产绿色环保的电子产品。公司投入大量资金和资源,研发出了一系列符合环保标准的电子元件和设备。这些产品在市场上受到了广泛欢迎,不仅为公司带来了可观的经济效益,也为环保事业做出了积极贡献。

Dongguan City Niuhang Electronics Co.LTD公司的发展小趣事

Dongguan City Niuhang Electronics Co.LTD成立于2012年,当时的中国电子行业正处于快速发展期。创始人李小芹凭借对半导体技术的深刻理解和市场需求的敏锐洞察,决定专注于二极管、桥式整流器等产品的研发与封装。公司成立初期,面临着资金短缺、技术储备不足等挑战,但李小芹凭借坚定的信念和不懈的努力,带领团队攻克了一个又一个技术难关,逐步在市场上树立了良好的口碑。

BH Electronics公司的发展小趣事

近年来,随着环保意识的提高,BH Electronics积极响应国家绿色发展的号召,开始了绿色转型之路。公司加大了对环保技术的研发和应用力度,推出了一系列绿色环保产品。同时,BH Electronics还优化了生产流程,减少了能源消耗和废物排放。这些举措不仅提升了公司的环保形象,也为公司的可持续发展注入了新的动力。

这五个故事只是BH Electronics发展历程中的一部分,但它们却生动地展现了这家公司在电子行业中的崛起之路。从初创时期的筚路蓝缕,到技术创新的突破;从国际化战略的拓展,到品质管理的提升;再到绿色发展的转型,BH Electronics始终保持着敏锐的市场洞察力和不懈的创新精神。正是这些因素的共同作用,使得BH Electronics能够在激烈的市场竞争中脱颖而出,成为电子行业中的佼佼者。

Fujisoku Corporation公司的发展小趣事

随着全球化进程的加速,“未来电子”意识到单一市场已无法满足公司的长远发展需求。于是,公司制定了全球化战略,通过设立海外研发中心、生产基地和销售网络,积极拓展国际市场。在欧洲、北美和亚洲等地,“未来电子”的产品和服务得到了广泛认可,市场份额逐年攀升。这一战略不仅提升了公司的国际影响力,还为公司的持续增长提供了强劲动力。

Global Mixed-Mode Technology Inc公司的发展小趣事
校准和测试三相缺相报警灯电路的准确性,可以使用专业的测试仪器(如万用表、示波器等)来检测三相电的电压情况。首先,在正常情况下检查电路是否误报;然后,人为制造缺相情况(如断开某一相的电源),检查报警灯是否准确亮起并发出警报。通过反复测试和调整,可以确保电路的准确性和可靠性。

问答坊 | AI 解惑

关于数字波形实时更新

这几天调试关于数字波形实时更新的程序,发现更新做了几次后,就会报错。 考虑为硬件内存设置上的问题,采用do not allow regeneration 进行波形初始化,而后更新。 有人做这类似的吗?…

查看全部问答>

找高人给解释几个注册表项

; HIVE BOOT SECTION [HKEY_LOCAL_MACHINE\\init\\BootVars]         \"Flags\"=dword:00000003         \"SystemHive\"=\"Documents and Settings\\\\system.hv\"        ;system ...…

查看全部问答>

如何测试硬件的性能

公司现在做防火墙,我想问一下怎么测试纯硬件的性能,就是不考虑软件的影响…

查看全部问答>

求助:关于WinCE的背光驱动问题。

我想用流接口驱动模式来做一个LCD的背光驱动,主要是改变2410的PWM寄存器值,通过不同的占空比来控制LCD的背光亮度。 主要两个流接口是LBC_Init,LBC_IOControl. 我是想请问一下,操作系统是如何调用这个驱动的? 比如说,操作系统里设置了15s以 ...…

查看全部问答>

关于焊接

各位坛友好,我自己经常要焊接一些贴片电路板,量不大 就几十到一百个左右,自己焊接吧有点多,而且慢,出去找工厂吧人家嫌量小,要价就高,于是自己想买一个小型的焊接设备,大家给推荐一下 并且说说原理,谢谢了 我的要求不高大约在5000左右,能 ...…

查看全部问答>

编了两段程序,请求大家帮忙看看问题怎样改善

用ATmega16主控使八个流水灯以一秒闪一次,我不知道怎样编才能使八个流水灯按照顺序接到PD0~PD7引脚上……希望前辈们帮帮我 第一个程序是: #include<iom16v.h>#define uint  unsigned int#define unchar  unsigned charvoid Delay ...…

查看全部问答>

再组织一次DK-LM3S9B96开发板的团购吧

上一次在上课错过了~本来想想算了,但是一看到现在手头粗糙的arm板就耿耿于怀啊~~ 请求论坛在组织一次吧~ 有相同想法的同胞们回个帖子吧~~  …

查看全部问答>

9B96开发板

在开发板原本给的例程中,有关以太网i_o的部分,有俩个函数看不懂 一个是http_set_ssi_handler()      还有一个是http_set_cgi_handler() 我没找到原函数定义的文件  有的也解释的不是很清楚  我把这俩条语句 ...…

查看全部问答>

两块板子之间的CAN通讯

      两块5K31的板子,进行CAN通讯,请问时序上应该如何设置?如果一个只负责发送数据,另一个只负责接收数据,又怎么解决? (新板子的移植程序,两块板子分别跟老板子都能够进行CAN通讯,且协议一致了,再将两块一直程序后 ...…

查看全部问答>

对比方案赛+在实际中使用TPS5430和webench中设计对比

本帖最后由 youzizhile 于 2014-7-5 20:16 编辑 之前在学校中一直使用的linter或者lm78系列电源转换芯片较多,Ti的也有,但是工作之前不是一直长期使用的对象。后来再工作中,经常会和元器件物料代理商见面,谈论最新的产品技术或者是代理线的产 ...…

查看全部问答>