蓝桥杯:使用STM32G431RBT6点亮LED灯
一、原理
1、原理图
(1)LED灯里面用到了SN74HC573ADWR锁存器,这个锁存器有一个LE引脚,这个是我们芯片的锁存引脚(使能引脚),由PD2这个端口来控制的
(2)LD1~LD8这八个LED灯由PC8~PC15这八个端口控制,且因为LD左端通过300欧的电阻连到了VDD(电源的正引脚) ,若想要点亮LED灯的话,则需要给PC8~PC15低电平,这样灯才会亮,电流会从VDD顺着LED流到PC8
2、CubeMx的Timebase Source SysTick
(1)Timebase Source SysTick这个选项的作用
这一个Timebase Source SysTick的选项是为了后面的代码写入HAL_Delay(500);这个 延时函数,它的存在是为了让这个延时函数发挥作用。后面可以选择TIM,就是用定时器让我的程序进行定时,而不是用延时函数。
(2)SysTick在函数中是如何工作的
在CubeMx里面配置了SysTick这个之后,在Kil5软件里面就会有这个中断函数。每过一毫秒就会执行这个中断
(3)中断函数里面的HAL_IncTick();
就是一个不断自加的过程
(4)这个是HAL_Delay(200);里面函数执行的程序
这是一个阻塞型延时函数,因为while循环里面没有任何的东西,所以它在执行这个函数的之后是只执行这个等待200ms的函数,等到200ms过去之后才执行主函数里面其它程序的函数
二、STM32CubeMax的配置
(1)PD2控制
1、因为是PD2来控制LED的,所以我们一定要打开PD2这个使能端口。配置成输出模式,因为我们要控制我们的LED灯,向外发送信号。
2、输出模式配为高电平则是打开锁存器
(2)八个LED灯的端口(PC8~PC15)配置成输出模式
(3)细致配置
1、GPIO output level 这个是默认的电平,若配置为low,那么就是单片机一上电这里配置的就是低电平
2、Maximum output speed这个就是高电平变化为低电平变化的速度
能改的就改,(有些不能改)不能改的也没有关系,可以通过代码来改正,而且本身不改的影响不大
(4)时钟源
三、代码
(测试PD2函数、LED默认电平、电平变化速度、代码执行的先后顺序的具体现象显现)
(1)所有LED灯变灭
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin (GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//LED的使能端口PD2给高电平
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_8,GPIO_PIN_SET);//给高电平,灯灭
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_9,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_10,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_11,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_12,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_14,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_15,GPIO_PIN_SET);
}
1、首先要给PD2给高电平,这样我的LED灯才能开始工作
2、因为上面的CubeMx配置的时候我给的是low,也就是低电平,也就相当于单片机一上电,我的LED灯就是亮着的
3、这个时候我就给LED灯在Kile5软件里面给LED给高电平,这样我的LED就会由原来亮着而后熄灭,完成我给它的现象
4、因为上面的CubeMx的配置,所以我的PC13,PC14,PC15这几个端口就会比其它端口实现LED亮变灭这个现象实现的速度要慢一些,但最终还是会实现亮变灭
(2)所有LED灯变亮
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin (GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//LED的使能端口PD2给高电平
HAL_Delay(1000);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_9,GPIO_PIN_RESET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_10,GPIO_PIN_RESET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_11,GPIO_PIN_RESET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_12,GPIO_PIN_RESET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_14,GPIO_PIN_RESET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);
}
/* USER CODE END 3 */
}
1、因为我的CubeMax里面给LED灯的默认电平是高电平,所以单片机一上电,那么LED灯就是灭的状态
2、后来我程序里面给LED灯是低电平,所以此时LED灯亮起,实现LED灯由灭变亮的过程
3、在原来没有加延时函数的时候,基本上看不见由灭变量这个过程,因为亮得太快了,所以肉眼看不见单片机最开始灭的这个现象,于是我加了一个延时函数,这样就能够看见单片机一上电就是LED灯灭的状态到延时1000ms之后,执行程序(LED灯亮)
4、Delay延时函数不放在PD2后面而是放在PC8后面,此时PC8控制的LD1由灭边亮的速度极快,后面的灯则是一致的先执行在1000ms内的灭的状态,然后1000ms后统一执行LED灯亮的代码
(3)PD2的作用(此时LED默认的电平是低电平)
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//HAL_GPIO_WritePin (GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//LED的使能端口PD2给高电平
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_8,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_9,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_10,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_11,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_12,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_14,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_15,GPIO_PIN_SET);
}
/* USER CODE END 3 */
}
1、若我不屏蔽掉PD2的代码,那么程序正常执行LED灯由亮变灭
2、屏蔽掉PD2的代码之后的现象就是LED灯一直亮着,也就说明我的单片机根本就没有执行我给他的LED灯灭掉的功能,所以此时LED灯是没有接收到我的指令的
3、PD2不在while循环里面,放在int main()里面也能执行。但是放在int main()之外就不能执行了,会报错。只要给PD2写SET才能够执行LED的代码。若不写或屏蔽则执行不了LED的代码
(4)代码执行的先后顺序
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin (GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//LED的使能端口PD2给高电平
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_9,GPIO_PIN_SET);
HAL_Delay (1000);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_8,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_10,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_11,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_12,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_14,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_15,GPIO_PIN_SET);
}
/* USER CODE END 3 */
}
1、因为PC9在前,所以来的最先变灭,其他灯都是延时1000ms之后才变灭的
2、前面的延时函数也能够证明,代码是从前往后执行的
作者:学习日记hhh