请各位大侠指点下:
设置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);
}
估计是电路的问题吧!这个电流表是什么表啊,我想用示波器测,不过好像很不准,可能不怎么会用
不是硬件电路的问题,是我的程序问题。
注意最好在进入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();
}