打印
[开发工具]

STM32CubeMX_04 | 使用GPIO进行按键检测

[复制链接]
832|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本篇**主要介绍如何使用STM32CubeMX初始化STM32L431RCT6的GPIO,并扫描检测按键。

使用特权

评论回复
沙发
deadtime|  楼主 | 2020-3-29 18:38 | 只看该作者
1. 准备工作
硬件准备
开发板
首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi):

使用特权

评论回复
板凳
deadtime|  楼主 | 2020-3-29 18:38 | 只看该作者
软件准备
需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码;

Keil MDK和串口助手Serial Port Utility 的安装包都可以在文末关注公众号获取,回复关键字获取相应的安装包:

使用特权

评论回复
地板
deadtime|  楼主 | 2020-3-29 18:39 | 只看该作者
2.生成MDK工程
选择芯片型号
打开STM32CubeMX,打开MCU选择器:

搜索并选中芯片STM32L431RCT6:

使用特权

评论回复
5
deadtime|  楼主 | 2020-3-29 18:40 | 只看该作者
配置时钟源
如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC;
如果使用默认内部时钟(HSI),这一步可以略过;
这里我都使用外部时钟:

使用特权

评论回复
6
deadtime|  楼主 | 2020-3-29 18:40 | 只看该作者
配置LED的GPIO引脚
查看小熊派开发板的原理图,如下:

使用特权

评论回复
7
deadtime|  楼主 | 2020-3-29 18:41 | 只看该作者
所以接下来我们选择配置PC13引脚:

使用特权

评论回复
8
deadtime|  楼主 | 2020-3-29 18:41 | 只看该作者
设置用户标签为LED:

使用特权

评论回复
9
deadtime|  楼主 | 2020-3-29 18:42 | 只看该作者
给PC13引脚设置一个user_label:

使用特权

评论回复
10
deadtime|  楼主 | 2020-3-29 18:43 | 只看该作者
这里给PC13引脚添加一个user_label后,cubemx软件会在main.h文件中添加一个宏定义,如图,我们可以使用LED_GPIO_Port, LED_Pin来表示这个引脚,提高了程序的可移植性。如果没有该user_label,就需要使用GPIOC,GPIO_PIN_13 来表示这个引脚。

使用特权

评论回复
11
deadtime|  楼主 | 2020-3-29 18:43 | 只看该作者
配置按键的GPIO引脚
查看小熊派开发板的原理图,如下:

使用特权

评论回复
12
deadtime|  楼主 | 2020-3-29 18:44 | 只看该作者
所以接下来我们选择配置PB2引脚和PB3引脚:

使用特权

评论回复
13
deadtime|  楼主 | 2020-3-29 18:44 | 只看该作者
因为没有设置硬件上拉,所以我们配置开启上拉电阻,并设置用户标签为KEY1和KEY2:

使用特权

评论回复
14
deadtime|  楼主 | 2020-3-29 18:45 | 只看该作者
配置时钟树
STM32L4的最高主频到80M,所以配置PLL,最后使HCLK = 80Mhz即可:

使用特权

评论回复
15
deadtime|  楼主 | 2020-3-29 18:46 | 只看该作者
生成工程设置

使用特权

评论回复
16
deadtime|  楼主 | 2020-3-29 18:46 | 只看该作者
代码生成设置
最后设置生成独立的初始化文件:

使用特权

评论回复
17
deadtime|  楼主 | 2020-3-29 18:47 | 只看该作者
生成代码
点击GENERATE CODE即可生成MDK-V5工程:

使用特权

评论回复
18
deadtime|  楼主 | 2020-3-29 18:47 | 只看该作者
3. 在MDK中编写、编译、下载用户代码
编写用户代码
进入MDK-ARM目录,打开工程,在main.c中的main函数中编写简单的用户代码:

int main(void)
{

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();

  while (1)
  {
    /* USER CODE BEGIN 3 */
        if(0 == HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin))
        {
            HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
        }
        if(0 == HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin))
        {
            HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
        }
  }
  /* USER CODE END 3 */
}

使用特权

评论回复
19
deadtime|  楼主 | 2020-3-29 18:48 | 只看该作者
编译代码
编译整个工程:

使用特权

评论回复
20
deadtime|  楼主 | 2020-3-29 18:48 | 只看该作者
设置下载器



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

470

帖子

2

粉丝