我是一个新手,正在学习stm32,目前遇到这样一个问题,描述如下:
我想测试adc3与dma2功能,方法如下:
1,配置adc3和dma2:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF| RCC_APB2Periph_AFIO , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOF, &GPIO_InitStructure);
DMA_DeInit(DMA2_Channel5);//复位DMA通道5
DMA_InitStructure3.DMA_PeripheralBaseAddr = ADC3_DR_Address+1;
DMA_InitStructure3.DMA_MemoryBaseAddr = (u32)&ADCConvertedValue;
DMA_InitStructure3.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure3.DMA_BufferSize = 16384;
DMA_InitStructure3.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure3.DMA_MemoryInc = DMA_MemoryInc_Enable;//当前存储器地址不变
DMA_InitStructure3.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//定义外设数据宽度16位
DMA_InitStructure3.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //定义存储器数据宽度16位
DMA_InitStructure3.DMA_Mode = DMA_Mode_Circular;//DMA通道操作模式位环形缓冲模式
DMA_InitStructure3.DMA_Priority = DMA_Priority_High;//DMA通道优先级高
DMA_InitStructure3.DMA_M2M = DMA_M2M_Disable;//禁止DMA通道存储器到存储器传输
DMA_Init(DMA2_Channel5, &DMA_InitStructure3);
DMA_Cmd(DMA2_Channel5, ENABLE); //使能DMA通道5
DMA_ITConfig(DMA2_Channel5, DMA_IT_TC, ENABLE);
ADC_InitStructure3.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2工作在独立模式
ADC_InitStructure3.ADC_ScanConvMode = ENABLE; //使能扫描
ADC_InitStructure3.ADC_ContinuousConvMode = ENABLE;//ADC转换工作在单次模式
ADC_InitStructure3.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//定时器2的捕获比较2为转换外部触发
ADC_InitStructure3.ADC_DataAlign = ADC_DataAlign_Left;//转换数据右对齐
ADC_InitStructure3.ADC_NbrOfChannel = 2;//转换通道为通道1
ADC_Init(ADC3, &ADC_InitStructure3); //初始化ADC
ADC_RegularChannelConfig(ADC3, ADC_Channel_5, 1, ADC_SampleTime_1Cycles5 );
ADC_RegularChannelConfig(ADC3, ADC_Channel_6, 2, ADC_SampleTime_1Cycles5 );
ADC_DMACmd(ADC3, ENABLE);//使能ADC3模块DMA
ADC_Cmd(ADC3, ENABLE);//使能ADC3
ADC_ResetCalibration(ADC3); //重置ADC3校准寄存器
while(ADC_GetResetCalibrationStatus(ADC3));//等待ADC3校准重置完成
ADC_StartCalibration(ADC3);//开始ADC3校准
while(ADC_GetCalibrationStatus(ADC3));//等待ADC3校准完成
ADC_Cmd(ADC3, ENABLE);
ADC_SoftwareStartConvCmd(ADC3, ENABLE);
2,中断设定
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Channel4_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
3,写了一个很简单的中断程序
void DMA2_Channel4_5_IRQHandler(void)
{
//...........
}
4,测试结果有两个方面:一是发现dma2似乎没有工作,二是发现keil3.8里面调试时竟然没有dma2和adc3的寄存器,晕死我了。
然后我采用单次采样的方式测试adc3,能够取得数据(getadcconverter()之类函数),初步定为时dma2没有工作,郁闷啊郁闷,已经通宵到现在了,还是没有头绪。
请大侠看在我码了这些字的面子上,给我点有效的指导吧....... |