各位大侠,本人在用STM32F051R8T6 DMA方式实现采样ADC数据时,结果发现,从串口输出来的数值不对,一路数据很大,一路数据为零,弄了半天,也没有解决这个问题,只好请各位大侠们帮忙给看看,非常感谢! 【说明】:利用DMA中断方式,进行一路数据采集时是正常的。 相关源码如下: /* ADC1数据寄存器地址 */ #define ADC1_DR_Address 0x40012440 /* 宏定义 -------------------------------------------------------------*/ /* 变量定义 ---------------------------------------------------------*/ extern float AD_CH_1 = 0; extern float AD_CH_2 = 0 ; extern unsigned int ADC_Value[2]={0,0};//内存数组 /******************************************************************************* * 函数名称: ADC_GPIO_Init(); * 功能描述: ADC--GPIO输入引脚配置---在此可以设置16路外部输入通道 * 输入参数: void * 返回参数: 无 ********************************************************************************/ void ADC_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); } /******************************************************************************* * 函数名称: ADC_DMA_Reset() * 功能描述: ADC模块初始化 * 输入参数: void * 返回参数: 无 ********************************************************************************/ void ADC_DMA_Reset(void) { ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; ADC_DeInit(ADC1); //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 使能ADC1通道时钟 RCC_AHBPeriphClockCmd( RCC_AHBPeriph_DMA1 , ENABLE); // 使能DMA通道时钟 ADC_GPIO_Init(); //ADC-GPIO引脚初始化 ////////////////////////////////////////////////////////////////////////////////// /* DMA1 通道1配置设置*/ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address; //DMA对应的外设基地址 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_Value; //内存存储基地址,定义的一个数组 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //DMA转换模式为SRC模式,由外设搬移到内存 DMA_InitStructure.DMA_BufferSize = 2; // DMA缓存大小,2个(设置DMA在传输时缓冲区的长度) DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//接收一次数据后,设备地址禁止后移(设置DMA的外设递增模式) DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //关闭接收一次数据后,目标内存地址后移(设置DMA的内存递增模式) DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定义外设数据长度--16位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 循环模式开启,Buf写满后,自动回到初始地址开始传输 DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE); DMA_Cmd(DMA1_Channel1, ENABLE); // DMA1 Channel1 使能 ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular); // ADC DMA 配置在循环模式下面 //////////////////////////////////////////////////////////////////////////////////// ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //12位精度 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 连续转换模式 ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //转换由软件而不是外部触发启动 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据右对齐 ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward; //后前:0--18通道 ADC_Init(ADC1, &ADC_InitStructure); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor, ADC_SampleTime_239_5Cycles ); // ADC_TempSensorCmd(ENABLE); //使能内部温度传感器 // ADC_ChannelConfig(ADC1, ADC_Channel_Vrefint,ADC_SampleTime_239_5Cycles); //ADC_VrefintCmd(ENABLE); ADC_ChannelConfig(ADC1, ADC_Channel_8 , ADC_SampleTime_71_5Cycles ); ADC_ChannelConfig(ADC1, ADC_Channel_9 , ADC_SampleTime_71_5Cycles ); //////////////////////////////////////////////////////////////////////////////////////// ADC_GetCalibrationFactor(ADC1); // 开始ADC校准 ADC_Cmd(ADC1, ENABLE); // 使能指定的ADC1 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)); /* 等待ADC准备好 */ ADC_DMACmd(ADC1, ENABLE); // 使能 ADC_DMA ADC_StartOfConversion(ADC1); //开始温度转换; } DMA中断函数 void DMA1_Channel1_IRQHandler(void) { if(DMA_GetFlagStatus(DMA1_FLAG_TC1) != RESET ) //检测DMA1TC1标志 { Delay(50000); AD_CH_1 = (float)ADC_Value[0]; AD_CH_1 = AD_CH_1 /4096*3.3; AD_CH_2 = (float)ADC_Value[1]; AD_CH_2 = AD_CH_2/4096*3.3; DMA_ClearFlag(DMA1_FLAG_TC1);//清除DMA TC1标志 } } |
RE:【求助】STM32F0 ADC-DMA方式采集2路数据时出现问题 【悬赏问答】
RE:【求助】STM32F0 ADC-DMA方式采集2路数据时出现问题 【悬赏问答】
RE:【求助】STM32F0 ADC-DMA方式采集2路数据时出现问题 【悬赏问答】
RE:【求助】STM32F0 ADC-DMA方式采集2路数据时出现问题 【悬赏问答】
/*----------------------------------------------------------*\
| ADC Initialisation |
\*----------------------------------------------------------*/
void adc_Init (void) {
// GPIOA->CRL &= ~0x0000000F; /* set PIN1 analog input (see stm32_Init.c) */
RCC->AHBENR |= (1CPAR = (unsigned long)&(ADC1->DR); /* set chn1 peripheral address */
DMA1_Channel1->CNDTR = 3; /* transmit 3 words */
// DMA1_Channel1->CCR = 0x00002520; /* configure DMA channel 1 */
DMA1_Channel1->CCR = 0x000025A0; /* configure DMA channel 1 */
/* circular mode, memory increment mode */
/* memory & peripheral size 16bit */
/* channel priotity high */
DMA1_Channel1->CCR |= (1 APB2ENR |= (1SQR3 = (3
RE:【求助】STM32F0 ADC-DMA方式采集2路数据时出现问题 【悬赏问答】
回复:【求助】STM32F0 ADC-DMA方式采集2路数据时出现问题 【已解决】
unsigned int 变量改为_IO uint16后,就可以了。费了几天,还是出在一个小问题上。非常感谢!