[2]用STM32点亮第一个LED灯-用寄存器实现

用STM32点亮第一个LED灯-用寄存器实现

前言

相比于库函数,寄存器可能更难学一点,因为比较底层的知识,需要更扎实的功底,在之后的项目实验里面我都会用库函数,但是寄存器如果一点都不了解的话,之后出了Bug也很难解决,所以第一个实验—点亮LED灯,我也会用寄存器实现一次。

和库函数的准备工作一样,首先要先创建一个工程模板,然后添加led.h和led.c两个文件,具体步骤同于库函数的那篇博客,而不同的是led.c的程序是写的关于寄存器的程序。[1]用STM32点亮第一个LED灯-用库函数实现

GPIO知识回顾

因为我是看的正点原子的教程,所以参考的也是正点原子的几本资料,分别是STM32中文参考手册(主要是看寄存器配置)和STM32开发指南。

首先是GPIO的基础知识,由于我们要配置PE5和PB5两个端口,和寄存器一样要先对对PE5和PB5两个端口初始化再设置高低电平,从而实现LED灯的点亮与关闭,同理也应该用寄存器的方法使能时钟。在这里插入图片描述
具体上面的寄存器,我也只能从字面上了解,通过视频了解,CRL是控制的0-7位,CRH配置的8-15位,我们配置的是低位,所以这里之后会用CRL来初始化端口而不是CRH。

根据STM32中文参考手册的端口配置低寄存器,在MODE和CNF0里面更改其数值就可以更改其输出模式和速度,一个红色的框代表一位。比如我们这里要设置推挽输出,速度为50MHZ,在这里就是0011,这个二进制转化为十进制就是3,等会我们就要将第五位(因为是PB5和PE5)设置为0011,就把其设置为了速度为50MHz的推挽输出模式。
在这里插入图片描述

用寄存器使能时钟

在库函数里面,我是通过调用了一个时钟使能函数实现的控制。而在寄存器里面就要通过更改寄存器内的二进制数据实现对STM32板的直接控制(个人理解)。
GPIO口都是的使能时钟都是通过RCC里面的APB2ENR控制的。根据STM32中文参考手册只需要把第六位和第三位的数据改为1即可使能时钟。在这里插入图片描述

led.c函数

led.h这个库函数和之前的一样,无需更改,这里只需要重写LED_Init这个函数,用寄存器实现。

#include "led.h"   //调用库函数
#include "stm32f10x.h"

void LED_Init(void)
{
RCC->APB2ENR|=1<<3;    //使能时钟,使第三位和第六位为1即可使能时钟,不改变其它位
RCC->APB2ENR|=1<<6;    //这里用了C语言的或等于运算
//配置GPIOB.5
GPIOB->CRL&=0xFF0FFFFF;  //用16进制先将第五位清零 即为0000
GPIOB->CRL|=0x00300000;   //将第五位设置为0011
GPIOB->ODR|=1<<5;	            //将第五位设置为高电平
//配置GPIOE.5
GPIOE->CRL&=0xFF0FFFFF;
GPIOE->CRL|=0x00300000;
GPIOE->ODR|=1<<5;	

}


这里设置为高电平直接用的ODR寄存器,因为其只有一位,将其第五位更改为1即设置为了高电平。
在这里插入图片描述

main函数

main函数和库函数中的main函数大同小异,只不过由函数控制变成了寄存器控制,下面是main函数的代码。

#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
int main(void)
{
delay_init();
LED_Init();

while(1)
{
GPIOB->ODR|=1<<5;	
GPIOE->ODR|=1<<5;	
delay_ms(500);
	
GPIOB->ODR=~(1<<5);	
GPIOE->ODR=~(1<<5);
delay_ms(500);
}
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值