OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2814|回复: 7

关于STN32F103睡眠后ADC通道数据错乱问题

[复制链接]

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-11-6
在线时间
9 小时
发表于 2017-11-6 11:43:10 | 显示全部楼层 |阅读模式
1金钱
各位大神,我最近在做低功耗,用的是串口中断唤醒,SLEEP,模式睡眠。ADC采用DMA多通道采集,我这里用了9个通道,但是在睡眠之前把ADC使能关闭,唤醒后再次使能后应该是通道123的数据会在通道456,或者其它的通道出现。实在是不知道什么原因,大家讨论指点一下。不甚感激。

最佳答案

查看完整内容[请看2#楼]

是不是应该在检测到 产生DMA传输完成中断 以后 再去关ADC,不然DMA传输到一半就停了,或者你唤醒后把DMA初始化一下,只是个人猜测
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2017-11-6 11:43:11 | 显示全部楼层
是不是应该在检测到 产生DMA传输完成中断 以后 再去关ADC,不然DMA传输到一半就停了,或者你唤醒后把DMA初始化一下,只是个人猜测
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-11-6
在线时间
9 小时
 楼主| 发表于 2017-11-6 11:56:03 | 显示全部楼层
不能沉,不能沉,不能沉
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-11-6
在线时间
9 小时
 楼主| 发表于 2017-11-6 14:09:22 | 显示全部楼层
有人吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-11-7 00:53:33 | 显示全部楼层
帮顶
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-11-6
在线时间
9 小时
 楼主| 发表于 2017-11-7 09:29:10 | 显示全部楼层
void low_power(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All_NOUART;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AIN;   
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  //PB0/1 ??????????
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All_NOLED;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AIN;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  TIM_Cmd(TIM2, DISABLE);
  TIM_Cmd(TIM4, DISABLE);
  ADC_DMACmd(ADC1, DISABLE); //ʹÄÜADC1µÄDMA´«Ê䣬ADC_CR2λ8
////    ADC_SoftwareStartConvCmd(ADC1, DISABLE);//Èí¼þÆô¶¯ADת»»
  ADC_Cmd(ADC1, DISABLE); //ʹÄܵÄADC1,ADC_CR2λ0
///////////////////////上面是睡眠前准备,关闭不用的IO,以及定时器
  __wfi();
  Sys_Sleepy();//开始睡眠
// ADC_DMACmd(ADC1, ENABLE); //ʹÄÜADC1µÄDMA´«Ê䣬ADC_CR2λ8
     
//  ADC_Cmd(ADC1, ENABLE); //ʹÄܵÄADC1,ADC_CR2λ0
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//Èí¼þÆô¶¯ADת»»
  TIM_Cmd(TIM2, ENABLE);
  TIM_Cmd(TIM4, ENABLE);


/*---------------------------下面是恢复----------------------------*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  //Ä£ÄâÊäÈëÒý½Å
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //??????
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  ADC_DMACmd(ADC1, ENABLE); //ʹÄÜADC1µÄDMA´«Ê䣬ADC_CR2λ8
   
    ADC_Cmd(ADC1, ENABLE); //ʹÄܵÄADC1,ADC_CR2λ0
  //PB0/1 ??????????
//  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //??????
//  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin = LED_ERROR|LED_COMM;        
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(ERRO_PORT, &GPIO_InitStructure);
  GPIO_SetBits(ERRO_PORT,LED_ERROR);  
}
//这里是串口唤醒后开启AD
   void USART1_IRQHandler(void)
{
  // RX
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {modbus_rx_buff[MB_rx_offset] = USART_ReceiveData(USART1);
  {              if((modbus_rx_buff[0] == BROADCAST_ADDR)||(modbus_rx_buff[0] ==MB_device_addr_by_setting))
{
MB_rx_offset++;

timer = TIMOUT;
    if(MB_rx_offset<=1)
  {
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE);
}
TIM_Cmd(TIM3, ENABLE);
USART_ClearITPendingBit(USART1,USART_IT_RXNE);

}
}

回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-11-6
在线时间
9 小时
 楼主| 发表于 2017-11-7 09:29:43 | 显示全部楼层
wxjhby 发表于 2017-11-7 08:32
是不是应该在检测到 产生DMA传输完成中断 以后 再去关ADC,不然DMA传输到一半就停了,或者你唤醒后把DMA初 ...

嗯,好主意,我试试,多谢
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-11-6
在线时间
9 小时
 楼主| 发表于 2017-11-7 10:00:40 | 显示全部楼层
多谢大家的讨论,问题解决了,因为用串口唤醒,也许在他没有睡眠的时候串口有数据这样就有初始化了一次,这样在没有失能在初始化,就造成了数据通道错乱,我加了睡眠标志位,睡眠后再串口中再唤醒,数据正常,这是我的逻辑不严谨总成。惭愧!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-7 21:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表