This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TM4C123GH6PM的 GPIO触发uDMA

Other Parts Discussed in Thread: TM4C123GH6PM

我用PF4口做DMA的触发源,将PB口的数据传送到一个二维数组里面,但是程序出现问题,数据无法传输,请大神们帮忙看看程序出现的问题呗!感谢(其实这是用来驱动摄像头的程序,用DMA读像素值,有没有人用过TM4C123GH6PM驱动摄像头,或者有什么相关的资料,希望一起分享.........)

这是我DMA的初始化


void InitDMA(void)
{

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); //使能GPIOF4时钟-----------CLK
GPIODMATriggerEnable(GPIO_PORTF_BASE,GPIO_PIN_4); //设置PF4为DMA触发源
GPIOIntRegister(GPIO_PORTF_BASE, uDMAIntHandler); //GPIO注册中断--uDMAIntHandler
GPIOPinTypeGPIOInput(GPIO_PORTF_BASE,GPIO_PIN_4); //设置F4为输入
GPIOPadConfigSet(GPIO_PORTF_BASE,GPIO_PIN_4,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//配置F4为上拉电阻 输出电流能力2mA
GPIOIntTypeSet(GPIO_PORTF_BASE,GPIO_PIN_4,GPIO_RISING_EDGE);//上升沿触发
GPIOIntEnable(GPIO_PORTF_BASE,GPIO_PIN_4); //使能F4中断
ROM_IntEnable(INT_GPIOF);


//ROM_SysCtlPeripheralClockGating(true); //休眠模式
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); //使能外设uDMA
//ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UDMA); //使能uDMA休眠模式
ROM_IntEnable(INT_UDMAERR); //使能uDMA错误中断
ROM_uDMAEnable(); //使能uDMA
ROM_uDMAControlBaseSet(pui8ControlTable); //
ROM_IntEnable(INT_UDMA); // 使能UDMA中断
ROM_uDMAChannelAssign(UDMA_CH15_GPIOF); //配置通道15GPIOF

// 这个函数是禁用uDMA通道的属性 GPIOF通道,连续模式转移|备用通道|高优先级|屏蔽该通道的外设请求信号
ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_ADC1,
UDMA_ATTR_USEBURST | UDMA_ATTR_ALTSELECT |
(UDMA_ATTR_HIGH_PRIORITY |
UDMA_ATTR_REQMASK));
// ROM_uDMAChannelAttributeEnable(UDMA_CHANNEL_ADC1,UDMA_ATTR_HIGH_PRIORITY);
//这个函数是设置uDMA转移的控制参数。 GPIOF通道|主控制,数据宽度32位|源地址增量0位|目的地址增量32位|仲裁数目8个数据单元
ROM_uDMAChannelControlSet(UDMA_CHANNEL_ADC1 | UDMA_PRI_SELECT,
UDMA_SIZE_32| UDMA_SRC_INC_NONE| UDMA_DST_INC_32 |UDMA_ARB_8);

//这个函数是配置uDMA转移参数。 GPIOF通道|主控制,基本传输模式,源地址,目的地址,传输数据项的数量
ROM_uDMAChannelTransferSet(UDMA_CHANNEL_ADC1 | UDMA_PRI_SELECT,
UDMA_MODE_BASIC , (void *)(GPIO_PORTB_BASE+GPIO_O_DATA), g_ui32DstBuf, L); //
// ROM_uDMAChannelEnable(UDMA_CHANNEL_ADC1); //使能uDMA通道 开始数据传输
}

这是我触发源PF4口 的中断函数

void uDMAIntHandler(void)
{
uint32_t ui32Mode;
uint32_t ui32Status;
ui32Status = GPIOIntStatus(GPIO_PORTF_BASE, true); //读取PORTF中断状态
GPIOIntClear(GPIO_PORTF_BASE,ui32Status); //清除PORTF中断状态
ui32Mode = ROM_uDMAChannelModeGet(UDMA_CHANNEL_ADC1|UDMA_PRI_SELECT); //GPIOF通道转移数据
if(ui32Mode == UDMA_MODE_STOP) //转移完成
{
g_ui32MemXferCount++; //转移数据计数加一
if(g_ui32MemXferCount>5000) g_ui32MemXferCount=0;

//这个函数是配置uDMA转移参数。 GPIOB通道 |主控制,基本传输模式,源地址,目的地址,传输数据项的数量
ROM_uDMAChannelTransferSet(UDMA_CHANNEL_ADC1|UDMA_PRI_SELECT, UDMA_MODE_BASIC,
(void *)( GPIO_PORTB_BASE+GPIO_O_DATA), g_ui32DstBuf, L);//
ROM_uDMAChannelEnable(UDMA_CHANNEL_ADC1); //GPIOF通道使能
}
if(!ROM_uDMAChannelIsEnabled(UDMA_CHANNEL_ADC1))
{
//这个函数是配置uDMA转移参数。 GPIOB通道 |主控制,基本传输模式,源地址,目的地址,传输数据项的数量
ROM_uDMAChannelTransferSet(UDMA_CHANNEL_ADC1|UDMA_PRI_SELECT, UDMA_MODE_BASIC,
(void *)(GPIO_PORTB_BASE+GPIO_O_DATA ), g_ui32DstBuf, L);//
ROM_uDMAChannelEnable(UDMA_CHANNEL_ADC1);
}

}