TI-RTOS 之 PWM
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的更多相关文章
- Microsoft Azure IoTHub Serials 1 - 使用Android设备与Azure IoTHub进行交互
Azure IoTHub的目标是为物联网的应用场景提供方便的设备接入,完成消息的发送和接收(C2D和D2C).经过持续不断的努力,目前Azure IoTHub已经支持多种操作系统设备的接入,包括And ...
- 5、CC2541芯片中级教程-OSAL操作系统(PWM+看门狗)
本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...
- (原创)基于MCU的频率可调,占空比可调的PWM实现(MCU,MCS-51/MSP430)
1.Abstract 做这个是受朋友之邀,用在控制电机转动的方面.他刚好在一家好的单位实习,手头工作比较多,无暇分身,所以找我帮忙做个模型.要求很明晰,PWM的频率在0~1KHz范围内,占空比 ...
- CC2530 PWM波形产生。
1.使用TIM3_CC1,相关联引脚P1_7 #define GPIOPWM() do{P1SEL |= 0x80;}while(0);#define GPIOCLOSEPWM() do{P1SEL ...
- 嵌入式davinci电路元素基础和PWM模块
1,DAC_OUT和DAC_OUTB是AD9912输出的差分信号. 2,电容器储存电荷的能力,常用的单位是F.uF.nF.pFUF大了好还是UF小了好,要根据电路自身需要而设计, 要看电路滤波是在高频 ...
- TI Davinci DM6446开发攻略——开发环境搭建
TI DAVINCI DM6446的开发环境搭建不像三星S3C2410,S3C2440,ATMEL的AT91SAM9260之类的单核ARM那么简单,因为DM6446还有DSP端的开发环境,以及双核之间 ...
- 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 ...
- USB ISP(ICSP) Open Programmer < PWM ADC HV PID >
http://sourceforge.net/projects/openprogrammer/?source=navbar Open Programmer http://openprog.alterv ...
- NUC131演示如何通过PWM触发ADC。
今天我来讲讲PWM触发ADC的例程 /**************************************************************************** * @f ...
随机推荐
- [置顶]
xamarin android 布局尺寸了解
为了使UI界面在不同大小的移动端显示器上能够正常显示,大家可能都知道使用sp作为字体大小的单位,dp作为其他元素长度的单位. 前几天看了一篇文章关于 App设计规范的,文章用心写的非常好,这里是链接 ...
- 【WebGL】《WebGL编程指南》读书笔记——第2章
一.前言 最近看了<WebGL编程指南>这本书,发现还是很有意思的,故每章阅读后做个笔记. 二.正文 Example1:在canvas中绘制矩形 <!DOCTYPE html> ...
- [E::hts_idx_push] NO_COOR reads not in a single block at the end 10 -1
在分析转录组数据时,用bowtie2比对生成的bam文件,下一步call peak使用m6Aviewer,需要bam文件的index文件.所以我直接敲命令 samtools index xx.bam ...
- Tomcat在windows系统中的防火墙设置
在Win7下安装Tomcat后,其他机器无法访问到Tomcat服务,需要修改防火墙设置. 控制面板->window防火墙->允许程序通过Windows防火墙通信 将Tomcat目录下\bi ...
- jQuery 文档操作方法 (四)
方法 描述 addClass() 向匹配的元素添加指定的类名. after() 在匹配的元素之后插入内容. append() 向匹配元素集合中的每个元素结尾插入由参数指定的内容. appendTo() ...
- 【练习】Html
要求: 用html相关知识实现以下网页 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- Android-AnsyncTask异步任务
同步和异步的概念区别: 同步,必须执行完成某个问题后才能继续执行其他的. 异步,我会去先执行其他问题,你执行完之后返回给我一个结果就可以. android中为什么要引用异步任务呢 android启动的 ...
- Python模块学习------ 多线程threading(1)
# Method 1: 创建一个Thread实例,传给它一个函数:import threading from time import sleep, ctime loops = [4,2] def lo ...
- python3之shutil高级文件操作
1.shutil高级文件操作模块 shutil模块提供了大量的文件的高级操作.特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作.对单个文件的操作也可参见os模块. 2.shutil模块的拷 ...
- 【数论】Lucas
就是个Lucas 对于质数p,有C(n,m)=C(n/p,m/p)*C(n%p,m%p)%p 代码 ll C(ll a,ll b) { ; ; if(a<p&&b<p) r ...