DMA+串口空闲中断 不定长接收及解析数据

打开DMA通道

按如下设置


mode设置为normal方式,即单次

确认串口中断使能

添加相关代码

使能串口空闲中断,开始第一次DMA接收

找到USART1_IRQHandler函数,加入处理逻辑

if(huart1.Instance == USART1)
    {
        if(RESET != __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))
        {
            __HAL_UART_CLEAR_IDLEFLAG(&huart1);
            myUARTIdleCallback();                          //调用中断处理函数
        }
    }

在回调函数中,可以使用__HAL_DMA_GET_COUNTER获取接收字节数,完成数据处理后,再次开启一次DMA传输HAL_UART_Receive_DMA(&huart1, (uint8_t*)receiveBuffer, 255);

总结

在接收串口数据时,一般会定义协议接收,通常使用轮询方式接收是不合适的,使用中断方式接收,每个字节将触发中断,高频的接收会影响其它系统执行逻辑,使用DMA+串口空闲中断的方式,效率更高,从串口外设到内存的过程,直接由硬件完成,中断时已经可以拿到整包数据,并且可以方便地接收不定长数据。

需要注意的是:

  • 串口空闲中断触发时间为1帧,即1帧时间内无数据接收则触发空闲中断,具体时间与波特率有关。
  • 这里的不定长数据接收是指已知数据的可能有效位数的情况下,比如我知道我的一包数据不会超过255字节,则将缓存区设置为255即可正常工作
  • 在无法预知数据具体多长的情况下,需要将DMA设置为circle模式,并结合DMA半完成中断、完成中断和串口空闲中断来处理数据,具体可以参考这个非常详细的例子:MaJerle/stm32-usart-uart-dma-rx-tx 目前应用场景用不到,就没有作深入地测试。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇