程序说明
- 文件名: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; // 开启寄存器保护,不可以修改寄存器
}