board_led.h/board_led.c

/*******************************************************************************
  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;
	}
}

/*********************************************************************
*********************************************************************/

  

原文地址:https://www.cnblogs.com/jxndsfss/p/5169191.html