目录
硬件电路图:
将LED连接到PC1上,当PC1给低电平时点亮
将KEY连接到PC13上,在while里用按键扫描方式判断按键按下
初始化
HAL库也是类似于标准库,先创建一个xxxx_InitTypeDef的初始化变量,然后给它赋值,再将其传递到初始化函数中。
这里初始化GPIO口,所以定义一个GPIO_InitTypeDef结构体变量。
在不知道这个结构体变量的每一个成员填什么的时候,右键点击,跳转到定义看解释
前面是成员名称,后面又相应的解释,并且会有这个定义,告诉我们去哪里找。
比如Pin,双击后面的GPIO_pins_define,按ctrl + F查找,跳过去
这里就有一个表给我们列出了那个成员可以填写哪些值。
为了给IO口输出点亮LED灯,通常配置成推挽输出、上拉,输出速度没有特殊需求就选最高的
GPIO_InitTypeDef GPIO_InitStructure; //定义初始化结构体变量
//GPIO_InitStructure.Alternate备用功能选择
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_InitStructure.Pin = GPIO_PIN_1; //引脚1
GPIO_InitStructure.Pull = GPIO_PULLUP; //上拉
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; //低速
HAL_GPIO_Init(GPIOC , &GPIO_InitStructure); //初始化函数
HAL_GPIO_Init()函数可以在stm32h7xx_hal_gpio.h头文件最后找到,相应的外设就应该在相应的头文件中能找到,跳转到定义,看每个参数需要填什么,填好给它。
这就好像办理业务,先在纸上填写需要办理的业务,怎么办,相关的配置,也就是在结构体变量中配置好相应的参数,然后传递给初始化函数,让函数帮我们完成寄存器相关配置。
时钟使能
__HAL_RCC_GPIOC_CLK_ENABLE(); //使能GPIOC的时钟
库函数的函数名称都是有规律的,GPIOC的时钟使能是这样,可以得出ADC1的初始化使能是这样:
__HAL_RCC_ADC1_CLK_ENABLE();
库函数刚开始写不熟悉,可以查手册,可以百度,优快云,上网找,翻手册,写熟悉之后完全可以在头文件中找到需要的函数。
配置按键输入
GPIO_InitStructure.Mode = GPIO_MODE_INPUT; //输入模式
GPIO_InitStructure.Pin = GPIO_PIN_13; //PC13
GPIO_InitStructure.Pull = GPIO_PULLUP; //上拉
HAL_GPIO_Init(GPIOC , &GPIO_InitStructure); //初始化
读PIN和写PIN的函数
HAL_GPIO_ReadPin(GPIOC , GPIO_PIN_13); //读取PC13脚电平
HAL_GPIO_WritePin(GPIOC , GPIO_PIN_1 , GPIO_PIN_RESET); //写PC1脚电平
//GPIO_PIN_RESET - 0
//GPIO_PIN_SET - 1
//HAL_GPIO_ReadPin()函数返回值也是GPIO_PIN_RESET或GPIO_PIN_SET
代码实现
while里进行按键扫描,PC13按下时,给PC1置低电平,LED灯亮起
#include "main.h"
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
__HAL_RCC_GPIOC_CLK_ENABLE();
//GPIO_InitStructure.Alternate备用功能选择
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Pin = GPIO_PIN_1;
GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC , &GPIO_InitStructure);
GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
GPIO_InitStructure.Pin = GPIO_PIN_13;
GPIO_InitStructure.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOC , &GPIO_InitStructure);
while(1)
{
if(HAL_GPIO_ReadPin(GPIOC , GPIO_PIN_13) == GPIO_PIN_RESET)
{
HAL_GPIO_WritePin(GPIOC , GPIO_PIN_1 , GPIO_PIN_RESET);
}else
{
HAL_GPIO_WritePin(GPIOC , GPIO_PIN_1 , GPIO_PIN_SET);
}
}
return 0;
}