STM32寄存器点亮LED灯

一: 如何寄存器点灯

1:看单片机的原理图 找到LED灯

STM32寄存器点亮LED灯_第1张图片

 这个灯是 PB5引脚

看原理图可以看出 让GPIOB5输出低电平 就能点亮
那么我们得让
打开控制GPIOB5的时钟
让GPIOB5 输出模式
让GPIOB5低电平

二:看中文参考手册配置寄存器

2.1:打开管 GPIOB5的时钟

时钟就相当于一个阀门开关,或者理解成水龙头,你打开了 才有水出来,也就是你打开才能工作。

看中文参考手册 系统架构 找到你的GPIOB 看看是谁管的。

STM32寄存器点亮LED灯_第2张图片

 找到时钟的起始地址 也称为 基地址

STM32寄存器点亮LED灯_第3张图片

 由于是APB2管 我们也要找到 APB2外设时钟使能寄存器的偏移地址

STM32寄存器点亮LED灯_第4张图片

 要打开GPIOB5的时钟

时钟起始地址 + APB2外设时钟使能寄存器的偏移地址 = 控制GPIOB5的时钟的寄存器地址
0x4002 1000 + 0x18 = 0x4002 1018

如何打开呢 再中文参考手册继续参考

STM32寄存器点亮LED灯_第5张图片

 STM32寄存器点亮LED灯_第6张图片

在位3 中 1 为打开端口C时钟
那么我们就是 不改变其他位的情况下 用或 运算即可。

//打开时钟
*(unsigned int *)0x40021018 |= 0x01 << 3;    //(左移四位)

2.2:配置GPIOB5 为输出模式

1.找到GPIOB 的起始地址 (基地址)

STM32寄存器点亮LED灯_第7张图片

 GPIOB 的起始地址:0X4001 0C00

2.找到端口配置高寄存器偏移地址:

偏移地址:0x04

STM32寄存器点亮LED灯_第8张图片

 0X4001 0C00 + 0x00 = 0x4001 0C00

设置成推挽输出 以及 输出模式 设置最大为10MHz:

//设置端口为输出模式,速率为10MHz,推挽输出模式    PB5
*(unsigned int*)0x40010C00 |= 0x01<<20;   //左移20位

2.3:让GPIOB5引脚输出低电平

1.找到端口输出数据寄存器

STM32寄存器点亮LED灯_第9张图片

偏移值: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()
{


}

 

你可能感兴趣的:(stm32,嵌入式硬件,单片机)