一、硬件介绍
正点原子战舰开发板,主控芯片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
增加四个宏定义命令,注意自己增加的代码需要放在BEGIN
和END
之间,可以可以避免重新生成工程被删除掉。
重写中断回调函数
/* 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 */
七、现象
![]() | ![]() |
![]() | ![]() |
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 */