本帖最后由 dipingzhu 于 2015-7-24 12:13 编辑
我用PA4和内部参考电压,作为ADC的二个通道,每个通道用单通道模式测试转换都是正确的,但是ADC和DMA参数改成多通道模式时结果不正确,为乱码。代码如下:
void ADC_Icc_Init(void) //ADC初始化,ADC连续转换模式
{
/* Enable ADC clock */
CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE); //开启ADC时钟
CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE); //DMA时钟
DMA_DeInit(DMA1_Channel1); //初始化DMA
/* de-initialize ADC */
ADC_DeInit(ADC1); //初始化ADC
/* ADC configured as follow:
- NbrOfChannel = 1 - ADC_Channel_2
- Mode = Single ConversionMode(ContinuousConvMode disabled)
- Resolution = 12Bit
- Prescaler = /1
- sampling time 159 */
ADC_VrefintCmd(ENABLE); //启用内部参考电压
delay_10us(3); //延时
ADC_DMACmd(ADC1,ENABLE); //启用ADC DMA请求
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE); //启用ADC
ADC_Init(ADC1, ADC_ConversionMode_Continuous,ADC_Resolution_12Bit, ADC_Prescaler_1);//初始化ADC1为,连续转换模式,12位AD转换,ADC时钟预分频为1
ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels,ADC_SamplingTime_9Cycles);//配置ADC为慢速通道,采样时间周期为9
ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels,ADC_SamplingTime_9Cycles);//配置ADC为,快速通道,采样时间周期为9
ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, ENABLE); //内部参考电压
ADC_ChannelCmd(ADC1, ADC_Channel_2, ENABLE); //ADC通道2使能
// SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0); //重新映射DMA通道的具体外围(ADC或TIM4)
DMA_Init(DMA1_Channel0, //通道0
(uint32_t)&ADC_ConvertedValue,//缓冲区地址
(uint16_t)ADC1_DR_Address, //ADC数据寄存器地址
DMA_BUF_SIZE, //缓冲区大小
DMA_DIR_PeripheralToMemory, //外设到内存
DMA_Mode_Circular, //循环转换
DMA_MemoryIncMode_Inc, //内存地址自增
DMA_Priority_High, //优先级为高
DMA_MemoryDataSize_HalfWord); //内存数据是半字位宽 16位
// DMA_SetCurrDataCounter(DMA1_Channel0,DMA_BUF_SIZE);//
/* Enable DMA1 channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE); //启用DMA使能通道
DMA_SetCurrDataCounter(DMA1_Channel0,DMA_BUF_SIZE);//
DMA_ITConfig(DMA1_Channel0,DMA_ITx_TC, DISABLE);//是否开启DMA中断
// DMA_ITConfig(DMA1_Channel0,DMA_ITx_HT, DISABLE);
DMA_GlobalCmd(ENABLE);//启用或禁用全部DMA
/* a short time of delay is required after enable ADC */
delay_10us(3); //延时
ADC_ITConfig(ADC1, ADC_IT_EOC,DISABLE); //开启ADC中断
// ADC_ClearFlag(ADC1, ADC_FLAG_EOC); //清除EOC标志,即:清除转换完成标志
ADC_SoftwareStartConv(ADC1); //开始ADC转换
}
这是读取通道转换后的值,代码如下
for(i=0;i<2;i++)
{
/* wait until end-of-covertion */
while( ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0 );
ADC_ConvertedValue=ADC_GetConversionValue(ADC1); //读取两个通道的转换结果
SendByte(USART1,ADC_ConvertedValue>>8);
SendByte(USART1,ADC_ConvertedValue);
}
|
|