STM32 (4) 使用寄存器点亮LED 寄存器映射代码讲解 群号860099671
上次是操作内存地址 点亮LED灯没有用到寄存器,现在升级 实现寄存器映射。 对照上节课的代码这个如果不去手册里面查找是看不懂的,那么 我们把这些绝对的内存地址再取一个名字 叫寄存器
那么我们利用
#if 0
#else
#endif
上面语句的意思是屏蔽 else 上面的代码 而编译 else 到 endif之间的代码
打开《STM32中文参考手册》 第二章 存储器和总像架构这里的 存储器映像 可以看到全部外设的地址分配,来看看这个系统总线框图 所有的外设都挂在AHB上
RCC 控制单片机的复位和时钟 AHB桥接到 APB2 (高速总线)和APB1上, 等下我们在实现外设寄存器映射的时候,我们先定好三条总线的基地址
比如说我们定好AHB总线的基地址,在这条总线的基础上 加上RCC的偏移 就可以得到RCC外设的基地址,然后在RCC外设这个总线的基地址上加上0x18就可以得到 APB2外设时钟使能寄存器的地址 这个寄存器的位3控制的就是GPIOB这个端口的时钟
再回到储存器映射表可以看到 APB1的起始地址是从 0x4000 0000开始的
这里AHB总线的地址是从 0x40018000开始的 ,而18000不太好计算所以我们可以用从0x40020000开始,这样计算起来比较方便
这里我只截取了 储存器映射中的一部分
下面开始写代码
第一步:00
在stm32f10x.写外设基地址定义
接下来回到代码 我们要使能GPIOB就要使能 APB2 外设时钟使能寄存器的第三位
那么就在stm32f10x..h当中开始定义寄存器 这里RCC_BASE+0x18 编译器会认为只是一个立即数,所以我们要将它强制类型转化为指针,因为 外设时钟使能寄存器 是32位的,所以我们的指针也要定义成32位的。
指针首先会指向寄存器的首地址,
一个指针指向的是一个字节,我们这个是4个字节的寄存器,指针是一个地址对应一个字节,如果指针P定义成4个字节的话他就会连续访问4个字节所以要将 RCC_BASE+0x18强制转化成32位的指针,并将取地址的操作也定义在里面
然后我们就可以操作GPIO里面的寄存器了,首先是CRL 他的偏移地址是 0x00 DRR偏移的是0x0c,我们把这两个地址的寄存器也定义到stm32_10x.h当中
下面开始写程序
上面的代码就先 把GPIO口清零(&=~) 再让GPIO口输出为低电平 灯亮了 OK大功告成