天天看点

STM32学习笔记【3】使用寄存器点亮LED灯使用寄存器点亮LED灯

使用寄存器点亮LED灯

1.配置输出数据寄存器

找到LED灯的原理图:

STM32学习笔记【3】使用寄存器点亮LED灯使用寄存器点亮LED灯

由原理图可知,红色灯对应的端口为PB5,绿色对应的端口为PB0,蓝色对应的端口为PB1。当端口为低电平的时候,灯被点亮。

查阅手册可知,GPIOB的存储器映像为0X40010C00-0X40010FFF;而端口对应的输出数据寄存器的偏移量为0Ch。

STM32学习笔记【3】使用寄存器点亮LED灯使用寄存器点亮LED灯

下面代码使用了位移操作,详情可看:【C语言知识】关于移位指令的使用。

配置寄存器的代码为:

*(unsigned int *)0x40010C0C &=~(1<<0);

2.配置低端口寄存器(CRL)

在配置输出数据寄存器之前,我们还需要配置端口模式和功能。查阅手册可知,由CNF0和MODE0分别控制功能和模式,我们需要相应地配置,以用于GPIO口的使用。

STM32学习笔记【3】使用寄存器点亮LED灯使用寄存器点亮LED灯

LED灯需要使用推挽输出(后面会解释),这里的速度我们使用10MHz。所以CNF0应该为00,MODE0应该为01,整体配置应该是0001。

具体代码如下:

*(unsigned int *)0x40010C00 |=(1<<(4*0));

3.时钟配置(RCC)

在绝大部分的应用中,都先需要首先启动RCC时钟控制,才能正常的运行程序。

由于GPIOB是APB2总线上的外设,所以我们需要打开APB2中GPIOB对应的时钟。

STM32学习笔记【3】使用寄存器点亮LED灯使用寄存器点亮LED灯

IOPBEN的定义如下:

STM32学习笔记【3】使用寄存器点亮LED灯使用寄存器点亮LED灯

我们只要打开对应端口的第三个寄存器即可。

查阅手册得知,APB2的RCC的起始地址为0x40021000-0x400213FF。

具体代码如下:

*(unsigned int *)0x40021018 |=(1<<3);

4.完整代码如下

int main(void)
{
	//配置时钟
	*(unsigned int *)0x40021018 |=(1<<3);
	
	//配置I/O口模式
	*(unsigned int *)0x40010C00 |=(1<<(4*0));
	
	//控制ODR寄存器
	*(unsigned int *)0x40010C0C &=~(1<<0);
}
           

这里没有使用固件库,全部是寄存器编程,目的是为了强化对于寄存器的理解,以及复习C语言移位指令。

继续阅读