STM32F103ZET6【HAL函开发】STM32CUBEMX------2.GPIO输入、按键外部中断

本文详细介绍了如何使用正点原子战舰开发板,配置STM32CUBEMX进行STM32F103ZET6的硬件连接、晶振设置、下载口配置和时钟管理。通过GPIO控制LED和按键,并设置外部中断,提供LED状态切换和按键触发的代码示例。最后演示了如何在Keil中进行下载设置和代码修改,以实现LED和按键的不同操作模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、硬件介绍

正点原子战舰开发板,主控芯片STM32F103ZET6
两个LED接到PB5 PE5
三个按键PE2 PE3 PE4接GND
一个按键PA0接VCC3.3

在这里插入图片描述
在这里插入图片描述

二、STM32CUBEMX基础配置

2.1 晶振配置

如果你的板子上外部高速晶振8M和外部低速晶振32.768K都有的话,那么就在RCC-HSE/LSE后面选择Cyrystal/Ceramic Resonator
在这里插入图片描述

2.2 下载口配置

程序下载方式建议用SW下载,比较节省IO口,除开VCC和GND,只需要两个线。
分别是PA13-SWDIO和PA14-SWCLK
在这里插入图片描述

2.3 配置时钟

STM32F103时钟最大到72MHZ,可以直接按最大时钟频率配置,注意如果显示红色,说明配置有问题,需要自行调整数值,直到没有红色提示为止
在这里插入图片描述

三、STM32CUBEMX外设配置

3.1 两个LED配置

LED需要将GPIO配置为推挽输出
在这里插入图片描述

3.2 四个按键配置

四个按键都要配置为外部中断模式
其中三个按键KEY0、KEY1、KEY2设置为上拉,一个KEY_UP设置为下拉
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
开启中断使能
在这里插入图片描述

四、生成工程

上面配置以及完成,直接生成代码,然后下载到单片机即可。生成代码方法如下
1.在Project中配置项目名,项目存放位置,开发工具名称等,但要注意项目名和路径不能有中文。
2.在Code Generator中配置代码中的一些规定
3.点击GENERATE CODE生成代码到项目文件夹中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、keil里面的设置

1.点击魔术棒,在Debug里面选择下载线,一般是J-LINK和ST-Link比较多。
2.在Settings-Debug中选择下载模式为SW
3.在Flash-Download中将Reset and Run勾选上,默认是不勾选的,这样可以程序下载进去就开始运行,否则每次都要复位一次程序才运行。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、修改代码

为了增加代码的可读性,在main.c增加四个宏定义命令,注意自己增加的代码需要放在BEGINEND之间,可以可以避免重新生成工程被删除掉。
重写中断回调函数

/* USER CODE BEGIN PTD */
/* USER CODE BEGIN PTD */
#define LED0_ON  HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5,GPIO_PIN_RESET)//低电平
#define LED0_OFF HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5,GPIO_PIN_SET)//低电平
#define LED1_ON  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5,GPIO_PIN_RESET)//低电平
#define LED1_OFF HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5,GPIO_PIN_SET)//低电平
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_0)
    {
        LED0_ON;
				LED1_OFF;
    }	
    if(GPIO_Pin == GPIO_PIN_2)
    {
        LED0_ON;
				LED1_ON;
    }
	if(GPIO_Pin == GPIO_PIN_3)
    {
        LED0_OFF;
				LED1_ON;
    }	
    if(GPIO_Pin == GPIO_PIN_4)
    {
        LED0_OFF;
				LED1_OFF;
    }
}
/* USER CODE END PD */
/* USER CODE END PTD */

七、现象

图1
图2
图3
图4

PS:用switch的方式也可以实现上述效果

中断回调函数改为如下

/* USER CODE BEGIN PD */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    /* 判断哪个引脚触发了中断 */
    switch(GPIO_Pin)
    {
        case GPIO_PIN_0:
			LED0_ON;
			LED1_OFF;
           break;				
        case GPIO_PIN_2:
			LED0_ON;
			LED1_ON;
           break;				
        case GPIO_PIN_3:
			LED0_OFF;
			LED1_ON;
           break;				
        case GPIO_PIN_4:
			LED0_OFF;
			LED1_OFF;
           break;				
    }
}
/* USER CODE END PD */
/* USER CODE END PTD */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值