本人目前刚刚学习407的DMA写了两天了,就是无法把数据从ADC2的DR传送到定义的数组上去。
下面是代码。请论坛大神帮帮,多谢。
volatile u16 ADC_RCVTab[32];
void ADC2_init()
{
GPIO_InitTypeDef GPIO_InitStruct;
ADC_CommonInitTypeDef ADC_CommonInitStruct;
ADC_InitTypeDef ADC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
//时钟使能
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AN;//模拟
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOA,&GPIO_InitStruct);//PA6初始化
ADC_DeInit();//ADC复位
ADC_CommonInitStruct.ADC_DMAAccessMode=ADC_DMAAccessMode_1;//模式1
ADC_CommonInitStruct.ADC_Mode=ADC_Mode_Independent; //独立模式
ADC_CommonInitStruct.ADC_Prescaler=ADC_Prescaler_Div6; //时钟6分频
ADC_CommonInitStruct.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;//传送相隔5个时钟
ADC_CommonInit(&ADC_CommonInitStruct);
ADC_InitStruct.ADC_ContinuousConvMode=DISABLE; //禁止连续转换
ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;//右对齐
ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T2_TRGO;//T2_TRGO触发转换
ADC_InitStruct.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_Rising;//上升延触发
ADC_InitStruct.ADC_NbrOfConversion=1; //1个通道
ADC_InitStruct.ADC_Resolution=ADC_Resolution_12b; //12位精度
ADC_InitStruct.ADC_ScanConvMode=DISABLE; //扫描关
ADC_Init(ADC2,&ADC_InitStruct);
ADC_RegularChannelConfig(ADC2, ADC_Channel_6, 1, ADC_SampleTime_28Cycles);//配置ADC2通道6转换周期28个时钟,第一个
ADC_DMACmd(ADC2, ENABLE);//ADC,dma使能
ADC_DMARequestAfterLastTransferCmd(ADC2, ENABLE);//连续变化传输开启
ADC_Cmd(ADC2, ENABLE);//adc2使能
}
void DMA2_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
DMA_DeInit(DMA2_Stream2); //初始化DMA2,数据流2
DMA_StructInit(&DMA_InitStructure);
DMA_InitStructure.DMA_Channel=DMA_Channel_2;//选择通道2
DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&ADC2->DR;//外设地址
DMA_InitStructure.DMA_Memory0BaseAddr=(u32)ADC_RCVTab;//内存地址
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralToMemory; //方向外设至内存
DMA_InitStructure.DMA_BufferSize=32; //数据长度32
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设自增关闭
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//内存自增关开启
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//外设数据长度半字
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//内存数据长度半字
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//DMA循环传输
DMA_InitStructure.DMA_Priority=DMA_Priority_High;//DMA2_数据流2优先级高
DMA_Init(DMA2_Stream2,&DMA_InitStructure);//DMA设置
DMA_Cmd(DMA2_Stream2,ENABLE);//DMA使能
/*DMA中断设置*/
}
void My_TIM2_Init(u16 presca,u16 period)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
//定时器时钟使能
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_Prescaler=presca;
TIM_TimeBaseInitStruct.TIM_Period=period;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);//定时器初始化
TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update);//溢出更新,TRGO触发
TIM_Cmd(TIM2,ENABLE); //定时器2初始化
}
关闭DMA时候, ADC2->DR数据一直是有值,可是一开DMA配置,数据就不动了。谢谢哪位帮忙看看什么地方。出问题了。对照参考资料看了几次没看出问题。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>