STM32通过寄存器点灯需要以下几个步骤
芯片为STM32F103ZE
keil安装可以看这篇
STM32开发环境搭建安装keil_5MDK(巨量图片手把手教学附带安装包及芯片支持包)-CSDN博客
物料清单:
- 尚硅谷STM32开发板 (可根据自身情况选择)
- stlink 数据线
软件清单:
- keil mdk
- wps(可选)
1. 首先查看板子的原理图(这里我是用的是 尚硅谷STM32开发板)
通过查看原理图发现led灯分别连接着 PA0,PA1 PA8 三个引脚
2. 正所谓,手册离了开发板,神仙来了也茫然 所以们要打开我们数据手册
我这里使用的是中文手册和英文手册对照进行查阅(如果需要的人多我就去买个服务器发给大家)
2.1 点灯-配置寄存器
2.1.1首先我们先打开引脚的时钟
查看手册
发现时钟的地址为 0x4002 1000
然后我们找到控制时钟的寄存器
由此可以看出 要打开GPIOA的时钟需要令这个值为1 即 令他等于4(二进制为:0100)
STM32的keil工程创建可以参考这篇文章 STM32开发环境搭建安装keil_5MDK(巨量图片手把手教学附带安装包及芯片支持包)-CSDN博客
所以我们得到以下代码 后面的0X18为上图偏移地址(可以理解为数组的下标偏移量)
#include <stdint.h>
int main(void){
//1. 打开RCC中的GPIOA的时钟 让RCC_APB2ENR = 4
*(uint32_t *)(0x40021000 + 0x18) = 4;
}
2.2点灯-配置输出模式
我们继续开扒数据手册 继续回到储存器映像那张图找到GPIO端口A
由此可已得到其实地址值为 0x4001 0800
接着我们找到端口配置低寄存器
我们配置为浮空输出 并且开启位服用开漏输出
所以需要配置为 3 (二进制位 0111)
由此可得下一段代码为
#include <stdint.h>
int main(void){
//1. 打开RCC中的GPIOA的时钟 让RCC_APB2ENR = 4
*(uint32_t *)(0x40021000 + 0x18) = 4;
//2. 配置为推挽输出
*(uint32_t *)(0x40010800) = 3;
}
2.3 点灯-配置GPIOA具体的值
接着我们找到端口通用输出数据寄存器
由于我们配置的是推挽输出 所以我们如果想要点亮就需要令A0置0
所以需要配置为 十六进制 0xfffe 又因为偏移量为0x0c所以可得以下代码
#include <stdint.h>
int main(void){
//1. 打开RCC中的GPIOA的时钟 让RCC_APB2ENR = 4
*(uint32_t *)(0x40021000 + 0x18) = 4;
//2. 配置为推挽输出
*(uint32_t *)(0x40010800) = 3;
//PA0置为0
*(uint32_t *)(0x40010800+0x0c) = 0xfffe;
//while的作用是保持这个状态
while(1);
}
完成
接着我们开始烧录
灯亮 任务完成!