你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

急救呀!stm32f103cb,双ADC模式,同时规则模式,如何配置ADC2?

[复制链接]
zdhrlj 提问时间:2012-12-19 21:38 /
请各位帮我看看,我如下设置DMA及ADC后,DMA 32位DR数据到内存中,为什么只有低字节有数据,高字节全是零?
到底是那个地方有问题?请求帮助!!
 
 
void DMA_Configuration(void)
     {
   DMA_InitTypeDef DMA_InitStructure;
   //DMA1 channel1 configuration ----------------------------------------------
     DMA_DeInit(DMA1_Channel1);//将DMA1的通道1重新设置为缺省值
     DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)ADC1_DR_Address;//定义DMA外设基地址
     DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCValue;//定义DMA内存基地址
     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//规定外设是作为数据传输的目的地还是来源。DST=目的地/SRC=来源
     DMA_InitStructure.DMA_BufferSize = 6;//定义指定DMA通道的DMA缓存的大小,单位为数据单位。
     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//设定外设地址寄存器递增与否。Enable=外设地址寄存器递增/Disable=外设地址寄存器不变
     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//设定内存地址寄存器递增与否。Enable=内存地址寄存器递增/Disable=内存地址寄存器不变
     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//设定外设数据宽度。Byte=8位/HalfWord=16位/Word=32位
     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;////设定内存数据宽度。Byte=8位/HalfWord=16位/Word=32位
     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//设置DMA的CAN的工作模式。Circular=工作在循环缓存模式/Normal=工作在正常缓存模式
     DMA_InitStructure.DMA_Priority = DMA_Priority_High;//设置DMA通道的软件优先级。VeryHigh=非常高优先级 High=高优先级 Medium中优先级 Low低优先级
     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//设置DMA通道的内存到内存传输。Enable=通道设置为内存到内存传输/Disable=通道没有设置为内存到内存传输
     DMA_Init(DMA1_Channel1, &DMA_InitStructure);//   
   // Enable DMA1 channel1
     DMA_Cmd(DMA1_Channel1, ENABLE);//使能或者失能指定的DMA通道。使能DMA1的通道1
   while(DMA_GetFlagStatus(DMA1_FLAG_TC1));
       
   }
void ADC_Configuration(void)
     {
  
   ADC_InitTypeDef ADC_InitStructure;
 /*ADC1设置*/
   ADC_DeInit(ADC1);//复位
/* ADC1 configuration ------------------------------------------------------*/
     ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;//设置ADC工作在独立或者双ADC模式。ADC_Mode_Independent独立模式;ADC_Mode_RegSimult双模式
     ADC_InitStructure.ADC_ScanConvMode = ENABLE;//ENABLE模数转换工作在扫描模式(多通道);DISABLE模数转换工作在单次(单通道)模式。
      ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ENABLE连续转换模式;DISABLE单次转换模式
     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//设置外部触发来启动规则通道的模数转换。_None转换由软件而不是外部触发启动
     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//设置ADC数据左/右边对齐。_Right数据右边对齐   _Left数据左对齐
     ADC_InitStructure.ADC_NbrOfChannel = 2;//设置顺序进行规则转换的ADC通道的数目。取值范围1到16
     ADC_Init(ADC1, &ADC_InitStructure);//。在调用完ADC_InitStructure后必须调用ADC_RegularChannelConfig()来配置每个所使用通道的转换次序和采样时间
   /* ADC1 regular channel_0 configuration */
     ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
    
 /* ADC1 regular channel_1 configuration */
      ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5);//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
     
 /* Enable ADC1 DMA */
     ADC_DMACmd(ADC1, ENABLE);//使能或失能指定的ADC的DMA请求。
   /*ADC2设置*/
   ADC_DeInit(ADC2);//复位
   /* ADC1 configuration ------------------------------------------------------*/
     ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;//设置ADC工作在独立或者双ADC模式。ADC_Mode_Independent独立模式;ADC_Mode_RegSimult双模式
     ADC_InitStructure.ADC_ScanConvMode = ENABLE;//ENABLE模数转换工作在扫描模式(多通道);DISABLE模数转换工作在单次(单通道)模式。
      ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ENABLE连续转换模式;DISABLE单次转换模式
     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//设置外部触发来启动规则通道的模数转换。_None转换由软件而不是外部触发启动
     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//设置ADC数据左/右边对齐。_Right数据右边对齐   _Left数据左对齐
     ADC_InitStructure.ADC_NbrOfChannel = 2;//设置顺序进行规则转换的ADC通道的数目。取值范围1到16
     ADC_Init(ADC2, &ADC_InitStructure);//。在调用完ADC_InitStructure后必须调用ADC_RegularChannelConfig()来配置每个所使用通道的转换次序和采样时间
 /* ADC2 regular channel_8 configuration */
      ADC_RegularChannelConfig(ADC2, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
  
 /* ADC2 regular channel_9 configuration */
      ADC_RegularChannelConfig(ADC2, ADC_Channel_9, 2, ADC_SampleTime_239Cycles5);//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
    ADC_ExternalTrigConvCmd(ADC2, ENABLE);
 /* Enable ADC1 */
     ADC_Cmd(ADC1, ENABLE);//使能或失能指定的ADC。
   /* Enable ADC1 reset calibaration register */  
     ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器。1=初始化校准寄存器
   /* Check the end of ADC1 reset calibration register */
     while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态。0=校准寄存器已初始化
   /* Start ADC1 calibaration */
     ADC_StartCalibration(ADC1);//指定ADC的A/D校准。1=开始校准
   /* Check the end of ADC1 calibration */
     while(ADC_GetCalibrationStatus(ADC1));//获取指定的ADC校准状态。0=校准完成
 /* Enable ADC2 */
     ADC_Cmd(ADC2, ENABLE);//使能或失能指定的ADC。
   /* Enable ADC2 reset calibaration register */  
     ADC_ResetCalibration(ADC2);//重置指定的ADC的校准寄存器。1=初始化校准寄存器
   /* Check the end of ADC2 reset calibration register */
     while(ADC_GetResetCalibrationStatus(ADC2));//获取ADC重置校准寄存器的状态。0=校准寄存器已初始化
   /* Start ADC2 calibaration */
     ADC_StartCalibration(ADC2);//指定ADC的A/D校准。1=开始校准
   /* Check the end of ADC2 calibration */
     while(ADC_GetCalibrationStatus(ADC2));//获取指定的ADC校准状态。0=校准完成
   /* Start ADC1 Software Conversion */
     ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ENABLE使能或者失能指定的ADC的软件转换启动功能。开始转换规则通道。
   }
123.jpg
收藏 评论9 发布时间:2012-12-19 21:38

举报

9个回答
zykzyk-93033 回答时间:2012-12-19 22:01:20

RE:急救呀!stm32f103cb,双ADC模式,同时规则模式,如何配置ADC2?

你采集的是什么东西?建议你从串口打印出来看看。
回答时间:2012-12-20 09:31:08

RE:急救呀!stm32f103cb,双ADC模式,同时规则模式,如何配置ADC2?

首先,确定ADC采集的精度是多少?然后就知道你采集的结果最大值是多少了。
zdhrlj 回答时间:2012-12-20 10:40:41

回复:急救呀!stm32f103cb,双ADC模式,同时规则模式,如何配置ADC2?

回复第 3 楼 于2012-12-20 09:31:08发表:
首先,确定ADC采集的精度是多少?然后就知道你采集的结果最大值是多少了。 

ADC2下的转换通道的内容是0(通道输入的模拟量不是零V,读出的都是0),即使精度不好,起码也得有数据。
只有ADC1能读出数据
zdhrlj 回答时间:2012-12-20 10:43:27

RE:急救呀!stm32f103cb,双ADC模式,同时规则模式,如何配置ADC2?

如果把ADC双模式,改成ADC独立模式,循环扫描所设置的通道时,所设置的通道都能采集出数据来,但到改为双ADC模式后只能读出ADC1下通道的数据来。
luyihjye 回答时间:2013-10-22 11:42:19

回复:急救呀!stm32f103cb,双ADC模式,同时规则模式,如何配置ADC2?

看看
Aimifan 回答时间:2016-9-7 11:53:37
zdhrlj 发表于 2012-12-20 10:43
如果把ADC双模式,改成ADC独立模式,循环扫描所设置的通道时,所设置的通道都能采集出数据来,但到改为双AD ...

一样的问题,不知道咋办,能解决吗?
hake1 回答时间:2016-11-18 14:08:18
可以试试直接读取ADC1->DR的数据,最近也遇到这问题,好像出在DMA上。
tester-216570 回答时间:2016-12-24 22:04:55
刚刚碰到这个情况,需要在 ADC_SoftwareStartConvCmd(ADC1, ENABLE); 这句前面加上ADC_ExternalTrigConvCmd(ADC2, ENABLE);就可以了
醉翁001 回答时间:2017-10-13 10:57:08
楼主知道是什么问题了吗?我也遇到了相同的情况,能不能讲解一下呢?

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版