STM32 CubxMX 实现按键灯光反转 - STM32F103VET6

351 阅读3分钟

做好硬件连接

本次实验烧录方式我们使用的是仿真器。我们需要先将Debugger仿真器通电(防止仿真器被烧坏)

image.png

然后将仿真器与开发板相连接:

image.png

最后给开发板通电:

image.png

使用STM32 CUbeMX创建项目

打开CUbeMX,点击创建项目:

image.png

选择好芯片类型STM32F103VET6,然后初始化项目:

image.png

在CubeMX进行基本通用配置

配置时钟晶振。在System Core中找到RCC,然后配置HSE为外部时钟晶振

image.png

配置时钟为72MHZ。在Clock Configuration中,配置HCLK为72,然后直接回车即可自动配置:

image.png

在Project Manager中配置IDE为Keil,然后配置项目名称。

image.png

在CubeMX中配置引脚

在芯片STM32F103VET6中,有三个灯光,两个按键,他们所对应的引脚如下:

引脚说明
PB5红灯 R
PB0绿灯 G
PB1蓝灯 B
PA0按键 K1
PC13按键 K2

我们选择的是红色灯光,先配置红灯:在CubeMX中找到引脚PB5,然后配置它的模式为GPIO_Output,同时修改它的标签名为LED_R

image.png

image.png

image.png

image.png

image.png

同理,因为K1采用轮询模式,所以配置PA0模式为GPIO_Input,标签名为K1。

image.png

同理,因为K2采用中断模式,所以配置PC13模式为GPIO_EXTI13,标签名为K2.

image.png

在CubeMX中配置NVIC允许中断

image.png

配置完成,生成代码,并使用Keil打开项目

image.png

image.png

配置Keil魔法棒

Keil 打开项目后,点击魔法棒,进行 Keil 配置。

image.png

配置 Debug,使用 CMSIS-DAP:

image.png

配置端口为 SW

image.png

配置 Reset and Run,这样每次烧录后就不需要自己手动点击Reset按键。

image.png

注意:Keil版本不同,配置也稍微不同。如果点击 Debug 的 setting 后,有四块选项 Debug,Trace,Flash Download,Pack,则需要在 Pack 中取消 Enable 的勾选:

image.png

同时确保 Reset 是 Autodetect:

image.png

配置完成后,先编译一下看看是否有报错:

image.png

点击F7进行编译,0个报错

image.png

编写代码

选择喜欢的编辑器打开项目

Core/Src/main.c 中定义全局变量k2_flag,用于标识K2按键是否有效。注意代码要编写在 /* USER CODE BEGIN *//* USER CODE END */ 之间,不然使用CubeMX重新生成代码时,代码会被删除。

int k2_flag = 0;

image.png

Core/Inc/main.h 中声明全局变量k2_flag,这样该变量可在其他文件中使用。

extern int k2_flag;

image.png

Core/Src/main.c 中,实现K1按键的轮询。即不断地读取K1按键的电平,若为高电平则说明手指已按下。

    if (HAL_GPIO_ReadPin(K1_GPIO_Port, K1_Pin) == GPIO_PIN_SET) {
      while (HAL_GPIO_ReadPin(K1_GPIO_Port, K1_Pin) == GPIO_PIN_SET);
      k2_flag = 1;
    }

image.png

代码中的while循环是解决防抖问题。即当手指还停留在按键上时,代码将一直在执行while循环,直到手指松开按键时跳出while,同时修改k2_flag为1,表示当前状态下点击K2按键是有效的。

Core/Src/stm32f1xx_it.c 中,实现K2的中断回调函数。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
  if (GPIO_Pin == K2_Pin) {
    if (k2_flag == 1) {
      HAL_GPIO_TogglePin(LED_R_GPIO_Port, LED_R_Pin);
      k2_flag = 0;
    }
  }
}

image.png

当K2按键被按下时,将会出发中断,同时该回调函数被执行。

Keil编译代码并烧录到板子上

image.png

编译完成后,没有报错。然后点击烧录。

image.png

烧录成功后,红灯亮起。

image.png

同时,直接点击K2时,不会有任何变化。需要先点击K1,再点击K2,灯光才会反转。