大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说串口usart工作需要设置哪些参数_串口中断设置,希望您对编程的造诣更进一步.
嵌入式系统中应用最广泛的一种通讯设备,只要三根线(TX,RX,GND),合适低速长距离通讯。发送和接收的控制流程如下:
1.初始化串口
包括使能串口时钟,使能发送和接收,定义引脚,波特率,数据位长度,奇偶校验方式,停止位位数。
使能串口模块接收中断,此时不能使能发送中断[炸弹]。
使能全局串口中断并设置优先级。
定义一个接收超时定时器,设置好超时值,并使能超时中断,这此定时器是关闭状态。
2. 发送
定义控制结构,
typedef struct txCtrl{
u8 buf[TX_SIZE],//根据最长发送帧定义大小
u8 idx;
u8 len;//实际数据长度
}txCtrl_t;
txCtrl_t txCtrl;
2.1 数据准备
将发发送的数据装到txCtrl.buf,txCtrl.len=数据长度,txCtrl.idx=0。
2.2 启动发送
uartSend()
{
//马上触发中断
使能发送缓冲器空中断;
}
3. 接收
接收数据时会遇到一个问题,就是接到数据字节数是多少?一个帧数据接接收到什么时候才算结束?
解决这个问题,我们要使用到定时器。其原理是,接收到数据时,使能定时器,并设置超时时间为串口传输一个或几个字节的时间,注意,这个时间是随波特率变化的。如果定时器超时了,意味差这个帧结束了。
比如9600的波特率,起始位1,停止位1位,数据位8位,奇偶校验位0位,传输一个字节共10位的时间大约 10/9600=1ms.
定义控制结构,
typedef struct rxCtrl{
u8 buf[RX_SIZE],//根据最长接收帧定义大小
u8 len;//接收到的数据长度
}rxCtrl_t;
rxCtrl_t rxCtrl;
4. 中断服务
有两个中断服务要处理,一个是串口中断,一个是接收定时器超时中断。
串口中断
void usartISR(void)
{
if( 发送结束中断标志==1 )
{
清除此标志
关闭发送结束中断功能
}
if( txCtrl.len>0 )
{
//把数据装入串口数据寄存器
DR = txCtrl.buf[txCtrl.idx++];
txCtrl.len--;
//最后一个字节
if( txCtrl.len == 0 )
{
关闭发送缓冲器空中断,
使能发送结束中断功能
}
}
//收到数据
if(接收数据缓冲器非空中断标志==1 )
{
使能并装填定时器的超时值
rxCtrl.buf[rxCtrl.len++] = RD;
}
}
接收定时器超时中断
void timerOutISR(void)
{
Recevied = TRUE;//通知主程序处理
}
主程序
if(Recevied)
{
处理长度为rxCtrl.len的接收数据
//处理完要设置len为0
rxCtrl.len=0;
Recevied=FALSE;
}
注意⚠️,启动发送是使能发送缓冲器空中断,在发送最后一字节时关闭并使能发送完成中断,这样效率最高。也可以不用发送缓冲器空中断,都改用发送完成中断,但这样效率降低很多。
后面还会讲DMA方式,有什么不明白的,欢迎请留言。
码字很辛苦,谢谢转发与点赞。
9DB针引脚定义
串口数据帧示意
USB转接串口
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/11956.html