• 正文
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

STM32 DMA串口接收到数组,数组元素顺序错乱怎么办

2024/12/12
872
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

提问:

配置DMA循环模式,使用HAL_UART_Receive_DMA(&huart1,buffer,4)函数将串口数据循环发送到4个元素的buffer数组内,上位机20ms发送一次数据。理论上讲上位机发送数据的数量和顺序都是固定的——比如AABA,可是现在有干扰——有一次上位机多发送了一个数据——变成了CAABA,根据DMA循环原理,存到数组里的数据就变成了AAAB——并且还是根据DMA循环原理——数组里的数据至此之后永远都是AAAB,如何才能让它重新变成AABA呢?有没有办法能找到DMA自动递增的那个指针?把那个自动递增指针重新给它置零?

最新回答

  • 通常,我们做IAP设计时使用 两个相对 独立的工程,分别是BOOTLOADER和APPLICATION区。
    前者重点是接收固件代码、完成Flash编程。后者通常是实际的用户功能性应用程序代码。

    显然,很多外设,比方UART/TIMER/GPIO以及核外设NVIC,可能在BOOT区和APP区都会用到。

    但各用各的,配置及初始化也是根据当前工程需要具体配置,外设配置、变量定义跟在另外一个
    运行区没有关联。

    具体点说,即使同一个UART,BOOT区可以配置8bit 115200,APP区可以配置为7位 9600。两个代码区的UART收发
    缓冲定义其实也是各自定义、各不相干。

    一般来讲,中断矢量表位置也是各定义各的。即不同代码区的中断矢量入口地址都是相互独立的。以UART中断服务程序为例,
    即使服务程序代码一样,发生中断事件时,中断服务程序的入口是不一样 的。其中,Cortex-M0核芯片稍微特殊点,另当别论。

    Bootloader中的全局变量和静态变量在跳转到APP后不再有效,因为APP会重新初始化自己的全局变量和静态变量。反之亦然。

    不过,如果说在当前代码区使用了动态内存分配(例如malloc),跳转到另一代码区后,这些内存估计仍然占据着内存

    空间,我们可以在跳转前先行释放这些内存。

  • 将DMA配置为循环模式,这样DMA会在缓冲区满时自动回到缓冲区的开始处继续接收数据。这种方法适用于连续数据流的接收,可以避免数据丢失。
    使用两个缓冲区,当一个缓冲区正在被处理时,DMA可以继续在另一个缓冲区中接收数据。这样可以避免因处理数据不及时而导致的数据覆盖问题。

相关推荐

电子产业图谱