您的位置 首页 系统

stm32的总线AMBA、AHB、APB

stm32的总线AMBA、AHB、APB-系统中的各个模块之间相互通信是通过总线,总线的作用,就是把数据和地址从设备A搬运到设备B上。

AMBA

AMBA(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之间的效果。 

stm32的总线AMBA、AHB、APB

AHB链接的设备的数据传输速度是比APB设备传输的速度快许多的,也便是说,这儿的这个Bus Beidge所起的效果便是“缓冲”

这儿能够看到AHB首要是链接在了体系的内核以及存储办理上面的,APB则首要散布给我外设。 

下面这张图,更简单看出AHB和APB的效果: AHB链接的是体系总线、RAM等等 APB链接的是常用的外设:GPIO、UART等等 

stm32的总线AMBA、AHB、APB

 

STM32上的总线结构


首要看一下F103系列的芯片的总线结构 

stm32的总线AMBA、AHB、APB

需求留意的是,这儿有两个APB,它们链接的外设是不一样的,所以在STM32的库文件中会有关于APB1和APB2的界说: 

 

/** @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))  

/** 

* @} 

*/  


APB的速率见下面阐明: 

stm32的总线AMBA、AHB、APB

APB1约束在了36MHz,APB2也能够到达全速72MHz 

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

stm32的总线AMBA、AHB、APB

  STM32上APB1和APB2的地址映射

stm32的总线AMBA、AHB、APB

 

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/xitong/347540.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部