stm32f4xx系统总线架构
最近有人在STMCU社区网站咨询如下问题:
由于实验需要,要用到STM32F407的两个DMA并用定时器触发,在使用过程中发现DMA1无法把GPIO的IDR上的数据传输到内存,调试过程中出现DMA1的数据流传输错误标志,但是使用DMA2没有问题。然后我看了下参考手册上两个DMA的控制系统实现图,DMA1的外设端口有一个桥接器把APB1和AHB1连起来,不知道这个桥连器作用是什么?是把APB1和AHB1连起来互相访问吗? 另外测试把GPIO的IDR改成APB1下的tim5的ARR,DMA1正常工作。请问这是怎么回事?
咨询者提到STM32F4系列中的两个DMA,即DMA1与DMA2,AHB到APB桥接器;再就是两个外设,GPIO和TIM5 。为了弄清这个问题,我们有必要先看看STM32F407的总线与存储框架图。 如下图所示:
STM32F4系统存储及总线框图
整个系统架构由多层32位AHB总线矩阵及主从总线构成,并建立起各个主从模块间的互联访问。
图中方框内纵横交错的矩阵线就是总线矩阵,犹如纵横交错的公路,让各类交通工具在里面同时运行而互不干扰。只有在图中红色箭头所指的地方,可能出现主控总线访问撞车的时刻,此时总线矩阵会按照一定规矩进行仲裁,即谁先谁后而不会发生交通事故。
总线矩阵跟图中上方的8条主控总线和右方的7条从控总线保持互联。
八条主控总线: [主控总线简单点说就是可以用来主动访问别的外设的通路]
—Cortex?-M4F 内核 I 总线、D 总线和 S 总线
—DMA1 存储器总线
—DMA2 存储器总线
—DMA2 外设总线
— 以太网 DMA 总线
—USB OTG HS DMA 总线
● 七条被控总线:
— 内部 Flash ICode 总线
— 内部 Flash DCode 总线
— 主要内部 SRAM1 (112 KB)
— 辅助内部 SRAM2 (16 KB)
— 辅助内部 SRAM3 (64 KB)(仅适用于STM32F42xxx 和 STM32F43xxx 器件)
—AHB1 外设(包括 AHB-APB 总线桥和 APB 外设)
—AHB2 外设 —FSMC
借助于总线矩阵,可以实现主控总线到被控总线的访问,可以实现多个高速外设并发访问和高效运行。[需要注意的是,对于STM32F4系列,图中64K CCM并不经过总线矩阵,只能被CPU访问。自然DMA是不能访问它的。]
好,我们接着看看STM32F407 的两个通用DMA,即DMA1和DMA2。
这两个DMA都具有双AHB总线访问端口,一端用于存储器访问,另一端用于外设访问。同时它们各自都有一个AHB从编程接口,这个不难理解,对它配置编程控制总得有个接口。
DMA总线访问框图
我们结合这幅DMA总线访问框图和上面的系统存储总线框架图可以明显看出,2个DMA的外设访问端口的总线连接有点不一样。
DMA2的外设访问端口既与总线矩阵相连,又与AHB-APB桥2相连,可以进一步访问APB2外设。而DMA1却没有与总线矩阵相连,只是跟AHB-APB桥1相连,可以进一步访问APB1外设。[红色方框代表总线矩阵]
现在的问题说DMA1访问不了GPIO,但如果换成TIM5就可以。我们可以去芯片数据手册的Device overview部分查看相关总线和外设分布图。我截取STM32F40xblock diagram的部分如下:
我们可以看出GPIO外设跟AHB1相连;TIM5跟APB1相连。而我们从DMA访问框图看得清楚,DMA1的外设端口根本没连接AHB1,自然没法访问相应外设,比如GPIO,而DMA2 可以,因为它可以经过总线矩阵后去访问AHB1的外设。
那DMA1为什么能访问TIM5呢,因DMA1的AHB外设端口总线经过AHB/APB1桥后就可以访问APB1各类外设,比方TIM5等。
至于咨询者问到的两个桥接器的作用,没啥过多需要解释的。桥嘛,连接第一;然后两边时钟的同步和时钟分频,满足不同外设的时钟需求。
ST MCU的参考手册里强调了只有DMA2能实现MEMORY到MEMORY的传输,DMA1是实现不了的,原理类似。因为要实现M to M 的传输,必须两个端口都能实现对MEMORY的访问,DMA1的AHB外设端口无法访问到内部MEMORY。
咨询者的问题,基本上靠看上面几幅图可以得到答案。这些图很重要,很多信息用图描述也很直观明了。各技术手册里的插图往往大有乾坤,不要视而不见。上面提到的都是基于STM32F4系列的总线架构,你也可以去看看STM32其它系列的系统总线框图,相信你一定会另有发现和收获。