环境介绍
- 系统: Ubuntu18.04
- 工作环境: STM32Cube+Truestudio
- 芯片: stm32f103ret6(麒麟座v3.2)
简介 stm32cube 是一个非常便捷的STM32开发工具,使用它可以非常迅速的完成项目功能框架的搭建,这里编译器的选用Truestudio,主要是因为其免费开源且多平台,其代码预览能力也是甩keil好几条街(个人看法,主要原因还是本人现在改用linux系统,无法使用keil),但是其代码补全和代码编辑能力还是有点不足,这里推荐使用vscode进行配合编辑.本系列博文不对STM32各个功能进行详细介绍,只介绍各个功能在HAL库的使用方法和一些特定功能如何修改.
按键的原理其实很简单,就是配置引脚输入然后启用一个定时器不断去读取引脚输入状态即可,一般来说我们有两种方式实现定时读取引脚状态,一种是启用一个定时器,设置1ms的定时中断去读取引脚状态,另一种就是利用STM32自带的systick中断去读取(一般来说配置好systick中断后,其中断周期为1Ms),我这里采用的是后者,话不多说开始配置.
- 我们先来配置STM32Cube,在选择了指定的STM32芯片后,我们来配置按键和LED灯相关配置如下:
我使用的麒麟座V3.2的板子,其上带有四个独立按键和四色LED灯,分别配置如下,读者按照自己的板子实际配置.
- 接下配置RCC,选择外部晶振
配置好钟树
- 配置uart串口通信,在按键按下时,输出相应信息,配置结果如下:
- 在sys中进行s-tlink 和systick 配置,在这里提一句,很多初学者在这里没有配置serial wrie,导致烧录一次固件后无法重新烧录固件,turestudio显示无法识别stlink设备,这里需要将芯片的boot0引脚置高在置低就可以烧录了
- 最后就是项目的生成,配置好后点击右上角生成按钮就可以了,如下:
关于STM32Cube的配置就这样,现在我们需要用turestudio编辑并编译项目,将STM32Cube生成的项目导入Truestudio方法如下:
- 打开Truestudio 打开File->Import,出现如下画面,点击General->Existing Project into Workspace,然后选择Next.
- 然后选择Select root directory 点击Browse,选择自己的项目然后点击Finish即可
这样项目导入就完成了,至于具体的项目编译和固件烧录这里就不细说了,读者自己找教程吧.
项目准备工作这就完成了,接下来就是代码的操作. - 首先我们需要建立key 的驱动文件,建立目录如下:
key.c 的代码如下,这里操作的时候将key.h调用放在了main.h里面,所以这里只需要调用mian.h
/*****************
* @description stm32 key driver c file
* @fileName key.c
* @author mufengqi
* @date 2020/02/26 12:00:41
* @version V1.0.0
*****************/
#include "main.h"
#define KEY_DELAY 50 //消抖延时
uint8_t key1_count = 0, key2_count = 0, key3_count = 0, key4_count = 0; //按键计时,若按键按下1Ms加1
uint8_t repush_key1 = 0, repush_key2 = 0, repush_key3 = 0, repush_key4 = 0; //按键在极短时间重复按下判断
uint8_t key1_flag = 0, key2_flag = 0, key3_flag = 0, key4_flag = 0; //按键状态
/******************
*@brief key扫描处理程序,应放在systick中断处理程序中
*@param null
*@retval null
******************/
void key_scan(void)
{
/*判断按键1是否按下*/
if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET && key1_flag == 0)
{
key1_count++;
if (key1_count >= KEY_DELAY) //消抖
{
if (repush_key1 == 0)
{
repush_key1 = 1;
key1_flag = 1;
key1_count = 0;
}
else
key1_count = 0;
}
}
else
{
key1_count = 0;
key1_flag = 0;
repush_key1 = 0;
}
/*判断按键2是否按下*/
if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET && key2_flag == 0)
{
key2_count++;
if (key2_count >= KEY_DELAY)
{
if (repush_key2 == 0)
{
repush_key2 = 1;
key2_flag = 1;
key2_count = 0;
}
else
key2_count = 0;
}
}
else
{
key2_count = 0;
key2_flag = 0;
repush_key2 = 0;
}
/*判断按键3是否按下*/
if (HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) == GPIO_PIN_RESET && key3_flag == 0)
{
key3_count++;
if (key3_count >= KEY_DELAY)
{
if (repush_key3 == 0)
{
repush_key3 = 1;
key3_flag = 1;
key3_count = 0;
}
else
key3_count = 0;
}
}
else
{
key3_count = 0;
key3_flag = 0;
repush_key3 = 0;
}
/*判断按键4是否按下*/
if (HAL_GPIO_ReadPin(KEY4_GPIO_Port, KEY4_Pin) == GPIO_PIN_RESET && key4_flag == 0)
{
key4_count++;
if (key4_count >= KEY_DELAY)
{
if (repush_key4 == 0)
{
repush_key4 = 1;
key4_flag = 1;
key4_count = 0;
}
else
key4_count = 0;
}
}
else
{
key4_count = 0;
key4_flag = 0;
repush_key4 = 0;
}
}
/******************
*@brief key按键输出结果,放置在main函数的 while循环里
*@param null
*@retval null
******************/
void key_out(void)
{
if (1 == key1_flag) //判断按键是否按下
{
printf("KEY1\r\n");
HAL_GPIO_TogglePin(LED_R_GPIO_Port, LED_R_Pin); //LED灯电平翻转
key1_flag = 0; //清除按键状态
}
if (1 == key2_flag)
{
printf("KEY2\r\n");
HAL_GPIO_TogglePin(LED_G_GPIO_Port, LED_G_Pin);
key2_flag = 0;
}
if (1 == key3_flag)
{
printf("KEY3\r\n");
HAL_GPIO_TogglePin(LED_Y_GPIO_Port, LED_Y_Pin);
key3_flag = 0;
}
if (1 == key4_flag)
{
printf("KEY4\r\n");
HAL_GPIO_TogglePin(LED_B_GPIO_Port, LED_B_Pin);
key4_flag = 0;
}
}
key.h代码如下:
/*****************
* @description stm32 key driver h file
* @fileName key.h
* @author mufengqi
* @date 2020/02/26 12:01:19
* @version V1.0.0
*****************/
#ifndef __KEY_H_
#define __KEY_H_
#include "stm32f1xx_hal.h"
extern uint8_t key1_flag, key2_flag, key3_flag, key4_flag;//按键状态
extern void key_scan(void);
extern void key_out(void);
#endif
- 然后将
key_scan()
函数放置在SysTick_Handler()函数中,这个函数在stm32f1xx_it.c文件中
- 然后在main函数的while循环中放入
key_out()
- 还有不要忘了在main.h中调用key.h
这样我们的代码也写好了,编译烧录后我们可以看到,当我们按下按键1之后,串口输出KEY1
并点亮一个LED灯