OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3931|回复: 8

3种非阻塞LED闪烁程序

[复制链接]

12

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2015-12-26
在线时间
115 小时
发表于 2016-11-19 20:18:50 | 显示全部楼层 |阅读模式
1.间隔x秒执行1次
if(Get_RunTime - led_time > 150)//间隔1.5秒,
{
    led_time = Get_RunTime;
    LED = !LED;
    //需要定时执行的函数
}

2.间隔x秒执行1次
if (IS_TIMEOUT_10MS(eTimLed, 80))//间隔0.8秒,
{
    LED = !LED;
    //需要定时执行的函数
}

3.次数,开时间,关时间(控制LED或BEEP)
SetLed(0xff, 100, 100);//连续,间隔1秒,
SetLed(5, 5, 300);//3次,开50毫秒,关3秒,





bsp.c 文件

static u16 timer_on = 0,timer_off = 0;
static u16 nCnt = 0;
static u8 nNum = 0;

//次数,开时间,关时间(单位10ms),其中num=0xff为连续
void SetLed(u8 num,u16 on_time,u16 off_time)     
{
        nNum = num;
        timer_on = on_time;
        timer_off = off_time;
        SetLedPower(0);
        nCnt = 0;
}

void Led_10mS_Conut(void)//定期器10ms调度任务
{
        if(nCnt)
        {
                nCnt--;
                if(nCnt == timer_off)
                        SetLedPower(0);
        }
        else
        {
                if(nNum == 0XFF)
                {
                        SetLedPower(1);
                        nCnt = timer_on + timer_off;
                }
                else if(nNum)
                {
                        SetLedPower(1);
                        nNum --;
                        nCnt = timer_on + timer_off;
                }
        }
}

void SetLedPower(u8 high)//接口
{
        if(high)
                LED = 1;
        else
                LED = 0;       
}


BspTime2.h 文件

#ifndef _BSPTIME2_h_
#define _BSPTIME2_h_

#include <stm32f10x.h>

enum {
    eTimLed,
    eTimNrf,
    eTim3,
    eTim4,
    eTimMax,
};

//如果index对应的时间超时,清零并返回1,未超时返回0
#define IS_TIMEOUT_10MS(index, count) ((g_Tim2Array[(u16)(index)] >= (count))?  \
                                      ((g_Tim2Array[(u16)(index)] = 0) == 0): 0)

extern volatile int g_Tim2Array[(u16)eTimMax];

void BspTim2Init(void);
u32 Get_RunTime(void);

#endif



BspTime2.c 文件

volatile int g_Tim2Array[(u16)eTimMax] = {0};
volatile u32 sys_time=0;

//通用定时器初始化,
void BspTim2Init(void)
{
    NVIC_InitTypeDef NvicInitdef;
    TIM_TimeBaseInitTypeDef timbase;       

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);       

    TIM_DeInit(TIM2);
    timbase.TIM_CounterMode = TIM_CounterMode_Up;
    timbase.TIM_ClockDivision = TIM_CKD_DIV1;
    timbase.TIM_Period = 10000 - 1;//1000=1ms;10000=10ms
    timbase.TIM_Prescaler = 72 - 1;// 72分频
    TIM_TimeBaseInit(TIM2, &timbase);

    NvicInitdef.NVIC_IRQChannel = TIM2_IRQn;
    NvicInitdef.NVIC_IRQChannelPreemptionPriority = 3;//最低优先级
    NvicInitdef.NVIC_IRQChannelSubPriority = 3;
    NvicInitdef.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NvicInitdef);

    TIM_SetCounter(TIM2, 0);
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    TIM_Cmd(TIM2, ENABLE);
}

//tim2中断函数(10毫秒)
void TIM2_IRQHandler(void)
{
    u16 i = 0;

    if( SET == TIM_GetITStatus(TIM2,TIM_IT_Update) )
    {
        TIM_ClearITPendingBit( TIM2, TIM_IT_Update);
        Led_10mS_Conut();
        sys_time++;
        if(Timerx)
        {
            Timerx--;
        }
        for (i = 0; i < (u16)eTimMax; i++)
        {
            g_Tim2Array[i]++;
        }
    }
}

u32 Get_RunTime(void)
{
        return sys_time;
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2016-11-19 20:39:17 | 显示全部楼层
支持一下,群里习惯用非阻塞编程的似乎不多。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复 支持 反对

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2016-11-19 22:50:39 | 显示全部楼层
东北小辉辉 发表于 2016-11-19 20:39
支持一下,群里习惯用非阻塞编程的似乎不多。

这话差不多是说,群里编程高手不多。
回复 支持 反对

使用道具 举报

7

主题

185

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2729
金钱
2729
注册时间
2015-12-27
在线时间
469 小时
发表于 2016-11-20 10:22:56 | 显示全部楼层
东北小辉辉 发表于 2016-11-19 20:39
支持一下,群里习惯用非阻塞编程的似乎不多。

这话讲得好像你看过大多数人的代码一样
回复 支持 反对

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-11-20 10:40:53 | 显示全部楼层
如果不是你这样说我去百度,我连什么是非阻塞都不清楚。但是实际上,项目中基本都是非堵塞,不会随便浪费资源空等待的
回复 支持 反对

使用道具 举报

28

主题

306

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
1320
金钱
1320
注册时间
2012-6-3
在线时间
353 小时
发表于 2016-11-20 14:13:01 | 显示全部楼层
好方法,支持。
回复 支持 反对

使用道具 举报

58

主题

359

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2014-9-29
在线时间
261 小时
发表于 2016-11-21 10:32:07 | 显示全部楼层
正常的项目上都是用的非阻塞吧,处理一般就是处理显示的数据

然后定时调用一次数据显示

回复 支持 反对

使用道具 举报

7

主题

54

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1028
金钱
1028
注册时间
2015-12-8
在线时间
447 小时
发表于 2017-8-20 22:39:31 | 显示全部楼层
非阻塞的学习了。。
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2018-12-26
在线时间
29 小时
发表于 2019-8-12 23:01:51 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 07:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表