DSP的CSL中最常见的函数:
- #define CSL_FINS(reg, PER_REG_FIELD, val) \
- ((reg) = ((reg) & ~CSL_##PER_REG_FIELD##_MASK)|CSL_FMK(PER_REG_FIELD, val))
reg表示某32位寄存器,PER_REG_FIELD表示将会被改动的位,val表示给寄存器的赋值
在PER_REG_FIELD前后加上两个“#”号是宏语法,表示取出PER_REG_FIELD前后加上CSL和MASK拼合成新的变量,其中CSL_PER_REG_FIELD_MASK表示该寄存器中将会被改变的位。
应用Omapl38捕获单元的寄存器操作一般步骤:
1. 配置管脚复用功能,使能GPIO中断,使能上升沿触发
2. 配置定时器模式为32位计数,配置定时器周期,定时器信号源是内部or外部,是否向下兼容旧版本
3. 定时器功能,使能事件捕获功能,事件捕获上升沿触发
,打开总中断,打开不可屏蔽中断
5. 使能定时器,捕获功能启动
一:首先是配置GPIO管脚复用和中断使能上升沿功能:
- GPIO interrupt events are enabled in banks of 16 by setting the appropriate bit(s) in the GPIO interrupt per-bank enable register (BINTEN). For example, to enable bank 0 interrupts (events from GP0[15-0]), set bit 0 in BINTEN; to enable bank 3 interrupts (events from GP3[15-0]), set bit 3 in BINTEN.
- …………………………..
- To configure a GPIO interrupt to occur only on rising edges of the GPIO signal:
- Write a logic 1 to the associated bit in SET_RIS_TRIG.
- Write a logic 1 to the associated bit in CLR_FAL_TRIG.
(@ sprufl8b-TMS320C674x&OMAP-L1x Processor
General-PurposeInputOutput (GPIO).pdf)
即先使能GPIO寄存器的相应BINTEN位,然后设置GPIO上升沿触发,置位SET_RIS_TRIG和CLR_FAL_TRIG相应位,这样就使能了GPIO中断功能和上升沿触发功能
相应代码:
CSL_FINST(gpioRegs->BINTEN,
GPIO_BINTEN_EN1, ENABLE);
CSL_FINST(gpiobakd01Regs->SET_RIS_TRIG,
GPIOBAKK01_SET_RIS, ENABLE);
CSL_FINST(gpiobakd01Regs->CLR_FAL_TRIG,
GPIOBAKK01_CLR_FAL, ENABLE);
配置GP1[6],GP1[7],因为其分别对应管脚的复用功能为TM64P0_IN12、TM64P1_IN12,即该管脚可使用其捕获功能。
接下来在SYSCONFIG寄存器重配置GPIO的管脚复用为GPIO功能
相应代码:
- CSL_FINST(sysRegs->PINMUX4, SYSCFG_PINMUX4_PINMUX4_7_4, DEFAULT);
- CSL_FINST(sysRegs->PINMUX4, SYSCFG_PINMUX4_PINMUX4_3_0, DEFAULT);
二三、配置定时器
这里使用TM64P0
1、定时器可配置为四种模式
– 64-bit general-purpose timer mode
– Dual 32-bit unchained general-purpose timer mode
– Dual 32-bit chained timer mode
–
Watchdog timer mode
这里使用第二种unchained模式
2、定时器可以使用外部clock或者内部clock,通过寄存器CLKSRC12来选择使用何种clock,在捕获模式下使用内部clock,内部clock有多个分频器,定时器使用PLL0_AUXCLK。
3、使用捕获功能
- When the PLUSEN bit in the timer global control register (TGCR) is set, Event Capture Mode is available for TIM12 when the timer is configured in 32-bit unchained mode. When Event Capture Mode is enabled, the timer cycle is restarted when an external input event occurs on pin TM64P_IN12. In particular, when an external input event occurs, the timer stops counting, generates output events (TINT12, TEVT12, and TM64P_OUT12), copies values from the timer counter register TIM12 to the timer capture register CAP12, reloads the timer period register PRD12 if in continuous mode with period reload (ENAMODE = 3h), and then restarts counting in continuous mode. Event Capture Mode is available only when the timer clock source is the internal timer (CLKSRC = 0) and the timer is in continuous mode (ENAMODE = 2h or 3h). Capture mode is enabled using the Capture mode enable bit CAPMODE12 in the timer control register (TCR). The type of input event is selected by the capture event mode bit CAPEVTMODE12 in the timer control register (TCR). All of the following input event types are available:
(@ sprufm5d-TMS320C674x&OMAP-L1x Processor
64-BitTimerPlus.pdf)
使能捕获功能,先置位TGCR寄存器的PLUSEN位,使TM64P0可以使用新的功能,当TM64P0IN12检测到上升沿事件时(因为刚才配置TM64P0IN12对应的GPIO管脚为上升沿中断触发),就会从计数寄存器TIM12中拷贝数值到CAP12中,同时计数器清零重新计数。这样只要访问寄存器CAP12就可得到待测信号的周期了。置位相应CAPMODE位,使能相应的捕获信号。
相应代码:
- CSL_FINST(tmr0Regs->TGCR, TMR_TGCR_TIMMODE, 32BIT_UNCHAIN);
- CSL_FINST(tmr0Regs->TCR, TMR_TCR_CLKSRC12, INTERNAL);
- CSL_FINST(tmr0Regs->TGCR, TMR_TGCR_PLUSEN, ENABLE);
- CSL_FINST(tmr0Regs->TCR, TMR_TCR_CAPMODE12, ENABLE);
- CSL_FINST(tmr0Regs->TCR, TMR_TCR_CAPEVTMODE12, RISE);
四、映射系统124个事件与14个中断的,打开总中断
C6748有124个系统事件,可只有14个中断响应,这就需要在把要用的系统事件和中断之间形成映射。
使用中断号4。事件号GPIO外部中断触发事件号是41,而定时器TM64P0事件号是4,一开始很犹豫到底是是绑定4号事件还是41号事件,因为这好像是定时器触发又好像是GPIO触发,实验结果证明在使用捕获功能时使用的是4号定时器TM64P0事件。
相应代码:
- CSL_FINS(dspintcRegs->INTMUX1, DSPINTC_INTMUX1_INTSEL4,
- CSL_INTC_EVENTID_T64P0_TINT12);
- //打开总中断和相应中断,清除标志号,映射相应中断表
- ISTP = (unsigned int)intcVectorTable;
- ICR = DSPINTC_IST_ALL_MASK_INT;
- IER = DSPINTC_IST_NMI | DSPINTC_IST_INT4;
五、设置定时器模式,使能定时器中断
CSL_FINST(tmr0Regs->TCR, TMR_TCR_ENAMODE12,
EN_CONT);
这样捕获模块就开始工作了,接下来想要得到测量到的信号频率值直接取CAP12寄存器的值再通过相应运算即可得到。
阅读(5069) | 评论(1) | 转发(1) |