本帖最后由 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,这又是为什么呢?
还有一点就是,我用的普中的教程,但是板子是淘宝随便买的,程序是按普中来的。
小弟初次发帖,有不妥之处,还望大家多多包涵。
|