点亮灯板

控制脚是PB11如图  就是底板上的P5【不是核心板的!】

高电平--亮

开始

第一阶段:

void IO_Test(void)
{
	HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin,GPIO_PIN_RESET);//不亮
	HAL_Delay(100);
	HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin,GPIO_PIN_SET);//亮
	HAL_Delay(1000);
}

第二阶段:

基础闪烁

#ifndef _BASETwinkle_H_
#define _BASETwinkle_H_
#include "stdint.h"//负责typedef   signed          char int8_t;
#include "stddef.h"//负责#define NULL 0
typedef void (*todofunc)(void);


//节点的结构体
typedef struct
{
	uint8_t         openFlag;//节点功能开关-
	int         	  setcnt;//设定的次数
	int         	  realCnt;//实际的次数
	uint32_t        RTime;//实际的计数值
	uint32_t        ATime;//设定的A计数值
	uint32_t        BTime;//设定的B计数值
	todofunc        funA;//[0-A之间的函数]
	todofunc        funB;//[A-B之间的函数]
	
	void (*loop)    (void *p );
	void (*init)    (void *p ,uint8_t enable,uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime,todofunc funopen,todofunc funclose);
}twinkleType;


void twinkle_set(void *p ,uint8_t enable,uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime,todofunc funopen,todofunc funclose);
void twinkle_timer_isr( void *p );








#endif

#include "..//GKoSonTools/TW_LED/basetwinkle.h"


//对节点的实例化 也就是赋值
void twinkle_set(void *pp ,uint8_t enable,uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime,todofunc funopen,todofunc funclose)
{
	twinkleType* p=(twinkleType *)pp;
	if(p==NULL)return;
	p->setcnt = OpenCnt;
	p->realCnt = 0;
	p->RTime = 0;
	p->ATime = OpenTime;
	p->BTime = CloseTime;
	p->funA = funopen;
	p->funB = funclose;   
	p->openFlag = enable;	
}


//周期执行函数
void twinkle_timer_isr( void *pp )
{
		twinkleType* p=(twinkleType *)pp;
		if(p==NULL) return;
    if(p->openFlag == 1)
    {
        if( p->RTime ++ < p->ATime) 
        {
            p->funA() ;
        }
        else//隐藏条件 这是【A B之间的时候】
        {
            p->funB() ;
        }
				
        if( p->RTime  >  p->ATime+p->BTime)
        {
            p->RTime = 0;

						if( ++p->realCnt >= p->setcnt)
						{
							p->openFlag = 0;
						}

        }
    }    
}

这个模块非常独立 可以直接添加IDE 它没有初始化!!!我们去别的地方 做一个应用 实例化

#include "main.h"
#include "..//GKoSonTools/TW_LED/ledtw.h"

twinkleType basetw;



void ledon(void) {	HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin,GPIO_PIN_SET);}
void ledoff(void){	HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin,GPIO_PIN_RESET);}

void TWLED_init(void)
{
	basetw.loop=twinkle_timer_isr;
	basetw.init=twinkle_set;//这里 禁止参数!!(&basetw,able,num,OpenT,CoseT,fo,fc);
}

void TWLED_write(uint8_t num)
{
	basetw.init(&basetw,1,num,50,100,ledon,ledoff);
}




TWLEDType    TWLED=
{
    .write = TWLED_write,
};

这个C其实有2个全局变量 一个是最下面的 我们喜闻乐见 一个是最上面的也就是我们的基础闪烁 它是在init初始化的!!

本来希望做static的 但是它的LOOP要对外 没办法

#ifndef _ledtw_H_
#define _ledtw_H_
#include "..//GKoSonTools/TW_LED/basetwinkle.h"


typedef struct
{
    void (*write)       (uint8_t num);//BEEP鸣叫几次/LED闪烁几次
 
}TWLEDType;


extern twinkleType basetw;

extern TWLEDType    TWLED;
extern void TWLED_init(void);

#endif

写好来了 

测试:

void StartDefaultTask(void const * argument)
{
    TWLED_init();
  for(;;)
  {
     TWLED.write(1);
    osDelay(100);
  }
}

void StartTask02(void const * argument)
{
  for(;;)
  {
        basetw.loop(&basetw);
    osDelay(1);
  }

}

可以看到快速闪烁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值