STM32学习(六)

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

STM32学习(六)_第1张图片
时钟设置:为外设选择时钟源,再开启外设的时钟。
参数设置:设置GPIO工作模式(8种)。

GPIO配置步骤(掌握)

STM32学习(六)_第2张图片
相关HAL库函数简介
STM32学习(六)_第3张图片
F1系列,GPIO挂载在APB2总线上。
STM32学习(六)_第4张图片

编程实战:点亮一个LED灯

STM32学习(六)_第5张图片
STM32学习(六)_第6张图片
IO设置:推挽输出
STM32学习(六)_第7张图片
输出控制,输入采集
开漏输出,不能输出高电平,除非有内部或外部上拉
上图设置为开漏输出时,可以输出0,此时灯亮,输出高阻态时,相当于断开,灯灭。

点亮一个LED灯

创建一个HARDWARE文件夹,在这个文件夹下存放led.c和led.h。
并在项目中也添加HARDWARE/led.c
STM32学习(六)_第8张图片
STM32学习(六)_第9张图片
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。
STM32学习(六)_第10张图片
软件消抖:通过延时跳过抖动的时间段,再判断IO的输入电平。

STM32学习(六)_第11张图片
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);
		}
	}
}

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

STM32学习(六)_第12张图片
EXTI的HAL库设置步骤
STM32学习(六)_第13张图片
回调函数处理机制
STM32学习(六)_第14张图片

你可能感兴趣的:(stm32,单片机,学习)