分享

USART串口通信,中断方式,一分钟从菜鸟到大师(完整版)

 xpxys99 2019-08-10

嵌入式系统中应用最广泛的一种通讯设备,只要三根线(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;}

注意⚠️,启动发送是使能发送缓冲器空中断,在发送最后一字节时关闭并使能发送完成中断,这样效率最高。也可以不用发送缓冲器空中断,都改用发送完成中断,但这样效率降低很多。

后面还会讲DMA方式,有什么不明白的,欢迎请留言。全是自己码出来了~~

USART串口通信,中断方式,一分钟从菜鸟到大师(完整版)

9DB针引脚定义

USART串口通信,中断方式,一分钟从菜鸟到大师(完整版)

串口数据帧示意

USART串口通信,中断方式,一分钟从菜鸟到大师(完整版)

USB转接串口

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多