使用寄存器点亮LED灯
1.配置输出数据寄存器
找到LED灯的原理图:
由原理图可知,红色灯对应的端口为PB5,绿色对应的端口为PB0,蓝色对应的端口为PB1。当端口为低电平的时候,灯被点亮。
查阅手册可知,GPIOB的存储器映像为0X40010C00-0X40010FFF;而端口对应的输出数据寄存器的偏移量为0Ch。
下面代码使用了位移操作,详情可看:【C语言知识】关于移位指令的使用。
配置寄存器的代码为:
*(unsigned int *)0x40010C0C &=~(1<<0);
2.配置低端口寄存器(CRL)
在配置输出数据寄存器之前,我们还需要配置端口模式和功能。查阅手册可知,由CNF0和MODE0分别控制功能和模式,我们需要相应地配置,以用于GPIO口的使用。
LED灯需要使用推挽输出(后面会解释),这里的速度我们使用10MHz。所以CNF0应该为00,MODE0应该为01,整体配置应该是0001。
具体代码如下:
*(unsigned int *)0x40010C00 |=(1<<(4*0));
3.时钟配置(RCC)
在绝大部分的应用中,都先需要首先启动RCC时钟控制,才能正常的运行程序。
由于GPIOB是APB2总线上的外设,所以我们需要打开APB2中GPIOB对应的时钟。
IOPBEN的定义如下:
我们只要打开对应端口的第三个寄存器即可。
查阅手册得知,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语言移位指令。