中级会员
 
- 积分
- 389
- 金钱
- 389
- 注册时间
- 2014-11-8
- 在线时间
- 40 小时
|
5金钱
这几天学stm32的DMA,想用DMA控制IO口输出高电平,但却弄了好久没弄出来。
我参考的帖子http://www.openedv.com/posts/list/46844.htm#283106
底下为DMA初始化代码,直接改的原子哥的。现在实验的现象是总输出3.3V高电平。
主函数除了初始化什么也没干。初始化后直接while(1);郁闷了好久,希望大家帮帮忙。。。
DMA初始化代码
u16 Gpio_data[4]= {0xFFFF,0x0000,0xFFFF,0x0000};
void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u32 cndtr)
{
RCC->APB2ENR|=1<<4; //使能PORTC时钟
GPIOC->CRL &= 0x00000000;//低八位通用输出模式,速度为50MHz
GPIOC->CRL |= 0x33333333;//低八位通用输出模式,速度为50MHz
GPIOC->CRH &= 0x00000000;//高八位通用输出模式,速度为50MHz
GPIOC->CRH |= 0x33333333;//高八位通用输出模式,速度为50MHz
GPIOC->ODR |= 0xFFFF;//上拉
GPIOC->BSRR |= 0xFFFF;//上拉
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输
__nop(); //等待 DMA1 时钟稳定
__nop(); //经测试最少 2 个 nop
__nop();
DMA_DeInit(DMA1_Channel7);//将DMA的通道1寄存器重设为缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint16_t)(&(GPIOC->ODR));//DMA外设GPIOC->BSRR基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint16_t)cmar;//DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//数据传输方向,从内存读取发送到外设
DMA_InitStructure.DMA_BufferSize = 4;//DMA通道的DMA缓存大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据宽度16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;//内存数据宽度16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//工作在循环模式
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;//DMA此通道具有最高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Enable; //DMA此通道设置为内存到内存传输
DMA_Init(DMA1_Channel7, &DMA_InitStructure);//初始化DMA
DMA_Cmd(DMA1_Channel7, DISABLE ); //关闭 所指示的通道
DMA_SetCurrDataCounter(DMA1_Channel7,4);//DMA通道的DMA缓存的大小
DMA_Cmd(DMA1_Channel7, ENABLE); //使能DMA1_Channel7;
}
|
最佳答案
查看完整内容[请看2#楼]
解决了,发现了两处错误,改变如下。
1、 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint16_t)(&(GPIOC->ODR));//DMA外设GPIOC->BSRR基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint16_t)cmar;//DMA内存基地址
换成
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(GPIOC->ODR));//DMA外设GPIOC->BS ...
|