点亮灯板
控制脚是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);
}
}
可以看到快速闪烁