前言
了解并掌握STM32中断原理,HAL库函数开发方法。安装 stm32CubeMX,配合Keil,使用HAL库方式完成下列任务。
一、LED红绿灯周期闪烁
建立工程
打开stm32Cube
点击中间第一个
选择自己的芯片这里是STM32F103C8T6
点击图上引脚设置为GPIO_OUTPUT
点击RCC配置如图
SYS同理
配置时钟如图
创建工程点击右上脚生成工程
弹出弹框后,点击中间打开Kiel
找到main函数
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
然后找到main里面的while(1)函数
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
HAL_Delay(1000);
到此流水灯完成
二、利用中断实现水流灯
1.同理创建工程文件
设置PA5为中断
PA3,7和PB5为输出
![在这里插入图片描述](https://img-blog.csdnimg.cn/2ea11c0deed640ac8685cea6f28c8695.png
点击NVIC勾选
在GPIO里配置将倒数第二行配置为PULL-up
然后创建工程。
定义全局变量n
找到while写入我们要写的代码
switch(n)
{
case 0:
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
HAL_Delay(500);
if(n==1)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
break;
}
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
HAL_Delay(500);
if(n==1)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
break;
}
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);
HAL_Delay(500);
}
case 1:
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
break;
}
}
代码太多就不截图了
接着写中断函数:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==GPIO_PIN_5)
{
for(int i=0;i<999;i++)
{}
n=!n;
}
}
这样我们就实现了按键控制流水灯的操作
流水灯HAL
观测波形
观测波形跟上个文章有讲解,这里直接给出波形
由图可以分析出周期为2s,且每次只亮一个灯,其余俩个均为低。实际周期也为2s验证成功。
总结
`本次利用HAL库函数写中断流水灯加深了对STM32版的学习。同时在实验中遇到了许多的问题如:中断时遇到了灯乱闪,后面发现的时配置出了问题。