STM32学习:利用寄存器点亮LED

这篇博客介绍了如何使用STM32F10x库函数,通过定义寄存器地址并配置GPIOC来点亮PZ6806L开发板上的LED。首先开启GPIOC时钟,然后设置GPIO端口模式,最后通过修改GPIOC_BSRR寄存器实现LED的亮灭。代码详细解释了每一步操作,并提供了主程序示例。

/*使用普中PZ6806L开发板*/

由对应的LED模块的电路可知, 要想点亮一个LED,就要将其对应的引脚输出低电平。

要使用寄存器,首先要对其进行封装,具体代码如下:

#define PERIPH_BASE                     ((uint32_t)0x40000000)
#define APB2PERIPH_BASE                 (PERIPH_BASE + 0x10000)
#define GPIOC_BASE                      (APB2PERIPH_BASE + 0x1000)
#define GPIOC_CRL						*(int*)(GPIOC_BASE+0X00)
#define GPIOC_CRH						*(int*)(GPIOC_BASE+0X04)
#define GPIOC_IDR						*(int*)(GPIOC_BASE+0X08)
#define GPIOC_ODR						*(int*)(GPIOC_BASE+0X0C)
#define GPIOC_BSRR					    *(int*)(GPIOC_BASE+0X10)
#define GPIOC_BRR						*(int*)(GPIOC_BASE+0X14)
#define GPIOC_LCKR					    *(int*)(GPIOC_BASE+0X18)
#define AHBPERIPH_BASE                  (PERIPH_BASE + 0x20000)
#define RCC_BASE                        (AHBPERIPH_BASE + 0x1000)	
#define RCC_APB2ENR					    *(unsigned int*)(RCC_BASE+0X18)

这些代码写在stm32f10x.h里,我使用的是写好的头文件,所以自己在写这些代码时其中的PERIPH_BASE,APB2PERIPH_BASE,GPIOC_BASE,AHBPERIPH_BASE,RCC_BASE都是定义好的,不需要再定义了,否则会出现警告"macro redefined"。其他寄存器的地址则通过“基地址+相对基地址的偏移量”得到。具体数据通过查询数据手册和开发板原理图可得到。

例如:

所有I/O接口均挂载在APB2上,而APB2又挂载在block2上,所以PERIPH_BASE为0x40000000。

 而APB2PERIPH_BASE为(PERIPH_BASE+0x10000)

/*APB2起始地址*/

GPIOC地址为:

 所以GPIOC_BASE=(APB2PERIPH_BASE+0x1000)

之后的GPIOC_CRL等寄存器可直接通过参考手册查的偏移量,在GPIOC_BASE上加就可以。

要注意的是这里的"unsigned int*"的作用是将立即数变为指针,外面的“*”是取内容运算符,使寄存器得到相应地址。

之后就是点亮LED的主程序:

int main()
{
    /*第一步必须先开启时钟*/
	RCC_APB2ENR |= 1<<4;		   //通过移位运算开启GPIOC的时钟,'|'运算保持GPIOC之前的位不变				
	/*设置输入输出模式*/
    GPIOC_CRL &= ~(0X0F<<(4*0));   //对要进行操作的管脚复位,要操作几号管脚就是4*几 
	GPIOC_CRL |= (3<<(4*0));       //置位,设置输入输出模式

	GPIOC_BSRR=(1<<(16+0));        //对应管脚输出低电平,LED亮

	while(1){
		GPIOC_BSRR=(1<<(16+0));    

		delay(0xFFFFF);
		GPIOC_BSRR=(1<<(0+0));      //对应管脚输出高电平,LED灭

		delay(0xFFFFF);
	}
}

之后下载程序到开发板就可以点亮LED了!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值