搞这个,起因呢,公司产品里ZigBee模块固件版本不对,一大批产品需要二次升级。
需要升级的ZigBee模块是直接与stm32相连的,没有引出升级口,所以得搞个串口直通程序,通过232转MCU再转ZigBee,来进行升级。
一开始直接中断互通,结果呢,通倒是可以通,一升级固件就不行了,大概是因为数据量较大吧。
所以用了DMA,之前也没用过DMA,就慢慢学慢慢模仿着改呗。
这里要涉及到一个点,DMA的外设到外设,经常写的是,DMA只有外设到内存、内存到外设、内存到内存三种模式。
实际上,DMA是可以外设直接到外设的,而且用法非常非常简单,直接设置成外设到内存或内存到外设模式,然后把内存直接改成外设的地址,就可以了。
下面是我的程序,单片机是STM32F407,usart3和usart6 互通。
https://download.csdn.net/download/qq_36192233/11983754
说是互通,其实只有一路是DMA外设到外设。
一方面,只有下载一向有大量数据;一方面,usart3返回usart6,DMA外设到外设行不通。
这一点卡了我很久,一路我没多久就调好了,但返回的那一路我懵了几天。
我就搞不懂,凭啥数据进的来回不去,明明是几乎一模一样的配置。
我以为是配置问题,各种在网上找DMA配置的程序,然后对比参照着改配置,无果。
最后才发现,这一路就是通不了的。
注意图片下那一行,简单地说,所有的用DMA1的外设,都搞不通,人家DMA1外设端口压根不在总线矩阵。
所以,用外设到外设之前,必须得先考虑一下这一点,不行的话,还是老老实实配两次DMA加好中断吧。
特别是stm32F4系列,据说f1系列都是可以的。