微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > (8)mbed实战——最简单的多任务运行和外部中断

(8)mbed实战——最简单的多任务运行和外部中断

时间:10-02 整理:3721RD 点击:

我们平时说的定时器中断,在mbed中称为断续装置可以通过Ticker来定义断续装置
函数api:
attach:附加断续装置要调用的函数,以s为间隔,支持浮点数据,比如0.01s;
attach_us:功能同上,间隔为us
detach:分离函数
比如我写了一个反转LED的函数

  1. DigitalOut myled(LED1);
  2. void LED_fun(void)
  3. {myled != myled;}

复制代码

要想让他在中断里跑只需要这么写:

  1. Ticker s1hz_task;
  2. s1hz_task.attach(&LED_fun, 1);

复制代码

完整的示例程序如下:

  1. #include<mbed.h>
  2. void LED_fun(void);
  3. Ticker s1hz_tash;
  4. DigitalOut myled;
  5. void LED_fun(void)
  6. {myled !=myled;}
  7. int main{
  8.   s1hztask.attach(&LED_fun, 1);
  9.   while(1);
  10. }

复制代码

最后附上我个多功能测试程序

  1. #include "mbed.h"
  2. #include "1602_iic_sw.h"

  3. #define GREEN_LED PB_0
  4. #define BLUE_LED PB_7
  5. #define RED_LED PB_14
  6. //DigitalOut myled1(GREEN_LED);
  7. //DigitalOut myled2(BLUE_LED);
  8. //DigitalOut myled3(RED_LED);

  9. PwmOut PWM1(GREEN_LED);
  10. PwmOut PWM2(BLUE_LED);
  11. PwmOut PWM3(RED_LED);

  12. //    I2C_SCL     = PB_8,
  13. //    I2C_SDA     = PB_9,
  14. IIC_1602 my1602(I2C_SDA, I2C_SCL);

  15. float gValue = 0;
  16. char data = 0;

  17. Ticker s100hz_tick;
  18. Ticker s1hz_tick;

  19. Serial pc(PA_2,PA_3);//tx rx

  20. #define UP    0 //上
  21. #define Down  1 //下
  22. #define Enter 2 //确定
  23. #define Esc   3 //退出
  24. void task1(void);

  25. void NullSubs(void)     //空函数
  26. {                 }





  27. int main() {        
  28.         PWM1.period(0.01);
  29.         PWM2.period(0.01);
  30.         PWM3.period(0.01);

  31.         // my1602.lcdPrint("Hacker");
  32.         printf("Init ok\n\n");
  33.         s1hz_tick.attach(&task1, 1);
  34.     while(1) {

  35.     }
  36. }

  37. void task1(void)
  38. {
  39.         static u16 i = 0;
  40.         PWM1 = gValue;
  41.         PWM2 = 1 - gValue;
  42.         PWM3 = gValue;

  43.         gValue = gValue + 0.001;
  44.         wait(0.001); // 1 sec
  45.         
  46.         printf("Loop = %d\n", i);
  47.         i = (i+1)%1000;
  48.         if(gValue >= 1)
  49.         {
  50.                 static char ack_value = 0;
  51.                 gValue = 0;
  52.                
  53.                 printf("ACK = %d\n", ack_value);               
  54.         }
  55. }

复制代码

可以看到串口中,每秒发过来一个数据



Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top