目录
1. 前言
书接上文,上一篇笔记完成了基础源工程的构建,这次我们在上一个工程的基础上做LED指示灯程序设计。
2. 电路原理
通过查阅CT117E-M4产品手册的电路原理图,可以看到LED电路部分需要用到的引脚为PC8、PC9、PC10、PC11、PC12、PC13、PC14、PC15和PD2。
图2-1 LED电路原理图
由于发光二极管已经接入了VDD,那么PC8~PC15为低电平时,LED灯将变亮。但是要注意的是LED的一些引脚与我们后面的LCD引脚存在共用,所以需要锁存器来保存LED的电平设置。
图2-2 SN74HC573内部结构图
OE接地,所以一直是低电平,LE来控制信号通断,当LE为高电平时,信号传输过来;当LE为低电平时则Q端的电平将锁存,不会再改变。所以我们后续编程时,更改PC8~PC15的引脚电平后,去控制PD2引脚高电平后低电平,即可完成LED的控制。
3. 使用CubeMX进行源工程的配置
打开之前Source工程的.ioc文件,在Pinout View将PC8~PC15、PD2都设置为GPIO_Output
随后在System Core -GPIO设置里将PC8~PC15改为默认为高电平。
这样我们就设置完了,最后点击GENERATE CODE。
4. 代码编程
接下来我们在Test_Project工程里的Src文件夹创建BSP\LED\bsp_led.c,同理,在Inc文件夹创建BSP\LED\bsp_led.h。这就是我们后面要编写的中间层代码文件。
打开Test_Project工程,进行文件Group的添加
将Inc\BSP目录添加到include path里
随后在bsp_led.c中添加bsp_led.h
随后进行编译,即可看到bsp_led.h在Project目录中,编写bsp_led.h
#include "main.h"
void LED_Init(void);
void LED_Disp(unsigned char ucLed);
我们将Source工程里的gpio.c里的初始化部分代码粘贴到LED_Init内,然后实现LED_Disp函数,如下为bsp_led.c程序
#include "led\bsp_led.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
/*Configure GPIO pins : PC13 PC14 PC15 PC8
PC9 PC10 PC11 PC12 */
GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pin : PD2 */
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}
//函数名:LED_Disp
//入口参数:ucLed
//出口参数:void
//函数功能:LD8-LD1对应ucLed的8个位
void LED_Disp(unsigned char ucLed)
{
//**将所有的灯熄灭
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
//根据ucLed的数值点亮相应的灯
HAL_GPIO_WritePin(GPIOC,ucLed<<8,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
随后编写main.c部分进行代码测试
int main(void)
{
HAL_Init();
SystemClock_Config();
LED_Init();
while (1)
{
/* USER CODE END WHILE */
LED_Disp(0x88);
HAL_Delay(500);
LED_Disp(0x00);
HAL_Delay(500);
/* USER CODE BEGIN 3 */
}
}
5. 测试
烧录到开发板中看效果
板子的LED灯在闪烁,说明本次功能已成功实现啦🤭!