 
        
        
    | 本帖最后由 党国特派员 于 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对象主要用来计算用户关心的时间间隔,下面是一个简单的示例,可以计算用户按下按钮的时间,主要代码如下: 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();         }     } } | 
|   | 
| 谢谢分享。。。 | 
| 多谢特派员 | 
| 感谢分享 | 
| 学习学习。 | 
| 前来学习的!支持一个! | 
 微信公众号
                微信公众号
             手机版
                手机版
            