STM32——LED点灯(MiniSTM32F103RCT6,寄存器版本)

一、查看原理图:

在这里插入图片描述   在这里插入图片描述

由图可知,该开发板的LED0LED1分别接PA8PD2,且欲点亮LED0LED1,需要让PA8PD2输出低电平

二、查看参考手册:

1、外设时钟使能:

在这里插入图片描述 在这里插入图片描述
在这里插入图片描述 在这里插入图片描述

由以上信息可知:RCC寄存器的起始地址为0x40021000,APB2 外设时钟使能寄存器RCC_APB2ENR的偏移地址为0x18,即绝对地址为 0x40021000+0x18=0x40021018,把RCC_APB2ENR寄存器的bit5bit21即可使能GPIOAGPIOD的时钟

2、端口配置:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

由以上信息可知:GPIOA寄存器和GPIOD寄存器的起始地址分别为0x400108000x40011400,端口配置高寄存器GPIOx_CRH的偏移地址为0x04,端口配置低寄存器GPIOx_CRL的偏移地址为0x00,所以PA8口:应配置地址0x40010804bit3~00001PD2口:应配置地址0x40011400bit11~80001(此处我们配置通用推挽输出模式输出模式,最大速度10MHZ

3、端口输出:

在这里插入图片描述

GPIOA寄存器和GPIOD寄存器的起始地址分别为0x400108000x40011400,端口输出数据寄存器GPIOx_ODR的地址偏移为0x0C,所以PA8口:应配置地址0x4001080Cbit80PD2口:应配置地址0x4001140Cbit20

三、参考程序:

!!逐步优化代码,不断接近库函数,从而实现 “寄存器版本” 向 “库函数版本” 的转变

1、直接操作寄存器:

void LED0_Init(void);
void LED1_Init(void);

int main(void)
{
   
	LED0_Init();
	LED1_Init();

	*(unsigned int *)0x4001080C &= ~(1<<8);		// PA8输出低电平
	*(unsigned int *)0x4001140C &= ~(1<<2);		// PD2输出低电平
	
}

void LED0_Init(void)
{
   
	*(unsigned int *)0x40021018 |= (1<<2);					// 开启GPIOA时钟

	*(unsigned int *)0x40010804 &= ~((0x0f)<<(4*0));		// 配置 PA8
	*(unsigned int *)0x40010804 |= ((1)<<(4*0));
}

void LED1_Init(void)
{
   
	*(unsigned int *)0x40021018 |= (1<<5);					// 开启GPIOD时钟
	
	*(unsigned int *)0x40011400 &= ~((0x0f)<<(4*2));		// 配置PD2
	*(unsigned int *)0x40011400 |= ((1)<<(4*2));
}

2、寄存器映射:

#define PERIPH_BASE        ((unsigned int)0x40000000)

#define APB1PERIPH_BASE    (PERIPH_BASE)
#define APB2PERIPH_BASE	   (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE     (PERIPH_BASE + 0x20000)

#define RCC_BASE           (AHBPERIPH_BASE + 0x1000)
#define GPIOA_BASE         (APB2PERIPH_BASE + 0x800)
#define GPIOD_BASE         (APB2PERIPH_BASE + 0x1400)

#define RCC_APB2ENR        *(unsigned int *)(RCC_BASE + 0x18)
#define GPIOA_CRH          *(unsigned int 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~莘莘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值