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

  

board_led.h/board_led.c的更多相关文章

  1. CC2640R2F&TI-RTOS 拿到 TI CC2640R2F 开发板 第四件事就是 修改第三件事信号量超时改为 事件 超时,并增加 事件控制 ,用于控制LED 闪烁时间或者关闭

    /* * data_process.c * * Created on: 2018年7月5日 * Author: admin */ #include "board_led.h" #i ...

  2. CC2640R2F&TI-RTOS 拿到 TI CC2640R2F 开发板 第二件事就是 LED 驱动 ,点个灯

    /* * board_led.c * * Created on: 2018年7月3日 * Author: admin */ #include "board_uart.h" #inc ...

  3. CC2640R2F&TI-RTOS 拿到 TI CC2640R2F 开发板 第三件事就是使用 TI-RTOS 创建 一个任务 和 使用 信号量 超时来闪烁 LED灯

    /* * data_process.c * * Created on: 2018年7月5日 * Author: admin */ #include <ti/sysbios/knl/Task.h& ...

  4. CMSIS-RTOS 时间管理之时间延迟Time Delay

    时间管理 Time Management 此RTOS除了可以把你的应用代码作为线程运行,它还可以提供一些时间服务功能,使用这些功能你就可以访问RTOS的一些系统调用. 时间延迟Time Delay 在 ...

  5. APUE中fcntl.h的使用及O_SYNC在Mac与Ubuntu下的测试

    此部分测试涉及到APUE V3中,第三章的图3-12到图3-14. 通过fcntl.h提供的功能,修改fd的文件属性,本处增加O_SYNC功能,并测试其效果. 本文涉及代码: tree ch3 ch3 ...

  6. 关于apue.3e中apue.h的使用

    关于apue.3e中apue.h的使用 近来要学一遍APUE第三版,并于此开博做为记录. 先下载源文件: # url: http://http//www.apuebook.com/code3e.htm ...

  7. YYModel 源码解读(二)之NSObject+YYModel.h (1)

    本篇文章主要介绍 _YYModelPropertyMeta 前边的内容 首先先解释一下前边的辅助函数和枚举变量,在写一个功能的时候,这些辅助的东西可能不是一开始就能想出来的,应该是在后续的编码过程中 ...

  8. YYModel 源码解读(一)之YYModel.h

    #if __has_include(<YYModel/YYModel.h>) FOUNDATION_EXPORT double YYModelVersionNumber; FOUNDATI ...

  9. error RC1015: cannot open include file 'afxres.h' 解决办法

    在为WindowsPhone8程序添加本地化的过程中遇到这个问题: 问题原因就是afxres.h文件缺失,下载它,放到VS安装目录下的VS\include目录下就可以了(选择目录的时候注意对应对版本) ...

随机推荐

  1. 关于第一次在IED(MyEclipse)部署Maven时,pom.xml头部报这样的错---org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache.maven.archiver.MavenArchiveConfiguration)

    rg.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache ...

  2. SpringBoot的学习【2.分析HelloWorld的依赖】

    1.分析引入的父类项目 引入的父类如下. 点击进去发现又引入了一个父类 点击进去发现是spring的版本控制和相应的依赖. so~这就是springboot的终极大包.想用springboot开发的时 ...

  3. jsonify

    在flask中通过响应,将json数据显示在网页中,并且将Content-Type该为application/json格式 1,第一种方法: from flask import jsonify @ap ...

  4. java-IO流-字节流-概述及分类、FileInputStream、FileOutputStream、available()方法、定义小数组、BufferedInputStream、BufferedOutputStream、flush和close方法的区别、流的标准处理异常代码

    1.IO流概述及其分类 * 1.概念      * IO流用来处理设备之间的数据传输      * Java对数据的操作是通过流的方式      * Java用于操作流的类都在IO包中      *  ...

  5. hello1源码解析

    1.选择hello1文件夹并单击“打开项目” 2.展开网页节点,双击index.xhtml文件在编辑器中查看它 index.xhtml文件是facelets应用程序的默认登录页,在典型的facelet ...

  6. JVM的基本结构及其各部分详解(二)

    3.2 栈帧组成之操作数栈 操作数栈是栈帧的主要内容之一,它主要用于保存计算过程中的中间结果,同时作为计算过程中变量临时的存储空间. 操作数栈也是一个先进后出的数据结构,只支持入栈和出栈两种操作,许多 ...

  7. 自己写一个 Hash 表

    项目地址:  https://github.com/kelin-xycs/HashTableLib 为什么会想要自己写一个 Hash 表, 以前也想过 Hash 表 的 原理, 觉得很神奇, 不过最近 ...

  8. create table 推荐规则

    create table 推荐规则: 所有列都设置NOT NULL,都写备注(comment) 除主键外,所有列都设置默认值(default)

  9. centos7怎么查看、打开和关闭防火墙

    使用centos7会发现,用centos6以前的方式查看.打开和关闭防火墙都无效了.这是因为centos7的防火墙改用firewalld,而不再使用iptables了 查看centos7的防火墙的状态 ...

  10. php 字符串固定长度,不够补充其他字符串

    <?php $input = '456'; $var= str_pad($input,5,10,STR_PAD_LEFT); w3school手冊:http://www.w3school.com ...