STM32 (4) 使用寄存器点亮LED 寄存器映射代码讲解 群号860099671

上次是操作内存地址  点亮LED灯没有用到寄存器,现在升级  实现寄存器映射。 对照上节课的代码这个如果不去手册里面查找是看不懂的,那么 我们把这些绝对的内存地址再取一个名字 叫寄存器 

STM32 (4) 使用寄存器点亮LED 寄存器映射代码讲解 群号860099671

那么我们利用

#if 0

#else

#endif

上面语句的意思是屏蔽  else 上面的代码  而编译  else 到 endif之间的代码

打开《STM32中文参考手册》 第二章 存储器和总像架构这里的 存储器映像   可以看到全部外设的地址分配,来看看这个系统总线框图 所有的外设都挂在AHB上

RCC 控制单片机的复位和时钟      AHB桥接到 APB2 (高速总线)和APB1上, 等下我们在实现外设寄存器映射的时候,我们先定好三条总线的基地址

比如说我们定好AHB总线的基地址,在这条总线的基础上 加上RCC的偏移 就可以得到RCC外设的基地址,然后在RCC外设这个总线的基地址上加上0x18就可以得到 APB2外设时钟使能寄存器的地址  这个寄存器的位3控制的就是GPIOB这个端口的时钟

STM32 (4) 使用寄存器点亮LED 寄存器映射代码讲解 群号860099671   STM32 (4) 使用寄存器点亮LED 寄存器映射代码讲解 群号860099671

再回到储存器映射表可以看到  APB1的起始地址是从 0x4000 0000开始的

这里AHB总线的地址是从 0x40018000开始的 ,而18000不太好计算所以我们可以用从0x40020000开始,这样计算起来比较方便

这里我只截取了 储存器映射中的一部分

STM32 (4) 使用寄存器点亮LED 寄存器映射代码讲解 群号860099671

下面开始写代码   

第一步:00

在stm32f10x.写外设基地址定义

STM32 (4) 使用寄存器点亮LED 寄存器映射代码讲解 群号860099671

接下来回到代码 我们要使能GPIOB就要使能 APB2 外设时钟使能寄存器的第三位

STM32 (4) 使用寄存器点亮LED 寄存器映射代码讲解 群号860099671

那么就在stm32f10x..h当中开始定义寄存器  这里RCC_BASE+0x18 编译器会认为只是一个立即数,所以我们要将它强制类型转化为指针,因为 外设时钟使能寄存器 是32位的,所以我们的指针也要定义成32位的。

指针首先会指向寄存器的首地址,  

一个指针指向的是一个字节,我们这个是4个字节的寄存器,指针是一个地址对应一个字节,如果指针P定义成4个字节的话他就会连续访问4个字节所以要将   RCC_BASE+0x18强制转化成32位的指针,并将取地址的操作也定义在里面

STM32 (4) 使用寄存器点亮LED 寄存器映射代码讲解 群号860099671

然后我们就可以操作GPIO里面的寄存器了,首先是CRL 他的偏移地址是 0x00     DRR偏移的是0x0c,我们把这两个地址的寄存器也定义到stm32_10x.h当中

STM32 (4) 使用寄存器点亮LED 寄存器映射代码讲解 群号860099671STM32 (4) 使用寄存器点亮LED 寄存器映射代码讲解 群号860099671

STM32 (4) 使用寄存器点亮LED 寄存器映射代码讲解 群号860099671

下面开始写程序

STM32 (4) 使用寄存器点亮LED 寄存器映射代码讲解 群号860099671

上面的代码就先    把GPIO口清零(&=~) 再让GPIO口输出为低电平  灯亮了 OK大功告成