一: 如何寄存器点灯
1:看单片机的原理图 找到LED灯
这个灯是 PB5引脚
看原理图可以看出 让GPIOB5输出低电平 就能点亮
那么我们得让
打开控制GPIOB5的时钟
让GPIOB5 输出模式
让GPIOB5低电平
二:看中文参考手册配置寄存器
2.1:打开管 GPIOB5的时钟
时钟就相当于一个阀门开关,或者理解成水龙头,你打开了 才有水出来,也就是你打开才能工作。
看中文参考手册 系统架构 找到你的GPIOB 看看是谁管的。
找到时钟的起始地址 也称为 基地址
由于是APB2管 我们也要找到 APB2外设时钟使能寄存器的偏移地址
要打开GPIOB5的时钟
时钟起始地址 + APB2外设时钟使能寄存器的偏移地址 = 控制GPIOB5的时钟的寄存器地址
0x4002 1000 + 0x18 = 0x4002 1018
如何打开呢 再中文参考手册继续参考
在位3 中 1 为打开端口C时钟
那么我们就是 不改变其他位的情况下 用或 运算即可。
//打开时钟
*(unsigned int *)0x40021018 |= 0x01 << 3; //(左移四位)
2.2:配置GPIOB5 为输出模式
1.找到GPIOB 的起始地址 (基地址)
GPIOB 的起始地址:0X4001 0C00
2.找到端口配置高寄存器偏移地址:
偏移地址:0x04
0X4001 0C00 + 0x00 = 0x4001 0C00
设置成推挽输出 以及 输出模式 设置最大为10MHz:
//设置端口为输出模式,速率为10MHz,推挽输出模式 PB5
*(unsigned int*)0x40010C00 |= 0x01<<20; //左移20位
2.3:让GPIOB5引脚输出低电平
1.找到端口输出数据寄存器
偏移值:0x0c
在不影响其他位数据时,我们想让第5位输出低电平
//设置GPIOB5低电平
*(unsigned int*)0x40010C0C &= ~(1<<5); //左移5位,输出0,led灯亮
完整代码:
#include "stm32f10x.h" // Device header
int main()
{
//使能GPIOB时钟
*(unsigned int*)0x40021018 |= (1<<3); //左移3位
//使能GPIOE时钟
*(unsigned int*)0x40021018 |= (1<<6); //左移6位
//设置端口为输出模式,速率为10MHz,推挽输出模式 PB5
*(unsigned int*)0x40010C00 |= 0x01<<20; //左移20位
//设置GPIOB5低电平
*(unsigned int*)0x40010C0C &= ~(1<<5); //左移5位,输出0,led灯亮
//设置GPIOB5高电平
// *(unsigned int*)0x40010C0C |= (1<<5); //左移5位,输出0,led灯灭
//设置端口为输出模式,速率为2MHz,推挽输出模式 PE5
*(unsigned int*)0x40011800 |= (0x02<<20);
//设置GPIOE5低电平
*(unsigned int*)0x4001180C &= ~(1<<5); 左移5位,输出0,led灯亮
}
//为了编译不报错
void SystemInit()
{
}