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);
}

}

  • 没看出有什么问题,你只能试试单步调试,然后看寄存器中的值有没有写进去了。

  • 你能详细说一下吗?谢谢了

  • 应该是 数据为8位  地址增量为8位

  • 你说的这种配置我也试过,同样没有数据传输,还有,地址增量应该是零吧,我只读PB口的数据呀

  • wo也在调试摄像头  我们加个qq说哇 我也是没调出来  一起探讨一哈

  • qq  1228974075

  • 你好,请问使用TM4C123的uDMA一定要开中断的吗,我看过的每一个uDMA的程序全都开了中断,如果开了中断,那不就要处理器处理了吗,可以不开中断吗,比如说,用ADC连续采集采集,转化完的值被DMA自动(连续地)传入内存中,这可以做的到吗;我之前试过使用自动模式来实现这个想法,但是不行,我单步执行看了一下他的寄存器,发现和技术文档说的一模一样,他传输完一次之后就会变成停止模式,而且他寄存器的DMA使能位被清除了,他如果不使用中断给他重新初始化的话,DMA就在也无法使用了,我想问一下这是不是正常的状况?我很疑惑它手册关于ADC使用uDMA部分写的最后一句话:“...(对DMA的一般配置)...,除此之外不需要其他操作,ADC模块已经能够进行uDMA工作”,可以给我解答一下吗

  • 你好!请问你的问题解决了吗?