zoukankan      html  css  js  c++  java
  • STM32空闲中断+DMA(转)

    文章参考自:STM32开发---USART接收不定长数据 (空闲中断+DMA)_zhouml_msn的博客-CSDN博客

    USART 的两种数据接收方式
    1:RENE - 非空中断

    最常用!代码简单!
    但数据处理时稍麻烦,常配合简单的数据协议,如判断某字符为接收结束标志。正点原子的代码中USART接收就是使用这种方式。每个字节中断一次。系统实时性要求较高时得注意, 如无人机等.

    2:IDLE - 空闲中断 + DMA

    最好用!
    DMA接收:无需代码干预,DMA自动把接收到的字节,顺序存放到指定数组缓存!
    空闲中断:自接收到上个字节完成起(RXNE=1),超过一个字节周期时长没收到新数据,产生硬件中断(USART的SR第4位IDLE被置1),这时USART_IRQHANDLER()函数被调用,用户可在这里识别中断的类型,并做数据处理。
    空闲中断-使用场景
    适用:绝大部分场景都适用。

    不适用:接收的字节数据间隔,大于1字节周期时长的! 如正点原子的LORA模块,硬件机制1ms传送1个字节,即115200波特率下接收一字节用90us,但后面900us左右间隔是闲置的,这类机制,不适合使用空闲中断。

    代码编写注意坑点
    1. IDLE的中断清理方式.

    USART的非空中断标志位, 是自动清理的, 你只要读出数据, 标志会就自动被清, 不用自己费心.
    但IDLE的中断标志位, 必须通过软件序列清零, 步骤如下:
    u32 temp;
    temp=USART1->SR;
    temp=USART1->DR;
    这两句顺序还不能错, 之前没细心看手册, 调试差点爆血管. 前人不说, 撞墙也想不出来这前因后果!!
    2. DMA 设置

    使用DMA时, 一般会设置明确的传输数据量, 就是长度是已知道的; 而IDLE 空闲中断 , 最方便的就是接收不定长数据.
    所以NDTR(传输数量)要设得比实际数量要大, 注意单位:你的字长, 如200. 大多少没关系.
    中断处理时, 要重新设置DMA的NDTR. 另外: DMA是在关闭的时候才能修改!!

  • 相关阅读:
    原生ajax书写
    java 中的instanceof
    Leetcode-Python3
    快速读入挂
    HDU 6044 Limited Permutation(2017多校)【计数 快速读入挂 线性逆元】
    HDU 6015 Colorful Tree(2017多校)
    HDU 6034 【贪心】
    POJ 3415 Common Substrings 【长度不小于 K 的公共子串的个数】
    POJ Football Game 【NIMK博弈 && Bash 博弈】
    2018
  • 原文地址:https://www.cnblogs.com/yeshenmeng/p/15430187.html
Copyright © 2011-2022 走看看