打开主菜单

谷雨文档中心 β

更改

LED 闪烁控制软件模块

添加6,606字节2019年12月9日 (一) 15:25
初版正在进行中
LED闪烁功能,作为常用需求。将其归纳为软件模块,与其他项目或工程共享原代码。
 
=== 文件组成 ===
功能模块由六个文件组成,分别承载不同作用。
{| class="wikitable"
|+
!文件名称
!作用
|-
|bsp_status_led.c
|对应用层函数进行定义
|-
|bsp_status_led.h
|对应用层函数进行声明
|-
|ledConfig.c
|对硬件操作接口进行抽象
|-
|ledConfig.h
|对硬件操作接口进行声明
|-
|hal_led.c
|对硬件接口进行定义
|-
|hal_led.h
|对硬件接口进行声明
|}
在LED闪烁功能模块中,用到硬件包括一个GPIO引脚,一个定时器。开发者需要根据自身硬件情况,自行选择相应的硬件。并将这些硬件按要求实现相应的函数。这些函数在hal_led.h与hal_led.c文件中进行声明与定义。
 
==== hal_led.h与hal_led.c ====<!-- hal_led.h中与硬件相关函数声明 -->
<syntaxhighlight lang="c" line="1">
/*定时器超时回调函数指针*/
typedef void (*fnTimerTimeoutCb_t)(bool);
 
//******************************************************************************
// function declare
/*Create a timer*/
void HalLed_TimerInit(fnTimerTimeoutCb_t pFnTimeoutCb);
 
/*Start timer*/
void HalLed_TimerStart(uint32_t ms, void *pContext);
/*Stop timer*/
void HalLed_TimerStop(void);
/*Pin init*/
void HalLed_PinInit(void);
/*Pin set */
void HalLed_PinSet(bool level);
</syntaxhighlight>各函数功能及形参解释说明,如下表所示。
{| class="wikitable"
|+
!函数名
!解释
|-
|HalLed_TimerInit(fnTimerTimeoutCb_t pFnTimeoutCb)
|创建一个定时器,且定时器能达到秒级的周期。
pFnTimeoutCb:是定时器超时回调函数指针
|-
|HalLed_Timerstart(uint32_t ms, void *pContext)
|启动定时器。
ms:是定时周期
 
pContext:传入的参数指针,会在超时回调函数中使用
|-
|HalLed_Timerstop(void)
|停止定时器
|-
|HalLed_PinInit(void)
|初始化与LED相连的GPIO引脚,并保持LED灭状态
|-
|HalLed_PinSet(void)
|设置GPIO的高低电平,即控制LED亮灭。
level:true ->LED亮
 
false -> LED灭
|}<!-- hal_led.c就是对上述函数进行定义。而各个函数体是与开发者的硬件相关联 -->
<syntaxhighlight lang="c" line="1">
//******************************************************************************
// fn : HalLed_TimerInit
//
// brief: Create a time object for blink led
//
// param : pFnTimeoutCb -> the timeout cb
//
// return : none
void HalLed_TimerInit(fnTimerTimeoutCb_t pFnTimeoutCb)
{
 
}
 
//******************************************************************************
// fn : HalLed_TimerStart
//
// brief: Start timer
//
// param : ms -> the timeout ,unit = ms
//
// return : none
void HalLed_TimerStart(uint32_t ms,void *pContext)
{
}
 
//******************************************************************************
// fn : HalLed_TimerStop
//
// brief: Stop timer
//
// param : ms -> the timeout ,unit = ms
//
// return : none
void HalLed_TimerStop(void)
{
 
}
 
//******************************************************************************
// fn : HalLed_PinInit
//
// brief: Pin init
//
// param : none
//
// return : none
void HalLed_PinInit(void)
{
 
}
 
//******************************************************************************
// fn : HalLed_PinInit
//
// brief: Pin set
//
// param : level -> true -> open,false -> off
//
// return : none
void HalLed_PinSet(bool level)
{
}
</syntaxhighlight>
 
==== ledConfig.h与ledConfig.c ====
ledConfig.h与ledConfig.c是对LED闪烁模块的硬件进行抽象,即hal_led.h与hal_led.c中定义的功能函数。<!-- ledConfig.h抽象接口声明 -->
 
<syntaxhighlight lang="c" line="1">
/*定时器初始化函数指针*/
typedef void (*fnTimerInit_t)(fnTimerTimeoutCb_t);
/*定时器启动函数指针*/
typedef void (*fnTimerStart_t)(uint32_t ms,void*pContext);
 
/*定时器停止函数指针*/
typedef void (*fnTimerStop_t)(void);
 
/*Led 引脚初始化函数指针*/
typedef void (*fnPinInit_t)(void);
/*Led 引脚高低电平设置函数指针*/
typedef void (*fnPinLevelSet_t)(bool level);
 
//******************************************************************************
// Name : ledBlinkCfg_t
//
// Brief : 描述LED闪烁控制接口函数
typedef struct
{
fnTimerInit_t fnTimerInit;
fnTimerStart_t fnTimerStart;
fnTimerStop_t fnTimerStop;
fnPinInit_t fnPinInit;
fnPinLevelSet_t fnPinLevelSet;
}ledModuleCfg_t;
extern ledModuleCfg_t ledModule;
</syntaxhighlight>hal_led.h就是根据ledConfig.h声明函数接口进行定义的。
 
其中结构体ledModuleCfg_t就是对硬件层进行抽象。其中包括定时器定义,定时器启动,定时器停止,引脚gpio初始化,引脚高低电平设置。<!-- ledConfig.c是ledModuleCfg_t进行初始化 -->
 
<syntaxhighlight lang="c" line="1">
/*led operate interface*/
ledModuleCfg_t ledModule = {
.fnTimerInit = HalLed_TimerInit,
.fnTimerStart = HalLed_TimerStart,
.fnTimerStop = HalLed_TimerStop,
.fnPinInit = HalLed_PinInit,
.fnPinLevelSet = HalLed_PinSet
};
</syntaxhighlight>
 
==== bsp_status_led.h 与bsp_status_led.c ====
这两个文件是开发者可以调用函数的声明与定义。开发者可以调用相应函数对LED闪烁状态进行设置。led支持如下6种状态。<syntaxhighlight lang="c" line="1">
 
typedef enum
{
LED_STATUS_OFF, //关闭
LED_STATUS_ON, //常亮
LED_STATUS_BLINK1, //闪烁1,周期200ms,占空比50:亮100,灭100
LED_STATUS_BLINK2, //闪烁2,周期1000,占空比10:亮100,灭900
LED_STATUS_BLINK3, //闪烁3,周期1000,占空比50:亮500,灭500
LED_STATUS_BLINK4, //闪烁4,周期2000,占空比5: 亮100,灭1900
LED_STATUS_END
}eLEDStatus;
</syntaxhighlight>当然开发者也可以,根据自己的需求,对led闪烁状态进行修改。包括周期,占空比。具体修改的地方在bsp_status_led.c文件头部。各个闪烁状态由宏定义定义,如下。<syntaxhighlight lang="c" line="1">
#define LED_BLINK1_PERIOD 200
#define LED_BLINK1_DUTY 50
#define LED_BLINK1_ON_MS 100
#define LED_BLINK1_OFF_MS (LED_BLINK1_PERIOD - LED_BLINK1_ON_MS)
 
#define LED_BLINK2_PERIOD 1000
#define LED_BLINK2_DUTY 10
#define LED_BLINK2_ON_MS 100
#define LED_BLINK2_OFF_MS (LED_BLINK2_PERIOD - LED_BLINK2_ON_MS)
 
#define LED_BLINK3_PERIOD 1000
#define LED_BLINK3_DUTY 50
#define LED_BLINK3_ON_MS 500
#define LED_BLINK3_OFF_MS (LED_BLINK3_PERIOD - LED_BLINK3_ON_MS)
 
#define LED_BLINK4_PERIOD 2000
#define LED_BLINK4_DUTY 5
#define LED_BLINK4_ON_MS 100
#define LED_BLINK4_OFF_MS (LED_BLINK4_PERIOD - LED_BLINK4_ON_MS)
</syntaxhighlight>
119
个编辑