七、库函数点亮LED灯
1. 配置流程
一般我们使用GPIO的端口,都需要有以下几个步骤。
- 开启GPIO的端口时钟
- 配置GPIO的输出参数
- 配置GPIO的输出
从LED介绍那一章节我们了解到用户LED接的是单片机的PC13。下面我们就以用户LED接的PC13进行介绍,其他也是类似的。
在使用库函数之前,我们需要了解到,CW32官方帮我们做好了这一套库函数,很详细,很全面。我们使用的时候只需要到对应的函数中去查找即可。
1.1 开启GPIO的端口时钟
所有外设资源时钟默认都是关闭的,在配置外设之前需要先开启对应的时钟。
既然要开启时钟,那我们就要去关于时钟的库函数里去查找,打开cw32f030_rcc.h头文件,里面有很详细的关于时钟的函数的声明,到里面去查找我们需要的即可。查找一般可根据函数名去定义它的功能。我们要去开启AHB总线中的GPIOC的时钟,因为我们的GPIOC是挂载在AHB总线上面的。
相对应的开启函数是:
void RCC_AHBPeriphClk_Enable(uint32_t Periph, FunctionalState NewState)
- uint32_t Periph: 作为参数传递的外设时钟标识符。这是一个32位无符号整数,用来指定想要操作的外设。常见的外设有GPIOA ~ GPIOF、CRC、FLASH、DMA等,通过宏定义(如RCC_AHB_PERIPH_GPIOF, RCC_AHB_PERIPH_GPIOC等)给出。
- FunctionalState NewState: 表示想要设置的新状态,是一个枚举类型(FunctionalState),由ENABLE和DISABLE两个选项组成,分别代表开启和关闭时钟。
下面还有很多其他的开启函数:
由此可知,这个函数的一个参数就是要使能的时钟,我们要使用的时钟是GPIOC,开启GPIOC时钟转换为代码就是:
RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_GPIOC, ENABLE);
1.2 配置GPIO的输出参数
配置GPIO的参数,首先我们需要一个结构体:
typedef struct
{
uint32_t Pins;
uint32_t Mode;
uint32_t IT;
uint32_t Speed;
} GPIO_InitTypeDef;
2
3
4
5
6
7
这个结构体在cw32f030_gpio.h中给我们定义了。我们重要的GPIO参数就是存放在这个结构体中的。 下面介绍一下各个参数:
参数介绍
uint32_t Pins: 用于指定要配置的GPIO引脚。
uint32_t Mode: 定义引脚的工作模式。
uint32_t IT: 配置GPIO的中断触发条件。
- uint32_t Speed: 设置GPIO引脚作为输出时的输出速度。
当我们配置使用结构体配置好参数之后,我们还需要使用初始化函数:
void GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
GPIO_TypeDef *GPIOx:用于配置的某个GPIO端口
GPIO_InitTypeDef *GPIO_Init:要初始化结构体
要配置PC13为推挽输出,速度为高,只需要传入对应的参数即可。转换为代码为
GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化结构体
GPIO_InitStruct.Pins = GPIO_PIN_13; // GPIO引脚
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; // 输出速度高
GPIO_Init(CW_GPIOC, &GPIO_InitStruct); // 初始化
2
3
4
5
6
到此,有关GPIO的配置就完成了。
2. 配置LED输出高电平
配置好GPIO之后,我们就可以进行点灯了。其实也就是让GPIO引脚输出高低电平,到我们的开发板上就是让PC13输出高电平。
如何让PC13输出高电平呢?通过查阅库函数,这里为大家总结了几种操作的方式。
2.1 GPIO_WritePin
此函数用于将选定的GPIO引脚设置为高电平
函数原型为:void GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pins, GPIO_PinState PinState)
void GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pins, GPIO_PinState PinState)
- GPIOx: 指定GPIO端口,例如CW_GPIOA、CW_GPIOB、CW_GPIOC和CW_GPIOF等。
- GPIO_Pins: 指定要设置的引脚,可以是GPIO_PIN_0/1/2.../15/ALL;,也可以是这些值的组合,表示同时设置多个引脚。
- GPIO_PinState:引脚状态 GPIO_Pin_SET 或 GPIO_Pin_RESET。
使用示例:
// 配置PC13引脚转化代码为高电平
GPIO_WritePin(CW_GPIOC, GPIO_PIN_13, GPIO_Pin_SET);
2
2.2 GPIO_Write
此函数用于同时写入整个GPIO端口的值。
函数原型为:void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t Value)
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t Value)
- GPIOx: 指定GPIO端口例如CW_GPIOA、CW_GPIOB和CW_GPIOC等
- Value: 16位值,每一位对应端口上的一个引脚。例如,值0x0001将设置端口的第0位,而其余位保持不变。
(这个函数不建议使用)
3. 实验现象
关于这一章节的代码,在立创·地文星CW32F030C8T6开发板资料/第03章软件资料/代码例程/里面的002库函数点灯。
烧写我们的代码之后,可以看到开发板的LED这个灯将被点亮。