你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器
关于例程中的ticker 其实就是定时器,大家可以看下面的详细说明:
mbed 时钟系统
微处理器的大量应用都和时间相关,如我们前面代码中多次出现的wait函数就是最常用的时间等待函数,显然,精确的时间等待必须建立在精确的计时技术上,这就需要用到计数器系统。
计数器的工作原理非常简单,就是每当它接收到一个脉冲时,它的计数值加一,一旦它的计数值达到用户设定的阈值,计数器就会产生一个中断信号让系统处理并重新从0开始计数。根据计数器可设定阈值的大小,我们可以把计数器分成8位计数器,16位计数器等,8位计数器可设定的最大阈值为2^8-1即255,16位则为65535。如果我们给定的脉冲信号频率为1M,而给定的计数器阈值为0,那么计数器就会每1us产生1个中断信号,这就为系统计时产生了依据。对于xbed LPC1768来说,它有四个通用计时器,它们可以用来计时、PWM输出等。
除了wait相关的等待函数以外,mbed还提供了三个对象用来完成和时间相关的功能,分别是Timeout,用来在给定的时间执行特定函数;Ticker,用来定时执行特定函数;Timer,用来给系统计时,它们可用的方法描述如下:
类名
方法
用途
Timer
Timer();
构造函数,实例化Timer对象
void start();
开始计时
void stop();
停止计时
void reset();
重新计时,即把时间计数恢复从0,如果原来处于start状态,那么计时继续
float read();
读取计时开始后过去的时间,单位是秒
int read_ms();
读取计时开始后过去的时间,单位是毫秒
int read_us();
读取计时开始后过去的时间,单位是微秒
operator float();
操作符重载,相当于read
Ticker
Ticker();
构造函数,实例化Ticker对象
void attach(void (*fptr)(void), float t)
设定每t秒需要执行的函数
void attach_us(void (*fptr)(void), unsigned int t)
设定每t微秒需要执行的函数
void detach();
取消本对象需要定时执行的函数
Timeout
Timeout();
构造函数,实例化Timeout对象
void attach(void (*fptr)(void), float t)
设定t秒后需要执行的函数
void attach_us(void (*fptr)(void), unsigned int t)
设定t微秒后需要执行的函数
void detach();
取消本对象需要执行的函数
mbed Timer的应用
mbed的Timer对象主要用来计算用户关心的时间间隔,下面是一个简单的示例,可以计算用户按下按钮的时间,主要代码如下:
Serial pc(USBTX,USBRX);
InterruptIn btn(P2_8);
Timer mytimer;
int falltime;
int risetime;
void fallfunc()
{
falltime=mytimer.read_us();
}
void risefunc()
{
risetime=mytimer.read_us();
pc.printf("You press button for %d us \n",risetime-falltime);
}
int main() {
mytimer.start();
btn.fall(&fallfunc);
btn.rise(&risefunc);
while (1);
}
程序运行的结果如下,当然,我们需要理解,任何中断的处理都有一定的延迟时间,所以此结果还是会有一定的误差,但绝对在us级别。
You press button for 330410 us
You press button for 137603 us
You press button for 122679 us
You press button for 140683 us
有时候我们需要利用多个Timer来计算不同的时间,这只需要定义多个Timer对象即可:
Timer timer_led;
Timer timer_serial;
DigitalOut led1(LED1);
Serial pc(USBTX,USBRX);
void task_led(void)
{
led1=!led1;
}
void task_serial(void)
{
pc.printf("Timer passed %d ms \n",timer_serial.read_ms());
}
int main()
{
timer_led.start();
timer_serial.start();
while (1)
{
if (timer_led.read()>0.5)
{
task_led();
timer_led.reset();
}
if (timer_serial.read()>1)
{ //test Timer value
task_serial();
timer_serial.reset();
}
}
}
mbed Timeout的应用
mbed的Timeout对象主要用来在给定的时间后执行给定的函数,如下面的测试代码,运行后你会发现xbed LPC1768的四个led分别点亮,由于timeout只会被执行一次,所以点亮后会保持不变:
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);
Timeout timer_led1;
Timeout timer_led2;
Timeout timer_led3;
Timeout timer_led4;
void led1flip()
{
led1=!led1;
}
void led2flip()
{
led2=!led2;
}
void led3flip()
{
led3=!led3;
}
void led4flip()
{
led4=!led4;
}
int main() {
timer_led1.attach(&led1flip,0.5);
timer_led2.attach(&led2flip,0.5*2);
timer_led3.attach(&led3flip,0.5*4);
timer_led4.attach(&led4flip,0.5*8);
while (1);
}
mbed Ticker的应用
mbed的Ticker对象主要用来执行各类需要定期执行的函数,它和Timeout的唯一不同就是Timeout相关的函数只会被执行一次,而Ticker相关的则会被定期执行,如下面的测试代码,运行后你会发现xbed LPC1768的四个led将按照不同的频率变换:
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);
Ticker timer_led1;
Ticker timer_led2;
Ticker timer_led3;
Ticker timer_led4;
void led1flip()
{
led1=!led1;
}
void led2flip()
{
led2=!led2;
}
void led3flip()
{
led3=!led3;
}
void led4flip()
{
led4=!led4;
}
int main() {
timer_led1.attach(&led1flip,0.5);
timer_led2.attach(&led2flip,0.5*2);
timer_led3.attach(&led3flip,0.5*4);
timer_led4.attach(&led4flip,0.5*8);
while (1);
}
我们在使用Ticker对象的过程中还可以随时对Ticker设定的间隔进行更改,更改后的时间是即时生效的,如下面的代码,我们发现,用户每按一次按钮,led1的闪烁频率就会加快一倍。
DigitalOut led1(LED1);
InterruptIn btn(P2_8);
Ticker timer_led1;
float interval;
void led1flip()
{
led1=!led1;
}
void changefred()
{
interval=interval /2.0;
timer_led1.attach(&led1flip,interval);
}
int main() {
interval=2;
btn.fall(&changefred);
timer_led1.attach(&led1flip,interval);
while (1);
}