-
STM32 单片机寄存器地址
-
地址空间划分
4GB的孔吉纳被分成8各block,每个Block 512MB。
Block0 内部Flash
512KB
Block1 内部RAM
64KB
Block2 片上外设
APB1, 外设地址30719
APB2,外设地址16383
AHB,外设地址229375
0x4000 0000 使所有外设的基地址
举例GPIO 寄存器地址构造
总外设基地址+特定外设偏移地址+寄存器偏移地址 --》寄存器位操作
寄存器封装
宏定义
使用宏定义对总外设基地址, 外设偏移地址和寄存器偏移地址进行重新命名,主要是方便后续访问和理解。
结构体定义
在结构体中结构体成员的地址是顺序排列的,以GPIO为例 每个寄存器都是 4个字节,即32bit, 其地址都是4的倍数。
GPIO 结构体定义如下
GPIO_TypeDef *GPIOx; //定义GPIO结构体指针
GPIOx =GPIOB_BASE; //把GPIOB的基地址赋值给结构体
GPIOx->IDR; //通过结构体访问寄存器
在STM32 的固件库中,已经把GPIOA~H的基地址通过(GPIO_TypeDef*)强制转换成结构体指针。所有我们可以直接通过GPIOA->IDR 直接访问寄存器。
修改寄存器的位操作方法
STM32中寄存器是32的,如果我们只想修改寄存器中某一位或者某几位,我们需要一种比较直观和方便的方法。
位清零操作
寄存器某位清零
变量a=1001 1111b
对bit2 清零
a &=~ (1<<2); 1 左移两位,取反,跟a 进行位与操作;
寄存器连续几位清零
对bit2和bit3 清理
a &=~ (3<<2*1); 11 左移2位,取反,跟a 进行位与操作;
对bit4和bit5 清理
a &=~ (3<<2*2); 11 左移4位,取反,跟a 进行位与操作;
位赋值操作
某一位赋值
变量a=1001 1111b
对bit2 赋值
a |=(1<<2); 1 左移两位,跟a 进行位或操作;
寄存器连续几位清零
对bit2和bit3 清理
a |=(3<<2*1); 11 左移2位,跟a 进行位或操作;
对bit4和bit5 清理
a |=(3<<2*2); 11 左移4位,跟a 进行位或操作;
位取反操作
以下操作是异或操作,如果实现某位取反功能的????
GPIO 操作
输入:模拟输入 和数字输入
数字输入: 悬空/上拉和下拉
输出:OD 和PP
复用值非GPIO 功能更下的输出模式
第七章学习总结
最简单的通过寄存器编写单片机程序的过程其实很简单。
- 只需要startup_stm32f10x_hd.s 做启动引导, 这个文件是固件库中自带的可以完全不用修改,其作用就是创建堆栈,把启动引导到main函数的位置。
- 需要一个main 函数, 我们可以直接在main 函数通过 强制类型转换,把寄存器地址转换位指针,再通过指针给寄存器赋值的方法来编程,这样还把宏定义给省了,但是这样的编程方法会比较繁琐。