本文主要是介绍基于HAl库来实现stm32 流水灯操作。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
要使用HAL库,先使用cubeMX
cubeMX也是ST公司的,关于便捷搭建stm32环境的软件,它将stm32重复的环境代码,变成不同按钮,可以让我们使用更加直观和方便,特别是对于大量环境的配置。
在下载软件之前,十分建议你先注册一个ST公司的账号,方便下载各种核心。注册方法就在官网。
下载安装完成后打开我们的cubeMX软件。界面就是这样。
一开始我们要先安装核心,对应我们的硬件,这里使用的是f103c8t6.
看到右边的install or remove embedded software 嘛,就是那个,进入。
好的,但是你还需要先登录,直接使用之前你注册的账号就行了。
然后进入到以下界面
找到你的硬件,下载最新的核心就行。
回到主界面,点击左上角的file 创建工程。
随后在左上角一个类似搜索框里面填入你的硬件名,这个步骤其实就是选硬件。
接下来进入到这个界面。
可以看到右边这个芯片就是我们刚刚选中的硬件,你这里就可以之间点击你想要使用的IO口了,设定他们为输出或者开关都可以。
但是我们还是先配置系统,点击左边的SYS,如这样设定。
然后根据我的规划,A5 B1 C14均为红黄绿灯闪烁口。
所以设定他们为输出。
我把B5作为开关,所以设定B5为EXIT 中断点。
上面那个图的GPIO就是可以看到你刚刚点击过的IO口,并且可以进行不同的详细设置。
我们先点进NVIC,将中断点设定号,把做下面的打上勾。
然后进入我们的GPIO
这个地方可以设置各个接口高低电平触发,还有输出模式等,如上设置。
接下来点击project manage 这个地方是管理你环境代码生成的设置的。
上面哪些project location 明显是问你代码放在哪里,自己设定一个位置就行,剩下的按照我们一样的设置。下面就输入你的对应芯片就行。
接下来进入下一个设置
第一个栏目是问你需不需要全部库文件都复制到你的代码文件中。
这里我是点了只复制必须的库文件。
注意,第二个栏目的第一个一定要勾上。
这里是问你需不需要分别给头文件库文件分类,这样可以方便管理。
接下来点击生成代码。
这个按钮在右上角,很右上角,位置放得很反直觉嘛。
进入KEIL编写用户代码
接下来我们使用keil打开你之间创建的环境代码,还记得你自己设定的位置吗?
可以看到如下图。
注释和库文件都很多,但是不要被吓到了,找到我们的main.c
下滑,找到我们在main函数里面的while(1),这里就是我们需要编写的代码位置,这里先编写使用HAL
库函数让灯设定高低电平实现闪烁,至于delay函数,你可以现在自己写一个,时间不需要太精确。
LED灯闪烁代码如下
while (1){/* USER CODE END WHILE */HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);delay_ms(1000);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);delay_ms(1000);//上面是对PA5口进行亮灭操作HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);delay_ms(1000);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);delay_ms(1000);//上面是对于PB1来进行亮灭操作HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);delay_ms(1000);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_RESET);delay_ms(1000);//上面是对于PC14来进行亮灭操作/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
好的,接下来我们找到我们的中断函数。
他在你的名为stm32f1xx_hal_gpio.c的库文件里面,
找到这个函数。
这个实际是先使用HAL库函数读取B5接口的状态,然后根据状态,来调控A5,B1,C14三个接口的状态,比如让他们停止闪烁。下面贴出代码。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin == (GPIOB,GPIO_PIN_5)){//获取B5的电位GPIO_PinState pinState = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5);//低电位if(pinState==GPIO_PIN_RESET){ HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);//把A5变为低电位HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);//把B1变为低电位HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);//把C14变为低电位}//高电位else{ HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);//把A5变为高电位HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);//把B1变为高电位HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_RESET);//把C14变为高电位}}}
注意上面的OPIO _Pinstate pinstate 是创建了一个为GPIO_Pinstate 类型的 变量pinstate来装我们B5的状态而已。
下面的就是不同状态下三个接口的操作,都是hal库的writepin 函数,写入状态。 最后面的SET 和RESET 就是置1 和复位0.
然后我们先编译,显示无错误,过后我们先用keil的逻辑分析仪看看。
如下
*
*可以看到我们三个接口和pc13 状态在闪烁状态的变化,鼠标滚轮可以调整每一格的时间间隔。
仿真没有问题过后我们使用fly mcu 烧录程序进入硬件。
再说一遍要注意烧录时和执行程序时,boot1 和boot0 的状态不同。
烧录时是错开的,执行时是对齐的,识别不了就把ch340拔了重新接一边就行,简单的。
于是我们便可以实现如下效果
注意看最左边的那个红色线,那个是我连接B5的高位开关,当B5未连接时,可以看到红绿黄三灯持续亮,但是完全不闪烁,处于非工作状态。
当我们连接上B5过后则可以实现三灯闪烁。
如下
可以看到左边B5已经连接上了,至于为什么有一个没有亮的绿灯,那是因为我们没有公-公线,只能用一个发光二极管和两根公-母线来组合成公-公线了。
可以看到我们的实验效果完全正确,符合预期。
参考文献如下:
- Listitemhttps://blog.csdn.net/weixin_56102526/article/details/120877293
- https://blog.csdn.net/qq_43279579/article/details/112213196
- https://blog.csdn.net/qq_43279579/article/details/112233696
- https://blog.csdn.net/ssj925319/article/details/111984002
- https://blog.csdn.net/qq_47281915/article/details/121024427
这篇关于基于HAl库来实现stm32 流水灯操作。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!