STM32: 总线矩阵

总线矩阵请添加图片描述

上图为stm32f4的总线矩阵,其中主控总线有8条,被控总线有7条,主设备和从设备通过各自的总线两两相交连接,图中两条总线相交且为圆圈的地方,表示这两条总线对应的主设备可以访问从设备,如I总线(指令总线),只有跟 M0、M2和M6这三根被控总线交叉的时候才有圆圈,就表示I总线只能跟这三根被控总线通信,这样就可以知道stm32f4的启动有三种分别是FLASH、内部SRAM、外部存储FSMC。
  总线矩阵用于主控总线之间的访问仲裁管理,仲裁采用循环调度算法。有了总线矩阵,就可以让主设备和从设备进行并行访问,提升了访问效率,同时也降低了功耗。需要注意的是,虽然总线矩阵使得多个主设备可以并行访问不同的从设备,但在一个定义的时间段内,只有一个主设备拥有总线矩阵的控制权,如果有多个主设备同时出现总线请求时就得进行仲裁。所以有了总线仲裁器,就能保证每个时刻只有一个主设备通过总线矩阵对从设备进行访问。
  注意并非所有主设备访问从设备都得经过总线矩阵,如上图中,有些主设备和从设备间有直通通道。

存储器映射请添加图片描述

存储器本身不具有地址信息,给存储器分配地址的过程就称为存储器映射,尽管预定义的存储器映射的地址是固定的,但也具有很高的灵活性,允许芯片设计人员使用不同的内存和外设来设计他们的产品,以实现更好的产品差异化。给某个地址再分配一个地址的过程叫存储器重映射,但是Cortex M4芯片没有MMU所以并不支持。如上所示,就是stm32f4xx的部分通过存储器映射的寄存器地址,详见《STM32F4xx中文参考手册》的P52~P54页。

请添加图片描述

上图为预定义的存储器映射图,来自 Cortex M3与M4权威指南中的第六章第三节。在4GB的可寻址内存空间中,一些部分被分配给内部外设,如NVIC和调试组件。这些内部外设的地址是固定的。此外,内存空间在结构上被划分为若干内存区域,对应上图:
  Code:只读段,用于保存默认的向量表;
  SRAM:连接SRAM,主要是片内SRAM,但没有确切的内存类型限制。SRAM区域的前1MB是位可寻址的,如果可选位带特性包括在内。还可以从该区域执行程序代码;
  Peripherals:主要用于片内外设。由芯片公司进行定义的一些寄存器地址,如GPIO寄存器地址、USART和I2C的寄存器地址等等;
  RAM:变量存储区,如果开发板从片内的Flash启动,就需要指定RAM,不过一般只要选好了器件型号,keil5就自动选好了;
  Devices:主要是用于给片外的设备分配地址;
  System:内核定义的一些寄存器,包含了:NVIC,MPU, SysTick,SCB,FPU,FPB,DWT等。

GPIO的位带操作请添加图片描述

在预定义的存储器映射图有两个位带区,分别对应了两个位带别名,其实也就是将位带区每个的比特位一个一个按顺序取出来,将其映射成32位4字节的寄存器,这样位带别名的大小应该是位带区的32倍,事实也是这样。

查看stm32f4xx的芯片手册可以发现GPIO的寄存器地址属于Peripherals的位带区,所以可以进行位带操作,使用位带操作可以大大提高程序的运行速率和提升安全性,操作IO口的性能将达到极致,而不必要去调用GPIO_SetBits、GPIO_ResetBits、GPIO_WriteBit等GPIO操作的库函数,调用函数要进行入栈出栈等操作,会占用时间。

请添加图片描述

上图为位带区转换为位带别名区的宏定义代码,以GPIOE端口的第n根引脚为例,进行了输出高低电平的操作,只要预先初始化好了GPIOE端口第n根引脚,就可以使用这个宏定义,让第n根引脚输出高低电平,如:

PEout(13) = 0//让GPIOE的第13根引脚输出低电平
PEout(13) = 1//让GPIOE的第13根引脚输出高电平

总结
  1.总线矩阵很重要,不可忽略;
  2.了解了存储器映射便能大概知道内核的结构;
  3.位带操作可以提高速率和提升安全性,能使用就尽量使用,I/O初始化就不必要,因为这样的话代码会很多,直接使用库函数初始化就可以。

  • 11
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值