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目录下就可以了(选择目录的时候注意对应对版本) ...
随机推荐
- 爬虫案例(js动态生成数据)
需求:爬取https://www.xuexi.cn/f997e76a890b0e5a053c57b19f468436/018d244441062d8916dd472a4c6a0a0b.html页面中的 ...
- WEBBASE篇: 第七篇, JavaScript知识1
JavaScript 1 一.JavaScript 概述什么是JavaScript: JavaScript 简称 JS,是一种专门运行于JS解释器/引擎中的解释型脚本语言JS发展史: 1.1992年N ...
- Mad LIbs小游戏
c1=input('请输入摄氏温度;') c2=float(c1)*9/5+32 print('摄氏温度转换成华氏温度是{}'.format(c2)) name1=input('请输入名字:') na ...
- Ubuntu16.04的sublime text3 的安装教程
1. sublime text3的官网位置 https://www.sublimetext.com/3 2.apt安装方式 1. 安装 GPG -key: wget -qO - https://do ...
- 《C语言程序设计》编程总结汇总
<C语言程序设计>编程总结汇总 院系: 专业年级: 班级名称: 学号: 姓名: 指导教师: 完成时间: 自我评价: 计算机科学与技术专业教研室 2018 年秋季学期 第四周编程总结 题目4 ...
- 全志A33 lichee怎样编译镜像
对于全志A33 lichee编译镜像文件需要先搭建好交叉编译环境,这个搭建环境可以看之前的文档 "SINA33开发板怎样创建编译环境" 开发平台 * 芯灵思SinlinxA33开发 ...
- ie 浏览器缓存问题
Get请求在IE会存在缓存问题,最直接的办法 改成Post请求解决
- liunx学习笔记(一:常用命令)
linux: 在学习linux之前我们应该多少了解windows的一些相关操作,linux也就是类似windows的另一种操作系统,用来管理软硬件的一种应用.在windows下你可以通过鼠标点击相关的 ...
- redis的内存优化【转】
Redis所有的数据都在内存中,而内存又是非常宝贵的资源.对于如何优化内存使用一直是Redis用户非常关注的问题.本文让我们深入到Redis细节中,学习内存优化的技巧.分为如下几个部分: 一.redi ...
- SSH原理及操作
1:公钥与私钥(public and private key) 公钥:提供给远程主机进行数据加密的行为 私钥:远程主机收到客户端使用公钥加密数据后,在本地端使用私钥来解密 2:公钥与私钥进行数据传输时 ...