时钟设置:为外设选择时钟源,再开启外设的时钟。
参数设置:设置GPIO工作模式(8种)。
相关HAL库函数简介
F1系列,GPIO挂载在APB2总线上。
IO设置:推挽输出
输出控制,输入采集
开漏输出,不能输出高电平,除非有内部或外部上拉
上图设置为开漏输出时,可以输出0,此时灯亮,输出高阻态时,相当于断开,灯灭。
创建一个HARDWARE文件夹,在这个文件夹下存放led.c和led.h。
并在项目中也添加HARDWARE/led.c
led.h
#ifndef __LED_H
#define __LED_H
#include "sys.h"
#define LED0 PAout(9)
void LED_Init(void);
#endif
led.c
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
GPIO_Initure.Pin = GPIO_PIN_8;
GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出
GPIO_Initure.Pull = GPIO_PULLUP;//输出模式上下拉不起作用
GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;//高速
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
GPIO_Initure.Pin = GPIO_PIN_2;
HAL_GPIO_Init(GPIOD,&GPIO_Initure);
//默认初始化后灯灭
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
}
main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
int main(void)
{
HAL_init();
Stm32_Clock_Init(RCC_PLL_MUL9);//
delay_int(72);
LED_Init();
while(1){
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET); //LED0对应引脚PA8拉低,亮,等同于LED0(0)
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); //LED1对应引脚PD2拉高,灭,等同于LED1(1)
delay_ms(500); //延时500ms
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET); //LED0对应引脚PA8拉高,灭,等同于LED0(1)
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET); //LED1对应引脚PD2拉低,亮,等同于LED1(0)
delay_ms(500);
}
}
独立按键抖动波形图,如果在抖动期间判断按键状态,则有可能是0也有可能是1.一般抖动时间为5~10ms。
软件消抖:通过延时跳过抖动的时间段,再判断IO的输入电平。
PA0,如果按键没有按下,就呈现高阻态,所以设置为输入下拉时,才能得到低电平。
PE0,1,2,如果按键按下,就输出0,如果按键没有按下,为了呈现高电平,就必须设置为输入上拉。
key.h
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
void key_init(void);
u8 key_scan(void);
key.c
#include "key.h"
#include "delay.h"
void key_init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOC_ENABLE();
GPIO_Initure.Pin = GPIO_PIN_5;
GPIO_Initure.Mode = GPIO_MODE_INPUT;
GPIO_Initure.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOC,GPIO_Initure);
}
u8 key_scan(void)
{
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5) == 0){
delay_ms(10);
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5) == 0){
while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5));
return 1;
}
}
return 0;
}
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
int main()
{
HAL_Init();//初始化HAL库
Stm32_Clock_Init(RCC_PLL_MUL9);//设置时钟,72M
delay_init(72); //初始化延时函数
LED_Init(); //初始化LED
key_init();
while(1)
{
if(key_scan())
{
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_8);
}else{
delay_ms(10);
}
}
}