寄存器初识----stm32f103rbt6

本文详细介绍了如何通过STM32F103RB微控制器的寄存器操作来点亮LED灯。首先,文章解释了LED1-8使用的GPIOC端口,并说明了其外设基地址、偏移地址等关键信息。接着,介绍了端口配置寄存器GPIOC_CRL和GPIOC_CRH的用途,以及输出数据寄存器GPIOC_ODR的使用方法。最后,通过两种方式展示了如何打开GPIOC时钟并配置IO口为输出,包括直接操作寄存器地址和使用寄存器映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(由于第一次在自带的浏览器写,结果在粘贴代码时网页卡死,没有保存。。。所以没了。。。这是第二次写,所以介绍简略了许多)
目的:通过对寄存器的操作,点亮LED;
参考文档:国信长天嵌入式竞赛平台原理图,stm32f103rbt6 ,
STM32中文参考手册_V10,Cortex-M3权威指南(中文)

通过对文档的翻阅,我们知道了LED1-8使用的是开发板的PC8-15;即GPIO的C端口的第8-15位;
其中,外设基地址是0x40000000;APB2的偏移地址是0x10000,GPIO接口都挂接在APB2总线上;
GPIOC的偏移地址是0x1000,保存着操作GPIO口的一些寄存器;
端口配置低寄存器GPIOC_CRL的偏移是0x00;端口配置高寄存器GPIOC_CRH的偏移是0x04,用来配置IO模式,俩个寄存器共64位,每4位可以配置一个IO位线的模式,可以配置0-15共16根位线;
GPIOC_ODR的偏移是0x0C;用来输出数据,通过实验发现,输出0可以使LED点亮,而ODR复位设置是0x00000000;所以,如果想要使某一个LED点亮,需要先全部置1,然后使用位运算;或者直接用立即数赋值。
我们发现,即使这样,仍然不能点亮LED,这是因为,APB2挂接在AHB,AHB基地址一般认为是0x40020000,AHB上有RCC时钟,其中APB2 外设时钟使能寄存器(RCC_APB2ENR)的偏移是0x18;复位是0x00000000;所以需要对GPIO的C端口的时钟打开,如图,需要将第4位置1,
在这里插入图片描述
代码如下:
一种是直接操作寄存器地址,另一种是通过寄存器映射来实现;

void SystemInit()
{
}

#if 0
//直接操作地址
int main()
{
//打开GPIOC的时钟
	*(unsigned int *)0x40021018 |=((1)<<4);
//配置IO口为输出
	*(unsigned int *)0x40011004 =0x11111111;

//控制ODR寄存器					  
	*(unsigned int *)0x4001100C =0xFEFF;
}

void SystemInit()
{
}
#endif

 //使用寄存器映射

//外设
#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 GPIOC_BASE 		 (APB2PERIPH_BASE+0X1000)

//寄存器
#define RCC_APB2ENR 		 *(unsigned int *)(RCC_BASE+0X18)
#define GPIOC_CRL 		 *(unsigned int *)(GPIOC_BASE+0X00)
#define GPIOC_CRH 		 *(unsigned int *)(GPIOC_BASE+0X04)
#define GPIOC_ODR 		 *(unsigned int *)(GPIOC_BASE+0X0C)
int main()
{
//打开GPIOC的时钟
	RCC_APB2ENR |=((1)<<4);
//配置IO口为输出
	GPIOC_CRH =0x11111111;

//控制ODR寄存器					  
	GPIOC_ODR =0xFEFF;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值