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

STM32f1系列ADC DMAc传输

[复制链接]
ho 提问时间:2019-4-8 22:30 /
这次在调试STM32的adc单通道DMA传输时出现了一个很大的问题。

直接去读取ADC的DR是没问题的,但是过来DMA传输后就出现值变了。
  1.   printf("ADC_ConvertedValue=%d  ",ADC_ConvertedValue);
  2.   printf("ADC1->DR=%d  ",ADC1->DR);
复制代码
打印出的数据如下:ADC_ConvertedValue的值一直不变,且是错误。
E0DG]@030T8~CEFS4GUOKXM.png
  1. ADC_DMACmd(ADC1,ENABLE);
  2.        
  3.         ADC_Cmd(ADC1, ENABLE);  
  4.        
  5. //  ADC_ExternalTrigConvCmd(ADC1, ENABLE);//设置外部触发模式使能(这个“外部“其实仅仅是相对于ADC模块的外部,
  6.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);//设置软件触发模式使能(这个“外部“其实仅仅是相对于ADC模块的外部,

  7.         ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1,ADC_SampleTime_55Cycles5);//ADC通道采样周期配置
  8.        
  9.   ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器
  10.        
  11.         while( ADC_GetResetCalibrationStatus(ADC1) );  //等待重新校准完成

  12.   ADC_StartCalibration(ADC1);  //开始校准  ADC_RSTCAL=1; 初始化校准寄存器

  13.   while(ADC_GetCalibrationStatus(ADC1));     //等待校准完成  ADC_CAL=0;  
  14.   
  15.   ADC_SoftwareStartConvCmd(ADC1, ENABLE); //连续转换开始,ADC通过DMA方式不断的更新RAM区。
  16.         ADC_DMACmd(ADC1,ENABLE);   //ADC命令,使能  ADC_ADON=1
  17.   //ADC_SWSTART=1 开始规则转换 切记 软件触发也属于外部事件  要设置  ADC_EXTTRIG=1
复制代码

ADC,DMA使能
  1. DMA_Cmd(DMA1_Channel1, ENABLE);        //DMA使能
  2.   DMA_ITConfig(DMA1_Channel1,DMA_IT_TC, ENABLE);//使能传输完成中断
复制代码
2]~0EDKF9SNIIY}C)ZDRMRE.png

上两图是DMA配置以及调用。

从DR可以读到数据中ADC是没问题的。就是DMA传输到内存那一块出现问题,指向的内存地址都是不变的。

附上工程
另外外部晶振是12m,做了配置了
/*****外部晶振为12M,修改stm32f10x.h中的HSE_VALUE预定义为((uint32_t)12000000)
SetSysClockTo72()中配置修改为:
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |  RCC_CFGR_PLLMULL));  
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6);  ****/

STM32f1.rar

下载

4.81 MB, 下载次数: 3, 下载积分: ST金币 -1

收藏 评论6 发布时间:2019-4-8 22:30

举报

6个回答
七哥 回答时间:2019-4-9 00:08:03
本帖最后由 toofree 于 2019-4-9 00:30 编辑

第一次见这么玩的,你DMA开了128的DMA缓存;
你却不把DMA缓存的地址给进去,而是给了个ADC_ConvertedValue,这种用法本身就不对,程序不跑飞不不错了;
你得把DMA缓存EGCBuff赋进去,然后从这128个逐个取数啊。

或者把DMA缓存大小改成1

还是建议跑一下官方标准函数库自带的样例程序吧,“STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\ADC\ADC1_DMA”



评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

yulanhao 回答时间:2019-4-9 19:04:45
你就配置了一个通道??这还需要DMA嘛?
ho 回答时间:2019-4-9 21:29:46
toofree 发表于 2019-4-9 00:08
第一次见这么玩的,你DMA开了128的DMA缓存;
你却不把DMA缓存的地址给进去,而是给了个ADC_ConvertedValue ...

我在DMA中给的地址就是&ADC_ConvertedValue,EGCBUFF是我在内存在开辟的一个数组呀。
ho 回答时间:2019-4-9 21:30:32
yulanhao 发表于 2019-4-9 19:04
你就配置了一个通道??这还需要DMA嘛?

实时传输,这样我cpu就不用在去管他了
Kevin_G 回答时间:2019-4-10 15:01:58
DMA配错了吧?

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

ho 回答时间:2019-4-10 20:41:12

那要怎么配置,哪里出问题了

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版