搜索
查看: 10905|回复: 26

[STM32F769-DISC] 【F769IDISCOVERY评测】串口接收超时中断和字符匹配中断

  [复制链接]

该用户从未签到

60

主题

2111

帖子

31

蝴蝶豆

版主

最后登录
2023-6-21
发表于 2016-12-10 18:05:04 | 显示全部楼层 |阅读模式
         在如今这个需要快速开发设计出产品的时代,模块化的东西越来越方便快捷,在各种模块使用的接口里面串口应该是比较常见和常用的,串口蓝牙模块,串口WIFI模块等等,除此之外串口还常用于和客户产品进行通信中也比较方便,因此一个接收发送数据等功能完善的串口对项目开发来说非常重要。(STM32官网


在ST发布比较新的系列的ARM芯片中,串口已经非常强大,下面我们就简单测试几个比较常用的功能。


  1、接收超时中断+DMA接收不定长数据

   如果我们想要用串口接收一段长度不确定的数据,比较常见的做法是空闲中断配合DMA或者自己使用定时器进行一个超时判断来确定一帧长度数据接收完成,除此之外在STM32F7系列中串口有一个Receiver timeout 中断,使用这个接收超时中断配合DMA可以很方便的接收不定长数据。
   接收超时中断用于串口在接收到最后一个字符后,在设置的超时时间内没有接收到新的数据便会触发。


uartouttime.png

   接收超时中断的设置超时时间是以串口接收一个bit的持续的时间为单位,这个时间和波特率有关系实际使用中可以根据具体情况进行调整,然后设置超时多少个这样的持续时间才会触发中断。

   RTO.png

接收超时设置和中断回调函数如下
  1. //打开或者关闭串口接收超时
  2. void USART_ReceiverTimeOutCmd(USART_TypeDef* USARTx, FunctionalState NewState)
  3. {
  4.   if (NewState != DISABLE)
  5.   {

  6.     USARTx->CR2 |= USART_CR2_RTOEN;
  7.   }
  8.   else
  9.   {

  10.     USARTx->CR2 &= (uint32_t)~((uint32_t)USART_CR2_RTOEN);
  11.   }
  12. }

  13. //设置串口接收超时时间
  14. void USART_SetReceiverTimeOut(USART_TypeDef* USARTx, uint32_t USART_ReceiverTimeOut)
  15. {
  16.   USARTx->RTOR &= (uint32_t)~((uint32_t)USART_RTOR_RTO);
  17.   USARTx->RTOR |= USART_ReceiverTimeOut;
  18. }
  19. //接收超时中断回调函数
  20. void UART_ReceiverTimeOut_Callback(UART_HandleTypeDef *huart)
  21. {
  22.     uint16_t len;
  23.     uint32_t tmp1 = 0;
  24.     tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_RTOF);
  25.     if((tmp1 != RESET))
  26.     {
  27.         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_RTOF);
  28.         /* set uart state  ready*/
  29.         huart->RxState = HAL_UART_STATE_READY;
  30.         /* Disable the rx  DMA peripheral */
  31.         __HAL_DMA_DISABLE(huart->hdmarx);
  32.         /*Clear the DMA Stream pending flags.*/
  33.         __HAL_DMA_CLEAR_FLAG(huart->hdmarx, __HAL_DMA_GET_TC_FLAG_INDEX(huart->hdmarx));
  34.         /* get rx data len */
  35.         len = huart->hdmarx->Instance->NDTR;
  36.         U1_Rxlen = RXBUFFLENGTH - len;
  37.         /* Process Unlocked */
  38.         __HAL_UNLOCK(huart->hdmarx);
  39.         
  40.        huart->hdmarx->State = HAL_DMA_STATE_READY;

  41.         HAL_UART_Receive_DMA(huart, U1_RxBuff, RXBUFFLENGTH);
  42.     }
  43. }
复制代码
在演示程序的mian函数中我们将接收到的数据使用dma再发送到串口
  1. //串口接收超时中断测试
  2. //2016年12月10日
  3. //creep

  4. int main(void)
  5. {
  6.   CPU_CACHE_Enable();
  7.   HAL_Init();
  8.   SystemClock_Config();
  9.   USART1_Init();
  10.   while (1)
  11.   {
  12.         if(U1_Rxlen)
  13.         {
  14.             HAL_UART_Transmit_DMA(&UartHandle, U1_RxBuff, U1_Rxlen);
  15.             U1_Rxlen = 0;
  16.         }
  17.   }
  18. }
复制代码
下面的演示可以看到调试串口助手可以发送不定长的任意数据到串口,然后串口将接收的数据在发送到调试串口:

outtime.gif

上面的演示中发送和接收字符串开始和结尾带有特殊的◇和■是因为串口助手的时间戳和分包显示导致,实际接收和发送的数据不受影响:

sscom.png

2、字符匹配中断

   STM32F7系列串口还有一个中断叫 Character match中断,主要功能就是检测到串口收到某个字符后产生中断,这个字符可以设置为一个字节的长度。
要使用这个中断比较简单,只需要设置要匹配的字符然后使能中断即可。设置匹配的寄存器如下:

   add.png

匹配字符设置和中断回调函数如下:
  1. //设置匹配的检测字符
  2. void USART_SetCharactermatch(USART_TypeDef* USARTx, uint8_t  match)
  3. {

  4.   USARTx->CR2 &= (uint32_t)~((uint32_t)USART_CR2_ADD);
  5.   USARTx->CR2 |= match << 24;
  6. }
  7. //字符匹配中断回调函数
  8. void UART_Charactermatch_Callback(UART_HandleTypeDef *huart)
  9. {
  10.    
  11.     uint32_t tmp1 = 0;
  12.     tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_CMF);

  13.     if((tmp1 != RESET))
  14.     {        
  15.         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_CMF);
  16.         huart->RxState = HAL_UART_STATE_READY;
  17.         CharMatchSta = ENABLE;
  18.         CharMatchVal = USART3->RDR;
  19.     }
  20. }
复制代码
mian函数如下,如果检测到匹配字符,回复串口助手 “Receive Match Character”,如果收到的字符不是匹配字符不回复任何数据
  1. //串口接收字符匹配中断测试
  2. //2016年12月10日
  3. //creep

  4. int main(void)
  5. {
  6.   CPU_CACHE_Enable();
  7.   HAL_Init();
  8.   SystemClock_Config();
  9.   USART1_Init();
  10.   while (1)
  11.   {
  12.         if(CharMatchSta)
  13.         {
  14.                 printf("Receive Match Character\r\n");
  15.                 CharMatchSta = DISABLE;
  16.         }
  17.   }
  18. }
复制代码
我们首先设置匹配字符'a',然后可以看到发送a的时候回收到应答,发送不是a的时候收不到应答:

a.gif

然后我们再设置匹配字符为hex的0x41(既是ascii的A)

A0.gif


3、字符匹配中断+DMA
     
     字符匹配中断如何配合DMA使用也可以接收一个特殊的字符串,或许在特殊的情况下能起到事半功倍的效果。 同样下面在测试中我们将收到的数据通过串口发的串口助手,匹配字符设置为a。
a) 发送多个字符串,当发送的字符中有a时会收到之前发送的所有的字符串


123a.gif

b)发送任意长度的以a结尾的字符串


alla.gif

c)发送的字符a后面还有字符串 类似 "hello world a Hi, I  AM CREEP"这样的字符

rrr.gif


通过上面3种不同字符串类型我们可以看到字符匹配中断和DMA配合使用可以很方便实现接收一些特殊类型的字符串。

4、串口的其他功能

  除了上面的超时中断和字符匹配中断之外,STM32f7还有很多其他的功能,比如波特率自动检测,TX/RX交换,Binary Data 倒置,空闲中断,END of Block 中断等等功能,总之ST的新的系列的芯片的串口真的是越来约强大了,这无疑给我们的开发和使用带来非常大的方便。
上面的测试代码只对基本的功能做演示和验证,如果要在实际的项目和产品中使用还需要对相应的功能更加仔细的研究和严格的验证。

延伸阅读:  
波特率自动识别

测试代码:

USART_ReceiverTimeOut_DMA.rar (865.88 KB, 下载次数: 131)

评分

参与人数 1ST金币 +30 收起 理由
zero99 + 30

查看全部评分

回复

使用道具 举报

该用户从未签到

60

主题

2111

帖子

31

蝴蝶豆

版主

最后登录
2023-6-21
 楼主| 发表于 2016-12-12 13:54:15 | 显示全部楼层
风子 发表于 2016-12-12 12:34
那个是屏幕录制搞的?什么软件?

gif 录制软件:

licecap-屏幕操作录制为gif.rar (158.25 KB, 下载次数: 23)
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

703

帖子

0

蝴蝶豆

金牌会员

最后登录
2018-6-15
发表于 2016-12-10 19:07:20 | 显示全部楼层
谢谢分享                     
回复 支持 反对

使用道具 举报

该用户从未签到

41

主题

2582

帖子

282

蝴蝶豆

论坛元老

最后登录
2021-4-1
发表于 2016-12-10 19:17:57 来自手机 | 显示全部楼层
好强大的串口
回复 支持 反对

使用道具 举报

该用户从未签到

60

主题

2111

帖子

31

蝴蝶豆

版主

最后登录
2023-6-21
 楼主| 发表于 2016-12-10 19:59:57 | 显示全部楼层

我也是看参考手册才发现新出的系列的串口功能真多。
回复 支持 反对

使用道具 举报

该用户从未签到

29

主题

1285

帖子

59

蝴蝶豆

论坛元老

最后登录
2021-6-27
发表于 2016-12-10 20:43:44 | 显示全部楼层
超时中断是不是F7新添加的新功能?F4上都没见过
回复 支持 反对

使用道具 举报

该用户从未签到

60

主题

2111

帖子

31

蝴蝶豆

版主

最后登录
2023-6-21
 楼主| 发表于 2016-12-10 20:51:14 | 显示全部楼层
斜阳__ 发表于 2016-12-10 20:43
超时中断是不是F7新添加的新功能?F4上都没见过

我用的F1/F4时也没有看到过这个超时中断和字符匹配中断,L0/F0/F7这些后面的系列好像都有这些中断了。
回复 支持 反对

使用道具 举报

该用户从未签到

64

主题

809

帖子

23

蝴蝶豆

实习版主

最后登录
2021-4-25
发表于 2016-12-10 21:50:56 | 显示全部楼层

谢谢分享         
回复 支持 反对

使用道具 举报

该用户从未签到

74

主题

1442

帖子

194

蝴蝶豆

版主

最后登录
2023-10-26
发表于 2016-12-10 22:49:27 | 显示全部楼层
古老串口的潜在功能一样需要得到新变化
回复 支持 反对

使用道具 举报

该用户从未签到

60

主题

2111

帖子

31

蝴蝶豆

版主

最后登录
2023-6-21
 楼主| 发表于 2016-12-10 23:05:15 | 显示全部楼层
wolfgang2015 发表于 2016-12-10 22:49
古老串口的潜在功能一样需要得到新变化

可能兼容不好做,要不F1/F4这些发布较早的系列也可以加入这些新功能了,而且这些系列用户群目前应该是最多的。
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

796

帖子

2

蝴蝶豆

金牌会员

最后登录
2019-3-6
发表于 2016-12-12 08:42:42 | 显示全部楼层
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-28 19:41 , Processed in 0.247681 second(s), 48 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表