DSP

创龙TMS320C6748开发板———Timer配置 + Timer触发中断 + GPIO控制LED

2019-07-13 16:33发布

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