[DSP编程]

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

[复制链接]
328|1
手机看帖
扫描二维码
随时随地手机跟帖
RedA|  楼主 | 2022-7-6 22:00 | 显示全部楼层 |阅读模式
本帖最后由 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,这又是为什么呢?
还有一点就是,我用的普中的教程,但是板子是淘宝随便买的,程序是按普中来的。
小弟初次发帖,有不妥之处,还望大家多多包涵。

使用特权

评论回复

相关帖子

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则