做好硬件连接
本次实验烧录方式我们使用的是仿真器。我们需要先将Debugger仿真器通电(防止仿真器被烧坏)
然后将仿真器与开发板相连接:
最后给开发板通电:
使用STM32 CUbeMX创建项目
打开CUbeMX,点击创建项目:
选择好芯片类型STM32F103VET6,然后初始化项目:
在CubeMX进行基本通用配置
配置时钟晶振。在System Core中找到RCC,然后配置HSE为外部时钟晶振
配置时钟为72MHZ。在Clock Configuration中,配置HCLK为72,然后直接回车即可自动配置:
在Project Manager中配置IDE为Keil,然后配置项目名称。
在CubeMX中配置引脚
在芯片STM32F103VET6中,有三个灯光,两个按键,他们所对应的引脚如下:
| 引脚 | 说明 |
|---|---|
| PB5 | 红灯 R |
| PB0 | 绿灯 G |
| PB1 | 蓝灯 B |
| PA0 | 按键 K1 |
| PC13 | 按键 K2 |
我们选择的是红色灯光,先配置红灯:在CubeMX中找到引脚PB5,然后配置它的模式为GPIO_Output,同时修改它的标签名为LED_R
同理,因为K1采用轮询模式,所以配置PA0模式为GPIO_Input,标签名为K1。
同理,因为K2采用中断模式,所以配置PC13模式为GPIO_EXTI13,标签名为K2.
在CubeMX中配置NVIC允许中断
配置完成,生成代码,并使用Keil打开项目
配置Keil魔法棒
Keil 打开项目后,点击魔法棒,进行 Keil 配置。
配置 Debug,使用 CMSIS-DAP:
配置端口为 SW
配置 Reset and Run,这样每次烧录后就不需要自己手动点击Reset按键。
注意:Keil版本不同,配置也稍微不同。如果点击 Debug 的 setting 后,有四块选项 Debug,Trace,Flash Download,Pack,则需要在 Pack 中取消 Enable 的勾选:
同时确保 Reset 是 Autodetect:
配置完成后,先编译一下看看是否有报错:
点击F7进行编译,0个报错
编写代码
选择喜欢的编辑器打开项目
在 Core/Src/main.c 中定义全局变量k2_flag,用于标识K2按键是否有效。注意代码要编写在 /* USER CODE BEGIN */ 和 /* USER CODE END */ 之间,不然使用CubeMX重新生成代码时,代码会被删除。
int k2_flag = 0;
在 Core/Inc/main.h 中声明全局变量k2_flag,这样该变量可在其他文件中使用。
extern int k2_flag;
在 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;
}
代码中的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;
}
}
}
当K2按键被按下时,将会出发中断,同时该回调函数被执行。
Keil编译代码并烧录到板子上
编译完成后,没有报错。然后点击烧录。
烧录成功后,红灯亮起。
同时,直接点击K2时,不会有任何变化。需要先点击K1,再点击K2,灯光才会反转。