微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI WIFI设计交流 > 关于CC3200 TIMER DMA传输的问题

关于CC3200 TIMER DMA传输的问题

时间:10-02 整理:3721RD 点击:

想用CC3200的PWM生成简单的音频信号,所以用DMA搬运音频数据,现在实现的代码如下:

MAP_PRCMPeripheralClkEnable(PRCM_TIMERA2, PRCM_RUN_MODE_CLK); // GT_PWM05 is Timer2B
/* Timer Config 16k 12bit */
MAP_PinTypeTimer(PIN_64,PIN_MODE_3); // GT_PWM02 - Timer2B
MAP_TimerConfigure(TIMERA2_BASE,TIMER_CFG_SPLIT_PAIR|TIMER_CFG_B_PWM);
MAP_TimerPrescaleSet(TIMERA2_BASE,TIMER_B,0);
MAP_TimerControlLevel(TIMERA2_BASE,TIMER_B,1);
MAP_TimerLoadSet(TIMERA2_BASE,TIMER_B,4999);
MAP_TimerMatchSet(TIMERA2_BASE,TIMER_B,10);
HWREG(TIMERA2_BASE+TIMER_O_TBMR) |= (1<<9); // TBPWMIE@GPTMTBMR

SetupTransfer(UDMA_CH5_TIMERA2_B,UDMA_MODE_PINGPONG,256,UDMA_SIZE_16,UDMA_ARB_1,
AudioData,UDMA_DST_INC_16,(void *)(TIMERA2_BASE+TIMER_O_TBMATCHR),
UDMA_DST_INC_NONE);
MAP_uDMAChannelAttributeDisable(UDMA_CH5_TIMERA2_B,\
UDMA_ATTR_ALTSELECT|UDMA_ATTR_USEBURST|UDMA_ATTR_REQMASK);
MAP_uDMAChannelAttributeEnable(UDMA_CH5_TIMERA2_B,UDMA_ATTR_HIGH_PRIORITY);
MAP_TimerDMAEventSet(TIMERA2_BASE,TIMER_DMA_CAPEVENT_B);

MAP_TimerIntRegister(TIMERA2_BASE,TIMER_B,TIMERA2B_IRQ);
MAP_TimerIntEnable(TIMERA2_BASE,TIMER_TIMB_DMA);
MAP_TimerIntDisable(TIMERA2_BASE,TIMER_CAPB_EVENT);

MAP_TimerEnable(TIMERA2_BASE,TIMER_B);
现在这段代码可以运行,将AudioData里面的256字节数据轮流复制到TIMERA2的TBMATCHR寄存器,有几个问题想请教一下:
1.现在这段代码DMA只能启动一次,我想每次完成后再启动下一次,要怎么操作?是要把DMA的操作全部再执行一次?
2.红色部分的代码是参考一个外国友人发的技术贴里面做的,HWREG(TIMERA2_BASE+TIMER_O_TBMR) |= (1<<9);是将GPTMTBMR中的
TBPWMIE位置1,RM里面说这个位=1时,在CCP通道发生比较的时候触发一次DMA,但是这样只能用比较事件TIMER_DMA_CAPEVENT_B来触发DMA,我现在先用溢出事件TIMER_DMA_TIMEOUT_B触发DMA是不行的。要怎么操作?
3.现在这段程序DMA完成后能进入中断服务程序,但是清楚了标志位以后还是会继续进入中断,这是什么原因?
这是中断服务函数,尝试过很多方法,包括使用TimerIntClear 也是不停进入中断。读出来的中断标识是TIMER_TIMB_DMA、TIMER_CAPB_EVENT位为1
void TIMERA2B_IRQ(void)
{
uint32_t u32Temp;
u32Temp = HWREG(TIMERA2_BASE+TIMER_O_RIS);
HWREG(TIMERA2_BASE+TIMER_O_ICR) |= u32Temp;
}

小弟先在这谢过各位

请问下你的问题解决了吗,谢谢,我现在也在做音频方面的,可以留个联系方式探讨下吗,这个是我的2201117311@qq.com

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top