最近有人在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其它系列的系统总线框图,相信你一定会另有发现和收获。

stm32f4xx系统总线架构的更多相关文章

  1. linux驱动程序之电源管理之新版linux系统设备架构中关于电源管理方式的变更

    新版linux系统设备架构中关于电源管理方式的变更 based on linux-2.6.32 一.设备模型各数据结构中电源管理的部分 linux的设备模型通过诸多结构体来联合描述,如struct d ...

  2. (系统架构)标准Web系统的架构分层

    标准Web系统的架构分层 1.架构体系分层图 在上图中我们描述了Web系统架构中的组成部分.并且给出了每一层常用的技术组件/服务实现.需要注意以下几点: 系统架构是灵活的,根据需求的不同,不一定每一层 ...

  3. 标准Web系统的架构分层

    标准Web系统的架构分层 – 转载请注明出处 1.架构体系分层图 在上图中我们描述了Web系统架构中的组成部分.并且给出了每一层常用的技术组件/服务实现.需要注意以下几点: 系统架构是灵活的,根据需求 ...

  4. Android系统四层架构分享

    Android系统四层架构 个人网站:http://www.51pansou.com Android视频下载:Android视频 Android源码下载:Android源码 如果把Android系统看 ...

  5. 基于Flume的美团日志收集系统(一)架构和设计

    美团的日志收集系统负责美团的所有业务日志的收集,并分别给Hadoop平台提供离线数据和Storm平台提供实时数据流.美团的日志收集系统基于Flume设计和搭建而成. <基于Flume的美团日志收 ...

  6. IA32系统级架构总览(一) 实模式和保护模式

    应用程序的编写大部分的时候是不必关心系统级架构的,最多学习一下平台所给的API即可,也就是我们通常说的黑箱子.但是在学习操作系统的时候,系统级架构是要关心的. 系统级架构很难学习,其中一个很大的原因是 ...

  7. 【安卓面试题】简述一下Android系统的架构?

    安卓系统的架构分为四层:应用程序层,应用框架层,系统框架层和内核层. 应用程序层:开发者编写的供用户使用的应用 应用框架层:开发者构建应用程序可能用到的API, 例如ActivityManager 系 ...

  8. SaaS系列介绍之十三: SaaS系统体系架构

    1 系统体系架构设计 软件开发中系统体系架构决定了一个系统稳定性.健壮性.可扩展性.兼容性和可用性,它是系统的灵魂.体系架构是架构师所关注的核心.良好的体系架构是系统成功的开端,否则,再好的代码与设计 ...

  9. 标准Web系统的架构分层[转]

    标准Web系统的架构分层 – 转载请注明出处 1.架构体系分层图 在上图中我们描述了Web系统架构中的组成部分.并且给出了每一层常用的技术组件/服务实现.需要注意以下几点: 系统架构是灵活的,根据需求 ...

随机推荐

  1. 20155320 2016-2017-2《Java程序设计》第九周学习总结

    20155320 2016-2017-2<Java程序设计>第九周学习总结 教材学习内容总结 第十六章 JDBC简介 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 ...

  2. 20155334 2016-2017-2 《Java程序设计》第一周学习总结

    20155334 2016-2017-2 <Java程序设计>第一周学习总结 教材学习内容总结 第一章主要讲了Java的前世今生以及Java的三大平台(Java SE.Java EE.Ja ...

  3. 【洛谷P2016】战略游戏

    题面 题解 树形\(dp\)(最大独立集) 设\(f_{i,0/1}\)表示\(dp\)到第\(i\)个点,在这个点放了(没放)士兵的最小花费 直接转移即可. 代码 #include<cstdi ...

  4. 记录使用jQuery和Python抓取采集数据的一个实例

    从现成的网站上抓取汽车品牌,型号,车系的数据库记录. 先看成果,大概4w条车款记录 一共建了四张表,分别存储品牌,车系,车型和车款 大概过程: 使用jQuery获取页面中呈现的大批内容 能通过页面一次 ...

  5. WordPress用户导入Drupal7并登录

    用户导入比较简单.使用Feeds模块中的Feeds Import工具就行. 不过有个不好地方的,导入前密码是明文,导入后该模块会自动转换为Drupal加密后的密码. 这需要导入后原wp的用户也能登录d ...

  6. 【excle基础】如何去掉excel某一列中的字段的空格

    如图所示,想要去掉A列的空格: 查找空格,全部替换

  7. 搜索引擎ElasticSearch系列(二): ElasticSearch2.4.4 Head插件安装

    一:ElasticSearch Head插件简介 elasticsearch-head is a web front end for browsing and interacting with an  ...

  8. python根据正则表达式的简单爬虫

    今天根据正则表达式简单的爬了一下大众点评,把北京的美食爬了爬,(店铺名,人均消费,地址) import re import urllib.request from urllib.request imp ...

  9. selenium 列表循环定位方法。

    话不多说,直接上代码. 就是循环第一层,然后拼接,然后继续循环,继续屏接,任你多少层都不是问题. def c_select(self, values, text): """ ...

  10. Linux内核学习笔记(6)-- 进程优先级详解(prio、static_prio、normal_prio、rt_priority)

    Linux 中采用了两种不同的优先级范围,一种是 nice 值,一种是实时优先级.在上一篇粗略的说了一下 nice 值和实时优先级,仍有不少疑问,本文来详细说明一下进程优先级.linux 内核版本为 ...