发帖
4 0 0

定时中断不执行

L079712
高级会员

8

主题

9

回帖

513

积分

高级会员

积分
513
小安派Cam 38204 4 2025-10-15 18:35:52
在原工程AiPi-Eyes-DU的基础上添加定时中断代码,定时器 程序参考的零基础开发小安派-Eyes-S1【外设篇】——TIMER中的定时代码。稍微修改,并无关于定时时间变量MyTime_s的打印输出
  1. #include "bflb_mtimer.h"
  2. #include "bflb_pwm_v2.h"
  3. #include "bflb_clock.h"
  4. #include "bflb_gpio.h"
  5. #include "bflb_timer.h"
  6. #include "board.h"

  7. struct bflb_device_s *pwm;
  8. struct bflb_device_s *gpio;


  9. struct bflb_device_s *timer0;

  10. volatile static uint16_t MyTime_s = 0; //定义一个全局变量,在中断中修改,这里注意要用volatile关键字防止变量被优化
  11. volatile static uint16_t MyTime_s_tmp = 0; //定义一个全局变量,在中断中修改,这里注意要用volatile关键字防止变量被优化

  12. void timer0_isr(int irq, void *arg)
  13. {
  14.     bool status = bflb_timer_get_compint_status(timer0, TIMER_COMP_ID_0);
  15.     if (status) {
  16.         bflb_timer_compint_clear(timer0, TIMER_COMP_ID_0);
  17.         if (MyTime_s==60)
  18.         {
  19.             MyTime_s = 0;
  20.         }
  21.         MyTime_s++;
  22.         printf("time is %d\r\n",MyTime_s);
  23.     }
  24. }
  25. //中断服务函数,每进入一次变量自增1,到达60也就是1分钟置为0


  26. int main(void)
  27. {
  28.     int i;
  29.     board_init();

  30.     pwm = bflb_device_get_by_name("pwm_v2_0");
  31.     gpio = bflb_device_get_by_name("gpio");

  32.     /*初始化RGB灯,IO15、12、14,对应蓝灯、红灯、绿灯*/
  33.     bflb_gpio_init(gpio, GPIO_PIN_15, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
  34.     bflb_gpio_init(gpio, GPIO_PIN_12, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
  35.     bflb_gpio_init(gpio, GPIO_PIN_14, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);

  36.      bflb_gpio_init(gpio, GPIO_PIN_27, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);
  37.     /* period = .XCLK / .clk_div / .period = 40MHz / 40 / 1000 = 1KHz */
  38.     struct bflb_pwm_v2_config_s cfg = {
  39.         .clk_source = BFLB_SYSTEM_XCLK,
  40.         .clk_div = 40,
  41.         .period = 1000,
  42.     };

  43.    
  44.     /*初始化PWM输出*/
  45.     bflb_pwm_v2_init(pwm, &cfg);
  46.     bflb_pwm_v2_start(pwm);
  47.      printf("\r\n=========== First Project ==============\r\n");

  48. printf("Timer basic test\n");

  49.     /* timer clk = XCLK/(div + 1 )*/
  50.     struct bflb_timer_config_s cfg0;
  51.     cfg0.counter_mode = TIMER_COUNTER_MODE_PROLOAD; /* 选择重装载模式 */
  52.     cfg0.clock_source = TIMER_CLKSRC_XTAL;//选择外部时钟晶振,40MHz
  53.     cfg0.clock_div = 39; /* for bl616/bl808/bl606p is 39, for bl702 is 31 */
  54.     cfg0.trigger_comp_id = TIMER_COMP_ID_0;//选择比较ID的个数,这里选择一个ID,也就是只会到达下面的ID1
  55.     cfg0.comp0_val = 1000000; /* 比较值ID1,当计数达到1000000时,根据前面的分频一微秒一个计数,也就是总共1秒  */
  56.     cfg0.comp1_val = 2500000; /* 比较值ID2,需要大于ID1,由于前面只设置了一个ID,所以这里不会触发 */
  57.     cfg0.comp2_val = 3500000; /* 比较值ID2,需要大于ID2,由于前面只设置了一个ID,所以这里不会触发 */
  58.     cfg0.preload_val = 0;    /* 重装载值,开始的值,以及比较完所有ID个数后重启的值 */

  59.     timer0 = bflb_device_get_by_name("timer0");

  60.     /* Timer init with default configuration */
  61.     bflb_timer_init(timer0, &cfg0);

  62.     bflb_irq_attach(timer0->irq_num, timer0_isr, NULL);

  63.     bflb_irq_enable(timer0->irq_num);


  64.     /* Enable timer */
  65.     bflb_timer_start(timer0);//开启定时器

  66.     printf("case success.\r\n");



  67.     /*功能实现,红、绿、蓝灯依次呼吸循环亮灭*/
  68.     while (1) {

  69.     //红灯呼吸亮灭   
  70.     bflb_pwm_v2_channel_positive_start(pwm, PWM_CH0);
  71.     for(i=100;i>0;i--)
  72.     {

  73.         bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH0, i, 100);

  74.         bflb_mtimer_delay_ms(10);

  75.     }

  76.     if(MyTime_s_tmp!=MyTime_s){
  77.         MyTime_s_tmp=MyTime_s;
  78. switch (MyTime_s)
  79.         {
  80.         case 10:
  81.             printf("10 seconds have passed\r\n");
  82.             break;
  83.         case 20:
  84.             printf("20 seconds have passed\r\n");
  85.             break;
  86.         case 30:
  87.             printf("30 seconds have passed\r\n");
  88.             break;
  89.         case 40:
  90.             printf("40 seconds have passed\r\n");
  91.             break;
  92.         case 50:
  93.             printf("50 seconds have passed\r\n");
  94.             break;
  95.         case 60:
  96.             printf("One minute has already passed\r\n");
  97.             break;
  98.         default:
  99.             break;
  100.         }
  101. }
  102.     for(i=1;i<100;i++)
  103.     {
  104.         bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH0, i, 100);

  105.         bflb_mtimer_delay_ms(10);
  106.     }
  107.     bflb_pwm_v2_channel_positive_stop(pwm, PWM_CH0);



  108.     //绿灯呼吸亮灭
  109.     bflb_pwm_v2_channel_positive_start(pwm, PWM_CH2);
  110.     for(i=100;i>0;i--)
  111.     {
  112.         bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH2, i, 100);

  113.         bflb_mtimer_delay_ms(10);
  114.     }   
  115.      for(i=1;i<100;i++)
  116.     {
  117.         bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH2, i, 100);

  118.         bflb_mtimer_delay_ms(10);
  119.     }      
  120.     bflb_pwm_v2_channel_positive_stop(pwm, PWM_CH2);


  121.     //蓝灯循环亮灭
  122.     bflb_pwm_v2_channel_positive_start(pwm, PWM_CH3);
  123.     for(i=100;i>0;i--)
  124.     {
  125.         bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH3, i, 100);

  126.         bflb_mtimer_delay_ms(10);
  127.     }  
  128.      for(i=1;i<100;i++)
  129.     {
  130.         bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH3, i, 100);

  131.         bflb_mtimer_delay_ms(10);
  132.     }   
  133.     bflb_pwm_v2_channel_positive_stop(pwm, PWM_CH3);
  134.     }
  135. }
复制代码
──── 0人觉得很赞 ────

使用道具 举报

2025-10-15 18:37:54

原来的灯程序执行正常,但printf("time is %d\r\n",MyTime_s);这条语句就是不执行,请问哪里不对?

谢谢!

2025-10-16 08:35:02
好像定时器没工作,定时器中断函数不执行 这怎么解决?
谢谢!
2025-10-16 09:02:39
不要用以前的SDK,听从我们技术同事的建议~
2025-10-16 09:53:52
好的 用这个SDK bouffalo_sdk-master里面的例子做参考?
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 31104 个
  • 话题数: 44805 篇