背景: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灯亮。
2.使能GPIOB时钟
首先找到GPIO挂载在哪条时钟总线,然后使用RCC的外设基地址,对应时钟总线的偏移地址。
GPIOB挂载在AHB2上,那么找RCC基地址:
AHB2偏移地址:
所以RCC的基地址:0x40021000
AHB2时钟使能偏移地址:0x4c
3.配置GPIOB模式:输出
GPIOB的基地址从上面图中可以看出:0x48000400
偏移地址:0x00
MODE3[1:0]设置0x1,输出模式
4.配置输出模式:推挽、开漏
GPIOB的基地址从上面图中可以看出:0x48000400
偏移地址:0x04
之前说过,一般都选择推挽输出,开漏输出用在I2C通信、SMBUS通信、电平不匹配场合,其他都用推挽输出
5.配置输出速度
GPIOB的基地址从上面图中可以看出:0x48000400
偏移地址:0x08
6.配置上拉下拉
GPIOB的基地址从上面图中可以看出:0x48000400
偏移地址:0x0c
7.配置输出寄存器
GPIOB的基地址从上面图中可以看出:0x48000400
偏移地址:0x14
PB3输出高电平,LD3亮
8.配置复位置位寄存器
GPIOB的基地址从上面图中可以看出:0x48000400
偏移地址:0x18
复位即设置低电平,置位设置高电平,这里设置复位和置位的bit位不相同
三、代码(寄存器编程)
亲试可用:
#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); //置位
}
版权声明:本文为weixin_42638731原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。