实验一 中断功能实验
一、实验目的
1、掌握STM32F103中断程序设计流程;
2、熟悉STM32固件库的基本使用。
二、实验要求
2.1 实验原理
1、在使用GPIO点亮一个LED灯的基础上,添加一个按键和一个LED;
2、使用中断的方式实现以下两个功能:
(1)KEY1按键按下,LED1点亮;
(2)KEY2按键按下,LED2点亮。
2.2 实验软件
电脑、Keil uVision5软件、Proteus 8 Professional软件。
三、实验过程
3.1 代码开发
按照书本中实验流程在Keil中完成中断实验的代码开发;
3.2 原理图设计
在Proteus中完成原理图的设计,如图1所示。
图1 中断实验原理图
四、实验记录与总结
4.1 核心代码理解
实验中利用按键中断驱动LED亮灭,故核心在于按键中断的配置与中断处理函数的重写和LED控制的代码编写。
首先是LED部分编写。本质上是对GPIO的控制,一般流程为使能GPIO时钟、设置GPIO工作模式(模式与速率),基于标准固件库进行开发时即对GPIO初始化结构体中的相关成员机械能赋值,最后初始化对应GPIO结构体内容。根据原理图可知,两个LED分别连接在PA1与PA2上,LED另一边接高电平,意味着两个LED均有相应GPIO端口输出低电平点亮,反之熄灭,因此将这俩端口均配置为速率为10MHz的通用推挽输出模式即可。
控制LED熄灭或点亮通过给对应端口输出高低电平即可,所以一句GPIO_SetBits(GPIOA, GPIO_Pin_2);或GPIO_ResetBits(GPIOA, GPIO_Pin_2);即可完成。对于本次实验,按键按下一次就将端口设置成低电平即可点亮。
其次是KEY编写。同理按键根据原理图可知是连在PB0、PB1上,另一边接地,因此首先也是配置好GPIO端口,由于按键按下就会接通GND和另一边的端口,因此只需要让对应端口读取接收的电平信号即可,又因为接收到的是接地即低电平信号,因此让端口默认处于高电平更合适,即配置成上拉输入模式。
在前面基础上,再配置按键中断相关内容。按键连接GPIO触发中断属于外部中断,因此先配置端口复用,即使能复用时钟,然后配置外部中断控制器,使用标准固件库开发时主要配置外部中断控制器初始化结构体中的一些成员属性,如中断线选择、中断模式、边沿触发方式(按下时触发,而端口从默认高->低,因此选择下降沿触发模式),最后使能外部中断,然后通过这些配置对外部中断控制器结构体进行相应初始化。最后配置统筹中断的NVIC,配置好中断优先级。
最后重写相应地中断服务函数。本次使用proteus进行仿真,可暂时忽略实际硬件上的机械抖动,因此该函数中直接放置按下触发中断后要处理的逻辑——点亮LED(端口置低)即可,然后清除中断标志位(EXTI、NVIC)。
在main.c中只需要初始化LED初始状态为熄灭,当按键按下时,触发中断,执行其中的切换LED状态函数即可点亮LED,实现实验需求。
4.2 实验结果
Keil中编译代码,将生成的.hex文件加载至proteus中原理图的芯片中,开始仿真可看出下图现象:
显然,按下KEY1和KEY2时,LED被点亮,满足实验要求。
4.3 问题与想法
1、问题
实验过程中,我发现按键按下后被点亮,再次按下可能就不会发生变化了,比较固定,只能初次看出现象。
2、想法
尝试修改LED控制逻辑,按键按下时,每次按下一次,LED就会变换状态,更灵活,因此编写了状态切换函数,每调用一次变化一次LED状态。
4.4 实验收获
1)掌握了 STM32 外部中断的完整开发流程,包括 GPIO 配置、EXTI 和 NVIC 设置,以及中断服务函数的编写;
2)通过中断方式,实现了两个按键分别独立控制两个 LED 的亮灭,并将逻辑优化为 “状态翻转”,提升了交互性;
3)深刻体会到中断相比轮询在效率和实时性上的巨大优势;
4)实验未处理实际硬件中的按键抖动问题,这是后续实际控制的注意点。
笔者小白,能力有限,以上内容难免存在不足和纰漏,仅供参考,各位阅读时请带着批判性思维学习,遇到问题多查查。同时欢迎各位评论区批评指正。谢谢。