程序说明

  • 文件名:main.c
  • 描 述:调整矩形波信号(1kH)的占空比从1%逐渐增加到100%,再逐渐减小到1%,如此循环(总周期为2s)。10ms 调整一次Duty
  • 版本号:v1.0.0
  • 型 号:DSP-28027

步骤说明

第1步

初始化系统控制:PLL,看门狗,使能外围时钟

第2步

初始化 GPIO:将IO-34设置为输出IO

第3步

清除所有中断,初始化PIE向量表

第4步

初始化外设,此处为定时器

第5步

允许中断

程序代码

#include "DSP28x_Project.h"     // 包括设备的头文件DSP2802x_Device.h和例子的头文件DSP2802x_Examples.h
interrupt void cpu_timer0_isr(void);//定时器0的中断服务程序
interrupt void cpu_timer1_isr(void);//定时器1的中断服务程序
interrupt void cpu_timer2_isr(void);//定时器2的中断服务程序
void InitIO(void);                  //GPIO的初始化设置程序

#define true 1
#define false 0

unsigned int Duty = 1;

int flag = false;
int flag1 = false;

void main(void)//C主程序
{
    // 第1步:初始化系统控制:PLL,看门狗,使能外围时钟,见DSP281x_SysCtrl.c
    InitSysCtrl();

    // 第2步:初始化 GPIO:将IO-34设置为输出IO
    InitIO();

    // 第3步:清除所有中断,初始化PIE向量表
    DINT;// //关闭总中断  :Disable CPU interrupts
    InitPieCtrl();//初始化PIE控制寄存器,缺省状态为PIE中断禁止,标志位清除。见DSP2802x_PieCtrl.c
    //外设中断扩展模块(Peripheral Interrupt Expansion,PIE)
    //外设中断扩展模块实质上是将中断向量表范围扩展,使得96个可能产生的中断都有各自独立的29位入口地址。这样,在扩展模块的作用下就会加快中断的响应时间。

    IER = 0x0000;//关闭外设中断:Disable CPU interrupts
    IFR = 0x0000;//清除中断标志:clear all CPU interrupt flags:

    InitPieVectTable();//初始化PIE向量表,使得指针指向各自中断服务子程序,在本例中未用到的中断也会被初始化
    //默认ISR 子程序见 DSP2802x_DefaultIsr.c.
    //InitPieVectTable()见 DSP2802x_PieVect.c.

    // 重新映射本例中用到的中断服务程序
    EALLOW;  // 允许修改EALLOW protected registers
    PieVectTable.TINT0 = &cpu_timer0_isr;//设置中断服务程序入口
    PieVectTable.TINT1 = &cpu_timer1_isr;
    PieVectTable.TINT2 = &cpu_timer2_isr;
    EDIS;    // 完成后禁止写入EALLOW protected registers

    // 第4步初始化外设,此处为定时器。( Initialize the Device Peripheral). This function can be
    InitCpuTimers(); //in DSP2802x_CpuTimers.c
#if (CPU_FRQ_60MHZ)//根据系统时钟设置定时器周期,系统时钟默认为60MHz  周期1毫秒
    ConfigCpuTimer(&CpuTimer0, 60, 10);//设置周期为10us 0.01毫秒
    ConfigCpuTimer(&CpuTimer1, 60, 10000);//设置周期为10000us/10毫秒
    ConfigCpuTimer(&CpuTimer2, 60, 1000000);//设置周期为1s/1000ms
#endif
#if (CPU_FRQ_40MHZ)
    ConfigCpuTimer(&CpuTimer0, 40, 1000000);
    ConfigCpuTimer(&CpuTimer1, 40, 1000000);
    ConfigCpuTimer(&CpuTimer2, 40, 1000000);
#endif
    //(0x0C04)=0x4001;
    CpuTimer0Regs.TCR.all = 0x4001; // Use write-only instruction to set TSS bit = 0
    CpuTimer1Regs.TCR.all = 0x4001; // Use write-only instruction to set TSS bit = 0
    CpuTimer2Regs.TCR.all = 0x4001; // Use write-only instruction to set TSS bit = 0
    //上述寄存器状态含义见   DSP2802x_CpuTimers.h
    /*struct  TCR_BITS {          // bits  description
    Uint16    rsvd1:4;       // 3:0   reserved         0001
    Uint16    TSS:1;         // 4     Timer Start/Stop 0
    Uint16    TRB:1;         // 5     Timer reload     0
    Uint16    rsvd2:4;       // 9:6   reserved         0000
    Uint16    SOFT:1;        // 10    Emulation modes  0
    Uint16    FREE:1;        // 11                     0
    Uint16    rsvd3:2;       // 12:13 reserved         00
    Uint16    TIE:1;         // 14    Output enable    1
    Uint16    TIF:1;         // 15    Interrupt flag   0
};
*/
    StopCpuTimer0();//暂停Timer0// #define StopCpuTimer0()   CpuTimer0Regs.TCR.bit.TSS = 1
    StartCpuTimer0();//启动Timer0//#define StartCpuTimer0()   CpuTimer0Regs.TCR.bit.TSS = 0

//   StopCpuTimer1();
//   StartCpuTimer1();

    // 第5步,允许中断, 见DSP2802x_Device.h.
    IER |= M_INT1;//CPU-Timer 0 在 CPU int1
    IER |= M_INT13;//CPU-Timer 1 在 CPU int13
    IER |= M_INT14;//CPU-Timer 2 在 CPU int14

    // 允许 TINT0 ,在 PIE的 Group 1 ,interrupt 7,见DSP2802x_PieVect.c.
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
    // PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//此语句已在InitPieVectTable()中运行过,在此不是必需的。

    EINT;   // Enable Global interrupt INTM // 使能全局中断INTM
    ERTM;   // Enable Global realtime interrupt DBGM允许全局实时中断 DBGM
    //GpioDataRegs.GPASET.bit.GPIO2=1;
    //GpioDataRegs.GPATOGGLE.bit. GPIO2=1;

    while(1)
    {

    }
}

interrupt void cpu_timer0_isr(void)//定时器0的中断服务程序
{
    CpuTimer0.InterruptCount ++;
    if(CpuTimer0.InterruptCount >= 100)
        CpuTimer0.InterruptCount = 0;
    if(CpuTimer0.InterruptCount >= Duty)
        GpioDataRegs.GPADAT.bit.GPIO0 = 0;
    else
        GpioDataRegs.GPADAT.bit.GPIO0 = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

interrupt void cpu_timer1_isr(void)
{
    if(flag == false)
        Duty++;
    else
        Duty--;
    if(Duty == 100 || Duty == 1)
        flag =! flag;
    EDIS;
}

interrupt void cpu_timer2_isr(void)
{
    EALLOW;
    CpuTimer2.InterruptCount++;
    // The CPU acknowledges the interrupt.
    EDIS;
}
void InitIO(void)
{
    EALLOW;                                                // 关闭寄存器保护,可以修改寄存器
    GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;                    // 选择上拉电阻
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;                   // 选择普通 GPIO功能,输出!
    GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;                    // 配置输出
    //    GpioDataRegs.GPADAT.bit.GPIO0 = 0;                     //输出低电平LED亮
    EDIS;                                                  // 开启寄存器保护,不可以修改寄存器
}
End

本文标题:DSP-28027定时器实验

本文链接:https://www.kitteno.com/archives/cpu_timer.html

除非另有说明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

声明:转载请注明文章来源。

最后修改:2022 年 04 月 24 日
如果觉得我的文章对你有用,请随意赞赏