六、寄存器点亮LED灯
1. 配置流程
一般我们使用GPIO的端口,都需要有以下几个步骤。
- 开启GPIO的端口时钟
- 配置GPIO端口数字功能
- 配置GPIO的输出模式
- 配置端口驱动能力和输出速度
- 配置GPIO的输出
从LED介绍那一章节我们了解到用户LED接的是单片机的PC13,下面我们就以用户LED接的PC13进行介绍。
2. 开启GPIO的端口时钟
CW32的所有外设资源时钟默认都是关闭的,在配置外设之前需要先开 启对应的时钟。 要使能用户LED,就要先开启GPIOC的时钟,从数据手册的第11页我们了解到GPIOC挂载在AHB总线上,那操作GPIOC的时钟肯定要配置AHB使能寄存器。在用户手册的第81页,SYSCTRL_AHBEN 使能寄存器如下图。
从上图可以看到地址偏移量为0x30,那这个基地址是多少呢?在用户手册的第68页有明确说明,SYSCTRL 基地址:0x4001 0000 。那我们SYSCTRL_AHBEN 寄存器的地址就是基地址加上偏移量,0x4001 0000 + 0x30 = 0x4001 0030。 我们已经找到地址了,根据上图我们可以清晰的看到GPIOC的位域是6,我们只需要在第六位域将这个位赋值为1即可!!说明
在CW32的头文件中已经将大部分的地址定义了,所以我们只需要调用这些地址的定义就可以了。
*(unsigned int *)(0x40010030) |= (1 << 6); // 使能GPIOC时钟
3. 配置GPIO数字功能
我们首先来查看寄存器列表(在用户手册第151页):
有几个点我们需要特别注意:- 查看GPIOC的基地址
- 寄存器名称
- 寄存器描述
找到GPIOx_ANALOG寄存器,将13引脚对应的位配置为0,将端口配置为数字模式(只有高低电平)。
从寄存器列表中我们可以知道:- GPIOC基地址是:0x4800 0800
- GPIOx_ANALOG寄存器地址是:0x4800 0800 + 0x1C
- 将该寄存器的地址中的第13位域写入0即可。
说明
在CW32的头文件中已经将大部分的地址定义了,所以我们只需要调用这些地址的定义就可以了。
*(unsigned int *)(0x4800081C) &= ~(1 << 13); // PC13设定为数字模式
4. 配置输出模式
在GPIOx_DIR寄存器地址中将13引脚对应的位配置为0,将端口配置为输出。
从寄存器列表中我们可以知道:- GPIOC基地址是:0x4800 0800
- GPIOx_DIR寄存器地址是:0x4800 0800 + 0x00 将该寄存器的地址中的第13位域写入0即可。
说明
在CW32的头文件中已经将大部分的地址定义了,所以我们只需要调用这些地址的定义就可以了。
*(unsigned int *)(0x48000800) &= ~(1 << 13); // PC13设定为输出模式
在PIOX_OPENDRAIN寄存器地址中将13引脚对应的位配置为0,将端口配置为推挽输出。
从寄存器列表中我们可以知道:- GPIOC基地址是:0x4800 0800
- GPIOx_OPENDRAIN寄存器地址是:0x4800 0800 + 0x04
将该寄存器的地址中的第13位域写入0即可。
说明
在CW32的头文件中已经将大部分的地址定义了,所以我们只需要调用这些地址的定义就可以了。
*(unsigned int *)(0x48000804) &= ~(1 << 13); // PC13设定为推挽输出
5. 配置端口驱动能力和输出速度
在 PIOx_DRIVER寄存器 和 GPIOx_SPEED寄存器 将13引脚对应的位配置,将端口配置为高驱动里高速输出。
从寄存器列表中我们可以知道:
- GPIOC基地址是:0x4800 0800
- PIOx_DRIVER寄存器地址是:0x4800 0800 + 0x20
- GPIOx_SPEED寄存器地址是:0x4800 0800 + 0x08
PIOx_DRIVER的地址中的第13位域写入0即可。
PIOx_SPEED的地址中的第13位域写入1即可。
说明
在CW32的头文件中已经将大部分的地址定义了,所以我们只需要调用这些地址的定义就可以了。
*(unsigned int *)(0x48000820) &= ~(1 << 13); // PC13设定为高驱动能力
*(unsigned int *)(0x48000808) |= (1 << 13); // PC13设定为高输出速度
2
3
6. 配置GPIO输出高电平
配置GPIO的输出需要配置端口输出寄存器GPIOx_ODR
从寄存器列表中我们可以知道:- GPIOC基地址是:0x4800 0800
- PIOx_ODR寄存器地址是:0x4800 0800 + 0x54
- PIOx_DRIVER的地址中的第13位域写入0即可。
PIOx_SPEED的地址中的第13位域写入1即可。
说明
在CW32的头文件中已经将大部分的地址定义了,所以我们只需要调用这些地址的定义就可以了。
*(unsigned int*)(0x48000854) |= (1 << 13); // PC13输出高电平
7. 实验现象
如果用上面的代码需要注意一下,像RCC这种宏定义其实在CW32的头文件中已经定义了,可以直接使用原来定义的,这样我们就不用再编写,也可以把我们编写的名称稍微修改一下,比如在它们前面加上一个LED或者BSP等等都可。
关于这一章节的代码,在立创·地文星CW32F030C8T6开发板资料/第03章软件资料/代码例程/里面的001寄存器点灯。
烧写我们的代码之后,可以看到开发板的LED这个灯将被点亮。