STM32系统框架

正点原子学习。STM32F103ZET6。

MCU厂商,经ARM公司授权,添加不同的外设(包括内部总线,存储器,时钟和复位,I/O) = 各种XX32芯片

上图中的调试系统是内嵌在内核里面的,所以是绑定关系。

系统框图(STM32F103ZET6.pdf)

主动单元和被动单元的关系

主动单元可以发起通信,也就是给被动单元发送工作指令。

被动单元是不可以主动发起通信的。

系统框架简图(STM32F10xxx参考手册_V20(英文版).pdf)

D-Bus总线也就是图中的DCode总线

S-Bus总线也就是图中的System总线

因为ICode总线没有经过总线矩阵,所以st没有把ICode列为主动单元。但其实它也是属于主动单元的。

APB1和APB2的时钟频率为什么不同?

是因为挂载的外设时钟频率不一定是一样的,有一些需要高一些的时钟频率,一些需要低一些的时钟频率。所以使用两条总线来满足不同的外设。

STM32的寻址范围?

想要解答这个问题,我们需要清楚以下两点:

1,32位的单片机可以有32根地址线(每根地址线有两种状态:导通或不导通)

2,单片机内存地址访问的存储单元是按字节编址的(而不是bit)

STM32寻址大小:2^32 = 4G(字节)

STM32寻址范围:0x0000 0000 ~ 0xFFFF FFFF

举例:通过地址编号0xFF去访问存储单元,那么这个存储单元里面包含的是一个字节的数据。(而不是这个存储单元内只有一个bit)

存储器映射

存储器指可以存储数据的设备(FLASH/SRAM),本身没有地址信息,对存储器分配地址的过程称为存储器映射。

如上图星忆科技的XRAM芯片,也就是SRAM的升级版

根据19根地址线可以得到访问的地址编号数就是2^19 == 512k个地址。

根据16根数据线可以得到每个地址编号是按照2个字节进行编制的。

所以可以得到芯片的总容量是512k x 2 = 1024 = 1MB。

存储器功能划分(F1为例)STM32F103 精英开发指南V1.3.pdf

ST将4GB(2^32)地址空间分成8个块

重点需要学习的是片上外设。如系统框架中的APB1,APB2总线上面所有的外设都映射在片上外设中。

Block0(FLASH)功能划分 (STM32F103ZET6.pdf)

出厂的BootLoader程序:有这个BootLoader程序就可以使用串口下载程序了。

Block1(SRAM)功能划分

SRAM片内内存。

Block2(外设)功能划分

寄存器映射

寄存器是单片机内部一种特殊的内存,可以实现对单片机各个功能的控制

简单来说:寄存器就是单片机内部的控制机构

STM32寄存器分类

寄存器映射(F1为例)

寄存器是特殊的存储器,给寄存器地址命名的过程,就叫寄存器映射

STM32和51单片机IO口的命名规则

51单片机中,如P0-P3组,每组8个IO口,那么是32个IO口。

STM32单片机中,如GPIOA-GPIOG组,每组16个IO口,那么就是112个IO口。

寄存器描述解读(参考资料:STM32F10xxx参考手册_V10(中文版).pdf)

寄存器映射举例

寄存器地址计算

为了方便编写代码及使用,我们将寄存器地址分为三个部分:

1、总线基地址(BUS_BASE_ADDR)。补充:以F1为例,也就是AHB总线--APB1、APB2总线。

2,外设基于总线基地址的偏移量(PERIPH_OFFSET)

3,寄存器相对外设基地址的偏移量(REG_OFFSET)

寄存器地址 = BUS_BASE_ADDR +  PERIPH_OFFSET + REG_OFFSET

总线基地址(参考资料:STM32F10xxx参考手册_V10(中文版).pdf  2.3小节)

APB1总线的基地址,也叫外设基地址(PERIPH_BASE)

此表的偏移量:是相对外设基地址(PERIPH_BASE)来说的

GPIO外设基地址及偏移量

此表的偏移量:是相对APB2外设基地址(APB2PERIPH_BASE)来说的

GPIOA外设基地址及偏移量

此表的偏移量:是相对GPIOA外设基地址(GPIOA_BASE)来说的

GPIOA_ODR寄存器地址计算过程:

1,获取外设挂在哪个总线上面?查:系统结构图

2,获取总线基地址,APB2总线基地址:0X4001 0000

3,获取外设地址偏移量,GPIOA相对APB2总线偏移量是:0X800

4,获取寄存器地址偏移量,ODR相对GPIOA外设基地址的偏移量是:0X0C

寄存器地址 = BUS_BASE_ADDR +  PERIPH_OFFSET + REG_OFFSET

GPIOA_ODR = 0X4001 0000 + 0X800 + 0X0C = 0X4001 080C

补充,第四点中的偏移量是在ODR寄存器中描述的。

寄存器地址练习,以要使用串口1的USART_DR数据寄存器为例。

先找到USART1的基地址,下图

然后找到USART_DR寄存器的地址偏移

那么0x4001 3800 + 0x04 == 0x4001 3904就是USART1_DR的寄存器地址了。

使用结构体,可以很方便的完成对寄存器的映射(详见:stm32f103xe.h,725行开始)

根据偏移量可以发现,每次偏移4字节,刚好和结构体对齐。所以可以一次性映射7个寄存器。

stm32f103xe.h主要组成部分

需要结合手册STM32F10xxx参考手册_V10(中文版).pdf中2.3 存储器映像对应的看。

如这个外设就单独使用了。

  • 50
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值