STM32 (1) 之 什么是寄存器?群号860099671
什么是储存器映射?
什么是寄存器映射?
芯片辨别
1怎么看芯片丝印
缺口正方向()
正看丝印左边第一个脚为一脚
写程序最终是操作寄存器,这里参考零死角玩转 STM32 第六章什么是寄存器章节
外设:GPIO USART 12C SPI 等 Cortex-M3内核是主控器
soc厂商 苹果 三星 ST
在<STM32 中文参考手册> 存储器和总线架构这里
体现了内核外设的连接
我们写好的程序是由单片机来执行的,执行的时候是由内核来取这些指令的,程序我们放在FLASH里,但是内核要读取程序,要通过ICode总线读取 I (lnstruction指令)
2。DCode
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章节我们编程时所操作的寄存器只包括下图这部分
,
我们可以从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里面
什么是存储器映射?
ST给一块内存编好地址,叫存储器映射,然后我们可以根据这些地址去访问这些内存,上表就是存储器功能分类,这个表其实对应的就是memory mapping
接下来就可以进行编程了
这个操作和51很类似
51中头文件 reg52.h 做了寄存器映射如下图
STM32如何实现 GPIOB全部输出高电平?
打开STM32 中文参考手册 找到GPIO的寄存器 ODR寄存器(端口数据寄存器)只用到了低16位,每一个位对应端口的一个IO
如果想要GPIOB的所有端口都输出高电平 那么将寄存器的16位都写1就行了,知道要操作哪个寄存器以后我们要在memory mapping看GPIOB对应的地址
上图也可以在《STM32中文参考手册》当中存储器和总线架构当中找到
0x40010c00 起始地址
0x40010FFF 结束地址
地址偏移
是相对于端口的基地址的偏移 那么这个寄存器的地址就是
端口的基地址+地址偏移=0x40010c00+0x0c
上面这个就是 GPIOB端口的ODR寄存器的地址
上面的*(unsigned int*)(0x40010C0C)意思是:将0x40010C0C这个地址强制转化位 无符号指针类型再将0xFFFF赋值给0x40010C0C。
还有另外一种方法;
通过define 将0x40010C0C定义成一个宏 再通过宏来操作
总结:我们在编程的时候都是在操作寄存器, 这些寄存器是由芯片厂商在一段特定的内存当中规定好的,它每一个内存单元对应一个外设,每一个内存单元对应一个字节。 32位单片机就对应了4个字节,每一个内存单元都是有特定功能的我们往这些内存单元里写数据的话就能操作这些外设