最近一段时间忙着考试,没留意试用报告分享时间是到20号~ 先把程序放上来供大家参考,等考完试我再把相关寄存器配置说明补上~~~先说声抱歉了 言归正传,这部分介绍Timer定时器,应用它的定时功能周期触发中断,然后在中断服务程序中配置led闪烁。 一、Timer定时器简介 (稍后再补) 二、Timer定时器功能 (稍后再补) 三、Timer定时器寄存器介绍 (稍后再补) 四、Timer定时器与中断 (稍后再补) 五、基于CSLr的Timer例程 1、定时器配置函数 void setup_Timer0 (void) { // Set Timer0 as 32 Bit Unchain CSL_FINST(tmr0Regs->TGCR, TMR_TGCR_TIMMODE, 32BIT_UNCHAIN);//选择32位无连接模式 // Remove Timer0:12 from Reset CSL_FINST(tmr0Regs->TGCR, TMR_TGCR_TIM12RS, NO_RESET);//定时器12离开复位模式 // Set Timer0:12 Period; 1 Second // CSL_FINS(tmr0Regs->PRD12, TMR_PRD12_PRD12, CSL_ASYNC_2_FREQ);//PRD计数 //使用内部时钟,板载原来是24M未经过锁相环倍频 //现在输入时钟为24Mhz,实际值为24000000/24000000=1s CSL_FINST(tmr0Regs->TIM12, TMR_TIM12_TIM12, RESETVAL);//计数器复位 CSL_FINS(tmr0Regs->PRD12, TMR_PRD12_PRD12,24000000);//PRD计数 CLKSRC12,INTERNAL tmr0Regs->TCR= CSL_FMKT(TMR_TCR_INVOUTP12,INVERTED) |//输出倒置 CSL_FMKT(TMR_TCR_INVINP12,INVERTED) |//输入倒置 CSL_FMKT(TMR_TCR_CP12,PULSE) |//PULSE or CLOCK 模式 CSL_FMKT(TMR_TCR_PWID12,ONE_CLK) |//PULSE模式高电平持续周期 CSL_FMKT(TMR_TCR_CLKSRC12,INTERNAL) |//时钟源 CSL_FMKT(TMR_TCR_TIEN12,NOTGATED) |//输入门触发计数 CSL_FMKT(TMR_TCR_CAPMODE12,DISABLE) |//禁止捕获模式 CSL_FMKT(TMR_TCR_CAPEVTMODE12,RISE);//捕获触发方式,上升沿 tmr0Regs->INTCTLSTAT= CSL_FMKT(TMR_INTCTLSTAT_PRDINTEN12,DISABLE) |//定时器,使能中断 CSL_FMKT(TMR_INTCTLSTAT_PRDINTSTAT12,NOPEND)|//定时器,未触发中断 CSL_FMKT(TMR_INTCTLSTAT_EVTINTEN12,DISABLE) |//捕获模式禁止中断 CSL_FMKT(TMR_INTCTLSTAT_EVTINTSTAT12,NOPEND);//捕获模式,未触发中断 // Reset the Counter for Timer0:12 CSL_FINST(tmr0Regs->TCR, TMR_TCR_READRSTMODE12, RESET); // Disable the New Timer Features CSL_FINST(tmr0Regs->TGCR, TMR_TGCR_PLUSEN, DISABLE);//禁止新的定时器特征值 // CSL_FINS(tmr0Regs->REL12, TMR_REL12_REL12,24000000);//PRD计数 }/* setup_Timer0 */ 2、Timer中断配置程序 void setup_DSP_INTC (void)//中断配置程序 { // Map EDMA3CC/Timer0:12 System interrupts to DSP INT4/5 dspintcRegs->INTMUX1 = // CSL_FMK(DSPINTC_INTMUX1_INTSEL6, CSL_INTC_EVENTID_UPPINT )|//数据传输 // CSL_FMK(DSPINTC_INTMUX1_INTSEL5, CSL_INTC_EVENTID_SPIINT1) |//SPI1 // CSL_FMK(DSPINTC_INTMUX1_INTSEL4, CSL_INTC_EVENTID_UARTINT0)|//参数传输 // CSL_FMK(DSPINTC_INTMUX1_INTSEL7, CSL_INTC_EVENTID_GPIO_BNK1_INT );//同步信号 dspintcRegs->INTMUX2 =CSL_FMK(DSPINTC_INTMUX2_INTSEL8, SOC_INTC_EVENTID_T64P0_TINT12 ); // Assign the address of the IST to the IST pointer ISTP = (unsigned int)intcVectorTable;//指向中断向量表 // Clear all CPU maskable interrupts ICR = DSPINTC_IST_ALL_MASK_INT;//清空中断 // Enable INT4-INT5 interrupts //IER = DSPINTC_IST_NMI | DSPINTC_IST_INT4| DSPINTC_IST_INT6| DSPINTC_IST_INT7 ;//使能中断 IER = DSPINTC_IST_NMI | DSPINTC_IST_INT8 ;//使能中断 _disable_interrupts();//禁止中断 }/* setup_DSP_INTC */ 3、主函数 void main(void) { setup_DSP_INTC();//中断使能 setup_Timer0();//配置定时器 //CSL_FINST(tmr0Regs->TCR, TMR_TCR_ENAMODE12, EN_CONT); //CSL_FINS(gpioRegs->BANK[3].OUT_DATA,GPIO_OUT_DATA_OUT12,1);//给出该引脚输出低电平 //CSL_FINS(gpioRegs->BANK[3].OUT_DATA,GPIO_OUT_DATA_OUT13,1);//给出该引脚输出低电平 asm("nop"); CSL_FINS(gpioRegs->BANK[0].DIR,GPIO_DIR_DIR0,0);//输出 CSL_FINS(gpioRegs->BANK[0].OUT_DATA,GPIO_OUT_DATA_OUT0,1);//给出该引脚输出低电平 CSL_FINST(tmr0Regs->TCR, TMR_TCR_ENAMODE12, EN_CONT); _enable_interrupts();//使能中断 while(1); } 4、中断服务程序 interrupt void Timer0_isr(void)//Ping开始,更新参数,同步中断 { CSL_FINST(dspintcRegs->EVTCLR[0],DSPINTC_EVTCLR_EC4,SET);//清空中断标志位; CSL_FINS(gpioRegs->BANK[0].DIR,GPIO_DIR_DIR0,0);//输出 CSL_FINS(gpioRegs->BANK[0].OUT_DATA,GPIO_OUT_DATA_OUT0,~(CSL_FEXT(gpioRegs->BANK[0].OUT_DATA,GPIO_OUT_DATA_OUT0)));//给出该引脚输出低电平 //CSL_FINS(gpioRegs->BANK[0].INTSTAT,GPIO_INTSTAT_STAT21,1);//清空GPIO中断标志位; //CSL_FINS(gpioRegs->BANK[6].OUT_DATA,GPIO_OUT_DATA_OUT16,0);//给出该引脚输出低电平 //CSL_FINS(gpioRegs->BANK[0].INTSTAT,GPIO_INTSTAT_STAT16,1);//清空GPIO中断标志位; }