STM32
直播中

陈超

7年用户 910经验值
私信 关注
[问答]

调试STM32的adc单通道DMA传输时,DMA传输后就出现值变了的原因?

这次在调试STM32的adc单通道DMA传输时出现了一个很大的问题。

直接去读取ADC的DR是没问题的,但是过来DMA传输后就出现值变了。

  •   printf("ADC_ConvertedValue=%d  ",ADC_ConvertedValue);
  •   printf("ADC1->DR=%d  ",ADC1->DR);

打印出的数据如下:ADC_ConvertedValue的值一直不变,且是错误。

  • ADC_DMACmd(ADC1,ENABLE);

  •         ADC_Cmd(ADC1, ENABLE);

  • //  ADC_ExternalTrigConvCmd(ADC1, ENABLE);//设置外部触发模式使能(这个“外部“其实仅仅是相对于ADC模块的外部,
  •         ADC_SoftwareStartConvCmd(ADC1, ENABLE);//设置软件触发模式使能(这个“外部“其实仅仅是相对于ADC模块的外部,

  •         ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1,ADC_Sampletime_55Cycles5);//ADC通道采样周期配置

  •   ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器

  •          while( ADC_GetResetCalibrationStatus(ADC1) );  //等待重新校准完成

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

  •   while(ADC_GetCalibrationStatus(ADC1));     //等待校准完成  ADC_CAL=0;

  •   ADC_SoftwareStartConvCmd(ADC1, ENABLE); //连续转换开始,ADC通过DMA方式不断的更新RAM区。
  •         ADC_DMACmd(ADC1,ENABLE);   //ADC命令,使能  ADC_ADON=1
  •   //ADC_SWSTART=1 开始规则转换 切记 软件触发也属于外部事件  要设置  ADC_EXTTRIG=1


ADC,DMA使能

  • DMA_Cmd(DMA1_Channel1, ENABLE);        //DMA使能
  •   DMA_ITConfig(DMA1_Channel1,DMA_IT_TC, ENABLE);//使能传输完成中断

从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);  ****/

回帖(1)

黄勇

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

或者把DMA缓存大小改成1

还是建议跑一下官方标准函数库自带的样例程序吧,“STM32F10x_StdPeriph_Lib_V3.5.0ProjectSTM32F10x_StdPeriph_ExamplesADCADC1_DMA”
举报

更多回帖

发帖
×
20
完善资料,
赚取积分