STM32学习(六)

文章介绍了STM32的通用外设驱动模型,包括时钟设置、GPIO配置和相关HAL库函数的使用。通过实例展示了如何点亮LED灯以及如何通过软件消抖处理独立按键的抖动问题。此外,还提到了利用外部中断控制LED灯的亮灭方法。
摘要由CSDN通过智能技术生成

通用外设驱动模型(四步法)

在这里插入图片描述
时钟设置:为外设选择时钟源,再开启外设的时钟。
参数设置:设置GPIO工作模式(8种)。

GPIO配置步骤(掌握)

在这里插入图片描述
相关HAL库函数简介
在这里插入图片描述
F1系列,GPIO挂载在APB2总线上。
在这里插入图片描述

编程实战:点亮一个LED灯

在这里插入图片描述
在这里插入图片描述
IO设置:推挽输出
在这里插入图片描述
输出控制,输入采集
开漏输出,不能输出高电平,除非有内部或外部上拉
上图设置为开漏输出时,可以输出0,此时灯亮,输出高阻态时,相当于断开,灯灭。

点亮一个LED灯

创建一个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); 
	}
}

通过一个按键控制LED灯的亮灭

独立按键抖动波形图,如果在抖动期间判断按键状态,则有可能是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);
		}
	}
}

通过外部中断控制一个灯的亮灭

在这里插入图片描述
EXTI的HAL库设置步骤
在这里插入图片描述
回调函数处理机制
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饼干饼干圆又圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值