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

论坛 期权论坛 脚本     
匿名技术用户   2020-12-29 14:20   28   0

上次是操作内存地址 点亮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大功告成

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP