(蓝桥杯)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、前面的延时函数也能够证明,代码是从前往后执行的

  • 33
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值