STM32开发学习笔记之三【按键】

STM32开发学习笔记之一【按键】

之前分别通过LED灯和串口实现了信号的输出(当然串口也能输入),接下来我们通过STM32的按键输入信号来控制LED,编译链接下载到开发板后通过按键控制LED灯的点亮和熄灭。

一、用STM32CubeMX创建STM32工程

STM32CubeMX(CubeMX)是STMicroelectronics开发的一款图形化配置工具,用于帮助开发者轻松配置和初始化STM32微控制器。它提供了一个直观的图形用户界面,让用户通过简单的操作完成对STM32微控制器的配置,包括引脚分配、时钟配置、外设初始化等,形成初始代码框架。

本文中不涉及STM32CubeMX的下载及安装,需要的请到https://www.st.com/en/development-tools/stm32cubemx.html#get-software自行下载安装。

(一)新建工程

新建工程文件项目名称设为"key",本笔记中项目文件存放在"E:\prj\stm32\key"路径下。启动Stm32CubeMX程序在File菜单单击【新建项目】进入CPU选择界面

(二)选择芯片型号

开发板CPU型号为STM32H743VIT6,所以在Commercial Part Number编辑框输入型号。如果事先没有确定型号而是通过项目需求筛选的话可以在左侧导航栏筛选。输入型号后右侧会显示具体封装的列表,双击正确CPU进入系统引脚与配置窗口

如果出现下面窗口选"NO",因为本项目不涉及复杂的内核配置。

进入引脚与配置窗口 后如下图:

(三)GPIO配置

1、LED输出口配置

使用 STM32CubeMX 工具配置 STM32H743 的 GPIO 口,从上图可以看出,开发板的 PE3 引脚连接了 LED 灯。在【Pinout&Configuration】标签页展开【System Core】下拉框,在里面选中GPIO。在搜索栏输入 PE3 后回车,可以在引脚图中显示位置,如下图所示

在搜索栏找到引脚后,引脚将闪烁显示。接下来,我们在下图引脚图中点击 PE3,在弹出的下拉菜单中,选择 IO 口的功能为 GPIO_Output。操作方法如下图所示:

设置好即可看到引脚从灰色变成绿色,标识该管脚已经启用。这里我们需要说明一下,如果我们要配置 IO 口为外部中断引脚或者其他复用功能,我们选择相应的选项即可。配置完 IO 口功能之后,还要配置 IO 口的速度,上下拉等参数。这些参数我们通过 System Core 下的 GPIO 选项进行配置,如图所示。

GPIO output level 是 IO 的初始值,在原理图中看要点亮 LED灯时,使 GPIO 输出高电平即可。为了一开始让 LED 灯熄灭,我们设置初始值输出低电平。GPIO mode 是输出时,可以选择推挽输出和开漏输出图中配置为推挽输出。GPIO Pull-up/Pull-down 默认是无上下拉,推挽输出用默认配置。

Maximum output speed 输出速度配置,默认是低速,我们设置为高速。User Label 用户符号,我们给 PE3 起一个别名 LED0。

2、KEY输入口配置

开发板有三个按键,但是复位键是专用的,BOOT键做启动键最好,所以本案例我们只能使用 PC13 引脚连接的按键。和上面一样在搜索栏输入 PC13 后回车,找到引脚单击,弹出菜单选择中断(GPIO_EXTIx)模式,如下图所示

接下来进一步配置PC13的属性,【GPIO mode】选【External Interrupt Mode with Falling edge trigger detection】模式,Event模式不响应中断函数。从上面原理图能看出按键上电默认为低电平,所以因为外部电路已经有下拉电阻了 【GPIO Pull-up/Pull-down】选【No pull-up and no pull-down】

(四)配置NVIC中断

本案例中只用EXTI line中断,勾选中断使能。如下图所示:

(五)RCC时钟源配置

1、HSE时钟配置

进入工程主设计界面后,首先设置时钟源 HSE 和 LSE。如图所示。

这里HSE选择【Crystal/Ceramic Resonator】LSE选择【关闭】,因为独立CPU工作这种外部时钟最精确而且成本低。

2、时钟树配置

进入 【Clock Configuration】 配置栏之后可以看到,界面展现一个完整的 STM32H7 时钟系统框图。从这个时钟树配置图可以看出,配置的主要是外部晶振大小,分频系数,倍频系数以及选择器。在我们配置的工程中,时钟值会动态更新,如果某个时钟值在配置过程中超过允许值,那么相应的选项框会红色提示。

这里,我们将配置一个以 HSE 为时钟源25Mhz,配置第一个选择器指向HSE,配置 PLL 相关参数让时钟频率满足要求,然后第二个选择器使系统时钟选择 PLLCLK为时钟源,最终配置系统时钟为 400MHz(根据需求)。上图中可以看出SYSCLK最大可以到480Mhz,通过细致配置PLL的参数可以将主频性能配置到最大。

如上图后面的外设都有最高频率限制,配置 AHB,APB1,APB 和 Systick的相关分频系数使频率不要溢出,如果有功耗限制相关频率可以调低。

(六)生成工程文件

1、工程设置

接下来我们设置生成一个工程,如下图所示。选择 Project Manager-> Project选项用来配置工程的选项,我们了解一下里面的信息。

Project Name:工程名称,填入工程名称(这里填key)(半角,不能有中文字符)

Project Location:工程保存路径,点击 Browse 选择保存的位置(这里填E:\prj\stm32\key)(半角,不能有中文字符)

Toolchain Folder Location:工具链文件夹位置,默认即可。

Toolchain/IDE:工具链/集成开发环境,我们使用 Keil,因此选择 MDK-ARM,Min Version 选择 V5.27,这里根据 CubeMX 的版本可能会有差异,我们默认使用 V5 以上的版本即可。

Linker Settings 链接器设置:

Minimum Heap Size 最小堆大小,默认(大工程需按需调整)。

Minimum Stack Size 最小栈大小,默认(大工程需按需调整)。

MCU and Firmware Package 是 MCU 及固件包设置:

MCU Reference:目标 MCU 系列名称。

Firmware Package Name and Version:固件包名称及版本。

勾选 Use Default Firmware Location,文本框里面的路径就是固件包的存储地址,我们使用默认地址即可。(这里因为我有两个版本的固件包,所以它默认使用最新的,这个关系不大,就用新的)。

2、代码生成器设置

打开 Project Manager-> Code Generator 选项,Generated files 生成文件选项,勾选 Generate peripheral initialization as a pair of '.c/.h'files per peripheral,勾选这个选项的话将会将每个外设单独分开成一组.c、.h 文件,使得代码结构更加的清晰,如图所示。

由于 CubeMX 默认勾选了复制所有的库,即工程中不使用到的代码也会复制进来,为了节省 CubeMX 生成工程的空间,我们勾选生成工程时只复制用到的库(这一步是可选操作,大家根据自己的实际选择)

3、保存工程

至此工程最基础配置就已经完成,点击蓝色按钮(SENERATE CODE)就可以生成工程。

4、生成工程

如果我们的 CubeMX 工程放置配置路径中没有中文,生成代码后会弹出类似下图的提示窗口,点击 【Open Project】 就打开 MDK 工程(如果是中文路径则会报错)。

到此为止CubeMX任务就结束了,该软件不但帮我们配置了系统,同时生成了主程序框架。

另外需要补充的是,目前打开生成的C代码项目已经假设在你的计算机安装了MDK,如果MDK还没有安装请自行下载并安装。https://www.keil.com/download/product/
注意!不要下载最新版,有可能存在问题!

二、STM32程序设计

(一)用MDK打开工程

在MDK的keil编程界面中打开工程后的主界面如下图:

cubeMX已经给我们新建了默认代码,省掉了我们很多重复劳动,GPIO口初始化的代码如下,是系统自动生成的:

javascript 复制代码
void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOE_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);
  /*Configure GPIO pin : LED0_Pin */
  GPIO_InitStruct.Pin = LED0_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(LED0_GPIO_Port, &GPIO_InitStruct);
  /*Configure GPIO pin : KEY_Pin */
  GPIO_InitStruct.Pin = KEY_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(KEY_GPIO_Port, &GPIO_InitStruct);
  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}

(二)中断服务回调函数(在stm32h7xx_hal_gpio.c中)

在回调函数中我们添加如下代码:

javascript 复制代码
if(GPIO_Pin == GPIO_PIN_13)
	{
			HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_3);
	}

程序中入下图所示:

加入的代码判断是否PC13引脚产生的中断,如果是反转LED的亮灭。

(三)编译下载

单击编译按钮等一段时间系统编译完成会有如上图的错误或者警告信息(都是0最好)。编译通过以后,通过项目设置窗口的Debug标签确认程序下载器是否正确连接并安装好驱动程序

如果下载器没问题单击download下载按钮,下载器一边闪烁一边把编好的程序下载到STM32的FLASH当中。按下复位键,这时再按下PC13引脚的KEY按钮,LED灯就会开关点亮了!

这部分代码稳定性不是很好,应该和按键消抖有关,后续有时间再补充。

有问题欢迎留言,我再学新东西的时候和刚入门的小伙伴一起分享...

相关推荐
Lips6112 小时前
2026.1.11力扣刷题笔记
笔记·算法·leetcode
charlie1145141912 小时前
从 0 开始的机器学习——NumPy 线性代数部分
开发语言·人工智能·学习·线性代数·算法·机器学习·numpy
咚咚王者2 小时前
人工智能之核心基础 机器学习 第十二章 半监督学习
人工智能·学习·机器学习
袁气满满~_~3 小时前
Python数据分析学习
开发语言·笔记·python·学习
njsgcs4 小时前
ppo 找出口模型 训练笔记
人工智能·笔记
pumpkin845144 小时前
Go 学习全景引子:理解设计理念与工程思路
python·学习·golang
一枝小雨4 小时前
【OTA专题】17 打通Bootloader与App逻辑之间的通信
stm32·单片机·嵌入式·流程图·freertos·ota·bootloader
你要飞5 小时前
考研线代第四课:线性方程组
笔记·线性代数·考研·矩阵
week_泽5 小时前
第5课:短期记忆与长期记忆原理 - 学习笔记_5
java·笔记·学习·ai agent