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_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的更多相关文章
- CC2640R2F&TI-RTOS 拿到 TI CC2640R2F 开发板 第四件事就是 修改第三件事信号量超时改为 事件 超时,并增加 事件控制 ,用于控制LED 闪烁时间或者关闭
/* * data_process.c * * Created on: 2018年7月5日 * Author: admin */ #include "board_led.h" #i ...
- CC2640R2F&TI-RTOS 拿到 TI CC2640R2F 开发板 第二件事就是 LED 驱动 ,点个灯
/* * board_led.c * * Created on: 2018年7月3日 * Author: admin */ #include "board_uart.h" #inc ...
- CC2640R2F&TI-RTOS 拿到 TI CC2640R2F 开发板 第三件事就是使用 TI-RTOS 创建 一个任务 和 使用 信号量 超时来闪烁 LED灯
/* * data_process.c * * Created on: 2018年7月5日 * Author: admin */ #include <ti/sysbios/knl/Task.h& ...
- CMSIS-RTOS 时间管理之时间延迟Time Delay
时间管理 Time Management 此RTOS除了可以把你的应用代码作为线程运行,它还可以提供一些时间服务功能,使用这些功能你就可以访问RTOS的一些系统调用. 时间延迟Time Delay 在 ...
- APUE中fcntl.h的使用及O_SYNC在Mac与Ubuntu下的测试
此部分测试涉及到APUE V3中,第三章的图3-12到图3-14. 通过fcntl.h提供的功能,修改fd的文件属性,本处增加O_SYNC功能,并测试其效果. 本文涉及代码: tree ch3 ch3 ...
- 关于apue.3e中apue.h的使用
关于apue.3e中apue.h的使用 近来要学一遍APUE第三版,并于此开博做为记录. 先下载源文件: # url: http://http//www.apuebook.com/code3e.htm ...
- YYModel 源码解读(二)之NSObject+YYModel.h (1)
本篇文章主要介绍 _YYModelPropertyMeta 前边的内容 首先先解释一下前边的辅助函数和枚举变量,在写一个功能的时候,这些辅助的东西可能不是一开始就能想出来的,应该是在后续的编码过程中 ...
- YYModel 源码解读(一)之YYModel.h
#if __has_include(<YYModel/YYModel.h>) FOUNDATION_EXPORT double YYModelVersionNumber; FOUNDATI ...
- error RC1015: cannot open include file 'afxres.h' 解决办法
在为WindowsPhone8程序添加本地化的过程中遇到这个问题: 问题原因就是afxres.h文件缺失,下载它,放到VS安装目录下的VS\include目录下就可以了(选择目录的时候注意对应对版本) ...
随机推荐
- format 插入一个字符,%d,%n
- 剑指Offer 18. 二叉树的镜像 (二叉树)
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...
- Linux删除软链接
首先我们先来创建一个文件 #mkdir test_chk #touch test_chk/test.txt #vim test_chk/test.txt (这一步随便在这个test.txt里写点东东即 ...
- 5.Fiddler模拟弱网限速方法
原理:Fiddler的模拟限速是在客户端请求前来自定义限速的逻辑,此逻辑是通过延迟发送数据或接收的数据的时间来限制网络的下载速度和上传速度,从而达到限速的效果. 算法:那么我们的算法就是 1000/下 ...
- ARP【地址解析协议】理解
今天是来公司的第二个周一,早上收到Boss抄送的邮件说网段之间无法通信,心想现在还不太懂这个原理,于是就在网络上搜罗了一下资料,作此整理(大部分文字内容来自网络) 1. 同网段和不同网段设备通信原理详 ...
- Linux 查看端口被什么程序占用
lsof -i:8899 输出: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEjava 38889 root 329u IPv6 5883661 ...
- PythonStudy——可变与不可变 Variable and immutable
ls = [10, 20, 30] print(id(ls), ls) ls[0] = 100 print(id(ls), ls) print(id(10)) print(id(20)) print( ...
- spring IOC 和AOP 方面
spring 的2大核心 是Ioc 和 aop spring的依赖注入:在程序运行期间,由外部容器动态的将依赖对象注入到组件中 IOC: 实例化spring容器的二种方法 第一种:在类路径下寻找配 ...
- vsftpd 新增虚拟用户
接手公司linux服务器,已经用了vsftpd服务,需要增加新用户. vsftpd的配置文件在/etc/vsftpd.其中 编辑virtusers, 添加一个用户名和密码,奇行为用户名,偶行为密码 在 ...
- 中文分词算法工具hanlp源码解析
词图 词图指的是句子中所有词可能构成的图.如果一个词A的下一个词可能是B的话,那么A和B之间具有一条路径E(A,B).一个词可能有多个后续,同时也可能有多个前驱,它们构成的图我称作词图. 需要稀疏2维 ...