六、寄存器点亮LED灯
1. 配置流程
一般我们使用GPIO的端口,都需要有以下几个步骤。
- 开启GPIO的端口时钟
- 配置GPIO的模式
- 配置GPIO的输出
从LED介绍那一章节我们了解到用户LED接的是单片机的PC13,下面我们就以用户LED接的PC13进行介绍。
2. 开启GPIO的端口时钟
STM32的所有外设资源时钟默认都是关闭的,在配置外设之前需要先开 启对应的时钟。
要使能用户LED,就要先开启GPIOC的时钟,从数据手册的第11页我们了解到GPIOC挂载在APB2总线上,那操作GPIOC的时钟肯定要配置APB2使能寄存器。在中文参考手册的第115页,APB2使能寄存器如下图所示。
从上图可以看到地址偏移量为0x18,那这个基地址是多少呢?因为APB2使能寄存器是在RCC外设的地址范围内,所以RCC的外设基地址就是APB2使能寄存器的基地址,在中文参考手册的第28页有明确说明,RCC基地址:0x4002 1000。那我们RCC_APB2ENR 寄存器的地址就是基地址加上偏移量,0x4002 1000 + 0x18 = 0x4002 1018。找到要操作的地址了,那我们怎么去配置这个值呢?我们继续看这个寄存器的说明,在中文参考手册的第95页有寄存器说明,如图所示。
从上图可以了解到RCC_APB2ENR 寄存器的第4位就是GPIOC端口时钟使能,我们要开启GPIOC端口时钟使能,就需要往 RCC_APB2ENR 的第4位写1,然后为了保持其他位不变,我们可以使用一个或运算,也就是 RCC_APB2ENR |= 0x00000010,也就是相当于往 RCC_APB2ENR 寄存器的第1位写1,其他位保持不变。其实也可以写为 RCC_APB2ENR |=(1 << 4),是一样的效果,这里的4就是寄存器的第4位,如果是2就是寄存器的第2位,依次类推(位数从0开始)。
在STM32的头文件中已经将大部分的地址定义了,所以我们只需要调用这些地址的定义就可以了。
RCC->APB2ENR |= ( 0x01 << 4 );
3. 配置GPIO模式&输出
我们要使能用户LED,自然是配置GPIO为输出模式,找到控制寄存器(GPIOx_CRH),如图所示。
从上图可以看到GPIOx_MODER
的地址偏移是0x00,我们要使能的是GPIOC的引脚,所以要加上GPIOC的基地址0x4002 0400,即GPIOx_MODER
寄存器的地址为0x4002 0400 + 0x00。我们接着看这个寄存器的介绍说明,如图所示。
从上图可以看到每一个引脚都由2位控制,我们要操作的是PC13引脚,也就是pin13,也就是GPIOx_CRH
寄存器的第20位到第23位。
将MODE13配置为:11
将CNF13配置为:00
在STM32的头文件中已经将大部分的地址定义了,所以我们只需要调用这些地址的定义就可以了。
// 清空控制PC13的端口位
GPIOC->CRH &= ~(0xFF << (4 * (13 - 8))); // 注意PC13对应CRH中的第5个位置,因此是13-8
// 配置PC13为通用推挽输出,速度为10MHz
GPIOC->CRH |= (0x1 << (4 * (13 - 8))); // 设置为通用推挽输出模式,速度10MHz
2
3
4
5
4. 配置GPIO输出高电平
配置GPIO的输出需要配置端口输出寄存器GPIOx_ODR
端口输出模式寄存器如图所示。
从上图可以看到端口输出模式寄存器的地址偏移为0x0C,那GPIOx_ODR寄存器的地址就是0x4002 0400 + 0x0C。我们接着往下看这个寄存器的介绍,如图所示。
从上图来看,只需要往对应的寄存器写1即可。转化为代码为GPIOC_MODER &= (0x01 << 13)。 在STM32的头文件中已经将大部分的地址定义了,所以我们只需要调用这些地址的定义就可以了。
// PC13输出高电平
GPIOC->ODR |= (1<<13);
2
5. 实验现象
如果用上面的代码需要注意一下,像RCC这种宏定义其实在STM32的头文件中已经定义了,可以直接使用原来定义的,这样我们就不用再编写,也可以把我们编写的名称稍微修改一下,比如在它们前面加上一个LED或者BSP等等都可。
关于这一章节的代码百度网盘可下载,在立创·STM32F103C8T6开发板资料(标准库)/第03章软件资料/代码例程/001寄存器点灯。
烧写代码之后,可以看到开发板的LED这个灯将被点亮。