目录
前言
最近在备战蓝桥杯嵌入式,故做一些笔记以帮助备战,也作为一种分享。单片机的学习离不开点灯,故以点灯开头。本文使用的单片机为stm32G431RBT6
一、LED的原理图
下图为蓝桥杯官方提供的原理图
从图中可知LD1~8的引脚为PC8~15也即GPIOC的高八位,因为蓝桥杯板子的LED和LCD引脚为复用的,所以可能引起冲突,故使用了SN74HC573ADWR芯片,当LE接收到由高到低的脉冲时LED的状态会刷新一下。
二、stm32CubeMX的配置
引脚的设置主要就是设置为输出模式,因为引脚PD2只影响LED的状态变换,于是将其设为LE。
三、代码的编写
代码如下(示例):
void LEDDisp(uint8_t led)
{ if(led!=0)
GPIOC->ODR =~(0x01<<(led-1))<<8;
else
GPIOC->ODR =~(0x00)<<8;
HAL_GPIO_WritePin(LE_GPIO_Port,LE_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(LE_GPIO_Port,LE_Pin,GPIO_PIN_RESET);
}
由原理图可知,LED的引脚为引脚C的前八位且是低电平也就是说,当前八位的输入为~(0 0 0 0 0 0 0 1)时是第一个灯亮,当前八位的输入为~(0 0 0 0 0 0 1 0) 时第二个灯亮依次类推。本代码可以实现 led = 0时灯熄灭,led=n时第n个灯亮。
四、流水灯例子
变量的定义
uint8_t led=0x01;
主函数的的代码
while (1)
{
LEDDisp(led);
led++;
if(led>8)
led=0;
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
总结
总的来说和普通的点灯差不多,有一点的区别是需要给以一个下降沿使状态刷新。