STM32CubeMx+HAL笔记(七)用GPIO控制LED灯实战(寄存器编程)

背景:Nucleo-stm32L432KCU开发板点亮LD3

一、软件开发步骤(回顾)

详细参考:https://blog.csdn.net/weixin_42638731/article/details/122309122?spm=1001.2014.3001.5501

1.使能GPIOB的外设时钟

        外设基地址:0xxxxxxxxx——RCC基地址

        偏移:0xxx

        APB2外设时钟使能寄存器 = 外设基地址 + 偏移

2.查阅参考手册的GPIO章节,配置推挽输出模式。通过端口位配置表展示的寄存器来进行配置。

二、实现思路

1.控制LD3的原理图

PB3配置输出高电平时,LD3灯亮。

STM32CubeMx+HAL笔记(七)用GPIO控制LED灯实战(寄存器编程)_第1张图片

 

2.使能GPIOB时钟

首先找到GPIO挂载在哪条时钟总线,然后使用RCC的外设基地址,对应时钟总线的偏移地址。

STM32CubeMx+HAL笔记(七)用GPIO控制LED灯实战(寄存器编程)_第2张图片

 GPIOB挂载在AHB2上,那么找RCC基地址:

STM32CubeMx+HAL笔记(七)用GPIO控制LED灯实战(寄存器编程)_第3张图片

AHB2偏移地址:

STM32CubeMx+HAL笔记(七)用GPIO控制LED灯实战(寄存器编程)_第4张图片

所以RCC的基地址:0x40021000

AHB2时钟使能偏移地址:0x4c

3.配置GPIOB模式:输出

GPIOB的基地址从上面图中可以看出:0x48000400

偏移地址:0x00

MODE3[1:0]设置0x1,输出模式

STM32CubeMx+HAL笔记(七)用GPIO控制LED灯实战(寄存器编程)_第5张图片

4.配置输出模式:推挽、开漏

GPIOB的基地址从上面图中可以看出:0x48000400

偏移地址:0x04

之前说过,一般都选择推挽输出,开漏输出用在I2C通信、SMBUS通信、电平不匹配场合,其他都用推挽输出

STM32CubeMx+HAL笔记(七)用GPIO控制LED灯实战(寄存器编程)_第6张图片

 

5.配置输出速度

GPIOB的基地址从上面图中可以看出:0x48000400

偏移地址:0x08

STM32CubeMx+HAL笔记(七)用GPIO控制LED灯实战(寄存器编程)_第7张图片

6.配置上拉下拉

GPIOB的基地址从上面图中可以看出:0x48000400

偏移地址:0x0c

STM32CubeMx+HAL笔记(七)用GPIO控制LED灯实战(寄存器编程)_第8张图片

7.配置输出寄存器

GPIOB的基地址从上面图中可以看出:0x48000400

偏移地址:0x14

PB3输出高电平,LD3亮

STM32CubeMx+HAL笔记(七)用GPIO控制LED灯实战(寄存器编程)_第9张图片

8.配置复位置位寄存器

GPIOB的基地址从上面图中可以看出:0x48000400

偏移地址:0x18

复位即设置低电平,置位设置高电平,这里设置复位和置位的bit位不相同

STM32CubeMx+HAL笔记(七)用GPIO控制LED灯实战(寄存器编程)_第10张图片

 三、代码(寄存器编程)

亲试可用:

#define GPIOB_CLK 		(*(volatile unsigned int *)(0x40021000+0x4c))
#define GPIOB_MODER     (*(volatile unsigned int *)(0x48000400+0x00))
#define GPIOB_OTYPER 	(*(volatile unsigned int *)(0x48000400+0x04))
#define GPIOB_OSPEEDR   (*(volatile unsigned int *)(0x48000400+0x08))
#define GPIOB_PUPDR		(*(volatile unsigned int *)(0x48000400+0x0c))
#define GPIOB_IDR	    (*(volatile unsigned int *)(0x48000400+0x10))
#define GPIOB_ODR 		(*(volatile unsigned int *)(0x48000400+0x14))
#define GPIOB_BSRR		(*(volatile unsigned int *)(0x48000400+0x18))
#define GPIOB_BRR		(*(volatile unsigned int *)(0x48000400+0x28))


int main(void)
{
	//1.使能GPIOB
	GPIOB_CLK &= ~(0x1<<(1*1)); //清除某1位
	GPIOB_CLK |= (0x1<<(1*1)); //设置该位
	
	//2.配置GPIOB模式:通用输出
	GPIOB_MODER &= ~(0x3<<(2*3));
	GPIOB_MODER |= (0x1<<(2*3));

	//3.配置输出模式:推挽,开漏
	GPIOB_OTYPER = 0x0;

	//4.配置输出速度
	GPIOB_OSPEEDR =0x0;

	//5.配置上拉下拉
	GPIOB_PUPDR &= ~(0x3<<(2*3));
	GPIOB_PUPDR |= (0x0<<(2*3));

	//6.配置输出寄存器
	GPIOB_ODR = 0x8;//PB3高电平
	//GPIOB_ODR = 0x0;//PB3低电平

	//7.配置复位置位寄存器
	//GPIOB_BSRR = (0x1<<19); //复位
	//GPIOB_BSRR = (0x1<<3);  //置位
	
}

你可能感兴趣的:(STM32_HAL库学习笔记,stm32,单片机,arm)