我采用ADC1单通道,连续转换模式,DMA传送转换值,读出来的数字电压值都没超过255是什么原因啊,第一次求助。。

2019-08-17 05:16发布

[mw_shl_code=c,true] int main(void) { delay_init(); //延时函数初始化 uart_init(9600); //串口初始化为9600 LED_Init(); //初始化与LED连接的硬件接口 LCD_Init(); Adc_Init(); //ADC初始化 POINT_COLOR=RED;//设置字体为红 {MOD} LCD_Clear(LGRAY); BACK_COLOR=LGRAY; LCD_DrawLine(220, 0, 220, 320); LCD_DrawLine(20, 0, 20, 320); ADC_RegularChannelConfig(ADC1, 1, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能 // MYDMA_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)buff,320); // MYDMA_Config(DMA1_Channel1,ADC1_DR_Address,(u32)&buff2,1); printf("初始化/r/n"); while(1) { // Collect(320); // MYDMA_Config(DMA1_Channel1,ADC1_DR_Address,(u32)&buff2,1); ADC_DMACmd(ADC1, ENABLE); MYDMA_Enable(DMA1_Channel1); while(DMA_GetFlagStatus(DMA1_FLAG_TC1)==RESET);//等待通道4传输完成 DMA_ClearFlag(DMA1_FLAG_TC1);//清除通道4传输完成标志 printf("%d ",buff2); // Dispaly(320); // delay_ms(10); //界面保留一段时间 // LCD_Fill(21,0,219,320,LGRAY); } } [/mw_shl_code] [mw_shl_code=c,true][/mw_shl_code] [mw_shl_code=c,true]u16 DMA1_MEM_LEN; void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr) { DMA_InitTypeDef DMA_InitStructure;    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输   DMA_DeInit(DMA_CHx);   //将DMA的通道1寄存器重设为缺省值 DMA1_MEM_LEN=cndtr; DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMA外设ADC基地址 DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA内存基地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //数据传输方向,外设是源地址 DMA_InitStructure.DMA_BufferSize = cndtr;  //DMA通道的DMA缓存的大小 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_MemoryDataSize_HalfWord;  //数据宽度为16位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //数据宽度为16位 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //工作在循环模式 DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //DMA通道 x拥有中优先级  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输 DMA_Init(DMA_CHx, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器   }  [/mw_shl_code] [mw_shl_code=c,true][/mw_shl_code] [mw_shl_code=c,true]void  Adc_Init(void) { ADC_InitTypeDef ADC_InitStructure;  GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE );  //使能ADC1通道时钟   RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M //PA1 作为模拟通道输入引脚                          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚 GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //模数转换工作在单次转换模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目 ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器       ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1 ADC_ResetCalibration(ADC1); //使能复位校准     while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束 ADC_StartCalibration(ADC1); //开启AD校准   while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束   // ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能 }    [/mw_shl_code] [mw_shl_code=c,true][/mw_shl_code] [mw_shl_code=c,true][/mw_shl_code] http://www.openedv.com/posts/list/0/24464.htm#357081 另外这位大哥的代码 我下进去两个通道读出来的值都是0。。。我也是MINI开发板。你们下下试试。。要是和我不一样 估计就是我的ADC坏了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
菜鸟520
1楼-- · 2019-08-17 07:15
.回复【2楼】lycreturn:
---------------------------------
终于看见错误了太粗心了。。只顾复制粘贴,, DMA_InitStructure.DMA_PeripheralDataSize = DMA_MemoryDataSize_HalfWord;  这里的外设数据位被我赋值成了内存地址数据位。。。。。
lycreturn
2楼-- · 2019-08-17 08:42
DMA 传输数据位宽没设置吧,  默认8位位宽
菜鸟520
3楼-- · 2019-08-17 14:37
回复【2楼】lycreturn:
---------------------------------
设置了啊 16位宽
菜鸟520
4楼-- · 2019-08-17 14:47
 精彩回答 2  元偷偷看……
菜鸟520
5楼-- · 2019-08-17 19:39
发现一个现象,,用单次转换模式,读出的结果就是正确的。一用连续转换模式+DMA就出现 读出的电压值都未超过255(接在3.3V电压。。显示的值就是255).。。纠结两天了。。还是没看出什么原因啊。。。。
菜鸟520
6楼-- · 2019-08-17 22:32
这么一个小错误检查了两天才排查出来。。。该打啊,,还以为是ADC坏了。。。真的该打啊。。。

一周热门 更多>