|
我采用4通道ADC,使用DMA传输,DMA传输完成DMA1_IT_TC1中断正常,就是DAC转换的结果全部为零。感觉是ADC的原因,或者是ADC与DMA的设置搭配不正常,单通道ADC采集正确,多通道加DMA数据就全为零了。有没有哪位大哥说说原因在哪,我的程序如下:
1、DMA中断程序:
void DMA1_Channel1_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_IT_TC1))
{
ADC_DMA_TRSMIT_OK = 1;
DMA_ClearITPendingBit(DMA1_IT_GL1);
}
}
2、DMA配置程序:
void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStucture;
/* DMA通道1配置 */
DMA_DeInit(DMA1_Channel1);
DMA_InitStucture.DMA_PeripheralBaseAddr = ((u32)0x4001244C);/* 在本应用中外设基地址是ADC的数据寄存器地址 */
DMA_InitStucture.DMA_MemoryBaseAddr = (u32)GuiAdcValue; /* 在本应用中内存地址是自定义的数组地址 */
DMA_InitStucture.DMA_DIR = DMA_DIR_PeripheralSRC;/* 指定外设为数据源(指定了数据传输方向) */
DMA_InitStucture.DMA_BufferSize = (ADC_VONVERTOR_CNT * ADC_INPUT_CHN_NUM);/* DMA拷贝长度 */
DMA_InitStucture.DMA_PeripheralInc = DMA_PeripheralInc_Disable;/* 外设地址增加禁止 */
DMA_InitStucture.DMA_MemoryInc = DMA_MemoryInc_Enable;/* 内存地址增加使能 */
DMA_InitStucture.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;/* 外设数据半字访问 */
DMA_InitStucture.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;/* 内存数据半字访问 */
DMA_InitStucture.DMA_Mode = DMA_Mode_Circular;/* 工作在循环缓存模式 */
DMA_InitStucture.DMA_Priority = DMA_Priority_High;
DMA_InitStucture.DMA_M2M = DMA_M2M_Disable;/* 内存向内存拷贝禁止 */
DMA_Init(DMA1_Channel1 , &DMA_InitStucture);
DMA_ITConfig(DMA1_Channel1 , DMA_IT_TC , ENABLE);
/* 允许DMA通道1*/
DMA_Cmd(DMA1_Channel1 , ENABLE);
}
3、ADC配置程序:
void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;/* ADC独立模式(非多个ADC控制器) */
ADC_InitStructure.ADC_ScanConvMode = ENABLE;/* 扫描转换模式 */
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;/* 连续转换模式 */
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;/* 非外部触发,由软件控制 */
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;/* 右对齐 */
ADC_InitStructure.ADC_NbrOfChannel = 4;/* 4路ADC通道进行转换 */
ADC_Init(ADC1,&ADC_InitStructure);
/* ADC1通道10、11、12、13配置为规则通道 */
ADC_RegularChannelConfig(ADC1 , ADC_Channel_10 , 1 , ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1 , ADC_Channel_11 , 2 , ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1 , ADC_Channel_12 , 3 , ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1 , ADC_Channel_13 , 4 , ADC_SampleTime_55Cycles5);
/* 允许 ADC1 进行 DMA 传输 (注:开启ADC的DMA功能时,需要DMA使能) */
ADC_DMACmd(ADC1 , ENABLE);
/* 使能 ADC1 */
ADC_Cmd(ADC1 , ENABLE);
/* 允许 ADC1 复位校准寄存器 */
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
/* 启动 ADC1 校准 */
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
/* 软件使能 ADC1 开始转换 */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
4、中断配置程序:
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
5、时钟使能程序:
void RCC_Config(void)
{
SystemInit();
/* 使能GPIO(A~C)|ADC1|USART1 时钟 */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB
| RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO
| RCC_APB2Periph_ADC1 | RCC_APB2Periph_USART1
, ENABLE );
/* 使能CAN时钟 */
//RCC_APB1PeriphClockCmd( RCC_APB1Periph_CAN1 , ENABLE );
/* 使能DMA时钟 */
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_DMA1 , ENABLE );
}
以上就是我的程序,我感觉配置的没有问题,可是工作就是不正常,在主函数的处理就不给出了,无非是查看中断标志之类的。现在我不知道原因在哪,已经整整1天半了,望哪位高手指明错误。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|