“万物起源”皆点灯,咱们无论玩什么单片机,好像第一步开始的都是点灯,点灯成功就代表着开始打开这一款单片机的大门啦。
相信有看过蓝桥杯嵌入式省赛、国赛题目的同学都知道届届有点灯,题题要点灯。当然题目中的点灯不是特别简单的亮与灭,比如亮5秒之类的,而且需要不阻塞延时,当然这里只讲最基础的亮灭,等到咱们TIM的时候,再来提不阻塞延时
好啦,话不多说,接下来开始咱们的点灯这重要一步
下面这个是咱们的点灯电路图,可以看到,PC8~PC15都是接在GND一遍,所以当PC8~PC15是低电平的时候,会形成电压差,从而点灯
看了电路图就应该进入到STM32CubeMx配置引脚啦
接下来PC8~PC15都这样配置就行,其他选项默认,配置好后可以根据自己的习惯在User Label把引脚改为自己习惯的名字,例如PC8改名为LD1。但是我这个人就很懒,所以一般不改别名,也因为这样我也把各个引脚的功能记得差不多了,哈哈哈哈
千万别忘记了PD2引脚,这个引脚一般用来锁存,按照我自己的理解呢,锁存就是把引脚电平锁在一个电平内,因为LED灯与LCD屏共用了PC8~PC15,一般会导致很奇怪的现象,所以锁存就显得非常有用了,当然后面讲LCD的时候也会有更多对这个冲突的讲解
好啦,配置完之后,就点击GENERATE CODE生成就好啦,要是有什么基础配置不懂的话,就到我们的stm32CubeMx配置查看哦
先添加LED.c和LED.h文件
然后就开始编写咱们得LED.h文件啦
#ifndef _LED_H
#define _LED_H
#include "main.h"
void LED_OFF(void);
void LED_ON(void);
void LED_Assign(uint16_t LED_data,char LED_Level);
#endif
然后是LED.c文件
#include "LED.h"
void LED_OFF(void) //把所有灯关掉
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_10
|GPIO_PIN_9|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_8,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
void LED_ON(void) //把所有灯打开
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_10
|GPIO_PIN_9|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_8,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
void LED_Assign(uint16_t LED_data,char LED_Level) //选择哪个灯和电平状态
{
HAL_GPIO_WritePin(GPIOC,LED_data,(GPIO_PinState)LED_Level);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
LED.c代码要是问为什么要用这么多GPIO_PIN,不直接就用输出寄存器,简便不繁琐呢
我个人觉得吧,这个简便好记,实现功能就好了,哈哈哈哈
void LED_Assign(uint16_t LED_data,char LED_Level)
这个函数中的为什么要用到(GPIO_PinState)LED_Level呢,主要是这个位置本被枚举函数占用了,假如直接就是char类型的话,会出现枚举与char混合情况出现警告,所以就强制类型转化一下就不会有警告啦,当然警告并不会导致功能出现错误,觉得麻烦可以不用管,反正咱们主打一个能跑就行要什么自行车
好了,LED.c文件和LED.h文件都写好了,这时候就得到main.c函数“大展神威”了
首先在用户编写头文件处编写引用头文件,记得一定要在USER CODE BEGIN和USER CODE END之间编写,不然有时候代码会被“刷”掉
到达int main()函数里面啦
在这里咱们得先把全部灯关掉,毕竟不关掉怎么能看到咱们“大展神威”呢
在while函数里面调用选择哪号灯开关灯函数
可能有细心的好兄弟会好奇,咦~为啥有的是LED_Assign(GPIO_PIN_8,0);
有的是LED_Assign(GPIO_PIN_9,GPIO_PIN_RESET);呢,这两个其实是一样滴,就是给兄弟们看看这两种调用方式。第一种有个好处就是可以定义一个标志位,可以根据题目所要求变化更加方便 ,后面会有奇用哦
好啦,咱们得嵌入式之路,已经踏出,你是否成功了呢?