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目录下就可以了(选择目录的时候注意对应对版本) ...
随机推荐
- iOS Runtime 实操练习
iOS Runtime 知识详解: http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/ 一般可以运行Runtime进行以下操作 ...
- C# 文件上传下载功能实现 文件管理引擎开发
Prepare 本文将使用一个NuGet公开的组件技术来实现一个服务器端的文件管理引擎,提供了一些简单的API,来方便的实现文件引擎来对您自己的软件系统的文件进行管理. 在Visual Studio ...
- Linux下pn532板子测试学校水卡
0x01买板子 最便宜的板子pn532,需要买usb转串口的设备,对于kali-rolling,好像是通杀的,无论是PL2303,ch34X,FT232RL(没测试,这个更高端应该没问题),cp210 ...
- 一篇讲解如何调试pg 扩展的文章
以下链接这片关于pg 扩展调试的文章挺不错,记录下 http://big-elephants.com/2015-10/writing-postgres-extensions-part-iii/ ...
- CANVAS笔记
bglayer.add(bgimage) /*后面的层会覆盖前面的,所以要放在上面的,就要后面才添加!*/ bglayer.add(this.shape1) Layer.destroy() layer ...
- cookie和session的关联关系
- Linux服务器同步Intetnet时间
Linux服务器同步Intetnet时间 在使用linux服务器(虚拟机)的过程中,经常会发现使用一段时间后,linux服务器的时间和我的宿主机的时间不一致,而宿主机的时间确实是internet时间, ...
- instant client 的配置
instant client 的配置 oracle server developer自带了客户端 解压目录:D:\Toolkit\instantclient_11_2 设置环境变量 Ø 在Path变 ...
- 解决配置Windows Update失败,还原更改问题
问题描述 由于配置Windows Update失败,还原更改状态下无法正常关机.只能长按电源键关机后进入WinPE环境. 解决步骤 进入WinPE环境->选择Dism++->选择版本-&g ...
- 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) ...ubuntu 18.04 安装vim遇到的错误
安装vim: sudo apt-get install vim-gtk 问题: E:无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E:无法锁定管理目录(/ ...