`新建工程的详细过程见之前的帖子:使用Haawking IDE 新建一个LED闪烁的工程 - 中科昊芯 DSP - 电子技术 论坛 - 广受欢迎的专业电子论坛! (elecfans.com) 一、中断概念的介绍 DSC28034有很多资源,很多外设,这些外设与相关资料都有可能发布新的任务让内核来判断与处理,也就是DSC28034的可能中断源有很多。DSC28034的中断源可分为片内外设中断源,如PWM、CAP、QEP、定时器等,片外中断源,外部中断输入引脚XINT1、XINT2引入的外部中断源。这些中断源将中断请求信号传递给内核就肯定需要中断线,DSC28034的中断线是有限的。DSC28034的中断采用的是3级中断机制,分别为外设级中断、PIE级中断和CPU级中断。 PIE模块8个中断分成一组与外部中断一起复用一个CPU中断,总共有12组中断(INT1~INT12)。每组中断有相应的中断标志(PIEIFR)和使能(PIEIER)寄存器,这些寄存器控制PIE向CPU申请中断。同时CPU还根据PIEIFR和PIEIER寄存器确定执行哪个中断服务程序。 二、使用haawking IDE版本V0.5.0实现DSC28034定时器中断操作示例: int main(void) { InitSysCtrl(); //时钟频率配置成60M DINT; //清除所有中断初始化PIE向量表,不使能CPU中断 InitPieCtrl(); //初始化PIE控制寄存器为默认状态 IER_DISABLE(0xFFFF); //不使能CPU中断 IFR_DISABLE(0xFFFF); //清除所有的CPU中断标志 InitPieVectTable(); InitKEY(); //按键初始化 InitLED(); //LED初始化 InitBeep(); InitCputimers(); //调用官方库函数,初始化CPU定时器 Timer0_init(); ConfigCpuTimer(&CpuTimer1, 60, 500000);//定时器1初始化,第二个参数为CPU SYSCLK = 60M, 第三个参数为设定的周期,us单位 CpuTimer1Regs.TCR.bit.TSS = 0;// To start or restart the CPU-timer, set TSS to 0 ConfigCpuTimer(&CpuTimer2, 60,100000 );//定时器1初始化,第二个参数为CPU SYSCLK = 60M, 第三个参数为设定的周期,us单位 CpuTimer2Regs.TCR.bit.TSS = 0;// To start or restart the CPU-timer, set TSS to 0 // CpuTimer2Regs.TCR.bit.TSS = 1;// To stop the CPU-timer, set TSS to 1 //中断配置步骤-----5 //PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block 我们的没有 EINT; // Enable Global interrupt INTM ERTM; while(1){ if(msCounter > 100) { msCounter = 0; if(GpioDataRegs.GPADAT.bit.GPIO27 == 0) //如果按键按下 { GpioDataRegs.GPBCLEAR.bit.GPIO43 = 1; //D402亮 GpioDataRegs.GPASET.bit.GPIO6 = 1; //蜂鸣器响 } else { GpioDataRegs.GPBSET.bit.GPIO43 = 1; //D402灭 GpioDataRegs.GPACLEAR.bit.GPIO6 = 1; //蜂鸣器不响 } } if(CpuTimer1Regs.TCR.bit.TIF == 1)//定时器1查询周期 { CpuTimer1Regs.TCR.bit.TIF = 1;// clear flag GpioDataRegs.GPBTOGGLE.bit.GPIO41 = 1;//D400交互闪烁 } if(CpuTimer2Regs.TCR.bit.TIF == 1)//定时器2查询周期 { CpuTimer2Regs.TCR.bit.TIF = 1;// clear flag GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;//D401交互闪烁 } } return 0; } Timer0_init()的初始化函数主体: void Timer0_init(void) { //中断配置步骤-----1,开启模块中断使能,位于 Timer->RegsAddr->TCR.bit.TIE = 1; ConfigCpuTimer(&CpuTimer0, 60, 1000);//60MHz CPU Freq, 1 millisecond Period (in uSeconds) //CpuTimer0Regs.TCR.all = 0x4001; // Use write-only instruction to set TSS bit = 0 CpuTimer0Regs.TCR.bit.TSS = 0; // To start or restart the CPU-timer, set TSS to 0 CpuTimer0Regs.TCR.bit.TIE = 1; //中断使能 //中断配置步骤-----2,重映射中断服务函数 // Interrupts that are used in this example are re-mapped to // ISR functions found within this file. EALLOW; PieVectTable.TINT0 = &timer0_ISR; EDIS; //中断配置步骤-----3,连接CPU中断Y IER_ENABLE(M_INT1); //enable interrupt reg //IER |= M_INT1; //中断配置步骤-----4,连接Y中断里的第几位 PieCtrlRegs.PIEIER1.bit.INTx7 = 1; } /****************************************************************** 函数名:void INTERRUPT TINT0_ISR(void) 参 数:无 返回值:无 作 用:定时器中断,每进一次中断,msCounter加1 ******************************************************************/ void INTERRUPT timer0_ISR(void) { // timer0Base.Mark_Para.Status_Bits.OnemsdFlag = 1; // timer0Base.msCounter++; msCounter++; // Acknowledge this interrupt to receive more interrupts from group 1 EALLOW; PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; EDIS; 总结,中断函数的流程首先清除所有的中断并且初始化中断线,重定向对应中断向量表的表向,使能中断。当中断条件满足的时候就会执行中函数。 三、实验现象
在中断函数中设置了标志位,当进了中断函数就会执行,当标志位满足一定条件后实现灯的闪烁。
`
|