打印
[应用相关]

【转】STM32学习:stm32的总线AMBA、AHB、APB

[复制链接]
657|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
联通移不动|  楼主 | 2017-2-10 12:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

AMBAAMBA(Advanced Microprocessor Bus Architecture)是ARM公司提出的一种开放性的SoC总线标准,现在已经广泛的应用于RISC的内核上了。
AMBA定义了一种多总线系统(multilevel busing system),包括系统总线和等级稍低的外设总线。
AMBA支持32位、64位、128位的数据总线,和32位的地址总线,同时支持byte和half-word设计。
它定义了两种总线: AHB(Advanced High-performance Bus)先进的高性能总线,也叫做ASB(Advanced System Bus)。APB(Advanced peripheral Bus)先进的外设总线
AHB和ASB其实是一个东西,是高速总线,主要负责嵌入式处理器、DMA控制器、Memory等等的接口。
APB是低速总线,主要负责外设接口
AHB和APB之间是通过Bridge(桥接器)链接的

Bus Bridges总所周知,一个系统中的各个模块之间相互通信是通过总线,总线的作用,就是把数据和地址从设备A搬运到设备B上,
如果说设备A和设备B具有一致性(原文是under discussion,这里我不知道怎么翻译比较好,暂且翻译为一致性),那么设备A和设备B可以直接挂在同一个总线上,并直接解读总线上的数据。
但是,如果设备A和设备B不具有一致性,那么设备A和设备B就必须挂在两条不同的总线上,这时候我们就需要一个“翻译”,把设备A上的总线上的数据和地址转换成设备B可以解析的格式,然后放到设备B的总线上,这个“翻译”就是“Bus Bridge”,

下面这幅图就形象的说明了Bus Bridge在AHB和APB之间的作用。

AHB链接的设备的数据传输速度是比APB设备传输的速度快很多的,也就是说,这里的这个Bus Beidge所起的作用就是“缓冲浓ky"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vc8L3N0cm9uZz6hsaOsyMNBSEK6zUFQQtauvOS1xMr9vt0vtdjWt7XEtKvK5MvZwsq56bW9PHN0cm9uZz7NrNK7y9nCyjwvc3Ryb25nPsnPoaMKPGJyPgoKPGJyPgoKPGJyPgoKPGJyPgoKPGJyPgoKPGJyPgoKPGJyPgoKPGgyPkNvcnRleC1NM7XEz7XNs8Sjv+k8L2gyPgo8aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20141027/20141027091626117.png" alt="\">

这里可以看到AHB主要是链接在了系统的内核以及存储管理上面的,APB则主要分布给我外设。

下面这张图,更容易看出AHB和APB的作用: AHB链接的是系统总线、RAM等等 APB链接的是常用的外设:GPIO、UART等等


这里可以看到AHB主要是链接在了系统的内核以及存储管理上面的,APB则主要分布给我外设。

下面这张图,更容易看出AHB和APB的作用: AHB链接的是系统总线、RAM等等 APB链接的是常用的外设:GPIO、UART等等

STM32上的总线结构
首先看一下F103系列的芯片的总线结构

需要注意的是,这里有两个APB,它们链接的外设是不一样的,所以在STM32的库文件中会有关于APB1和APB2的定义:

[java] view plain copy


  • <span style="font-family:Microsoft YaHei">/** @defgroup APB2_peripheral  
  •   * @{
  •   */  
  •   
  • #define RCC_APB2Periph_AFIO              ((uint32_t)0x00000001)  
  • #define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)  
  • #define RCC_APB2Periph_GPIOB             ((uint32_t)0x00000008)  
  • #define RCC_APB2Periph_GPIOC             ((uint32_t)0x00000010)  
  • #define RCC_APB2Periph_GPIOD             ((uint32_t)0x00000020)  
  • #define RCC_APB2Periph_GPIOE             ((uint32_t)0x00000040)  
  • #define RCC_APB2Periph_GPIOF             ((uint32_t)0x00000080)  
  • #define RCC_APB2Periph_GPIOG             ((uint32_t)0x00000100)  
  • #define RCC_APB2Periph_ADC1              ((uint32_t)0x00000200)  
  • #define RCC_APB2Periph_ADC2              ((uint32_t)0x00000400)  
  • #define RCC_APB2Periph_TIM1              ((uint32_t)0x00000800)  
  • #define RCC_APB2Periph_SPI1              ((uint32_t)0x00001000)  
  • #define RCC_APB2Periph_TIM8              ((uint32_t)0x00002000)  
  • #define RCC_APB2Periph_USART1            ((uint32_t)0x00004000)  
  • #define RCC_APB2Periph_ADC3              ((uint32_t)0x00008000)  
  • #define RCC_APB2Periph_TIM15             ((uint32_t)0x00010000)  
  • #define RCC_APB2Periph_TIM16             ((uint32_t)0x00020000)  
  • #define RCC_APB2Periph_TIM17             ((uint32_t)0x00040000)  
  • #define RCC_APB2Periph_TIM9              ((uint32_t)0x00080000)  
  • #define RCC_APB2Periph_TIM10             ((uint32_t)0x00100000)  
  • #define RCC_APB2Periph_TIM11             ((uint32_t)0x00200000)  
  •   
  • #define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFC00002) == 0x00) && ((PERIPH) != 0x00))  
  • /**
  •   * @}
  •   */   
  •   
  • /** @defgroup APB1_peripheral  
  •   * @{
  •   */  
  •   
  • #define RCC_APB1Periph_TIM2              ((uint32_t)0x00000001)  
  • #define RCC_APB1Periph_TIM3              ((uint32_t)0x00000002)  
  • #define RCC_APB1Periph_TIM4              ((uint32_t)0x00000004)  
  • #define RCC_APB1Periph_TIM5              ((uint32_t)0x00000008)  
  • #define RCC_APB1Periph_TIM6              ((uint32_t)0x00000010)  
  • #define RCC_APB1Periph_TIM7              ((uint32_t)0x00000020)  
  • #define RCC_APB1Periph_TIM12             ((uint32_t)0x00000040)  
  • #define RCC_APB1Periph_TIM13             ((uint32_t)0x00000080)  
  • #define RCC_APB1Periph_TIM14             ((uint32_t)0x00000100)  
  • #define RCC_APB1Periph_WWDG              ((uint32_t)0x00000800)  
  • #define RCC_APB1Periph_SPI2              ((uint32_t)0x00004000)  
  • #define RCC_APB1Periph_SPI3              ((uint32_t)0x00008000)  
  • #define RCC_APB1Periph_USART2            ((uint32_t)0x00020000)  
  • #define RCC_APB1Periph_USART3            ((uint32_t)0x00040000)  
  • #define RCC_APB1Periph_UART4             ((uint32_t)0x00080000)  
  • #define RCC_APB1Periph_UART5             ((uint32_t)0x00100000)  
  • #define RCC_APB1Periph_I2C1              ((uint32_t)0x00200000)  
  • #define RCC_APB1Periph_I2C2              ((uint32_t)0x00400000)  
  • #define RCC_APB1Periph_USB               ((uint32_t)0x00800000)  
  • #define RCC_APB1Periph_CAN1              ((uint32_t)0x02000000)  
  • #define RCC_APB1Periph_CAN2              ((uint32_t)0x04000000)  
  • #define RCC_APB1Periph_BKP               ((uint32_t)0x08000000)  
  • #define RCC_APB1Periph_PWR               ((uint32_t)0x10000000)  
  • #define RCC_APB1Periph_DAC               ((uint32_t)0x20000000)  
  • #define RCC_APB1Periph_CEC               ((uint32_t)0x40000000)  
  •    
  • #define IS_RCC_APB1_PERIPH(PERIPH) ((((PERIPH) & 0x81013600) == 0x00) && ((PERIPH) != 0x00))  
  •   
  • /**
  •   * @}
  •   */</span>  


APB的速率见下面说明:

APB1限制在了36MHz,APB2也可以达到全速72MHz

下面是F105和F107的总线构架:

STM32上APB1和APB2的地址映射

沙发
feelhyq| | 2017-2-10 13:28 | 只看该作者
好东西,学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

127

帖子

0

粉丝