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. 定时器功能,使能事件捕获功能,事件捕获上升沿触发
4. 系统124个事件与14个中断的映射,打开总中断,打开不可屏蔽中断
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
eventis 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
寄存器的值再通过相应运算即可得到。