历史上的今天
今天是: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);
上一篇:MSP430串口接收控制LED
下一篇:MSP430 中ADC12用法
史海拾趣
|
这几天调试关于数字波形实时更新的程序,发现更新做了几次后,就会报错。 考虑为硬件内存设置上的问题,采用do not allow regeneration 进行波形初始化,而后更新。 有人做这类似的吗?… 查看全部问答> |
|
; HIVE BOOT SECTION [HKEY_LOCAL_MACHINE\\init\\BootVars] \"Flags\"=dword:00000003 \"SystemHive\"=\"Documents and Settings\\\\system.hv\" ;system ...… 查看全部问答> |
|
我想用流接口驱动模式来做一个LCD的背光驱动,主要是改变2410的PWM寄存器值,通过不同的占空比来控制LCD的背光亮度。 主要两个流接口是LBC_Init,LBC_IOControl. 我是想请问一下,操作系统是如何调用这个驱动的? 比如说,操作系统里设置了15s以 ...… 查看全部问答> |
|
用ATmega16主控使八个流水灯以一秒闪一次,我不知道怎样编才能使八个流水灯按照顺序接到PD0~PD7引脚上……希望前辈们帮帮我 第一个程序是: #include<iom16v.h>#define uint unsigned int#define unchar unsigned charvoid Delay ...… 查看全部问答> |
|
上一次在上课错过了~本来想想算了,但是一看到现在手头粗糙的arm板就耿耿于怀啊~~ 请求论坛在组织一次吧~ 有相同想法的同胞们回个帖子吧~~ … 查看全部问答> |
|
两块5K31的板子,进行CAN通讯,请问时序上应该如何设置?如果一个只负责发送数据,另一个只负责接收数据,又怎么解决? (新板子的移植程序,两块板子分别跟老板子都能够进行CAN通讯,且协议一致了,再将两块一直程序后 ...… 查看全部问答> |
|
对比方案赛+在实际中使用TPS5430和webench中设计对比 本帖最后由 youzizhile 于 2014-7-5 20:16 编辑 之前在学校中一直使用的linter或者lm78系列电源转换芯片较多,Ti的也有,但是工作之前不是一直长期使用的对象。后来再工作中,经常会和元器件物料代理商见面,谈论最新的产品技术或者是代理线的产 ...… 查看全部问答> |




