(已解决)M61-32SU开发板 timer无法触发中断

[复制链接]
查看2206 | 回复13 | 2024-6-3 00:01:43 | 显示全部楼层 |阅读模式
本帖最后由 lovzx 于 2024-6-3 13:36 编辑


问题已解决:根据泽哥的方案,换SDK,或者在aithinker_Ai-M6X_SDK/bsp/board/bl616dk/board.c,256行的#endif下加个中断复位函数,bflb_irq_restore(flag);

编译下载sdk下面的timer_int程序,跑起来发现无法触发定时器中断,尝试分析问题无果

main代码增加了一些log
  1. #include "bflb_mtimer.h"
  2. #include "bflb_timer.h"
  3. #include "board.h"
  4. #include "bflb_irq.h"

  5. #define TEST_TIMER_COMP_ID TIMER_COMP_ID_2

  6. struct bflb_device_s* timer0;
  7. struct bflb_device_s* timer1;
  8. extern struct bflb_irq_info_s g_irqvector[];

  9. void timer0_isr(int irq, void* arg)
  10. {
  11.     int id = -1;
  12.     bool status = bflb_timer_get_compint_status(timer0, TIMER_COMP_ID_0);
  13.     if (status) {
  14.         bflb_timer_compint_clear(timer0, TIMER_COMP_ID_0);
  15.         printf("timer0 comp0 trigger\r\n");
  16.         id = 0;
  17.     }
  18.     status = bflb_timer_get_compint_status(timer0, TIMER_COMP_ID_1);
  19.     if (status) {
  20.         bflb_timer_compint_clear(timer0, TIMER_COMP_ID_1);
  21.         printf("timer0 comp1 trigger\r\n");
  22.         id = 1;
  23.     }
  24.     status = bflb_timer_get_compint_status(timer0, TIMER_COMP_ID_2);
  25.     if (status) {
  26.         bflb_timer_compint_clear(timer0, TIMER_COMP_ID_2);
  27.         printf("timer0 comp2 trigger\r\n");
  28.         id = 2;
  29.     }
  30.     printf("timer0 isr,id: %d\n", id);
  31. }

  32. void timer1_isr(int irq, void* arg)
  33. {
  34.     int id = -1;
  35.     bool status = bflb_timer_get_compint_status(timer1, TIMER_COMP_ID_0);
  36.     if (status) {
  37.         id = 0;
  38.         bflb_timer_compint_clear(timer1, TIMER_COMP_ID_0);
  39.         printf("timer1 comp0 trigger\r\n");
  40.     }
  41.     status = bflb_timer_get_compint_status(timer1, TIMER_COMP_ID_1);
  42.     if (status) {
  43.         id = 1;
  44.         bflb_timer_compint_clear(timer1, TIMER_COMP_ID_1);
  45.         printf("timer1 comp1 trigger\r\n");
  46.     }
  47.     status = bflb_timer_get_compint_status(timer1, TIMER_COMP_ID_2);
  48.     if (status) {
  49.         id = 2;
  50.         bflb_timer_compint_clear(timer1, TIMER_COMP_ID_2);
  51.         printf("timer1 comp2 trigger\r\n");
  52.     }
  53.     printf("timer1 isr,id: %d\n", id);
  54. }

  55. int main(void)
  56. {
  57.     board_init();
  58.     printf("Timer basic test\n");

  59.     /* timer clk = XCLK/(div + 1 )*/
  60.     struct bflb_timer_config_s cfg0;
  61.     cfg0.counter_mode = TIMER_COUNTER_MODE_PROLOAD; /* preload when match occur */
  62.     cfg0.clock_source = TIMER_CLKSRC_XTAL;
  63.     cfg0.clock_div = 39; /* for bl616/bl808/bl606p is 39, for bl702 is 31 */
  64.     cfg0.trigger_comp_id = TEST_TIMER_COMP_ID;
  65.     cfg0.comp0_val = 1000000; /* match value 0  */
  66.     cfg0.comp1_val = 1500000; /* match value 1 */
  67.     cfg0.comp2_val = 2500000; /* match value 2 */
  68.     cfg0.preload_val = 0;    /* preload value */

  69.     struct bflb_timer_config_s cfg1;
  70.     cfg1.counter_mode = TIMER_COUNTER_MODE_PROLOAD;
  71.     cfg1.clock_source = TIMER_CLKSRC_XTAL;
  72.     cfg1.clock_div = 39; /* for bl616/bl808/bl606p is 39, for bl702 is 31 */
  73.     cfg1.trigger_comp_id = TEST_TIMER_COMP_ID;
  74.     cfg1.comp0_val = 1000000; /* match value 0  */
  75.     cfg1.comp1_val = 2000000; /* match value 1 */
  76.     cfg1.comp2_val = 2500000; /* match value 2 */
  77.     cfg1.preload_val = 0;    /* preload value */

  78.     timer0 = bflb_device_get_by_name("timer0");
  79.     timer1 = bflb_device_get_by_name("timer1");

  80.     /* Timer init with default configuration */
  81.     bflb_timer_init(timer0, &cfg0);
  82.     bflb_timer_init(timer1, &cfg1);


  83.     //16 + 36 = 52
  84.     bflb_irq_attach(timer0->irq_num, timer0_isr, NULL);
  85.     //16 + 37 = 53
  86.     bflb_irq_attach(timer1->irq_num, timer1_isr, NULL);
  87.     bflb_irq_enable(timer0->irq_num);
  88.     bflb_irq_enable(timer1->irq_num);

  89.     /* Enable timer */
  90.     bflb_timer_start(timer0);
  91.     bflb_timer_start(timer1);

  92.     printf("table: %p\n",g_irqvector);
  93.     printf("timer0_isr: %p, timer1_isr: %p\n", timer0_isr, timer1_isr);
  94.     for (int i = 0;i < 64;i++) {
  95.         irq_callback call = g_irqvector[i].handler;
  96.         // if (timer0_isr == call) {
  97.         //     printf("timer0_isr: %d,%p\n", i, timer0_isr);
  98.         // }
  99.         // if (timer1_isr == call) {
  100.         //     printf("timer1_isr: %d,%p\n", i, timer1_isr);
  101.         // }
  102.         if(call != NULL){
  103.             printf("irq: %d, call: %p\n",i,call);
  104.         }
  105.     }

  106.     printf("case success.\r\n");
  107.     volatile uint32_t mcause = 0UL;
  108.     uint32_t irq_num;
  109.     while (1) {

  110.         int v1 = bflb_timer_get_countervalue(timer1);
  111.         int v0 = bflb_timer_get_countervalue(timer0);


  112.         if (v1 == 1000000 || v1 == 2000000 || v1 == 2500000)
  113.         {
  114.             
  115.             mcause = READ_CSR(CSR_MCAUSE);
  116.             irq_num = mcause & 0x3FF;
  117.             printf("irq_num: %d\n",irq_num);
  118.             printf("v1: %d\n", v1);
  119.         }

  120.         if (v0 == 1000000 || v0 == 1500000 || v0 == 2500000)
  121.         {
  122.             
  123.             mcause = READ_CSR(CSR_MCAUSE);
  124.             irq_num = mcause & 0x3FF;
  125.             printf("irq_num: %d\n", irq_num);
  126.             printf("v0: %d\n", v0);
  127.         }
  128.     }
  129. }
复制代码

运行输入日志如下

  1. Timer basic test
  2. table: 0x62fc9770
  3. timer0_isr: 0xa0002d90, timer1_isr: 0xa0002e2a
  4. irq: 0, call: 0xa00047ca
  5. irq: 1, call: 0xa00047ca
  6. irq: 2, call: 0xa00047ca
  7. irq: 3, call: 0xa00047ca
  8. irq: 4, call: 0xa00047ca
  9. irq: 5, call: 0xa00047ca
  10. irq: 6, call: 0xa00047ca
  11. irq: 7, call: 0xa00047ca
  12. irq: 8, call: 0xa00047ca
  13. irq: 9, call: 0xa00047ca
  14. irq: 10, call: 0xa00047ca
  15. irq: 11, call: 0xa00047ca
  16. irq: 12, call: 0xa00047ca
  17. irq: 13, call: 0xa00047ca
  18. irq: 14, call: 0xa00047ca
  19. irq: 15, call: 0xa00047ca
  20. irq: 16, call: 0xa00047ca
  21. irq: 17, call: 0xa00047ca
  22. irq: 18, call: 0xa00047ca
  23. irq: 19, call: 0xa00047ca
  24. irq: 20, call: 0xa00047ca
  25. irq: 21, call: 0xa00047ca
  26. irq: 22, call: 0xa00047ca
  27. irq: 23, call: 0xa00047ca
  28. irq: 24, call: 0xa00047ca
  29. irq: 25, call: 0xa00047ca
  30. irq: 26, call: 0xa00047ca
  31. irq: 27, call: 0xa00047ca
  32. irq: 28, call: 0xa00047ca
  33. irq: 29, call: 0xa00047ca
  34. irq: 30, call: 0xa00047ca
  35. irq: 31, call: 0xa00047ca
  36. irq: 32, call: 0xa00047ca
  37. irq: 33, call: 0xa00047ca
  38. irq: 34, call: 0xa00047ca
  39. irq: 35, call: 0xa00047ca
  40. irq: 36, call: 0xa00047ca
  41. irq: 37, call: 0xa00047ca
  42. irq: 38, call: 0xa00047ca
  43. irq: 39, call: 0xa00047ca
  44. irq: 40, call: 0xa00047ca
  45. irq: 41, call: 0xa00047ca
  46. irq: 42, call: 0xa00047ca
  47. irq: 43, call: 0xa00047ca
  48. irq: 44, call: 0xa00047ca
  49. irq: 45, call: 0xa00047ca
  50. irq: 46, call: 0xa00047ca
  51. irq: 47, call: 0xa00047ca
  52. irq: 48, call: 0xa00047ca
  53. irq: 49, call: 0xa00047ca
  54. irq: 50, call: 0xa00047ca
  55. irq: 51, call: 0xa00047ca
  56. irq: 52, call: 0xa0002d90
  57. irq: 53, call: 0xa0002e2a
  58. irq: 54, call: 0xa00047ca
  59. irq: 55, call: 0xa00047ca
  60. irq: 56, call: 0xa00047ca
  61. irq: 57, call: 0xa00047ca
  62. irq: 58, call: 0xa00047ca
  63. irq: 59, call: 0xa00047ca
  64. irq: 60, call: 0xa00047ca
  65. irq: 61, call: 0xa00047ca
  66. irq: 62, call: 0xa00047ca
  67. irq: 63, call: 0xa00047ca
  68. case success.
  69. //上面log可以看出中断表里面已经正常设置了52号中断timer0_isr和53号中断timer1_isr, 当触发预设值后读取到的中断寄存器值却是0,也么有调用设置的中断函数,不知道哪里出问题了
  70. [2024/06/02 23:53:24.913] → irq_num: 0
  71. v0: 1000000

  72. [2024/06/02 23:53:25.419] → irq_num: 0
  73. v0: 1500000

  74. [2024/06/02 23:53:25.915] → irq_num: 0
  75. v1: 2000000
复制代码

上面log可以看出中断表里面已经正常设置了52号中断timer0_isr和53号中断timer1_isr, 当触发预设值后读取到的中断寄存器值却是0,也么有调用设置的中断函数,不知道哪里出问题了


回复

使用道具 举报

Ai-Thinker小泽 | 2024-6-3 08:47:21 | 显示全部楼层
换SDK,或者在aithinker_Ai-M6X_SDK/bsp/board/bl616dk/board.c,256行的#endif下加个中断复位函数,bflb_irq_restore(flag);
回复 支持 1 反对 0

使用道具 举报

爱笑 | 2024-6-3 08:34:06 | 显示全部楼层
抓泽哥来给你瞧瞧!
用心做好保姆工作
回复 支持 反对

使用道具 举报

WT_0213 | 2024-6-3 08:44:07 | 显示全部楼层
等泽哥解决
回复 支持 反对

使用道具 举报

lovzx | 2024-6-3 10:38:25 | 显示全部楼层
爱笑 发表于 2024-6-3 08:34
抓泽哥来给你瞧瞧!

富文本编辑器有点问题,插入代码后修改代码内容会吞掉一部分代码和被修改的也不会保存
回复 支持 反对

使用道具 举报

lovzx | 2024-6-3 10:52:41 | 显示全部楼层
Ai-Thinker小泽 发表于 2024-6-3 08:47
换SDK,或者在aithinker_Ai-M6X_SDK/bsp/board/bl616dk/board.c,256行的#endif下加个中断复位函数,bflb_i ...

还得是泽哥
回复 支持 反对

使用道具 举报

爱笑 | 2024-6-3 11:23:16 | 显示全部楼层
lovzx 发表于 2024-6-3 10:38
富文本编辑器有点问题,插入代码后修改代码内容会吞掉一部分代码和被修改的也不会保存 ...

用心做好保姆工作
回复 支持 反对

使用道具 举报

lovzx | 2024-6-3 12:02:38 | 显示全部楼层

哈哈哈哈哈 被这个编辑器折磨疯了都
回复 支持 反对

使用道具 举报

bzhou830 | 2024-6-3 13:33:47 | 显示全部楼层
泽哥很强
选择去发光,而不是被照亮
回复

使用道具 举报

lazy | 2024-6-4 11:23:03 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则