【NUCLEO_F767ZI开发板系列】三、LED灯和按键

一、LED灯

 首先,Nucleo开发板上一共有8颗LED灯

  LED1~3是用户LED :LED1:绿色;LED2蓝色;:LED3:红色

  LED4 :三色(绿色,橙色,红色)提供有关ST-LINK的与PC的信息沟通状态。默认颜色是红色的。LD4变成绿色表  PC与ST-LINK / V2-1之间正在进行通讯,具体如下:
   •慢速闪烁红色/熄灭:在USB初始化之前已经接通电源
   •快速闪烁红色/熄灭:PC和ST-LINK / V2-1(枚举)之间的第一次正确通信之后的状态,
   •红色LED亮起:PC和ST-LINK / V2-1之间的初始化完成时
   •绿色LED亮起:通信初始化成功后
   •闪烁红色/绿色:通信期间
   •绿灯亮起:通信完成并成功
   •橙灯亮:通信失败

  LED5 :USB电源警告,LD5指示USB供电(U5V)超过500mA,用户必须使用外部电源为电路板供电。
  LED6 :PWR,绿色LED指示STM32芯片已上电,CN8引脚9和CN11引脚18上有+5 V电源。
  LED7和LED8 :USB FS或设备的指示。


这里我们编程使用的是LED1~LED3。根据用户手册的说明,在Cube里配置引脚:LED1默认在PB0口。




打开原理图发现,这三个用户LED连接的方式不一样,LED2和LED3都是直接接IO口,另一端接地,IO推挽输出高的时候灯被点亮。




但LED1就不一样了,它是通过一个运算放大器来驱动的,型号:TSV631AILT,是ST设计的的轨到轨CMOS运算放大器,可以运行在从1.5到5.5 V的电压范围,而且功耗很低,5V电压时的功耗只有60uA。此电路是一个典型的电压跟随器,同相输入端为高电平时,输出就是高电平,所以当PB0为高时,LED1点亮。以前见到的LED驱动电路大多是直接接IO口,另一端接VDD或VCC,用三极管驱动的都很少,这次竟然见到了用运放驱动的电路,不知道ST这么设计的原因是什么。



配置PB0、PB7、PB14的IO引脚为输出模式



  • GPIO outputLevel (管脚输出状态):低电平。
  • GPIO mode (管脚模式 ):推挽输出。
  • GPIO Pull-up/pull-down(上拉/下拉):不上拉也不下拉。
  • Maximum output speed (最大输出速度):高速。
  • User Label (用户标签):LED1~3。

设置好后,回到引脚配置界面发现,LED的三个引脚已经自动改成了自己定的标签:




时钟配置在上一篇的工程里已经配置好216MHz的主频了,使用ST_Link的MCO的8MHz输入。




在配置选项里选择CORTEX_M7,




 1) Flash Interface:选择 Flash 接口,为 AXI 或者 TCM。
 2) ARI ACCLERATOR:使能缓存加速。
 3) Instruction Prefetch:使能指令预取。
 4) CPU ICache:使能 I-Cache。
 5) CPU DCache: 使能 D-Cache。

 最后生成代码,

在main.h文件里,有如下的宏定义:

#define LED1_Pin GPIO_PIN_0
#define LED1_GPIO_Port GPIOB
#define LED3_Pin GPIO_PIN_14
#define LED3_GPIO_Port GPIOB
#define LED2_Pin GPIO_PIN_7
#define LED2_GPIO_Port GPIOB


在主函数while(1)添加以下代码:


		HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
		HAL_Delay(500);
		HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
		HAL_Delay(500);
		HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);
		HAL_Delay(500);
配置Debug选项:


 下载到开发板,现象如下图所示,三个LED灯循环点亮和熄灭。


二、按键

 接着在工程的基础上添加按键(采用查询方式)

 用户手册:两个按键,一个用户按键(PC13),一个复位按键。


 默认是下拉的,按键按下为高电平。


 在Cube中配置如图:

  选择GPIO_Input

 配置Pin的参数如下图:

  

  生成代码,在main.h函数中,又有了关于KEY的宏定义。GPIO的初始化函数中,也自动生成了按键的初始化程序。

#define KEY_Pin GPIO_PIN_13
#define KEY_GPIO_Port GPIOC
   在主函数的while(1)中添加如下代码:
		if( HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_SET )
		{
			Led_Set++;
			HAL_Delay(300);
			if(Led_Set>=4) Led_Set=1;
			
			if(Led_Set==1)
			{
				HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
			}
			else if (Led_Set==2)
			{
				HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
			}
			else if (Led_Set==3)
			{
				HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);
			}
		}

  下载到开发板里,效果如图所示:



猜你喜欢

转载自blog.csdn.net/qq_37147721/article/details/79261989