- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《STM32_串口3种工作模式比较》.doc
STM32 串口3种工作模式比较
MCU:stm32f103 系列,串口有3种工作模式:查询、中断、DMA三种工作模式的例程在STM提供的lib里都有,在此目录下:\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\USART
1,查询查询最简单,效率也最低。
如要发送一个字节:
USART_SendData(EVAL_COM1, (uint8_t) ch);
/* Loop until the end of transmission */while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET){}
一直要等到发送完成后,才能继续,要知道串口的速度很低,MCU的速度很快,简直就是浪费。
上面程序可改进为:
USART1-DR = (u8) ch;
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET){}
2, 中断中断效率高,从51年代开始就已经使用,但如果发送/接收大量字节,会产生大量中断,影响整个系统效率。
在我的项目中,3个串口都用上,分别接控制台(console)、GSM 模块、汽车OBDII 的 KWP (k-line, k线),都不是属于需要大量传输数据的应用,而且在实际使用中,觉得中断会灵活、高效很多,所以这里着重介绍。
2.1, 串口发送环形队列为了使用方便,定义了一个结构体:struct icar_tx {u8 buf[TX_BUF_SIZE];
u8 *out_last;u8 *in_last;
bool empty;};
当需要发送数据时,只需要往队列里放入数据,in_last指针加1即可,当然会根据 in_last, out_last 指针,检查buffer 是否满,满的时候会加1ms延时,大约能发12个字节(以115200 k/b 估算);
只要empty标志不为真,就打开发送中断,开始发送数据,当然,如果缓冲为空时,会自动关闭发送中断,在中断里,会自动把 out_last 加1。
在应用程序更新指针及标志时,需要关闭发送中断,以免更新过程中,发生中断,相关指针被修改,从而影响判断结果。
2.2, 串口接收环形队列struct icar_rx {u8 buf[RX_BUF_SIZE];
u8 *out_last;u8 *in_last;
bool empty;bool full;bool lost_data;};
接收队列稍微复杂一点,当应用程序需要从buffer里取数据时,需要判断队列是否为空,如果标志 empty 为真,则无数据,否则可以取数据;另外,也要检查lost_data 标志,如果为真,说明接收队列已满,无法接受新数据,直接把新数据做丢弃处理,此时需要检查应用程序架构设计是否合理,因为mcu的速度是很快的(如72MHz),而串口速度比较慢(如115200 baud,约12k字节/秒),这样的条件下都发生接收数据丢失,真的需要改进应用程序。
3, DMA 方式DMA方式适合于高速设置的数据传输,但在我的应用中,Uart 的速度并不是很高,所以并不合适。DMA方式有个缺点,就是 STM32 的DMA通道有限,如果其它设备占用了通道,那么就不能使用,详见下表:同样也定义了一个结构,但用了2个buffer,做乒乓算法:当DMA正使用buf1时,需要发送到数据保存到buf2里;当buf2被DMA使用时,就保存到 buf1。struct icar_tx {u8 buf1[TX_BUF_SIZE];u8 buf2[TX_BUF_SIZE];
u32 buf1_cnt;u32 buf2_cnt;
bool use_buf1;bool use_buf2;};
接收功能没有用DMA方式,但原理是一样的,都可以开2个缓存,应用程序处理起来就麻烦一点。
如果有高人有很高效的办法,不妨介绍一下,谢谢。
上文提到的3种模式的驱动: stm32_uart.rar
文档评论(0)