baosong123 发表于 2018-8-18 16:13:05

stm32 ADC定时唤醒采集数据,工作一段时间adc值不变了

程序整体 是开机工作 采集数据,数据符合要求就进入stm32停机模式,同时开启rtc 2s的闹钟,闹钟唤醒后继续采集数据,判断数据情况在进入停机反复如此
现在问题是程序复位后可以正常采集 正常工作,但是不知道过多久,随机的,adc的数据就会停留在一个固定数值,不论我怎么调节模拟输入都无效
用仿真器查了dma 和数据buf 和adc的DR寄存器数值都一致,排除数据处理的问题,在adc这边数据已经不采集了不知道哪里的问题,求助大神们
adc 相关代码
#include "ADC_init.h"
u16 ADC_ConvertedValue={0,0};



void ADC_Configuration(void)

{

       ADC_InitTypeDef   ADC_InitStructure;   //定义adc结构体      
       DMA_InitTypeDef DMA_InitStructure;//定义dma结构体
       


           DMA_DeInit(DMA1_Channel1);        /* 将与 DMA 有关的寄存器设我初始值 */
/*定义 DMA 外设基地址, 这里的 ADC1_DR_Address 是用户自己定义的,即为存放转换结果的寄存器 ,他的作用
就是告诉 DMA 取数就到 ADC1_DR_Address 这里来取。*/
DMA_InitStructure.DMA_PeripheralBaseAddr =ADC1_DR_Address;

/*定义内存基地址,即告诉 DMA 要将从 AD 中取来的数放到 ADC_ConvertedValue 中 */
DMA_InitStructure.DMA_MemoryBaseAddr =(u32)&ADC_ConvertedValue;
/*定义 AD 外设作为数据传输的来源,即告诉 DMA 是将 AD 中的数据取出放到内存中,不能反过来*/
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
/*指定 DMA 通道的 DMA 缓存的大小,即告诉 DMA 开辟几个内存空间,由于我们只取通道 10 的 AD 数据所以只需
开辟一个内存空间*/
DMA_InitStructure.DMA_BufferSize = 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;

/*设定内存的的宽度*/
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

/*设定 DMA 工作再循环缓存模式,即告诉 DMA 要不停的搬运,不能偷懒*/
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

/*设定 DMA 选定的通道软件优先级*/
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
/* Enable DMA channel1,CPU 有好几个 DMA 秘书,现在只用 DMA1_Channel1 这个秘书*/
DMA_Cmd(DMA1_Channel1, ENABLE);

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;/*设置 ADC 工作在独立模式*/
ADC_InitStructure.ADC_ScanConvMode = ENABLE; /*单通道选择dis,多通道选择en*/
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; /*设定 AD 转化在连续模式*/
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        /*不使用外部chu发转换*/
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;/*采集的数据在寄存器中以右对齐的方式存放*/
ADC_InitStructure.ADC_NbrOfChannel = 2;        /*设定要转换的 AD 通道数目*/
ADC_Init(ADC1, &ADC_InitStructure);

//ADC_TempSensorVrefintCmd(ENABLE); //开启内部温度传感器

RCC_ADCCLKConfig(RCC_PCLK2_Div8); /*配置 ADC 时钟,为 PCLK2 的 8 分频,即 9MHz*/
ADC_RegularChannelConfig(ADC1, ADC_Channel_3,1, ADC_SampleTime_239Cycles5); /*配置 ADC1 的通道3为 55.5 个采样周期 ,负压传感*/
ADC_RegularChannelConfig(ADC1, ADC_Channel_9,2, ADC_SampleTime_239Cycles5); /*配置 ADC1 的通道9为 55.5 个采样周期 ,电池电压*/
ADC_DMACmd(ADC1, ENABLE);/* Enable ADC1 DMA */
ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 */
ADC_ResetCalibration(ADC1);/*复位校准寄存器 */

while(ADC_GetResetCalibrationStatus(ADC1));        /*等待校准寄存器复位完成 */

ADC_StartCalibration(ADC1);        /* ADC 校准 */

while(ADC_GetCalibrationStatus(ADC1));        /* 等待校准完成*/

ADC_SoftwareStartConvCmd(ADC1, ENABLE);/* 由于没有采用外部触发,所以使用软件触发 ADC 转换 */       

}





五哥1 发表于 2018-8-18 22:48:12

什么硬件?把内存再扩大一些,在一些关键节点加个延时看看

feixiang20 发表于 2018-8-18 23:14:44

是否超过数值限制了

jiekechoo 发表于 2018-8-19 09:36:49

我的STM32L152,第一次读取ADC数据正常,然后进入STOP模式后5分钟唤醒,再读ADC数据一直是第一次的数据。

baosong123 发表于 2018-8-20 10:56:17

我现在把 低功耗那块屏蔽了,工作了几个小时,没有出现adc 停机的情况,怀疑是频繁进入低功耗引起的

butterflyspring 发表于 2018-8-20 11:43:47

是不是ADC进入低功耗了,你可以尝试重新设置看看?

jiekechoo 发表于 2018-8-25 17:30:36

butterflyspring 发表于 2018-8-20 11:43
是不是ADC进入低功耗了,你可以尝试重新设置看看?

重新唤醒后,时钟挂了?

butterflyspring 发表于 2018-8-28 15:28:15

jiekechoo 发表于 2018-8-25 17:30
重新唤醒后,时钟挂了?

stop mode之后需要重新配置时钟呀

jiekechoo 发表于 2018-8-28 17:23:02

butterflyspring 发表于 2018-8-28 15:28
stop mode之后需要重新配置时钟呀

重新初始化?你搞过STOP模式吗?

butterflyspring 发表于 2018-8-29 11:47:19

jiekechoo 发表于 2018-8-28 17:23
重新初始化?你搞过STOP模式吗?

STOP mode唤醒之后就是MSI作为系统时钟,如果你之前不是用MSI,你不需要重新配置?


页: [1] 2
查看完整版本: stm32 ADC定时唤醒采集数据,工作一段时间adc值不变了