本帖最后由 liyancao001 于 2017-3-11 16:36 编辑
我让单片机一直连续运行,转换6个通道,DMA中设置的数组长度是78,也就是转换13个循环后产生DMA中断。DMA把结果存到BUFFER[13][6]的数组中。
问题是BUFFER[0][0]数据与我6个通道的哪个数据都对应不上,而BUFFER[0][1]对应1通道,BUFFER[0][2]对应2通道。。。。BUFFER[1][0]对应6通道。BUFFER[1][1]对应1通道.。。。后面的也都能对应上。
这样有两个问题,一直对应上偏移了一位,理论应该是BUFFER[0][1]对应2通道,而现在是对应1通道。二是第一个数据跟哪个通道的数据都对应不上。。。。
下面附上代码:#define ADC1_DR_ADDRESS ((uint16_t)0x5344)
#define BUFFER_SIZE ((uint8_t) 0x4E) //((uint8_t) 0x06)
#define BUFFER_ADDRESS ( (uint32_t)(&Buffer))
void ADC1_Init(void)
{
ADC1_GPIO_Config(); //ADO 端口设置
CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE); //时钟使能
ADC_DeInit(ADC1);
ADC_Init(ADC1,ADC_ConversionMode_Continuous,ADC_Resolution_12Bit,ADC_Prescaler_1);
ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels,ADC_SamplingTime_384Cycles);
ADC_VrefintCmd(DISABLE); //禁止内部电压基准源
ADC_ChannelCmd(ADC1,ADC_Channel_11, ENABLE); //温度 室温下一般AD值在1700-1800之间
ADC_ChannelCmd(ADC1,ADC_Channel_12, ENABLE);
ADC_ChannelCmd(ADC1,ADC_Channel_13, ENABLE);
ADC_ChannelCmd(ADC1,ADC_Channel_14, ENABLE);
ADC_ChannelCmd(ADC1,ADC_Channel_15, ENABLE);
ADC_ChannelCmd(ADC1,ADC_Channel_16, ENABLE);
ADC_DMACmd(ADC1, ENABLE); //ADC_DMA使能
ADC_Cmd(ADC1,ENABLE); //ADC使能
}
void DMA1_Init(void)
{
CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);
SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0);
DMA_GlobalDeInit();
DMA_Init(DMA1_Channel0, BUFFER_ADDRESS,
ADC1_DR_ADDRESS,
BUFFER_SIZE, //与AD通道相关
DMA_DIR_PeripheralToMemory,
DMA_Mode_Circular,
DMA_MemoryIncMode_Inc,
DMA_Priority_High,
DMA_MemoryDataSize_HalfWord );
DMA_Cmd(DMA1_Channel0, ENABLE); //DMA Channel0 enable
DMA_ITConfig(DMA1_Channel0, DMA_ITx_TC, ENABLE); // Enable DMA1 channel0 Transfer complete interrupt
DMA_GlobalCmd(ENABLE); //DMA enable
}
INTERRUPT_HANDLER(DMA1_CHANNEL0_1_IRQHandler,2)
{
unsigned char i=0;
IWDG_ReloadCounter();
// DMA_GlobalCmd(DISABLE); //DMA enable
ADC_Cmd(ADC1,DISABLE); //ADC使能
if(DMA_GetFlagStatus(DMA1_FLAG_TC0)!= RESET)
{
if(AD_Finish_Flag==0)//必须在处理函数结束以后才能刷新数据。
{
for(i=0;i<13;i++)
{
sum0=Buffer[0]; //此值应对应通道AD11,但实际对应通道AD16
sum1=Buffer[1]; //此值应对应通道AD12,但实际对应通道AD11
sum2=Buffer[2]; //此值应对应通道AD13,但实际对应通道AD12
sum3=Buffer[3]; //此值应对应通道AD14,但实际对应通道AD13
sum4=Buffer[4]; //此值应对应通道AD15,但实际对应通道AD14
sum5=Buffer[5]; //此值应对应通道AD16,但实际对应通道AD15
}
AD_Finish_Flag=1;
}
} //每个周期转换13次,分别存储在sunx[0]--sunx[12]中
DMA_ClearITPendingBit(DMA1_IT_TC0);
}
定时器中还有这一段相关的代码,这里是控制AD转换开始的
if(AD_Run_Time<25){AD_Run_Time++;}
else
{
disableInterrupts();
DMA1_Init();
ADC1_Init();
enableInterrupts();
ADC_SoftwareStartConv(ADC1);
AD_Run_Time=0;
}
|