2021-08-07- STM32 F407/M4呼吸灯实现

M4 -使用基础定时器实现呼吸灯

前言:

本人初学cortex-M4 的小练习,只使用一个基础定时器+按键+led,分别实现流水灯,呼吸灯,以及他们两者之间的切换,并做到尽可能的整个程序的运行有较小的阻塞。
下方只展示呼吸灯部分代码,内容杂乱,目前还处于学习积累的小小白阶段,仅供方便自己学习积累,欢迎大佬们进行批评指正。

问题描述:

主要遇到的问题是在没有外部中断的情况下实现流水灯和呼吸灯中的 “延时” 导致的程序阻塞,导致单片机会因延时导致无法快速运行,浪费大量等待时间,以及影响按键扫描

解决方案:

1:定时器实现pwm效果 假定一个周期,然后对一个周期划分出高低电平。

2:根据:对应不同状态或状态切换可以有相应的处理动作的处理思想,
在流水灯以及呼吸灯中,分别加入一个 1 us的延时,然后通过改变一个数值,对不同的状态进行判断,进而进行不同的操作。

下方只展示呼吸灯部分代码,内容杂乱,仅供自己学习积累,欢迎大佬们进行批评指正,也欢迎交流。


int j = 0, k = 1, times = 0;  //j 用来 由 0-499 499-0 k 反转减加的标志位 times每次1 us 通过times来模仿delay很多

void river3_led(void)
{

    if(times == 500) 				// 判断是否完成了一整个周期,完成后改变j 开启新的周期
    {

        if(j < 500 && k == 1)      // 这里的k为标志位 判断 此时应该进行加 还是进行减
        {
            if(j == 499)
            {
                k = 0;
            }

            j++;
        }
        else
        {
            j--;
            if(j == 0)
            {
                k = 1;
            }
        }
        times = 0;          		//将 times 置零 在进去 开启新的“占空比”下的走完完整的一个周期
        cycle_time();

    }
    else                  			 // 反之 就会来到这里 继续进行 times ++
    {
        cycle_time();
    }

}
void cycle_time(void)
{

    times++;    		 // 改变times 即变 "占空比"  

    if(times <= j)       //j是改变的 所以此处的times 受到j的控制 因此 电平的时间就会改变 实现呼吸效果
    {
        LED1 = 0;
        LED2 = 0;
        LED3 = 0;
        LED4 = 0;
    }
    else if(times <= 500)  		//在500 中剩下的周期 执行 高电平 让其熄灭
    {
        LED1 = 1;
        LED2 = 1;
        LED3 = 1;
        LED4 = 1;

    }

    Delay_us(1);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值