最近一段时间忙着考试,没留意试用报告分享时间是到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中断标志位;
}