zoukankan      html  css  js  c++  java
  • 串口配合DMA接收不定长数据(空闲中断+DMA接收)-(转载)

    1、空闲中断和别的接收完成(一个字节)中断,发送完成(发送寄存器控)中断的一样是串口中断;

    2、空闲中断是接收到一个数据以后,接收停顿超过一字节时间  认为桢收完,总线空闲中断是在检测到在接收数据后,数据总线上一个字节的时间内,没有再接到数据后发生。也就是RXNE位被置位之后,才开始检测,只被置位一次,除非再次检测到RXNE位被置位,然后才开始检测下一次的总线空闲。一次RXNE位被置位只进行一次。

    实现思路:

        采用串口1,并配置成空闲中断模式且使能DMA接收,并同时设置接收缓冲区和初始化DMA。那么初始化完成之后,当外部给单片机发送数据的时候,假设这帧数据长度是100个字节,那么在单片机接收到一个字节的时候(RXNE位被置位)并不会产生串口中断,而是DMA在后台把数据默默地搬运到你指定的缓冲区里面。当整帧数据发送完毕之后(接收停顿超过一字节时间)串口才会产生一次中断,此时可以利用DMA_GetCurrDataCounter();函数计算出本次的数据接受长度,从而进行数据处理。

        就是在串口空闲中断中使用 Usart1RecLen = DMARecLen-DMA_GetCurrDataCounter(DMA1_Channel5); //算出接本帧数据长度 = DMA缓存的大小 - 剩余 DMA缓存大小

        配置时候注意:

        USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//开启空闲中断

        DMA_InitStructure.DMA_BufferSize = DMA_Rec_Len;  //DMA通道的DMA缓存的大小

     刘乾文
  • 相关阅读:
    一键启动frida server的cmd脚本
    AES加密的S盒和逆S盒的推导代码备份(C实现)
    windows android ndk的某些编译工具报错乱码0x5 或拒绝访问05
    cygwin的sh: line 15: $' ': command not found错误
    一种JNI混淆方案
    android上的bin/sbin/xbin等各种目录
    Mac OSX bash function 备份
    Xposed免重启调试工具类
    vscode调试vue代码
    爬取ESRI疫情地图数据
  • 原文地址:https://www.cnblogs.com/-colin/p/9915642.html
Copyright © 2011-2022 走看看