本帖最后由 RedA 于 2022-7-6 22:02 编辑
最近课题需要用到DSP28335,到B站找了视频来学,看的是普中的教程。在使用到定时器0中断的时候有些问题没有搞清楚,想来问问大家。
下面是代码:
main.c:- #include <APP/leds_00/leds.h>
- #include <APP/leds_00/leds.h>
- #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
- #include "DSP2833x_Examples.h" // DSPude File
- #include "time.h"
- #include "adc.h"
- void main()
- {
- int i=0;
- InitSysCtrl();
- InitPieCtrl();
- IER = 0x0000;
- IFR = 0x0000;
- InitPieVectTable();
- LED_Init();
- TIM0_Init(150,500000); //指定频率和周期
-
- while(1)
- {
- i++;
- if(i%2000==0)
- {
- LED2_TOGGLE;
- }
- DELAY_US(100);
- }
- }
time.c:
- #include <APP/leds_00/leds.h>
- #include "time.h"
- void TIM0_Init(float Freq, float Period)
- {
- EALLOW;
- SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0
- EDIS;
- EALLOW;
- PieVectTable.TINT0 = &TIM0_IRQn;
- EDIS;
- // CPU Timer 0
- // Initialize address pointers to respective timer registers:
- CpuTimer0.RegsAddr = &CpuTimer0Regs;
- // Initialize timer period to maximum:
- CpuTimer0Regs.PRD.all = 0xFFFFFFFF;
- // Initialize pre-scale counter to divide by 1 (SYSCLKOUT):
- CpuTimer0Regs.TPR.all = 0;
- CpuTimer0Regs.TPRH.all = 0;
- // Make sure timer is stopped:
- CpuTimer0Regs.TCR.bit.TSS = 1;
- // Reload all counter register with period value:
- CpuTimer0Regs.TCR.bit.TRB = 1;
- // Reset interrupt counters:
- CpuTimer0.InterruptCount = 0;
- ConfigCpuTimer(&CpuTimer0, Freq, Period);
- CpuTimer0Regs.TCR.bit.TSS=0;
- IER |= M_INT1;
- PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
- EINT;
- ERTM;
- }
- interrupt void TIM0_IRQn(void)
- {
- EALLOW;
- LED1_TOGGLE; //指示灯闪烁,表示正在运行
- PieCtrlRegs.PIEACK.bit.ACK1=1;
- EDIS;
- }
阐述问题如下,在while循环前,定时器初始化的时候让LED1闪烁,之后进入While循环,LED2闪烁。感觉那展现出来的应该就是LED1开始闪,然后不闪。接着LED2重复闪烁。但是结果却是LED1和LED2交替闪烁。我有点搞不懂了,LED1闪烁完了,中断标志位被清0,它的语句又不在while中,应该闪一次就结束了才对啊。
我这个地方就搞不懂了。
还有就是,在time.c里,它清除中断标志位语句用的是PieCtrlRegs.PIEACK.bit.ACK1=1;而不是用TIF清0,这又是为什么呢?
还有一点就是,我用的普中的教程,但是板子是淘宝随便买的,程序是按普中来的。
小弟初次发帖,有不妥之处,还望大家多多包涵。
|