文章目录
- GPIO(通用I/O)
- GPIO控制函数
- HAL_GPIO_WritePin
- HAL_GPIO_ReadPin
- HAL_GPIO_TogglePin
- 按下按键点亮LED
- 编写代码
- Cube生成的文件结构
- 参考资料
GPIO(通用I/O)
-
通用输入输出接口
-
可以输入输出数字信号
-
STM32的GPIO每16个一组(Port),分为ABCD等
- 例如PA0代表这是A组的第0个GPIO(Port-A Pin-0)
-
STM32的每一个不是电源或复位相关的引脚都可以用作GPIO
-
STM32的GPIO输出高电平是3.3V,输入一般可以最高承受5.25V
- 有例外,F103的很多引脚只能承受最高3.6V
GPIO控制函数
HAL_GPIO_WritePin
void HAL_GPIO_WritePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
//参数一般两到三个
//第一个gpio的port,
//例如pa0的pa
//第二个参数是pin,例如pa0的0,不能单纯敲数字,必须使用宏定义编号,
//例如:GPIO_PIN_0
//可以将不同的pin按位或在一起使用,
//例如:GPIO_Pin_1 | GPIO_Pin_2会同时操作pin1和pin2
//第三个参数表示写入的是高电平还是低电平
作用:写一个高电平或者低电平
HAL_GPIO_ReadPin
GPIO_PinState HAL_GPIO_ReadPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
作用:读取一个GPIO的电平
HAL_GPIO_TogglePin
void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
作用:翻转一下电平
按下按键点亮LED
首先进行各种外设的配置
其次参考芯片原理图把LED_R的引脚PH12S配置成GPIO_Output
然后回到原理图找到按键
原理图表示按下按键后,它会变成低电平,松开后就会变成高电平
看到key连接在PA0引脚
回到cube中把PA0配置成输入(GPIO_Input)
这样就把外设配置完毕然后命名生成MDK-ARM文件
编写代码
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if (HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_Pin_SET)
{
HAL_GPIO_WritePin(GPIOH,GPIO_PIN_12,GPIO_PIN_RESET);
}
else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_Pin_RESET)
{
HAL_GPIO_WritePin(GPIOH,GPIO_PIN_12,GPIO_PIN_SET);
}
HAL_Delay(100);
/* USER CODE END 3 */
}
//HAL_GPIO_ReadPin(GPIOA,GPIO_Pin_0) 代表读进来是pa0的电平
//GPIO_Pin_SET是一个枚举类型变量,代表高电平,即按键没有按下
//按键没有按下时把LED灯输出低电平,即灭灯
//在whlie(1)中加入HAL_Delay防止程序一直判断条件语句增加CPU负担
编写好代码后进行编译与烧录
最后实现效果为按下按键后红灯亮起,按键没有按下时灯灭。
Cube生成的文件结构
- main.c:程序入口
- main.h:主头文件
- 其他程序文件只需包含这个头文件即可使用HAL库
- gpio.c/gpio.h: GPIO初始化函数
- 类似的,其他外设也会有对应的.c和.h
- 其他程序文件最好不要包含外设.h(可能会造成不兼容问题)
- 尽量使用main.h或者stm32xx_hal.h
- 只有 USER CODE BEGIN 和 USER CODE END 注释中间的内容是可编辑的,
- 其他内容编辑后再重新生成工程会被覆盖