主题中讨论的其他器件:TM4C123
也许我必须创建一个 LaunchPad 软件来展示这一点、但下面是一个尝试词:
-在 TCCP 管脚中接收到一个 PWM 信号
-信号的周期大约为1ms,它是非停止的
-定时器 A0被配置为在两个边沿上捕捉信号。 DMAEventSet 已正确配置为 CAPEVENT
TimerConfigure (TIMER0_BASE、(TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME_UP)); //TimerPrescaleSet (TIMER0_BASE、TIMER_A、ENC_PRcaler); TimerPrescaleSet (TIMER0_BASE、TIMER_A、预分频); TimerLoadSet (TIMER0_BASE、TIMER_A、0);//为0xFFFF TimerControlEvent (TIMER0_BASE、TIMER_A、TIMER_EVENT_BULE_edges); TimerDMAEventSet (TIMER0_BASE、TIMER_DMA_CAPEVENT_A); TimerIntEnable (TIMER0_BASE、TIMER_TINA_DMA | TIMER_TINA_TIMEOUT); IntPrioritySet (INT_TIMER0A、0); //可能的最高中断 IntEnable (INT_TIMER0A);
请注意、这里有一个将超时作为中断源的尝试-这不会发生-但这还不是马上讨论的内容、我会回来讨论。
当我想测量 PWM 时、我配置 DMA 通道:
uDMAChannelAssign (UDMA_CH18_TIMER0A); uDMAChannelAttributeDisable (UDMA_CH18_TIMER0A、UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIORY | UDMA_ATTR_REQMASK); uDMAChannelControlSet (((UDMA_CH18_TIMER0A|UDMA_PRI_SELECT)、(UDMA_SIZE 32|UDMA_SRC_INC_None|UDMA_DST_INC_32|UDMA_ARB_1)); uDMAChannelTransferSet (((UDMA_CH18_TIMER0A|UDMA_PRI_SELECT)、UDMA_MODE_BASIC、(void *)(TIMER0_BASE + 0x048)、编码脉冲、4); uDMAChannelEnable (UDMA_CH18_TIMER0A); //启用此特定通道 HWREG (TIMER0_BASE + TIMER_O_TAV)= 0; //将计时器计数器归零 ROM_TimerEnable (TIMER0_BASE、TIMER_A); //启用 timer0以便捕获信号
这足以使内部齿轮运行- 4个边沿时刻应通过 DMA 从固定的 TMER0 TAR 寄存器传输到递增的数组编码脉冲。
它按预期工作、但我经常会得到奇怪的序列、例如:
2 350 396、2 397 921、54 350、101 754
显然、计时器计数器会翻转。 这在这个系统上是不可能的、信号一直在运行、并且应该记录前4个脉冲。 如果我将超时负载添加到较小的值(在这种特殊配置中,即37*2^16),我将获得反映实际信号的理想连续值。 正确的序列如下所示:
1 084 102、1 131 633、1 212 768、1 260 302
不过、上面的序列显示4个记录的值是 DMA 传输的延迟值! 如果信号为~1ms、则在 TAV 加载为零且 TimerEnable 置位后、第一次事件必须在不到120000次点击的时间内发生。
我的配置或勘误表中是否存在我缺失的 DMA 错误?
此致
布鲁诺