STM32 (1) 之 什么是寄存器?

什么是储存器映射?

什么是寄存器映射?

芯片辨别  

1怎么看芯片丝印

缺口正方向()

正看丝印左边第一个脚为一脚

写程序最终是操作寄存器,这里参考零死角玩转 STM32 第六章什么是寄存器章节

STM32 (1) 之 什么是寄存器?_第1张图片

外设:GPIO USART  12C SPI 等   Cortex-M3内核是主控器

soc厂商 苹果 三星 ST

   存储器和总线架构这里

STM32 (1) 之 什么是寄存器?_第2张图片

体现了内核外设的连接

我们写好的程序是由单片机来执行的,执行的时候是由内核来取这些指令的,程序我们放在FLASH里,但是内核要读取程序,要通过ICode总线读取 I (lnstruction指令)

STM32 (1) 之 什么是寄存器?_第3张图片

2。DCode

STM32 (1) 之 什么是寄存器?_第4张图片

const  常量是存放在flash里面的  

变量是放在内部的SRAM当中的       要读取的时候是通过DCode这条总线去读取的

在驱动单元中还有另外一部分: DMA他也是可以读取数据的,  DMA和DCode有时会同时读取,那么就会产生冲突,这时就需要总线矩阵来总裁,判断到底由哪条总线来读取数据

3  System 系统总线

      主要用来读取寄存器 内核要想操作某个外设,必须要通过操作寄存器来实现,读取的时候也就是通过这个System总线  来读取 而寄存器存在于外设当中

4  DMA 主要用来搬数据

比如:cpu要读取一个变量,该变量在 sram里面,将变量存到串口的数据寄存器(DR),如果不使用DMA,cpu要先通过DCode将变量独到CPU当中,然后再把变量存到  串口的数据寄存器,但是,如果你使用了DMA  ,那么CPU只需要发一个命令,DMA就可以直接 将变量存到串口的数据寄存器 CPU就可以空闲出来,可以做其他事情

AHB 总线到APB 总线

AHB挂在了两个外设  1复位和时钟控制(RCC)       2.  SDIO

AHB通过桥接 分成了    APB1   和   APB2

APB2 是高速总线 里面的外设如上图所示

APB1 是低速总线

FSMC 是用来驱动外存的 驱动液晶的时候会讲,我们重点要学的是 APB1和 APB2上的外设

接下来看英文板   STM32 英文版 《数据手册》memory mapping章节我们编程时所操作的寄存器只包括下图这部分

 

STM32 (1) 之 什么是寄存器?_第5张图片

我们可以从memory mapping 中发现ARM是32位的2的32 次方   有4GB  被分成了8个块(每一块有512M)

第0块 放FLASH(block0)  ST只用了512kb

第1块 放SRAM ST 只用了64kb

第2块 (block3)放外设(Peripherals)

第3.4块 (block4 5)都是FSMC 的寄存器     block6没有用

block7 放Cortex-m3 的寄存器

我们重点要学习的是block2 里面的 外设,我们所说的所有的  寄存器都在block2里面

什么是存储器映射?

STM32 (1) 之 什么是寄存器?_第6张图片

ST给一块内存编好地址,叫存储器映射,然后我们可以根据这些地址去访问这些内存,上表就是存储器功能分类,这个表其实对应的就是memory mapping

接下来就可以进行编程了

STM32 (1) 之 什么是寄存器?_第7张图片

这个操作和51很类似

51中头文件 reg52.h 做了寄存器映射如下图

STM32 (1) 之 什么是寄存器?_第8张图片

STM32如何实现 GPIOB全部输出高电平?

打开STM32 中文参考手册  找到GPIO的寄存器 ODR寄存器(端口数据寄存器)只用到了低16位,每一个位对应端口的一个IO

如果想要GPIOB的所有端口都输出高电平 那么将寄存器的16位都写1就行了,知道要操作哪个寄存器以后我们要在memory mapping看GPIOB对应的地址

上图也可以在《STM32中文参考手册》当中存储器和总线架构当中找到

0x40010c00     起始地址

0x40010FFF  结束地址

STM32 (1) 之 什么是寄存器?_第9张图片

地址偏移 

是相对于端口的基地址的偏移    那么这个寄存器的地址就是   

端口的基地址+地址偏移=0x40010c00+0x0c

上面这个就是    GPIOB端口的ODR寄存器的地址

上面的*(unsigned int*)(0x40010C0C)意思是:将0x40010C0C这个地址强制转化位  无符号指针类型再将0xFFFF赋值给0x40010C0C。

还有另外一种方法;

通过define  将0x40010C0C定义成一个宏  再通过宏来操作

STM32 (1) 之 什么是寄存器?_第10张图片

STM32 (1) 之 什么是寄存器?_第11张图片

总结:我们在编程的时候都是在操作寄存器,  这些寄存器是由芯片厂商在一段特定的内存当中规定好的,它每一个内存单元对应一个外设,每一个内存单元对应一个字节。   32位单片机就对应了4个字节,每一个内存单元都是有特定功能的我们往这些内存单元里写数据的话就能操作这些外设

STM32 (1) 之 什么是寄存器?_第12张图片

你可能感兴趣的:(stm32,STM32)