文章目录
- 一、功能需求分析
- 二、Proteus绘制电路原理图
- 三、STMCubeMX 配置引脚及模式,生成代码
- 四、MDK打开生成项目,编写HAL库的按键检测代码
- 五、运行仿真程序,调试代码
一、功能需求分析
在完成GPIO输入输出案例之后,开始新的功能模块的学习。同样是实现按键输入检测的功能,在GPIO的案例中,我们使用的是查询扫描方式,这种方式有一个缺点,浪费CPU算力,功能代码是放在while循环中,一直在循环检测。这一次我们介绍中断扫描方式完成按键状态检测,只有在开关按键状态变换的时候,才会触发中断,通知CPU处理中断事件,执行中断服务。
需求分析
- 按键检测使用中断扫描方式;
- 连线方式:PA0-LED0;PA1-LED1;PA4-KEY0;PA6-KEY1;
- 按键中断模式设置为上升沿触发;
- KEY0控制LED0,KEY1控制LED1;
- 每次开关状态变化,使LED状态反转。
二、Proteus绘制电路原理图
Proteus绘制需要对基本元器件的名称有一定了解,如下方的发光二极管LED、电阻RES,可以在网上查找对应的元器件名称列表,方便以后绘制。
绘制电路原理图的步骤:创建画布=》芯片选型及放置=》元器件选型及放置=》连接电路=》修改元器件参数=》仿真运行。
下图为所需元器件清单。
下图为电路原理图。
三、STMCubeMX 配置引脚及模式,生成代码
接下来,根据原理图绘制,创建CubeMX项目,配置引脚及工作模式,生成MDK项目代码。
创建项目,选择Pinout=》system core=》GPIO:
点击PA0,选择GPIO_Output推挽输出模式,同理,配置PA1。
点击PA4,选择GPIO_EXTI4,同理,配置PA6。
选择Pinout=》system core=》NVIC:
在配置中勾选EXTI4和【9:5】的中断Enabled选项,并设置各自的抢占式优先级为3和2。
优先级值越小,优先级越高,抢占式优先级可以实现中断嵌套,也就是说,在中断4执行中断服务时,如果中断【9:5】触发了中断,会暂停中断4,执行中断【9:5】。
在clock单元,配置系统时钟为72MHz。
在Project单元,填写项目名称、保存路径、IDE和版本。
在 code generator中,配置添加库的方式为所需库,用户代码在每次项目重新生成时保留。配置完成,通过以上步骤,完成了2个LED引脚的模式配置及时钟配置,接下来,点击GENERATE,生成项目代码。
找到生成路径,可以看到项目目录文件。
四、MDK打开生成项目,编写HAL库的按键检测代码
从上面步骤中,生成了MDK项目。
在MDK-ARM目录中,找到项目快捷方式,打开项目。
在gpio.c文件中找到__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)函数,复制到main.c中。
__weak 为弱函数,如果项目中有不带__weak的同名函数,被调用时则执行同名函数,如果只有__weak函数,被调用时则其被执行。
拷贝后放在注释为用户代码区域,当中断触发,则此函数被调用。
callback函数全部代码
这里出现了新的GPIO函数,引脚状态切换,有两个参数,GPIO组名和引脚名。
还有一个消除中断挂起位的宏调用,中断触发后需要用户手动清除挂起位。
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
//PA4中断服务
if(GPIO_Pin & GPIO_PIN_4)
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
//PA6中断服务
if(GPIO_Pin & GPIO_PIN_6)
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
}
在项目中勾选生成HEX选项,HEX文件就是MDK编译生成的十六进制文件,作为烧录到开发板的源程序文件使用,当然,这里我们使用仿真,在Proteus中加载HEX即可。
点击编译程序,生成HEX文件。在编译窗口显示生成了以下信息,则编译成功,保证 0 errors再进行下一步。
五、运行仿真程序,调试代码
在Proteus中,双击芯片,选择加载程序路径。
04_NVIC\MDK\NVIC\MDK-ARM
上面是我的项目的HEX文件目录路径。
点击仿真按钮,运行程序,查看功能执行结果。
可以看到,两个黄色LED随着开光闭合断开改变切换点亮熄灭状态,功能正常。
代码链接:STM32-04基于HAL库(CubeMX+MDK+Proteus)中断案例(按键中断扫描)
至此,我们已经完成了STM32的开发环境搭建以及测试案例的编写,后面,会给大家介绍更多的功能。