代码解析
led模块相对简单,对对外只有一个接口暴露出来,通过设置状态来执行相应的显示
/* 应用层设置led的状态,led模块根据状态设置相应的动作 */
app_status_indication_set(APP_STATUS_INDICATION_T status)
{
struct APP_PWL_CFG_T cfg0;
struct APP_PWL_CFG_T cfg1;
...
switch (status) {
case APP_STATUS_INDICATION_POWERON:
cfg0.part[0].level = 1;
cfg0.part[0].time = (300);
cfg0.part[1].level = 0;
cfg0.part[1].time = (300);
cfg0.parttotal = 2;
cfg0.startlevel = 0;
cfg0.periodic = true;
cfg1.part[0].level = 1;
cfg1.part[0].time = (300);
cfg1.part[1].level = 0;
cfg1.part[1].time = (300);
cfg1.parttotal = 2;
cfg1.startlevel = 1;
cfg1.periodic = true;
app_pwl_setup(APP_PWL_ID_0, &cfg0);
app_pwl_start(APP_PWL_ID_0);
app_pwl_setup(APP_PWL_ID_1, &cfg1);
app_pwl_start(APP_PWL_ID_1);
break;
case APP_STATUS_INDICATION_INITIAL:
break;
...
}
...
}
上面的参数定义如下所示:
status 类型定义在APP_STATUS_INDICATION_T中:
typedef enum APP_STATUS_INDICATION_T {
APP_STATUS_INDICATION_POWERON = 0,
APP_STATUS_INDICATION_INITIAL,
...
...
...
}APP_STATUS_INDICATION_T;
APP_PWL_CFG_T的定义如下
struct APP_PWL_CFG_T {
struct PWL_CYCLE_ONCE {
uint8_t level;/*电平 高/低*/
uint32_t time;/*电平持续时间*/
}part[10];
uint8_t parttotal;/*part总共有几种操作,即part数组中有效操作的个数*/
uint8_t startlevel;/* 起始电平*/
bool periodic;/*是否循环操作*/
};
led的ID号,用于在cfg_hw_pinmux_pwl索引具体的硬件io,目前最多只支持两个led
enum APP_PWL_ID_T {
APP_PWL_ID_0 = 0,
APP_PWL_ID_1 = 1,
#if (CFG_HW_PLW_NUM == 1)
APP_PWL_ID_QTY = 1,
#elif (CFG_HW_PLW_NUM == 2)
APP_PWL_ID_QTY = 2,
#else
APP_PWL_ID_QTY = 0,
#endif
};
使用举例
io配置
led的io配置在tgt_hardware.c中定义,如下所示,注意不同的芯片可能会有不同
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_hw_pinmux_pwl[CFG_HW_PLW_NUM] = {
#if (CFG_HW_PLW_NUM > 0)
{HAL_IOMUX_PIN_LED2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENALBE},
{HAL_IOMUX_PIN_LED1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENALBE},
#endif
};
设置状态
假如这里想开机时,led1快闪两次,先在app_status_indication_set配置led动作
int app_status_indication_set(APP_STATUS_INDICATION_T status)
{
/* 对应两个led配置 */
struct APP_PWL_CFG_T cfg0;
struct APP_PWL_CFG_T cfg1;
......
switch (status) {
case APP_STATUS_INDICATION_POWERON:
cfg0.part[0].level = 1;
cfg0.part[0].time = (200);
cfg0.part[1].level = 0;
cfg0.part[1].time = (200);
cfg0.part[2].level = 1;
cfg0.part[2].time = (200);
cfg0.part[3].level = 0;
cfg0.part[3].time = (200);
cfg0.parttotal = 3;
cfg0.startlevel = 1;
cfg0.periodic = false;
app_pwl_setup(APP_PWL_ID_0, &cfg0);/* 将cfg0与led1绑定 */
app_pwl_start(APP_PWL_ID_0);
break;
......
}
return 0;
}
然后在开机起来之后,设置开机状态即可
app_status_indication_set(APP_STATUS_INDICATION_POWERON);
相关资料请到<bes2300开发调试笔记>文章底部的网盘链接中下载!