了解并掌握STM32中断原理,HAL库函数开发方法,用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作,接低电平时,LED流水灯停止工作。
文章目录
一、问题重现
提出的问题:用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。通过HAL库方式采用中断模式编程,当开关接高电平时,LED流水灯工作;接低电平时,LED流水灯停止工作!
解决方案:利用PA4、PB15和PC14作为流水灯的三个GPIO口(本文设置的GPIO口输出低电平的时候LED灯亮),利用PA9来作为外部中断控制流水灯的工作,在PA9处接一个开关,按下导通,松手断开
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、搭建STM32开发环境(HAL库环境)
参考我的上篇博客:
三、利用HAL库新建一个keil5工程
(1)打开STM32CubeMX,在主界面点击:ACCESS TO MCU SELECTOR:
(2)选择的单片机型号以及点击开始工程项目:
(3)点击system core,进入SYS,在debug下选择serial wire:
(4)配置时钟,进入上面的rcc,有两个时钟,一个是hse和lse,将hse那里设为Crystal/Ceramic Resonator:
(5)进入GPIO选择引脚 并且配置其工作模式:
我这里一共选择了三个GPIO:PA4,PB14,PC15设置为了GPIO_output;以及一个PA9设置为外部中断源:
(6)在GPIO这个界面里面点击PA9,对PA9的进行中断配置:
(7)NVIC中断优先级配置,点击NVIC,进入其中,按照图示步骤进行操作:
(8)进入CLK Configuration (时钟配置)中,进行时钟配置:
(9)进入Project Manager(工程管理),进行工程设置点击生成工程与代码:
四、完善keil5工程
(1)首先,点击刚刚生成的keil5工程文件,双击main.c文件,然后再main.c中找到图示框住的函数:
接着右击此函数,进入其定义的地方处:
(2)将图中框住的部分改为SET即可:此步骤是将这三个GPIO口设置为高电平,均不初始时不亮!
(3)回到main.c文件中,在main函数上方进行编写一个中断函数HAL_GPIO_EXTI_Callback()以及自定义一个中断的标识符号flag:
uint32_t flag=0;//自定义中断标识符号
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
// if(GPIO_Pin == SWITCH_Pin){
// //获取PA9的电位
//
// }
GPIO_PinState pinState = HAL_GPIO_ReadPin(SWITCH_GPIO_Port,SWITCH_Pin);
//高电位
if(pinState==GPIO_PIN_SET)//PA9高电位流水灯亮
{
flag=1;//PA9高电位标识
}
//低电位
else if(pinState==GPIO_PIN_RESET)//PA9低电位流水灯灭
{
flag=0;//PA9低电位标识
}
}
(4)接着写一个测试函数test()
void test()
{
if(flag==1)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4亮灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET);//PB14熄灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
HAL_Delay(100);//延时0.1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET);//PB14亮灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
HAL_Delay(100);//延时0.1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET);//PB14熄灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15亮灯
HAL_Delay(100);//延时0.1s
}
else if(flag==0)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA0熄灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET);//PA1熄灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PA2熄灯
}
}
五、电路连接与烧录运行
1、电路连接:
ST_Link与单片机的连接,如下图所示:
2、烧录与运行:
流水灯(按键控制)
六、总结
这个任务是利用STM32F103的GPIO外部中断功能来实现按键控制LED流水灯的效果:
1、硬件连接:
将开关一端接地,另一端接GPIOA某一管脚(比如PA0)
将LED接在STM32的其他GPIO管脚上(比如PB0-PB7)
2、软件配置:
配置GPIOA某一管脚为输入模式,开启下降沿触发中断
配置LED对应的GPIO为输出模式
配置NVIC,使能GPIOA中断线
编写GPIO外部中断服务函数
在函数内读取开关管脚电平
如果为高电平,开始流水显示LED效果
如果为低电平,关闭LED显示
3、主函数循环中:
初始化GPIO、LED和中断配置
开启全局中断
循环等待
4、按下开关后,会产生下降沿中断
进入中断服务函数
判断开关状态,控制LED显示
5、松开开关后,再次产生下降沿中断,关闭LED显示
通过GPIO外部中断,可以实现开关按下时控制LED流水显示,松开时关闭的功能。中断响应速度快,满足实时性要求。