/*******************************************************************************
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_LED1\Board_LED2\Board_LED3\Board_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;
}
}
/*********************************************************************
*********************************************************************/