STM32使用HAL库点亮流水灯及中断控制LED流水灯
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)打开时钟架构,APB2总线的时钟由hse控制,同时在这个界面得把PLLCLK右边选上。我们要用是GPIO接口,而这些接口都在APB2里:
(6)进入GPIO选择引脚 并且配置其工作模式:点击相应的引脚设置输出寄存器了,就是GPIO_output那一项
选择了三个GPIO:PA0,PA1,PA2,均设置为了GPIO_output:
(7)点击Project Manager,接着点击Code Grenerator,勾选上第三步的那一个选项:
(8) 点击Project Manager,接着点击Project,开始给项目取名字;选择存放位置;选择MDK-ARM,最后点击图示第五步生成项目:
(9)点击Open Project打开项目(keil工程):
10)打开main.c文件,滑倒主函数那一部分。
在主函数while(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(1000);//延时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(1000);//延时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(1000);//延时1s
一、电路连接与烧录运行
1、电路连接:
ST_Link与单片机的连接,如下图所示:
2、烧录与运行:
(1)点击图示1处进行编译,接着点击图示2处进行烧录:
(2)板子运行结果展示:
三、利用keil5进行仿真实验:观察GPIO端口的输出波形
(1)点击图示圈住的部分,进行仿真
(2)仿真结果:
中断控制LED流水灯
一、搭建STM32开发环境(HAL库环境)
(1)选择的单片机型号以及点击开始工程项目:
(2)点击system core,进入SYS,在debug下选择serial wire:
(3)配置时钟,进入上面的rcc,有两个时钟,一个是hse和lse,将hse那里设为Crystal/Ceramic Resonator:
(4)进入GPIO选择引脚 并且配置其工作模式:
选择了三个GPIO:PA0,PA1,PA2设置为了GPIO_output;以及一个PB5设置为外部中断源:
(5)在GPIO这个界面里面点击PB5,对PB5的进行中断配置:
(6)NVIC中断优先级配置,点击NVIC,进入其中,按照图示步骤进行操作:
(7)进入CLK Configuration (时钟配置)中,进行时钟配置:
(8)进入Project Manager(工程管理),进行工程设置点击生成工程与代码:
二、完善keil5工程
(1)首先,点击刚刚生成的keil5工程文件,双击main.c文件,然后再main.c中找到图示框住的函数
接着右击此函数,进入其定义的地方处:
(2)将图中框住的部分改为SET即可:此步骤是将这三个GPIO口设置为高电平,均不初始时不亮!
(3)在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与单片机的连接,如下图所示:
2、烧录与运行:
(1)点击图示1处进行编译,接着点击图示2处进行烧录:
(2)板子运行结果情况:
四、总结
在前面已经学会并且使用了三种方式点亮LED了流水灯的情况下,又学会了利用中断来控制LED流水灯的实验。通过本次实验,学会了如何使用中断,以及温习加深了刚刚学会的HAL搭建工程的知识与操作!
作者:umot