/******************************************************************************* Filename: board_led.h Revised: $Date: 2015-10-13 $ Revision: $Revision:v1 $ author: $lazy Description: 板级led驱动 ******************************************************************************* 说明: 1.如果Board_blinkLed()开启了led的一直闪烁,关闭闪烁使用Board_stopBlinkLed() 2.使用该led驱动的应用需包含Board.h头文件和本头文件(board_led.h) 3.使用示例: Board_initLed(); // led初始化 Board_blinkLed( Board_LED1, 250, 5 ); // 闪烁周期500ms,闪烁5次 Board_blinkLed( Board_LED2, 500, 10 ); // 闪烁周期1s,闪烁10次 Board_turnOnLed( Board_LED3 ); // 点亮led3 Board_blinkLed( Board_LED4, 100, BLINK_STILL ); // 闪烁led4,周期100ms,一直闪烁 Board_turnOffLed( Board_LED3 ); // 熄灭led3 Board_toggleLed(Board_LED3); // 翻转led3 Board_stopBlinkLed(Board_LED4); // 停止闪烁led4 注意! 传入函数的参数,只能使用Board_LED1Board_LED2Board_LED3Board_LED4 这几个宏名 *******************************************************************************/ #ifndef BOARD_LED_H #define BOARD_LED_H #ifdef __cplusplus extern "C" { #endif /********************************************************************* * INCLUDES */ #include <stdint.h> /********************************************************************* * CONSTANTS */ #define BLINK_STILL 0xFF // 参数 - 闪烁led次数,默认一直闪烁 /********************************************************************* * API FUNCTIONS */ /********************************************************************* * @fn Board_initLed * * @brief led初始化 * * @param none * * @return none */ extern void Board_initLed( void ); /********************************************************************* * @fn Board_turnOnLed * * @brief 点亮LED * * * @param none * * @return none */ extern void Board_turnOnLed( uint8_t led ); /********************************************************************* * @fn Board_turnOffLed * * @brief 熄灭LED,该函数只能熄灭Board_turnOnLed()点亮的led * 不能熄灭Board_blinkLed()函数点亮的led * * @param none * * @return none */ extern void Board_turnOffLed( uint8_t led ); /********************************************************************* * @fn Board_blinkLed * * @brief 闪烁LED * * @param led - 指定闪烁的led * @param halfPeriod - 闪烁周期的一半,如闪烁周期为100ms,则该参数设置为50ms * @param nBlinks - 闪烁次数,若参数为BLINK_STILL则一直闪烁 * * @return none */ extern void Board_blinkLed( uint8_t led, uint32_t halfPeriod, uint8_t nBlinks ); /********************************************************************* * @fn Board_stopBlinkLed * * @brief 停止闪烁LED (对无限次数闪烁的led而言) * 熄灭由Board_blinkLed()开启的闪烁led * * @param led - 停止闪烁的led * * @return none */ extern void Board_stopBlinkLed( uint8_t led ); /********************************************************************* * @fn Board_toggleLed * * @brief 翻转LED * * @param led - 指定翻转的led * * @return none */ extern void Board_toggleLed( uint8_t led ); /********************************************************************* *********************************************************************/ #ifdef __cplusplus } #endif #endif /* BOARD_LED_H */
/******************************************************************************* Filename: board_led.c Revised: $Date: 2015-10-13 $ Revision: $Revision: $ author: $lazy Description: 板级led驱动 *******************************************************************************/ /********************************************************************* * INCLUDES */ #include "board_led.h" #include "Board.h" #include "util.h" #include <ti/sysbios/knl/Clock.h> /********************************************************************* * CONSTANTS */ // 位区分不同的led #define BOARD_BLINK_LED1 0x0001 #define BOARD_BLINK_LED2 0x0002 #define BOARD_BLINK_LED3 0x0004 #define BOARD_BLINK_LED4 0x0008 #define defaultHalfPeriod 250 // 默认led软件定时器半周期250ms,周期500ms /********************************************************************* * LOCAL VARIABLES */ static PIN_Handle hLedPin = NULL; static PIN_State pinState; // 配置led引脚的初始电平,CC2640学习板v2 应该是高电平,led熄灭 PIN_Config BoardLedGpioInitTable[] = { Board_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */ Board_LED2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */ Board_LED3 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */ Board_LED4 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */ PIN_TERMINATE /* Terminate list */ }; // led闪烁软件定时器 static Clock_Struct led_1_blinkClock; static Clock_Struct led_2_blinkClock; static Clock_Struct led_3_blinkClock; static Clock_Struct led_4_blinkClock; static uint8_t led_1_blinkNumber = BLINK_STILL; // 默认BLINK_STILL值表示一直闪烁 static uint8_t led_2_blinkNumber = BLINK_STILL; // 默认BLINK_STILL值表示一直闪烁 static uint8_t led_3_blinkNumber = BLINK_STILL; // 默认BLINK_STILL值表示一直闪烁 static uint8_t led_4_blinkNumber = BLINK_STILL; // 默认BLINK_STILL值表示一直闪烁 /********************************************************************* * LOCAL FUNCTIONS */ static void blinkLed_clockHandler(UArg arg); /********************************************************************* * PUBLIC FUNCTIONS */ /********************************************************************* * @fn Board_initLed * * @brief Open LED peripheral * * @param none * * @return none */ void Board_initLed( void ) { if (hLedPin == NULL) { // 初始化led IO口 hLedPin = PIN_open(&pinState, BoardLedGpioInitTable); // 创建led闪烁软件定时器,4个定时器对应个led,传入第一次溢出时间值,不立即开启计时 Util_constructClock(&led_1_blinkClock, blinkLed_clockHandler, defaultHalfPeriod, 0, false, BOARD_BLINK_LED1); Util_constructClock(&led_2_blinkClock, blinkLed_clockHandler, defaultHalfPeriod, 0, false, BOARD_BLINK_LED2); Util_constructClock(&led_3_blinkClock, blinkLed_clockHandler, defaultHalfPeriod, 0, false, BOARD_BLINK_LED3); Util_constructClock(&led_4_blinkClock, blinkLed_clockHandler, defaultHalfPeriod, 0, false, BOARD_BLINK_LED4); } } /********************************************************************* * @fn Board_turnOnLed * * @brief 点亮LED * * @param none * * @return none */ void Board_turnOnLed( uint8_t led ) { // 输出点亮led的电平,Board_LED_ON 在board.h中定义,需根据具体板子修改 PIN_setOutputValue(hLedPin, led, Board_LED_ON); } /********************************************************************* * @fn Board_turnOffLed * * @brief 熄灭LED * * @param none * * @return none */ void Board_turnOffLed( uint8_t led ) { // 输出熄灭led的电平,Board_LED_OFF 在board.h中定义,需根据具体板子修改 PIN_setOutputValue(hLedPin, led, Board_LED_OFF); } /********************************************************************* * @fn Board_blinkLed * * @brief 闪烁LED * * @param led - 指定闪烁的led * @param halfPeriod - 闪烁周期的一半,单位ms,如闪烁周期为100ms,则该参数设置为50 * @param nBlinks - 闪烁次数,最大254(0xFE)次 * * @return none */ void Board_blinkLed( uint8_t led, uint32_t halfPeriod, uint8_t nBlinks ) { switch(led) { case Board_LED1: Board_turnOnLed(led); // 点亮led Util_restartClock(&led_1_blinkClock, halfPeriod); // 重新设置闪烁半周期 if(nBlinks != BLINK_STILL){ // 闪烁有限次数,最大254(0xFE)次 led_1_blinkNumber = nBlinks * 2 -1; // 闪烁n次则,io电平需翻转2n-1次 } break; case Board_LED2: Board_turnOnLed(led); Util_restartClock(&led_2_blinkClock, halfPeriod); if(nBlinks != BLINK_STILL){ led_2_blinkNumber = nBlinks * 2 -1; } break; case Board_LED3: Board_turnOnLed(led); Util_restartClock(&led_3_blinkClock, halfPeriod); if(nBlinks != BLINK_STILL){ led_3_blinkNumber = nBlinks * 2 -1; } break; case Board_LED4: Board_turnOnLed(led); Util_restartClock(&led_4_blinkClock, halfPeriod); if(nBlinks != BLINK_STILL){ led_4_blinkNumber = nBlinks * 2 -1; } break; default: break; } } /********************************************************************* * @fn Board_stopBlinkLed * * @brief 停止闪烁LED (对无限次数闪烁的led而言) * * @param led - 停止闪烁的led * * @return none */ void Board_stopBlinkLed( uint8_t led ) { switch(led) { case Board_LED1: if(Util_isActive(&led_1_blinkClock)){ // 软件定时器正运行 Util_stopClock(&led_1_blinkClock); // 停止软件定时器 } Board_turnOffLed( led ); // 熄灭led break; case Board_LED2: if(Util_isActive(&led_2_blinkClock)){ Util_stopClock(&led_2_blinkClock); } Board_turnOffLed( led ); break; case Board_LED3: if(Util_isActive(&led_3_blinkClock)){ Util_stopClock(&led_3_blinkClock); } Board_turnOffLed( led ); break; case Board_LED4: if(Util_isActive(&led_4_blinkClock)){ Util_stopClock(&led_4_blinkClock); } Board_turnOffLed( led ); break; default: break; } } /********************************************************************* * @fn Board_toggleLed * * @brief 翻转LED * * @param led - 指定翻转的led * * @return none */ void Board_toggleLed( uint8_t led ) { PIN_setOutputValue(hLedPin, led, !PIN_getOutputValue(led)); } /********************************************************************* * @fn blinkLed_clockHandler * * @brief 闪烁led定时器溢出回调函数 * * @param arg - event type * * @return none */ static void blinkLed_clockHandler(UArg arg) { switch(arg) { case BOARD_BLINK_LED1: if(led_1_blinkNumber == BLINK_STILL) { // 一直闪烁 Board_toggleLed(Board_LED1); // 翻转led Util_startClock(&led_1_blinkClock); // 再次启动软件定时器 break; } else if(led_1_blinkNumber--){ // 剩余闪烁次数不为0 Board_toggleLed(Board_LED1); // 翻转led Util_startClock(&led_1_blinkClock); // 再次启动软件定时器 } else { Util_stopClock(&led_1_blinkClock); // 闪烁次数到,停止闪烁,关闭软件定时器 } break; case BOARD_BLINK_LED2: if(led_2_blinkNumber == BLINK_STILL) { Board_toggleLed(Board_LED2); Util_startClock(&led_2_blinkClock); break; } else if(led_2_blinkNumber--) { Board_toggleLed(Board_LED2); Util_startClock(&led_2_blinkClock); } else { Util_stopClock(&led_2_blinkClock); } break; case BOARD_BLINK_LED3: if(led_3_blinkNumber == BLINK_STILL) { Board_toggleLed(Board_LED3); Util_startClock(&led_3_blinkClock); break; } else if(led_3_blinkNumber--) { Board_toggleLed(Board_LED3); Util_startClock(&led_3_blinkClock); } else { Util_stopClock(&led_3_blinkClock); } break; case BOARD_BLINK_LED4: if(led_4_blinkNumber == BLINK_STILL) { Board_toggleLed(Board_LED4); Util_startClock(&led_4_blinkClock); break; } else if(led_4_blinkNumber--) { Board_toggleLed(Board_LED4); Util_startClock(&led_4_blinkClock); } else { Util_stopClock(&led_4_blinkClock); } break; default: break; } } /********************************************************************* *********************************************************************/