LED燈的設置較爲簡單,整合起來管理,讓應用更加方便。(以下代碼爲本人朋友設計思路,僅供參考)
#define LEDn 2
#define LED_TIMEBASE 10
#define LED_MODE_OFF 0x00
#define LED_MODE_ON 0x01
#define LED_MODE_FLASH 0x02
#define LED_IDLE 0x00
#define LED_BUSY 0x01
typedef struct {
uint8_t mode; /* led燈工作模式 */
uint8_t isBusy; /* 忙碌狀態 */
uint16_t onTime; /* 亮燈時間,單位:ms*/
uint16_t offTime; /* 滅燈時間,單位:ms */
uint32_t tick; /* 時間計數 */
uint8_t enableDuration; /* 使能持續週期 */
uint32_t duration; /* 持續週期 */
}led_info_t;
static led_info_t ledtbl[LEDn];
void bsp_led_set_mode(LEDn_TypeDef_t led, int mode, uint32_t onTime, uint32_t offTime, uint32_t cycle)
{
if (led >= LEDn) return;
switch (mode) {
case LED_MODE_OFF:
ledtbl[led].isBusy = LED_IDLE;
if (ledtbl[led].mode != mode) {
bsp_led_off(led);
ledtbl[led].mode = mode;
}
break;
case LED_MODE_ON:
ledtbl[led].isBusy = LED_BUSY;
if (ledtbl[led].mode != mode) {
bsp_led_on(led);
ledtbl[led].mode = mode;
}
break;
case LED_MODE_FLASH:
ledtbl[led].isBusy = LED_BUSY;
ledtbl[led].offTime = offTime;
ledtbl[led].onTime = onTime;
if (ledtbl[led].mode != mode)
ledtbl[led].tick = 0;
ledtbl[led].mode = mode;
ledtbl[led].duration = cycle * (offTime + onTime);
ledtbl[led].enableDuration = ledtbl[led].duration > 0 ? 1 : 0;
break;
default :
break;
}
}
void bsp_led_tick_handler(void)
{
int i;
for (i = 0; i < LEDn; i++) {
if (ledtbl[i].isBusy == LED_IDLE) continue;
if (ledtbl[i].mode == LED_MODE_FLASH) {
ledtbl[i].tick += LED_TIMERBASERS;
ledtbl[i].tick %= (ledtbl[i].onTime + ledtbl[i].offTime);
if ((ledtbl[i].tick <= ledtbl[i].onTime) && (ledtbl[i].tick > 0))
bsp_led_on((LEDn_TypeDef_t)i);
else
bsp_led_off((LEDn_TypeDef_t)i);
if (ledtbl[i].enableDuration == 0) continue;
if (ledtbl[i].duration > LED_TIMERBASERS) {
ledtbl[i].duration -= LED_TIMERBASERS;
} else if (ledtbl[i].duration > 0) {
ledtbl[i].tick = 0;
ledtbl[i].duration = 0;
ledtbl[i].isBusy = LED_IDLE;
bsp_led_off((LEDn_TypeDef_t)i);
ledtbl[i].mode = LED_MODE_OFF;
}
}
}
}
```