目录
一、解决的问题
提出问题:用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。通过HAL库方式采用中断模式编程,当开关接高电平时,LED流水灯工作;接低电平时,LED流水灯停止工作!
我的解决方案:利用PA0,PA1,PA2来作为流水灯的三个GPIO口(本文设置的是三个GPIO口输出低电平时流水灯才亮),利用PB5来作为外部中断来进行控制这三个GPIO口形成的流水灯的工作与不工作:当开关(PB5口)接高电平时,LED流水灯工作;PB5口接低电平时,LED流水灯停止工作!
二、搭建STM32开发环境(HAL库环境)
请参考我的这篇博客: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:PA0,PA1,PA2设置为了GPIO_output;以及一个PB5设置为外部中断源:
(6)在GPIO这个界面里面点击PB5,对PB5的进行中断配置:
(7)NVIC中断优先级配置,点击NVIC,进入其中,按照图示步骤进行操作:
(8)进入CLK Configuration (时钟配置)中,进行时钟配置:
(9)进入Project Manager(工程管理),进行工程设置点击生成工程与代码:
注意:路径不能包含中文和空格,不然生成的工程文件无法在Keil中打开;

四、完善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){
//获取B5的电位
GPIO_PinState pinState = HAL_GPIO_ReadPin(SWITCH_GPIO_Port,SWITCH_Pin);
//高电位
if(pinState==GPIO_PIN_SET)//PB5高电位流水灯亮
{
flag=1;PB5高电位标识
}
//低电位
else if(pinState==GPIO_PIN_RESET)//PB5低电位流水灯灭
{
flag=0;//PB5低电位标识
}
}
}
(4)接着在main函数里的while(1)里面写上如下代码:
if(flag==1)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);//PA0亮灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//PA1熄灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//PA2熄灯
HAL_Delay(100);//延时0.1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//PA0熄灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);//PA1亮灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//PA2熄灯
HAL_Delay(100);//延时0.1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//PA0熄灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//PA1熄灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);//PA2亮灯
HAL_Delay(100);//延时0.1s
}
else if(flag==0)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//PA0熄灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//PA1熄灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//PA2熄灯
}
五、电路连接与烧录运行
1、电路连接:
ST_Link与单片机的连接,如下图所示:
关于ST-link的具体软件以及参数等等配置请参考我的这篇博客:stm32通过寄存器方式利用GPIO端口点亮LED_-HSheng的博客-优快云博客
总电路:
黄——PA0
红——PA1
绿——PA2
连接好的电路实物图如下:
2、烧录与运行:
(1)点击图示1处进行编译,接着点击图示2处进行烧录:
(2)板子运行结果情况:
这里附上程序代码运行流程图:
六、总结
本人在前面已经学会并且使用了三种方式点亮LED了流水灯的情况下,又学会了利用中断来控制LED流水灯的实验。通过本次实验,本人学会了如何使用中断,以及温习加深了刚刚学会的HAL搭建工程的知识与操作!希望阅读本文的你也能通过本文章与我感受到一样的进步情感与乐趣!!!
七、参考资料
1、Stm32f103c8t6 基于stm32CubeMX、HAL库实现的LED流水灯,以及中断控制流水灯工作状态-优快云博客