正点原子学习。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 存储器映像对应的看。
如这个外设就单独使用了。