前言
笔记是人类的第二大脑,以前的我也总是在记录上所懈怠,遇到不会的就csdn cv 一顿操作,始终不得其内涵。从这个赛事开始,我来学习大佬在嵌入式上的理解,自己做好每次记录,辅助记忆的同时也能亲手过一次知识与项目。希望能在赛事上大放光彩
一、IO口常用函数
HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)——读电平状态
HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState)——写电平状态
HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)——转换电平状态HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)——锁电平状态
二、按键原理图
由原理图可知
浮空状态:高电平 按下状态:低电平
上拉模式意味着内部电阻将GPIO端口拉高到VCC,确保在没有外部信号时,端口状态为高;
下拉模式意味着内部电阻将GPIO端口拉低到GND,确保在没有外部信号时,端口状态为低。
按键代码逻辑是检测低电平(0),低电平有效,那我们就得设置默认高电平。
PB0——B1按键
PB1——B2按键
PB2——B3按键
PA0——B4按键
三、配置STM32Cubemx
注意事项:按键代码需要进行延时消抖
目标程序:B1按下LED1亮,B2按下LED1灭,B3按下LED2亮,B4按下LED2灭。
选芯片,配置时钟树,配置RCC,工程配置,魔术棒配置等在第一篇文章有讲解,我们直接从配置IO口开始。
配置引脚
吸取教训
1.本来想直接只设置LED1和LED2的,但是其他灯在浮空状态时是亮的,而我预想是默认熄灭,所以其他LED只能全部配置上拉。
2.忘记配置锁存器了!真的很容易忘记。
GENERATE CODE!
模块化设置(第一篇有讲解,不复述了)
四、代码编辑
key.c代码
#include "key.h"
#include "main.h"
int key(void)
{
int num=0;//统一出口
if(HAL_GPIO_ReadPin(GPIOB,B1_Pin)==RESET)//检测是否按下
{
HAL_Delay(5);//消抖
if(HAL_GPIO_ReadPin(GPIOB,B1_Pin)==RESET)//再次检测
{
num=1;//检测到一号按键被按下
}
while(HAL_GPIO_ReadPin(GPIOB,B1_Pin)==RESET);//循环到按键释放才能进行下一步
}
if(HAL_GPIO_ReadPin(GPIOB,B2_Pin)==RESET)
{
HAL_Delay(5);
if(HAL_GPIO_ReadPin(GPIOB,B2_Pin)==RESET)
{
num=2;
}
while(HAL_GPIO_ReadPin(GPIOB,B2_Pin)==RESET);
}
if(HAL_GPIO_ReadPin(GPIOB,B3_Pin)==RESET)
{
HAL_Delay(5);
if(HAL_GPIO_ReadPin(GPIOB,B3_Pin)==RESET)
{
num=3;
}
while(HAL_GPIO_ReadPin(GPIOB,B3_Pin)==RESET);
}
if(HAL_GPIO_ReadPin(GPIOA,B4_Pin)==RESET)
{
HAL_Delay(5);
if(HAL_GPIO_ReadPin(GPIOA,B4_Pin)==RESET)
{
num=4;
}
while(HAL_GPIO_ReadPin(GPIOA,B4_Pin)==RESET);
}
return num;
}
key.h代码
#ifndef __KEY_H
#define __KEY_H
#include "main.h"
int key(void);
#endif
main.c代码
#include "key.h"
#include "LED.h"
int num=keynum();
switch(num)
{
case 1:
LED(1,1);
break;
case 2:
LED(1,0);
break;
case 3:
LED(2,1);
break;
case 4:
LED(2,0);
break;
}
至此,实验目的完成。
总结
更改配置后需要重新设置魔法棒和盒子;使用部分LED得把全部LED都设置成上拉;LED锁存器的配置。