历史上的今天
今天是:2025年02月13日(星期四)
2020年02月13日 | STM8S103F3实现串口中断接,中断发功能
2020-02-13 来源:eefocus
一、首先进行UART1初始化
/*USART1 config*/
void USART1_Init(void)
{
/*Uart1*/
UART1_CR1=0x00;
UART1_CR2=0x00;
UART1_CR3=0x00;
// 设置波特率,必须注意以下几点:
// (1) 必须先写BRR2
// (2) BRR1存放的是分频系数的第11位到第4位,
// (3) BRR2存放的是分频系数的第15位到第12位,和第3位到第0位
// 例如对于波特率位9600时,分频系数=2000000/9600=208
// 对应的十六进制数为00D0,BBR1=0D,BBR2=00
//例如对于波特率位9600时,没有分频 = 16000000/9600 = 1666
//对应的十六进制数为0682,BBR1=68,BBR2=02
UART1_BRR2=0x02;
UART1_BRR1=0x68;
UART1_CR2 = 0x2c; //接收,发送使能,开接收中断
}
注意的事项:波特率的设置方式,在UART1初始化中打开了接收,发送使能,但是只打开了接收中断,而发送中断打开在哪里呢?接下来往下看。
二、接收中断服务函数中的操作过程
//将收到的数据再发送出去
#pragma vector= UART1_R_RXNE_vector //0x14
__interrupt void UART1_R_RXNE_IRQHandler(void)
{
u8 data;
if(UART1_SR & 0x20) //收到数据该位置位
{
UART1_SR &= ~0x20; //清接收中断标志位
rs485_data = UART1_DR;
Rev_Slaver_PrePare(data);
}
}
这里采用的接收中断方式不是采用while()去等待接受标志位完成,而是采用接收一个数据就传递一个数据到需要处理的函数,有人可能会说在接收中断中不要去做太多的事情,其实不然,在对接收数据处理函数中其实是对接收到的数据进行存储并不像复杂的逻辑运算而担心中断触发太久。处理函数这边就不贴出来,本文主要的目的是将接收,发送中断的处理方式。
三、发送中断处理方式
void USART1_SendArray(uint8_t *data,uint8_t len)
{
for(uint8_t i = 0;i < len;i++)
{
Tx1Buffer[count1++] = *(data + i);
}
#pragma vector= UART1_T_TC_vector //0x13
__interrupt void SYS_UART1_TX_IRQHandler(void)
{
if(UART1_SR & 0x80)
{
UART1_DR = Tx1Buffer[Tx1Counter++];
if(Tx1Counter == count1)
{
UART1_CR2 &= ~0x80; //关闭发送中断
}
}
}
UART1_CR2 |= 0x80; //直接开启发送中断}
需要发送的数据串,调用此发送函数,将会触发中断发送服务函数,在这里说明一点,stm8s103f3这款芯片的发送中断服务函数与接收中断服务函数不是同一个,这与stm32系列的芯片不太一样,后者是发送和接收中断共用同一个服务函数,在中断向量表中可观察到不同。
#pragma vector= UART1_T_TC_vector //0x13
__interrupt void SYS_UART1_TX_IRQHandler(void)
{
if(UART1_SR & 0x80)
{
UART1_DR = Tx1Buffer[Tx1Counter++];
if(Tx1Counter == count1)
{
UART1_CR2 &= ~0x80; //关闭发送中断
}
}
}
在进入中断发送服务函数中后,将要发送的数据串依次装入UART1_DR,这里就不需要想接受中断服务函数中需要清标志位,这边是硬件自动清除
上一篇:OSAL移植到STM8
下一篇:STM8 UART中断发,中断收
史海拾趣
|
2009年1月,工信部向移动、电信和联通三大运营商发放3G牌照,似乎一夜之间,3G的气息扑面而来。而到底如何认识3G对社会经济生活的影响?3G这条宽阔大道上到底会跑那几辆车?3G的未来发展如何?一系列问题成为业内业外人士争论的焦点.这都说明了全 ...… 查看全部问答> |
|
就普通照明而言,LED技术已经可以满足生产高品质灯具的要求,但是具体生产高品质LED灯具时,则需要掌握电力电子学、光学和热管理学等三个领域的知识。很少有同时精通於三个领域的工程师,而如果电源工程师还负责系统架构时,他多半会将更多精力放 ...… 查看全部问答> |
|
下载的朋友顶一下? XuX_NiosII嵌入式系统开发平台(简称:XuX_Nedp),是基于VMware Workstation桌面虚拟计算机软件,在Windows XP或者Windows 7上运行Fedora 14 Linux操作系统,进行Altera公司的NiosII软核CPU相关嵌入式系统开发、测试 ...… 查看全部问答> |
|
BUG_Zigbee CC2530 前提协调器的最大子设备数为20 1个协调器+大于等于21个子设备 即超过协调器所能携带的最大子设备,在这种情况下回发生子设备加入网络问题。当打开协调器建立网络,然后打开21个子设备此时有的子设备加入 ...… 查看全部问答> |




