cc2530 timer 1 PWM 输出
需要在ZStack 协议栈里使用PWM,于是使用其16bit的timer 1来实现之。使用 P1_0口输出,使用的是正计数/倒计数模式,占空比为50%。代码如下:
#include <ioCC2530.h> /*使用P1_0口为输出、外设端口,来输出PWM波形*/
void init_port(void)
{
P1DIR |= 0x01; // p1_0 output
P1SEL |= 0x01; // p1_0 peripheral
P2SEL &= 0xEE; // Give priority to Timer 1
PERCFG |= 0x40; // set timer_1 I/O位置为2
return ;
} /*
将基准值放入T1CC0 寄存器, 将被比较值放入T1CC2寄存器
当T1CC2中的值与T1CC0中的值相等时,则T1CC2 设置or清除
*/ void init_timer(void)
{
T1CC0L = 0xff; //PWM duty cycle 周期
T1CC0H = 0x7f; T1CC2L = 0x00; // PWM signal period 占空比
T1CC2H = 0x00; T1CCTL2 = 0x34; // 等于T1CC0中的数值时候,输出高电平 1; 等于T1CC2中的数值时候,输出低电平 0 ,其实整个占空比就为50%了
T1CTL |= 0x0f; // divide with 128 and to do i up-down mode
return ;
} void start_pwm(void)
{
init_port();
init_timer();
// IEN1 |=0x02; //Timer 1 中断使能
// EA = 1; //全局中断使能
// while(1) {;}
return ;
} #if 0
/*irq function*/
#pragma vector=T1_VECTOR
//__interrupt void T1_IRQ(void)
volatile unsigned char count = ;
__interrupt void _irq_timer1(void)
{
//TODO....
} #endif /*_irq_timer1*/
使用的时候,将start_pwm() 函数 放在需要的地方即可。注意不要和原来的timer 冲突。自己是选择注释掉原来的timer的代码,直接写寄存器,不用协议栈给出的API了。
解释下:
1、
P2SEL &= 0xEE; // Give priority to Timer 1
其中,P2SEL 寄存器的名字叫 "端口2功能选择寄存器",但是它的管的范围可不只有端口2 ,它的[2:0] 分别指定 P2.0、 P2_3、P2_4 是作为通用I/O还是外设引脚功能;而
[6:3] 则分别指定端口1 外设优先级的--一个端口可能同时可以被uart 和timer使用,那么谁优先使用这个端口,则是它来指定的。3 ~6 bit 分别对应端口 1的 P1_0 ~ P1_3.。
当然,类似于P2SEL这样多功能的寄存器还有其他的,比如P2DIR,它同时指定端口2的方向,也管理着端口0的外设优先级。这个是奇怪了点,但还是按照数据手册来吧。
2、
PERCFG |= 0x40; // set timer_1 I/O位置为2
PERCFG 这个寄存器名字叫“外设I/O控制寄存器”,其实它的功能就像一个拨码开关一样,起一个选择路的作用。
看下面贴图:


什么乱七八糟的备用位置1 备用位置2,我是没明白的,但是看第一张图,要使用timer 1 并且在P1_0,那么就必须设置到 Alt 2的位置上。那么相应的寄存器就是PERCFG 了,开始还纠结了一把,没搞明白。 <ps:手册里的I/O口映射并没有标Alt 1,只是标了 Alt 2:如上图USART1在P0端口,就是使用的Alt 1。如果有需要的话,还是一样的用寄存器 PERCFG设置到 备用位置1 即可>
我程序里是 timer 1 P1_0,那么设置到 Alt 2的话,代码显然就该:
PERCFG |= 0x40; // set timer_1 I/O位置为2
3、32MHz / 128 = 250 Hz ? 不知道计算错了没,反正就是这么个公式吧。以这样的频率,计时器从0单步单步走到同T1CC2寄存器里面的值相等的时候,进行一次操作;然后继续走到T1CC0 处再操作一次 -- 比如给I/O端口的电平取反什么的,都可以,看心情。
4、其他,其他就没了,其他的寄存器在手册里面很容易理解了。
5、 我和同事一起整理了个小的学习备忘录文档,链接如下:
文档链接: http://pan.baidu.com/s/1o6qIjOY
<ps:文档表述不一定非常准确>
关键字: cc2530 timer1 pwm PWM
cc2530 timer 1 PWM 输出的更多相关文章
- cc2530 timer 3 PWM <可调占空比>
前提: 开始用的是 cc2530 timer 1来做PWM的,已经可调占空比了,但是由于硬件的改动,需要用timer 3 和 timer 4 代替.由于调试过程中出了些小问题,于是自己把这个贴出来.关 ...
- TIMER门控模式控制PWM输出长度
TIMER门控模式控制PWM输出长度 参照一些网友代码做了些修改,由TIM4来控制TIM2的PWM输出长度, 采用主从的门控模式,即TIM4输出高时候TIM2使能输出 //TIM2 PWM输出,由TI ...
- STM32: TIMER门控模式控制PWM输出长度
搞了两天单脉冲没搞定,无意中发现,这个利用主从模式的门控方式来控制一路PWM的输出长度很有效. //TIM2 PWM输出,由TIM4来控制其输出与停止 //frequency_tim2:TIM2 PW ...
- (五)转载:通用定时器PWM输出
1. TIMER输出PWM基本概念 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有 ...
- 关于STM32CubeMX使用LL库设置PWM输出
HAL和LL库 HAL是ST为了实现代码在ST家族的MCU上的移植性,推出的一个库,称为硬件抽象层,很明显,这样做将会牺牲存储资源,所以项目最后的代码比较冗余,且运行效率大大降低,运行速度受制于fla ...
- STM32(7)——通用定时器PWM输出
1.TIMER输出PWM基本概念 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种 ...
- 合宙AIR105(三): 定时器, 定时器中断和PWM输出
目录 合宙AIR105(一): Keil MDK开发环境, DAP-Link 烧录和调试 合宙AIR105(二): 时钟设置和延迟函数 合宙AIR105(三): 定时器, 定时器中断和PWM输出 Ai ...
- Arduino学习经验(一)之解决舵机库和pwm输出冲突
一.前言 最近在公司学习Arduino uno ,用它实现小车超声波避障功能.实现的功能很简单,就是在小车前方挂一个超声波模块,当碰到障碍物时,会通过舵机进行摆头,判断两边的距离,进行左右转弯.但是碰 ...
- 关于普通定时器与高级定时器的 PWM输出的初始化的区别
不管是普通定时器还是高级定时器,你用哪个通道,就在程序里用OC多少.比如CH3对应OC3 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_ ...
随机推荐
- CCS使用TIPS
2013-06-20 09:37:49 CCS使用TIPS: 代码编写: CCS中通过Using CodeSense方便写代码,跟VC助手类似,具体使用方法在ccs的help中搜索using visu ...
- Java之数组array和集合list、set、map
之前一直分不清楚java中的array,list.同时对set,map,list的用法彻底迷糊,直到看到了这篇文章,讲解的很清楚. 世间上本来没有集合,(只有数组参考C语言)但有人想要,所以有了集合 ...
- Zookeeper安装和配置
Zookeeper的安装和配置,可以配置成单机模式.伪集群模式.集群模式. 参考http://coolxing.iteye.com/blog/1871009 一. 单机模式 (1)zookeeper下 ...
- 8款必备的免费移动Web开发框架(HTML5/JS)
标签:JavaScript HTML5 移动开发 Web开发 jQuery 应用程序框架 插件 概述:随着智能手机和平板电脑的普及,移动开发逐渐成为众多开发者追逐的潮流.拥有一款优秀的移动Web开发框 ...
- 分享10个Js的小型库,效果真的很棒
1.$fx()简介:$fx()是一个轻量级的动画库,一些复杂的动画,可以由多个简单的动画效果进行组合,但是提供的是混淆压缩过的代码,对于研究动画源码的朋友可能特别不爽API:http://fx.ine ...
- linux tmp75 /dev/i2c-* 获取数据 demo
/********************************************************************** * linux tmp75 /dev/i2c-* 获取数 ...
- spring-webmvc 4.3.4 与 freemarker、easyui 整合
一.所需lib包 二.web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xm ...
- Query Profiler 和Explain 用法详解
一.Query Profiler MySQL 的Query Profiler 是一个使用非常方便的Query 诊断分析工具,通过该工具可以获取一条Query 在整个执行过程中多种资源的消耗情况,如C ...
- JS组件Bootstrap实现弹出框和提示框效果代码
这篇文章主要介绍了JS组件Bootstrap实现弹出框和提示框效果代码,对弹出框和提示框感兴趣的小伙伴们可以参考一下 前言:对于Web开发人员,弹出框和提示框的使用肯定不会陌生,比如常见的表格新增和编 ...
- 关于触发器、存储过程和DBlink的综合运用 (转)
关于触发器.存储过程和DBlink的综合运用 需求描述: 需要在两个不同oracl数据库实例中进行数据逻辑处理.如果A实例中的表有新数据插入或者数据更新,那么在B实例中执行与之相关的存储过程. 先假设 ...