zoukankan      html  css  js  c++  java
  • 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;
    	}
    }
    
    /*********************************************************************
    *********************************************************************/
    

      

  • 相关阅读:
    国家行政区划地区编码表
    Java循环中标签的作用(转)
    通过ribbon 根据服务名获取所有服务实例的IP和端口列表
    rabbitmq重装依赖的erlang 要注意
    Rabbitmq关于集群节点功能的读书笔记
    CentOS7统计某个进程当前的线程数
    理解同步、异步、阻塞、非阻塞(传送门)
    代理模式和装饰模式区别
    【转载】Asp.Net生成图片验证码工具类
    【转载】使用宝塔Linux面板屏蔽某些IP访问你的服务器
  • 原文地址:https://www.cnblogs.com/jxndsfss/p/5169191.html
Copyright © 2011-2022 走看看