TI-RTOS 之 PWM

CC1310 有4个定时器,8个PWM通道,在TI-RTOS它的驱动是写好的,引用时需要包含 PWM.h头文件即可。

一般是任务主体之前,或者主函数进行初始化。

Board_initPWM();

//...

pwmhandle  = PWM_open();

PWM_open(pwmhandle);

-------------------以上代码只需要调用一次-----------------------------------

PWM_setDuty(); // 按应用设置占空比

这里在有按键程序的基础上,实现按住左键不放,灯逐渐变至最亮,按住右键不放,灯逐渐变暗,直到熄灭。

代码如下:

/**************************************************************************************************

Filename:       keyDemo3.c

Editor:         Tome @ newbit

Revised:        $Date: 2016-8-11 11:20:02 +0800  $

Revision:       $Revision: 00001 $

Description:    了解 TI-RTOS的使用之,Event的使用,它用来同步任务,或者

Task - Hwis, Swis,同时也用到了PWM

History:

Notes:          要了解到这部分的接口,可阅读TI文档

1. TI-RTOS 2.20  User's Guide.pdf

2. Bios User Guide.pdf

硬件平台  CC1130_LAUNCHPAD Rev1.3

**************************************************************************************************/

/**************************************************************************************************

// INCLUDES

**************************************************************************************************/

/* XDCtools Header files */

#include <xdc/std.h>

#include <xdc/runtime/System.h>

/* BIOS Header files */

#include <ti/sysbios/BIOS.h>

#include <ti/sysbios/knl/Task.h>

#include <ti/sysbios/knl/Event.h>

/* TI-RTOS Header files */

#include <ti/drivers/PIN.h>

#include <ti/drivers/PWM.h>

#include "Board.h"

/**************************************************************************************************

// TYPEDEF

**************************************************************************************************/

/**************************************************************************************************

// CONSTANTS

**************************************************************************************************/

#define TASKSTACKSIZE     768

/**************************************************************************************************

// LOCAL VERIABLE

**************************************************************************************************/

Task_Struct keyTaskStruct;

Char keyTaskStack[TASKSTACKSIZE];               // 本任务的栈空间,静态分配

/* Global memory storage for a PIN_Config table */

static PIN_State buttonPinState;

PIN_Handle ledPinHandle;

PIN_Handle buttonPinHandle;

// 新建 Event, 它用来通知任务,按键已经按下

Event_Struct evtStruct;

Event_Handle evtHandle;

/*

* Initial LED pin configuration table

*   - LEDs Board_LED0 is on.

*   - LEDs Board_LED1 is off.

*/

PIN_Config ledPinTable[] = {

Board_LED0 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,

Board_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW  | PIN_PUSHPULL | PIN_DRVSTR_MAX,

PIN_TERMINATE

};

/*

* Application button pin configuration table:

*   - Buttons interrupts are configured to trigger on falling edge.

*/

PIN_Config buttonPinTable[] = {

Board_BUTTON0  | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE,

Board_BUTTON1  | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE,

PIN_TERMINATE

};

/**************************************************************************************************

// FUNCTIONS DECLERATION

**************************************************************************************************/

Void keyFxn(UArg arg0, UArg arg1);

void buttonCallbackFxn(PIN_Handle handle, PIN_Id pinId);

uint_t halKeyScan(void);

/**************************************************************************************************

// FUNCTIONS

**************************************************************************************************/

/**************************************************************************************************

* @fn      keyTaskAdd

*

* @brief

*

* @param   void

*

* @return  void

**************************************************************************************************/

void keyTaskAdd(void)

{

Task_Params taskParams;

/* Construct BIOS objects */

Task_Params_init(&taskParams); // 创建任务所要的参数,都设置为默认值

taskParams.stackSize = TASKSTACKSIZE; // 栈空间

taskParams.stack = &keyTaskStack;     // 栈地址

// 向bios 传递参数,建立控制灯的任务

Task_construct(&keyTaskStruct, (Task_FuncPtr)keyFxn, &taskParams, NULL);

}

/*

*  ======== keyFxn ========

*  Task for this function is created statically. See keyTaskAdd().

*/

Void keyFxn(UArg arg0, UArg arg1)

{

Event_Params evtParams;

Event_Params_init(&evtParams);

Event_construct(&evtStruct, &evtParams);

evtHandle = Event_handle(&evtStruct);

// PWM模块初始化

Board_initPWM();

// PWM IO的配置 在数组 PWM_config[] 中

PWM_Handle pwm1;

PWM_Params params;

uint16_t   pwmPeriod = 3000;      // Period and duty in microseconds

uint16_t   duty = 0;

uint16_t   dutyInc = 100;

// 这里使用的PWM通道 已经定义为 Board_GLED,详见 CC131X_LAUNCHXL.c

PWM_Params_init(¶ms);

params.dutyUnits = PWM_DUTY_US;

params.dutyValue = 0;

params.periodUnits = PWM_PERIOD_US;

params.periodValue = pwmPeriod;

pwm1 = PWM_open(Board_PWM1, ¶ms);

if (pwm1 == NULL) {

System_abort("Board_PWM0 did not open");

}

PWM_start(pwm1);

// 得到按键IO的操作句柄

buttonPinHandle = PIN_open(&buttonPinState, buttonPinTable);

if(!buttonPinHandle) {

System_abort("Error initializing button pins\n");

}

/* Setup callback for button pins */

// 注册按键的中断回调函数

if (PIN_registerIntCb(buttonPinHandle, &buttonCallbackFxn) != 0) {

System_abort("Error registering button callback function");

}

uint16_t keys = 0;

//

while(1)

{

// 如果没有按键 任务将在这里阻塞,直到有键按下

if ( halKeyScan() == 0 )

{

Event_pend(evtHandle,Event_Id_00, Event_Id_NONE, BIOS_WAIT_FOREVER );

// 任务休眠 20 ms 用于消抖

/* Debounce logic, only toggle if the button is still pushed (low) */

Task_sleep(20*100);

}

// 读按键

keys = halKeyScan();

if ( keys  & 0x01 )         // 左键  增加占空比

{

if ( duty < pwmPeriod )

duty += dutyInc;

}

if ( keys & 0x02 )          // 右键  减小占空比

{

if ( duty >= dutyInc )

duty -= dutyInc;

}

// 重新设置占空比

PWM_setDuty(pwm1, duty);

// 休眠一段时间,拉长PWM变化的视觉效果

Task_sleep(2000);

}

}

uint_t halKeyScan(void)

{

uint_t key = 0;

if (  !PIN_getInputValue(Board_BUTTON0))

{

key |= 0x01;

}

if (  !PIN_getInputValue(Board_BUTTON1))

{

key |= 0x02;

}

return key;

}

/**************************************************************************************************

* @fn      buttonCallbackFxn

*

* @brief   按键中断的回调函数

*

* @param   PIN_Handle handle, PIN_Id pinId

*

* @return  void

**************************************************************************************************/

void buttonCallbackFxn(PIN_Handle handle, PIN_Id pinId)

{

// 解除任务的阻塞

Event_post(evtHandle, Event_Id_00 );

}

/**************************************************************************************************

Copyright 2016 Newbit Studio. All rights reserved.

**************************************************************************************************/

TI-RTOS 之 PWM的更多相关文章

  1. Microsoft Azure IoTHub Serials 1 - 使用Android设备与Azure IoTHub进行交互

    Azure IoTHub的目标是为物联网的应用场景提供方便的设备接入,完成消息的发送和接收(C2D和D2C).经过持续不断的努力,目前Azure IoTHub已经支持多种操作系统设备的接入,包括And ...

  2. 5、CC2541芯片中级教程-OSAL操作系统(PWM+看门狗)

    本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...

  3. (原创)基于MCU的频率可调,占空比可调的PWM实现(MCU,MCS-51/MSP430)

    1.Abstract     做这个是受朋友之邀,用在控制电机转动的方面.他刚好在一家好的单位实习,手头工作比较多,无暇分身,所以找我帮忙做个模型.要求很明晰,PWM的频率在0~1KHz范围内,占空比 ...

  4. CC2530 PWM波形产生。

    1.使用TIM3_CC1,相关联引脚P1_7 #define GPIOPWM() do{P1SEL |= 0x80;}while(0);#define GPIOCLOSEPWM() do{P1SEL  ...

  5. 嵌入式davinci电路元素基础和PWM模块

    1,DAC_OUT和DAC_OUTB是AD9912输出的差分信号. 2,电容器储存电荷的能力,常用的单位是F.uF.nF.pFUF大了好还是UF小了好,要根据电路自身需要而设计, 要看电路滤波是在高频 ...

  6. TI Davinci DM6446开发攻略——开发环境搭建

    TI DAVINCI DM6446的开发环境搭建不像三星S3C2410,S3C2440,ATMEL的AT91SAM9260之类的单核ARM那么简单,因为DM6446还有DSP端的开发环境,以及双核之间 ...

  7. Using PWM Output as a Digital-to-Analog Converter

    http://www.ti.com/lit/an/spraa88a/spraa88a.pdf http://www.ti.com/litv/zip/spraa88a The high-resoluti ...

  8. USB ISP(ICSP) Open Programmer < PWM ADC HV PID >

    http://sourceforge.net/projects/openprogrammer/?source=navbar Open Programmer http://openprog.alterv ...

  9. NUC131演示如何通过PWM触发ADC。

    今天我来讲讲PWM触发ADC的例程 /**************************************************************************** * @f ...

随机推荐

  1. cp 命令详解

    作用:  cp 指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录, 则它会把前面指定的所有文件或目录复制到此目录下, 若同时指定多个文件或目录, 而最后的目的 ...

  2. MySQL连接方式及大小写问题

     一.连接数据库 在命令行连接MySQL有这两种方式,一种是使用命令行参数:另一种是将参数信息写入配置文件 1.命令行中使用参数 -u用户名 -p密码 -D数据库名 -P数据库服务端口 -s安静模式 ...

  3. 跟我一起读postgresql源码(七)——Executor(查询执行模块之——数据定义语句的执行)

    1.数据定义语句的执行 数据定义语句(也就是之前我提到的非可优化语句)是一类用于定义数据模式.函数等的功能性语句.不同于元组增删査改的操作,其处理方式是为每一种类型的描述语句调用相应的处理函数. 数据 ...

  4. springBoot系列教程06:参数验证及验证信息国际化

    在springboot应用中要验证参数是否正确很简单,web应用已经包含了validation的 1.定义需要被验证的参数实体,并用注解标明错误类别和错误信息 package com.xiao.dom ...

  5. Jenkins 学习笔记(三):我们的JAVA 项目是这么发布的

    发布拓扑 1. 拓扑图 2. 流程说明: Git 插件从 Git Server 上面拉取源代码. Maven 插件将源代码安装我们设定的指令进行编译打包,存放于项目的 WorkSpace. Publi ...

  6. sed中引用变量

    sed 中引用变量 eval sed 's/string/$REPLACE/g' file awk 中引用变量 awk 在匹配字符串的时候,有时候需要需要引用变量. $pid= eval " ...

  7. SSM整合---实现全部用户查询

    SSM整合 准备 1.创建工程 2.导入必须jar包 链接: https://pan.baidu.com/s/1nvCDQJ3 密码: v5xs 3.工程结构 代码 SqlMapConfig < ...

  8. Mongodb集群【三】

    Mongodb常用三种集群 1 主从(Master/Slave) 不推荐,但是mongodb依然保留有.一主多从,不支持链式结构.简单主从,没有裁仲者不能自动恢复. 2 副本集(Relica Set) ...

  9. mysql自连接求累计金额

  10. JavaScript时间处理插件

    摘要:代码返回的有两种时间格式  一种是///  另外一种是---分割的 两个接收参数的说明 timestr  是接收的时间  mark是格式   默认返回的格式是///   加上-  返回的格式是- ...