STM32学习笔记【1】什么是寄存器

什么是寄存器

1.STM32长什么样子

1.学会看丝印

STM32F103VET6
STM32:品牌名
F103:系列名
VET6:产品型号,V表示100个引脚,Z表示144个引脚。

处理器上丝印有产地和批次号

2.懂得如何辨别正方向

STM32学习笔记【1】什么是寄存器_第1张图片
黑色小圆点为起点,然后逆时针(1脚2脚3脚)顺序排列。如果没有黑色小圆点,以说明书为准。

2.芯片里有什么

芯片架构简图
STM32学习笔记【1】什么是寄存器_第2张图片
ARM(IP厂商):只生产内核
ST(SOC厂商):从ARM出拿到内核后,添加外设。三星苹果海思等都是SOC厂商。


STM32F10XX系统框图
STM32学习笔记【1】什么是寄存器_第3张图片

ICode总线:I表示Instruction,即指令。编译好的程序都是放在flash中,然后内核通过ICode总线进行读取,它几乎每时每刻都需要被使用,它是专门用来取指的。ICode某些情况下也可以用来取数据。

四个驱动单元(黄色部分,由ARM设计):
1.DCode总线:D表示Data,即数据。数据是存放在Flash(常量)或者SRAM(变量)之中的。Cortex内核和数据交换就是通过DCode总线实现的。

2.System总线:即系统总线,主要是Cortex内核用来访问外设的寄存器(粉色第4部分)。我们通常说的寄存器编程,即读写寄存器都是通过这根系统总线来完成的。

3.DMA总线(有两条):CPU可以将权力下放给DMA控制器,通过DMA总线,直接使外设(粉色第4部分)和存储器(粉色第2部分)进行数据交互。但是DMA和DCode都可以读取数据,所以在传输数据时需要使用总线矩阵进行仲裁。

四个被动单元(粉色部分,由ST设计):
1.FLASH:内部的闪存储存器。平时写好的程序和一些常量都存储在这里。内核通过ICode总线来取FLASH中的指令。内核通过DCode总线来访问常量。

2.SRAM:通常称为RAM。程序的变量,堆栈的开销等都是基于SRAM。内核通过DCode总线来访问他。

3.FSMC:Flexible static memory controller,灵活的静态的存储器控制器。通过FSMC,我们可以拓展内存,如外部的SRAM,NANDFLASH 和 NORFLASH。但是只能拓展静态的内存。动态内存如SDRAM就不能进行拓展。

4.AHB和APB总线:AHP(Advanced High performance Bus,高级高性能总线)挂载了SDIO(SD卡相关外设)和RCC(复位和时钟控制)。

AHP通过桥接挂载了2个APB(Advanced Peripheral Bus,高级外围总线)。APB2是高速总线,APB1是低速总线。挂载了各类外设,后面可以学习到。

3.存储器映射

我们不能直接对各种硬件进行操作,但是各类提供操作接口的功能部件都排列在一个4GB的地址空间内。我们在编程的时候,实际上是在通过读写这些地址空间,来进行间接的操作。

实际上4GB是位带的空间,实际上是一个不存在的空间,可以认为是虚拟的算法模拟出来的。我们不需要把这个空间真实的做出来,一样可以用这个空间来进行位带操作。

而存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程就称为存储器映射。

存储器功能分类

序号 用途 地址范围
Block0 Code 0x0000 0000 ~ 0x1FFF FFFF(512MB)
Block1 SRAM 0x2000 0000 ~ 0x3FFF FFFF(512MB)
Block2 片上外设 0x4000 0000 ~ 0x5FFF FFFF(512MB)
Block3 FSMC的bank1~bank2 0x6000 0000 ~ 0x7FFF FFFF(512MB)
Block4 FSMC的bank3~bank4 0x8000 0000 ~ 0x9FFF FFFF(512MB)
Block5 FSMC寄存器 0xA000 0000 ~ 0xCFFF FFFF(512MB)
Block6 没有使用 0xD000 0000 ~ 0xDFFF FFFF(512MB)
Block7 Cortex-M3内部外设 0xE000 0000 ~ 0xFFFF FFFF(512MB)

4.寄存器映射

以让GPIOB端口的16个引脚输出高电平的实现为例


1.通过绝对地址访问内存单元

*unsigned int*(0x40010C0C) = 0xFFFF;

Q:0x40010C0C 是GPIOB输出寄存器ODR的地址,如何找到?

A:首先在《STM32F10x参考手册》中找到GPIO寄存的区间。起始地址为0x40010C00。

在这里插入图片描述

然后再从手册中找到ODR的相关内容。

STM32学习笔记【1】什么是寄存器_第4张图片

可发现初始偏移量为0x0C。即初始地址为0x40010C00+0x0C=0x40010C0C。将后面的所有寄存器置为1,只需要将0x40010C0C往后的位置填充为1111 1111 1111 1111,也就是0xFFFF即可。


2.通过C语言对寄存器的封装

ST公司提供了相关的宏定义,直接将各寄存器都预先定义好。
STM32学习笔记【1】什么是寄存器_第5张图片
然后再使用结构体封装寄存器列表。
STM32学习笔记【1】什么是寄存器_第6张图片

最后将寄存器类型转换为指针,直接通过指针来操作寄存器。
STM32学习笔记【1】什么是寄存器_第7张图片
常见单独操作某个位,不改变寄存器里其他的位,以PB0的ODR10(输出位10)为例:

//PB0输出低电平,原先无论GPIOB_ODR是1还是0都可以置为0。可以看做清零操作。
GPIOB_ODR &= ~(1<<10);

//PB0输出高电平,原先无论GPIOB_ODR是1还是0都可以置为1。可以看做置位操作。
GPIOB_ODR |= !(1<<10);

你可能感兴趣的:(STM32)