五、寄存器点亮LED灯
1. 配置流程
一般我们使用GPIO的端口,我们直接在一个寄存器中配置GPIO。
从LED介绍那一章节我们了解到用户LED接的是单片机的PB2,下面我们就以用户LED接的PB2进行介绍。
注意在这里我们不需要进行GPIO端口时钟的使能。 时钟的初始化在 SystemInit 中被初始化,然后疑问又来了。SystemInit 在main函数中没找到,这个就要和单片机的启动有关系了,在 main 函数之前还有时钟初始化和 __main 函数的运行,这个我们要去启动文件中可以找到。如下图
我们主要配置的寄存器为 通用控制寄存器(PCRxy) ,x为A~i(端口号),y对应0~15(引脚号)。 寄存器地址:
寄存器相关配置:
- b15:我们不用管,为0即可,对应端口的所有数字功能全部强制无效,包括通用输入输出,周边的数字输入输出,上拉功能,以及外部中断输入功能。当端口作为模拟输入时,请设为 1。
- b14:设为0,我们将输出锁存失效。
- b12:设置为0,不使用外部中断输入。
- b9:置为0,输出不相反。
- b6,设为0,0内部上拉失效。
- b5~b4:设为11,高驱动模式。
- b2:设为0,正常输出。
- b1:设为1,输出许可。
- b0:设为1,输出高电平。
进入下面的网站进行bit的计算: https://wu_caicheng.gitee.io/gw-reg-conv-tool/ 我们就找出来所有需要配置的bit位数据,也就是:
我们往该寄存器写入 0x33 即可。
由图1-2-1可知,基地址为0x40053800 ,PCRxy寄存器的偏移地址是0x400+0x40n+0x4y,我们要将PB2输出高电平,所以x是1,y是2,也就是PCRB2,偏移地址是:0x400+0x401+0x42。
所以PCRB2整体地址为:0x40053800 + 0x400 + 0x401 + 0x42
也就是:0x40053800 +0x448 = 0x40053C48
我们直接往该地址写入0x33即可完成配置。
转化成代码就是:
*((unsigned int*)(0x40053C48UL)) = 0x33UL;
2. 配置GPIO输出高电平
我们想要控制GPIO输出高低电平,根据上节讲解的内容,我可以直接在通用控制寄存器(PCRxy)控制b0位来输出的高低电平。
- b0为1时:输出高电平
- b0为0时:输出低电平 转化为代码就是:
*((unsigned int*)(0x40053C48UL)) = 0x33UL; // 输出高电平
*((unsigned int*)(0x40053C48UL)) = 0x32UL; // 输出低电平
2
3. 实验现象
如果用上面的代码需要注意一下,像RCC这种宏定义其实在HC32的头文件中已经定义了,可以直接使用原来定义的,这样我们就不用再编写,也可以把我们编写的名称稍微修改一下,比如在它们前面加上一个LED或者BSP等等都可。
烧写我们的代码之后,可以看到开发板的LED这个灯将被点亮。