在线时间34 小时
UID3165601
注册时间2018-8-8
NXP金币0
TA的每日心情 | 开心 2019-2-18 09:04 |
---|
签到天数: 23 天 连续签到: 1 天 [LV.4]偶尔看看III
中级会员
 
- 积分
- 219
- 最后登录
- 2019-3-5
|
使用PIT触发DMA控制一组GPIO(GPIOC)输出从而控制片外并行DAC。PIT触发时间为1us,但是看实际效果,GPIO输出为13.4us,而非1us,个人感觉是DMA中断导致CPU处理不过来,有什么方式可以加快GPIO的输出速度(1us)。我目前的配置代码如下:
uint32_t g_dacDataValueArray[] = {0x5a5a5a5a,0xa5a5a5a5};
dma_handle_t g_DMA_Handle; /* DMA handler. */
dma_transfer_config_t g_transferConfig;
volatile uint32_t g_index = 0U; /* Index of the g_dacDataArray array. */
static void DMAMUX_Configuration(void)
{
/* Configure DMAMUX. */
DMAMUX_Init(DMAMUX0);
DMAMUX_SetSource(DMAMUX0, 0, 51); /* Map ADC source to channel 0 */
DMAMUX_EnablePeriodTrigger(DMAMUX0,0);
DMAMUX_EnableChannel(DMAMUX0, 0);
}
static void DMA_Callback(struct _dma_handle *handle, void *userData)
{
/* Clear DMA interrupt flag. */
DMA_ClearChannelStatusFlags(DEMO_DMA_BASEADDR, DEMO_DMA_CHANNEL, kDMA_TransactionsDoneFlag);
/* Setup transfer. */
g_index++;
if (g_index ==2)
{
g_index = 0U;
}
DMA_PrepareTransfer(&g_transferConfig, (void *)(g_dacDataValueArray+g_index), sizeof(uint32_t),
(void *)GPIOC_DATA_REG_ADDR, sizeof(uint32_t),4,kDMA_MemoryToMemory);
DMA_SubmitTransfer(&g_DMA_Handle, &g_transferConfig, kDMA_EnableInterrupt);
/* Enable transfer. */
DMA_StartTransfer(&g_DMA_Handle);
}
static void DMA_Configuration(void)
{
DMA_Init(DMA0);
#if 1
DMA_CreateHandle(&g_DMA_Handle, DMA0, 0);
DMA_SetCallback(&g_DMA_Handle, DMA_Callback, NULL);
DMA_PrepareTransfer(&g_transferConfig, (void *)(g_dacDataValueArray+g_index), sizeof(uint32_t),
(void *)GPIOC_DATA_REG_ADDR, sizeof(uint32_t),4,kDMA_MemoryToMemory);
DMA_SubmitTransfer(&g_DMA_Handle, &g_transferConfig, kDMA_EnableInterrupt);
#endif
/* Enable transfer. */
DMA_StartTransfer(&g_DMA_Handle);
}
/* Enable the trigger source of PIT. *///24Mhz
static void PIT_Configuration(void)
{
pit_config_t pitConfig;
PIT_GetDefaultConfig(&pitConfig);
/* Init pit module */
PIT_Init(PIT, &pitConfig);
/* Set timer period for channel 0 */
PIT_SetTimerPeriod(PIT, kPIT_Chnl_0, 24);//t = 1/24(us)
// PIT_EnableInterrupts(PIT, kPIT_Chnl_0,PIT_TCTRL_TIE_MASK);
// NVIC_SetPriority(PIT_IRQn, 5);
// EnableIRQ(PIT_IRQn);
}
最佳答案
神的罪名 发表于 2019-2-14 17:27
是的,我试过就是因为DMA中断导致的,SDK例程里都是使用DMA中断做传输的,触发一次,传一个数据,进入DMA ...
楼主你好,我看你的中断代码写的太冗余了。
你可以使用最简单的方式, ...
|
|