您的位置:首页 > 其它

board_led.h/board_led.c

2016-01-29 15:38 239 查看
/*******************************************************************************
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;
}
}

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


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: