一个LED的N种玩法 (三)---General Timer
Author: chenzhufly
Email: chenzhufly@126.com
2010-4-29
写完两篇终于等到timer上场了,前面已经有网友提议可以用timer来玩LED,那好吧,在这里我来感受一下timer是怎么操作LED的。Come on……
LPC1343有三种timer:
1. 一般的计数器或定时器 ---- General counter/timer
2. 系统节拍定时器 ---- system tick timer
3. 看门狗定时器 ---- watchdog timer
这里我们首先讨论一下一般的计数器或定时器,首先做个简单的介绍吧。
一. LPC1343计数器或定时器概述
LPC1343拥有2个32位和2个16位可编程定时器/计数器,被用来统计系统衍生时钟的周期数。有4个匹配寄存器,可选择在规定的时间内产生中断或执行其他操作。每个定时器/计数器还包含1个捕获输入,用来在输入信号变化时捕获定时器瞬时值和产生中断。
具有的特性:
- 两个32位的定时器/计数器,各带有一个可编程的32位预分频器;
- 计数器或定时器操作;
- 一个32位的捕获通道可在输入信号跳变时捕捉定时器的瞬时值。捕获事件也可以产生中断;
- 4个32位匹配寄存器,允许执行以下操作:
. 匹配时连续工作,在匹配时可选择产生中断;
. 在匹配时停止定时器运行,可选择产生中断;
. 在匹配时复位定时器,可选择产生中断。
- 有4个与匹配寄存器相对应的外部输出,这些输出具有以下功能:
. 匹配时设为低电平;
. 匹配时设为高电平;
. 匹配时翻转电平;
. 匹配时不执行任何操作
对timer有了个大概的了解之后,如果还有兴趣,可以看看相关的寄存器,看看怎么设置的,这里就不叙述了。直接跳过……呵呵
二. 计数器或定时器底层驱动
LPCXpresso的测试代码中,已经实现了计数器或定时器底层驱动,两个文件分别为timer.c和time.h。主要函数如下:
void delay32Ms(uint8_t timer_num, uint32_t delayInMs);
产生毫秒级延时,延时长短由参数delayInMs确定
void enable_timer32(uint8_t timer_num);
使能定时器
void disable_timer32(uint8_t timer_num);
关闭定时器
void reset_timer32(uint8_t timer_num);
复位定时器
void init_timer32(uint8_t timer_num, uint32_t timerInterval);
初始化定时器,时间长度由参数timerInterval确定
void init_timer32PWM(uint8_t timer_num, uint32_t period, uint8_t match_enable);
初始化Timer为PWM模式
void setMatch_timer32PWM (uint8_t timer_num, uint8_t match_nr, uint32_t value);
设置PWM的匹配值,主要是对MR0,MR1,MR2,MR3赋值
void TIMER32_0_IRQHandler(void)
void TIMER32_1_IRQHandler(void)
Timer0和1的中断处理函数
三. 示例代码
介绍完底层函数以后,我就开始使用这些函数,实现控制LED的操作。
1. 使用delay32Ms()实现LED闪烁,如下所示:
GPIOSetValue(LED_PORT, LED_BIT, LED_OFF );
delay32Ms(0,500);
GPIOSetValue(LED_PORT, LED_BIT, LED_ON );
delay32Ms(0,500);
注意:这里的delay32Ms和前面所说的delay实现的机制是不一样的.
2. 使用timer中断,这个官方给的例子程序就是,呵呵,还是把代码切上来。
init_timer32(0, TIME_INTERVAL);//初始化timer0,TIME_INTERVAL为10ms
enable_timer32(0); //使能timer 0,这样中断处理函数开始工作
GPIOInit();//初始化IO
GPIOSetDir( LED_PORT, LED_BIT, 1 );//设置led的IO为输出
while (1)
{
if ( (timer32_0_counter%LED_TOGGLE_TICKS) < (LED_TOGGLE_TICKS/2) )
{
GPIOSetValue( LED_PORT, LED_BIT, LED_OFF );
} else
{
GPIOSetValue( LED_PORT, LED_BIT, LED_ON );
}
__WFI();//在两个timer中断之间,进入休眠状态
}
3.使用PWM模式,这个可以实现LED亮度的渐变的,不过要焊接额外的LED,作罢,哈哈。。。。提供个参考代码,有兴趣的可以试一试。
init_timer32PWM(0,period,0x04)//初始化timer0,0x04对应timer0的MAT2模式,输出IO为PIO0_1,可以在PIO0_1上接个LED看看效果,我就不做啦
enable_timer32(0); //使能timer 0
setMatch_timer32PWM(0,2,period1)// 2表示timer0的MAT2模式,period1
是timer反转时间需要修改的值,也就是修改了init_timer32PWM中的period
PWM模式没有做实验,谁做了发上来,非常感谢!General Timer只写到这里啦!
一个LED的N种玩法_三_----General Timer.pdf
(91.81 KB, 下载次数: 97)
更多精彩 稍后继续