本帖最后由 党国特派员 于 2015-11-24 12:15 编辑
微处理器的大量应用都和时间相关,如我们前面代码中多次出现的wait函数就是最常用的时间等待函数,显然,精确的时间等待必须建立在精确的计时技术上,这就需要用到计数器系统。 计数器的工作原理非常简单,就是每当它接收到一个脉冲时,它的计数值加一,一旦它的计数值达到用户设定的阈值,计数器就会产生一个中断信号让系统处理并重新从0开始计数。根据计数器可设定阈值的大小,我们可以把计数器分成8位计数器,16位计数器等,8位计数器可设定的最大阈值为2^8-1即255,16位则为65535。如果我们给定的脉冲信号频率为1M,而给定的计数器阈值为0,那么计数器就会每1us产生1个中断信号,这就为系统计时产生了依据。对于NUCLEO-L476RG来说,它有五个通用计时器,它们可以用来计时、PWM输出等。
除了wait相关的等待函数以外,mbed还提供了三个对象用来完成和时间相关的功能,分别是Timeout,用来在给定的时间执行特定函数;Ticker,用来定时执行特定函数;Timer,用来给系统计时,它们可用的方法描述如下: mbed Timer的应用mbed的Timer对象主要用来计算用户关心的时间间隔,下面是一个简单的示例,可以计算用户按下按钮的时间,主要代码如下: Serial pc(USBTX,USBRX); InterruptIn btn(USER_BUTTON); 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 Ticker的应用下次再继续。 |