[DSP编程] 关于DSP28335定时器0中断程序是否不断循环的问题

[复制链接]
 楼主| RedA 发表于 2022-7-6 22:00 | 显示全部楼层 |阅读模式
本帖最后由 RedA 于 2022-7-6 22:02 编辑

最近课题需要用到DSP28335,到B站找了视频来学,看的是普中的教程。在使用到定时器0中断的时候有些问题没有搞清楚,想来问问大家。
下面是代码:
main.c:
  1. #include <APP/leds_00/leds.h>
  2. #include <APP/leds_00/leds.h>
  3. #include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
  4. #include "DSP2833x_Examples.h"   // DSPude File

  5. #include "time.h"

  6. #include "adc.h"
  7. void main()
  8. {
  9.     int i=0;

  10.     InitSysCtrl();

  11.     InitPieCtrl();
  12.     IER = 0x0000;
  13.     IFR = 0x0000;
  14.     InitPieVectTable();

  15.     LED_Init();
  16.     TIM0_Init(150,500000);  //指定频率和周期
  17.    

  18.     while(1)
  19.     {
  20.         i++;
  21.         if(i%2000==0)
  22.         {
  23.             LED2_TOGGLE;
  24.         }
  25.         DELAY_US(100);
  26.     }
  27. }

time.c:
  1. #include <APP/leds_00/leds.h>
  2. #include "time.h"

  3. void TIM0_Init(float Freq, float Period)
  4. {
  5.         EALLOW;
  6.         SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0
  7.         EDIS;

  8.         EALLOW;
  9.         PieVectTable.TINT0 = &TIM0_IRQn;
  10.         EDIS;

  11.         // CPU Timer 0
  12.         // Initialize address pointers to respective timer registers:
  13.         CpuTimer0.RegsAddr = &CpuTimer0Regs;
  14.         // Initialize timer period to maximum:
  15.         CpuTimer0Regs.PRD.all  = 0xFFFFFFFF;
  16.         // Initialize pre-scale counter to divide by 1 (SYSCLKOUT):
  17.         CpuTimer0Regs.TPR.all  = 0;
  18.         CpuTimer0Regs.TPRH.all = 0;
  19.         // Make sure timer is stopped:
  20.         CpuTimer0Regs.TCR.bit.TSS = 1;
  21.         // Reload all counter register with period value:
  22.         CpuTimer0Regs.TCR.bit.TRB = 1;
  23.         // Reset interrupt counters:
  24.         CpuTimer0.InterruptCount = 0;

  25.         ConfigCpuTimer(&CpuTimer0, Freq, Period);

  26.         CpuTimer0Regs.TCR.bit.TSS=0;

  27.         IER |= M_INT1;

  28.         PieCtrlRegs.PIEIER1.bit.INTx7 = 1;

  29.         EINT;
  30.         ERTM;

  31. }

  32. interrupt void TIM0_IRQn(void)
  33. {
  34.         EALLOW;
  35.         LED1_TOGGLE;                                         //指示灯闪烁,表示正在运行
  36.         PieCtrlRegs.PIEACK.bit.ACK1=1;
  37.         EDIS;
  38. }


阐述问题如下,在while循环前,定时器初始化的时候让LED1闪烁,之后进入While循环,LED2闪烁。感觉那展现出来的应该就是LED1开始闪,然后不闪。接着LED2重复闪烁。但是结果却是LED1和LED2交替闪烁。我有点搞不懂了,LED1闪烁完了,中断标志位被清0,它的语句又不在while中,应该闪一次就结束了才对啊。
我这个地方就搞不懂了。
还有就是,在time.c里,它清除中断标志位语句用的是PieCtrlRegs.PIEACK.bit.ACK1=1;而不是用TIF清0,这又是为什么呢?
还有一点就是,我用的普中的教程,但是板子是淘宝随便买的,程序是按普中来的。
小弟初次发帖,有不妥之处,还望大家多多包涵。

 楼主| RedA 发表于 2022-7-6 22:04 | 显示全部楼层
我当时想的是,难不成是定时器被设定了之后。只要标志位结束被清0,定时结束后就会再次触发中断,是这样吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部