STM32 流水灯与跑马灯的实现
基于STM32F407实现流水灯与跑马灯
上一章实现了点亮LED灯的实验
添加引脚
根据电路图将LED灯的其他引脚加进来
然后进行宏定义,简化代码
之后我们就将LED1_PIN代替GPIO_Pin_14.........LED4_PIN代替GPIO_Pin_7
三目运算符
我们将LED(0)使LED灯亮 LED(1)使LED灯灭
三目运算符: X?表达式1:表达式2 当x为零时执行表达式2 非零时执行表达式1
#define LED1(x) x?(GPIO_SetBits(GPIOG,LED1_PIN)):(GPIO_ResetBits(GPIOG,LED1_PIN))
#define LED2(x) x?(GPIO_SetBits(GPIOG,LED2_PIN)):(GPIO_ResetBits(GPIOG,LED2_PIN))
#define LED3(x) x?(GPIO_SetBits(GPIOG,LED3_PIN)):(GPIO_ResetBits(GPIOG,LED3_PIN))
#define LED4(x) x?(GPIO_SetBits(GPIOG,LED4_PIN)):(GPIO_ResetBits(GPIOG,LED4_PIN))
delay函数
实现流水灯需要用到延时函数,最简单的延时函数是通过循环将其卡住,实现延时的效果。
想要做到精准的延时需要用到滴答定时器,这里就先复制了(延时函数所有文件都能用得上且代码不变)
//延时函数 us级别
void delay_us(uint32_t us)
{
SysTick->CTRL = 0; //关闭嘀嗒定时器
SysTick->LOAD = 21*us-1; //设置计数21*us-1~0,计数周期是21us-1+1
SysTick->VAL = 0; //计数器值清零,会被重装载值覆盖
SysTick->CTRL = 1; //清除计算器标志位,设置时钟源是21MH,关闭中断,开启嘀嗒定时器
while((SysTick->CTRL & 0X00010000) == 0); //等待标志位从0--》1
SysTick->CTRL = 0; //关闭嘀嗒定时器
}
// 普通延迟函数 ms级别
void delay_ms(uint32_t ms)
{
SysTick->CTRL = 0;
SysTick->LOAD = 21000*ms-1;
SysTick->VAL = 0;
SysTick->CTRL = 1;
while((SysTick->CTRL & 0X00010000) == 0);
SysTick->CTRL = 0;
}
// 普通延迟函数 s级别
void delay_s(uint32_t s)
{
while(s--)
{
delay_ms(500);
delay_ms(500);
}
}
流水灯操作
方法一:最直接的方法,使灯一个接着一个亮中间加延时
这种方法很麻烦,如果遇到灯组多的情况下需要一直写。
方法二:建立数组用循环实现。
主函数:
同理可以实现跑马灯: