stm32f103 stop 低功耗测量值偏高

2019-03-23 18:02发布

请各位大侠指点下:
设置IO的中断输入触发方式为falling 触发;
电路:使用ldo产生3.3V供电给stm32f103rbt6,最小系统,reset电路;boot0 通过10kohm电阻下拉到GND;Vbat未连接;VDD1-VDD2-VDD3_Vdd4以及VDDA都是连接到3.3V 上;无外部crystal;
测量方法:测量位置是3.3V进入mcu最小系统串接进去的
测量工具:电流表ua tester QH-05 Ver 1.5,配合的万用表是 victor VC890D 使用200mv档;

软件测试
系统上电后进入systeminit(),设置时钟是HSI;--->
初始化一个gpioB.9作为输出,驱动LED点亮指示;--->
初始化一个GPIOB.6作为输出中断,进入stop模式使用---->
在while(1)中,执行LED_ON(LED_NO_1);---->
在EXTI中断函数中,LED_OFF(LED_NO_1),且执行Enter_StopMode(),
Enter_StopMode()__--->>
1、在进入stop模式前,GPIO设置为AIN模式;
2、关闭所有时钟GPIO、AFIO、SRAM以及FLITF时钟,但是使能PWR_Regulator clock
3、disable flash prefetch buffer;
4、进入low power 的stop 模式。PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
测试结果:
可以进入stop模式,我用led灯指示,进入后led熄灭。
测量的电流时0.4mA。为什么还这么高?
附code:
/********************************* STOP MODE **********************************/  
void Stop_MODE(void)
{
  /* Config the GPIO on Analog Input mode  disable all gpio clock and afio*/
  GPIO_Config_ALL_AIN();

  /* Desable the SRAM and FLITF clock in Stop mode */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SRAM|RCC_AHBPeriph_FLITF, DISABLE);

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); // Enable PWR clock
         
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Disable);    // Disable Prefetch Buffer
        FLASH_SetLatency(FLASH_Latency_0);    // Flash 0 wait state
        
    /* Mode: STOP + Regulator in low power mode + Entry with WFI */
        PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
}

static void GPIO_Config_ALL_AIN(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  
  /* Disable the Serial Wire Jtag Debug Port SWJ-DP */
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
      /* PB  */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
      /* PC  */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
        /* PD  */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA   | RCC_APB2Periph_GPIOB
                         | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD| RCC_APB2Periph_AFIO
                         , DISABLE);
                                                                                                
        RCC_HSICmd(DISABLE);
        RCC_LSICmd(DISABLE);
        RCC_HSEConfig(RCC_HSE_OFF);
        ADC_Cmd(ADC1,DISABLE);
        ADC_Cmd(ADC2,DISABLE);
}
        
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
hugo0chen
2019-03-24 03:38
不是硬件电路的问题,是我的程序问题。
注意最好在进入stop模式前关闭systick功能,我没有这么做的时候会有进入stop模式,然后就会被唤醒的情况发生。因为stop模式允许any exti interrupt唤醒。
使用外部中断PB6和PB8唤醒stop模式的mcu。
static void STOP_EXTI_Configuration(void)
{
  EXTI_InitTypeDef EXTI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
         
        //--------lock pile bike trig-----
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6);

  EXTI_ClearITPendingBit(EXTI_Line6);
  EXTI_InitStructure.EXTI_Line = EXTI_Line6;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
  
        //--------key wake up trig------
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);
       
        EXTI_ClearITPendingBit(EXTI_Line8);
  EXTI_InitStructure.EXTI_Line = EXTI_Line8;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
}


static void STOP_NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* 2 bits for Preemption Priority and 2 bits for Sub Priority */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
       
        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  /* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
}
void Stop_Mode(void)
{
       
        // RCC configration
        STOP_RCC_Configuration();
        /* Enable PWR and BKP clock */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
       
        //Config the GPIO on Analog Input mode  disable all gpio clock and afio
   GPIO_Config_ALL_AIN();
       
        /* Config the EXTI to wake up from STOP Mode */
  STOP_EXTI_Configuration();
       
        /* NVIC configuration */
  STOP_NVIC_Configuration();

  // Desable the SRAM and FLITF clock in Stop mode  
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SRAM|RCC_AHBPeriph_FLITF, DISABLE);
       
        wakeupflag  = 0;       
        systick_disable();
        // Mode: STOP + Regulator in low power mode + Entry with WFI  
        PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
               
        wakefromstopinitdrivers();
               
        wakeupflag = 1;
}
还有一个问题就是,唤醒后,如果理解将外部耗电大的设备打开,会导致reset的发生。
比如我在程序中,init_tts()和init_ble()的时候,如果没有delay操纵,在唤醒后执行的wakeupflag
的值将是reset的值,wakeflag=0.但是如果在下面的方式,增加delay后,就不会出现这问题。
void wakefromstopinitdrivers(void){
       
        SystemInit();
        RCC_Configuration();
        __disable_irq();
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
        init_led();       
        init_do();
        init_adc();       
        init_usart();
        init_nrf24l01();
        //init_oled();
        init_rfid();
        Delay_nms(100);---
        init_ble();---
        init_tts();--
        init_di();
        __enable_irq();
       
}

一周热门 更多>