USART从低功耗模式唤醒STM32F0

发布者:陈熙琼最新更新时间:2019-03-29 来源: eefocus关键字:USART  低功耗模式  唤醒  STM32F0 手机看文章 扫描二维码
随时随地手机看文章

STM32F0的低功耗模式

详细内容见参考手册—Power control (PWR)


在STM32应用中,为了降低功耗共有以下三种工作模式:


Sleep mode 

CPU clock off, all peripherals including ARM® Cortex®-M0 core peripherals like NVIC, SysTick, etc. are kept running.. 

In Sleep mode, only the CPU is stopped. All peripherals continue to operate and can wake up the CPU when an interrupt/event occurs.

Stop mode 

all clocks are stopped 

(Stop mode achieves very low power consumption while retaining the content of SRAM and registers. All clocks in the 1.8 V domain are stopped, the PLL, the HSI RC and the HSE crystal oscillators are disabled. The voltage regulator can also be put either in normal or in low power mode. 

The device can be woken up from Stop mode by any of the EXTI lines. The EXTI line source can be one of the 16 external lines and RTC.)

Standby mode 

1.8V domain powered-off 

The Standby mode is used to achieve the lowest power consumption. The internal 

voltage regulator is switched off so that the entire 1.8 V domain is powered off. The 

PLL, the HSI RC and the HSE crystal oscillators are also switched off. After entering Standby mode, SRAM and register contents are lost except for registers in the RTC domain and Standby circuitry. 

The device exits Standby mode when an external reset (NRST pin), an IWDG reset, a rising edge on the WKUP pins, or an RTC event occurs.

备注: 

The RTC, the IWDG, and the corresponding clock sources are not stopped by entering Stop or Standby mode.


另外,在正常工作模式(Run mode)下,可以通过以下方法有效降低功耗:


降低系统时钟(system clocks)


关闭不需要的APB和AHB外设时钟


三种低功耗模式对比 


Low-power mode summary


官网参考资料

STM32F0-参考手册–>6 Power control (PWR) 

RM0360 Reference manual STM32F030x4/x6/x8/xC and STM32F070x6/xB 

STM32F0-数据手册–>3.5 Power management 

DS9773 STM32F030x4 STM32F030x6 STM32F030x8 

STM32F0-编程手册–>2.5 Power management 

PM0215 STM32F0xxx单片机编程手册 

STM32F0-应用笔记 

如何使用USART或LPUART从低功耗模式唤醒STM32F0 / F3 / L0 / L4微控制器


官方参考代码

应用平台:STM32F030


main.c


#include "stm32f0xx.h"

/* Private variables ---------------------------------------------------------*/

uint8_t DataReceived = 0;

extern __IO uint8_t InterruptCounter;

/* Private function prototypes -----------------------------------------------*/

static void USART_Config(void);

static void WakeUp_StartBitMethod(void);

static void RestoreConfiguration(void);


/**

  * @brief   Main program

  * @param  None

  * @retval None

  */

int main(void)

{    

  /* Initialize LEDs available  ***********************************************/

  STM_EVAL_LEDInit(LED);


  /* USART configuration */

  USART_Config();


  /* Wake up from USART STOP mode by Start bit Method */

  WakeUp_StartBitMethod();


  /* Configure SystemClock*/

  RestoreConfiguration();


  /* Configure and enable the systick timer to generate an interrupt each 1 ms */

  SysTick_Config((SystemCoreClock / 1000));


  while (1)

  {}

}


/**

  * @brief  Start Bit Method to Wake Up USART from Stop mode Test.

  * @param  None

  * @retval None

  */

static void WakeUp_StartBitMethod(void)

  /* Configure the wake up Method = Start bit */ 

  USART_StopModeWakeUpSourceConfig(USART1, USART_WakeUpSource_StartBit);


  /* Enable USART1 */ 

  USART_Cmd(USART1, ENABLE);


  /* Before entering the USART in STOP mode the REACK flag must be checked to ensure the USART RX is ready */

  while(USART_GetFlagStatus(USART1, USART_FLAG_REACK) == RESET)

  {}


  /* Enable USART STOP mode by setting the UESM bit in the CR1 register.*/

  USART_STOPModeCmd(USART1, ENABLE);


  /* Enable the wake up from stop Interrupt */ 

  USART_ITConfig(USART1, USART_IT_WU, ENABLE);   


  /* Enable PWR APB clock */

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);


  /* Enter USART in STOP mode with regulator in low power mode */

  PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);


  /* Waiting Wake Up interrupt */

  while(InterruptCounter == 0x00)

  {}


  /* Disable USART peripheral in STOP mode */ 

  USART_STOPModeCmd(USART1, DISABLE);


  while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)

  {}

  DataReceived = USART_ReceiveData(USART1);


  /* Clear the TE bit (if a transmission is on going or a data is in the TDR, it will be sent before efectivelly disabling the transmission) */

  USART_DirectionModeCmd(USART1, USART_Mode_Tx, DISABLE);


  /* Check the Transfer Complete Flag */

  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)

  {}


  /* USART Disable */

  USART_Cmd(USART1, DISABLE);

}


/**

  * @brief Configure the USART Device

  * @param  None

  * @retval None

  */

static void USART_Config(void)

  USART_InitTypeDef USART_InitStructure;

  GPIO_InitTypeDef GPIO_InitStructure; 

  NVIC_InitTypeDef NVIC_InitStructure;


  /* Enable GPIO&USART clock */

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA , ENABLE);  

  RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);


  /* Configure the HSI as USART clock */

  RCC_USARTCLKConfig(RCC_USART2CLK_HSI);


  /* USARTx Pins configuration **************************************************/  

  /* Connect pin to Periph */

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);    

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1); 


  /* Configure pins as AF pushpull */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

  GPIO_Init(GPIOA, &GPIO_InitStructure); 


  /* USARTx configured as follow:

  - BaudRate = 115200 baud  

  - Word Length = 8 Bits

  - Stop Bit = 1 Stop Bit

  - Parity = No Parity

  - Hardware flow control disabled (RTS and CTS signals)

  - Receive and transmit enabled

  */


  USART_DeInit(USART1);

  USART_InitStructure.USART_BaudRate = 115200;

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;

  USART_InitStructure.USART_StopBits = USART_StopBits_1;

  USART_InitStructure.USART_Parity = USART_Parity_No;

  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_Init(USART1, &USART_InitStructure);


  /* USART2 IRQ Channel configuration */

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPriority = 0x01;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

}


/**

  * @brief  Restore peripheral config before entering STOP mode.

  * @param  None

  * @retval None

  */

static void RestoreConfiguration(void)

{

  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;


  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/    

  /* Enable HSE */    

  RCC_HSEConfig(RCC_HSE_ON);


  /* Wait till HSE is ready and if Time out is reached exit */

  HSEStatus = RCC_WaitForHSEStartUp();


  if (HSEStatus == (uint32_t)0x01)

  {

    /* Enable Prefetch Buffer */

    FLASH_SetLatency(FLASH_Latency_1);


    /* HCLK = SYSCLK */

    RCC_HCLKConfig(RCC_SYSCLK_Div1); 


    /* PCLK = HCLK */

    RCC_PCLKConfig(RCC_HCLK_Div1);


    /*  PLL configuration:  = HSE *  6 = 48 MHz */

    RCC_PREDIV1Config(RCC_PREDIV1_Div1);

    RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_CFGR_PLLMULL6);


    /* Enable PLL */

    RCC_PLLCmd(ENABLE);


    /* PLL as system clock source */

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  } 

}


stm32f0xx_it.c


/* Includes ------------------------------------------------------------------*/

#include "stm32f0xx_it.h"

/* Private variables ---------------------------------------------------------*/

__IO uint8_t InterruptCounter = 0x00;

__IO uint8_t Counter = 0;


/**

  * @brief  This function handles SysTick Handler.

  * @param  None

  * @retval None

  */

void SysTick_Handler(void)

{  

  if (Counter == 20)

  {

    /* Toggle LED's */

    STM_EVAL_LEDToggle(LED);


    /* Reset Counter */

    Counter = 0;

  }

  else

  {

    /* increment Counter */

    Counter++; 

  }

}


/**

* @brief  This function handles USART interrupt request.

* @param  None

* @retval None

*/

void USART1_IRQHandler(void)

{

  if (USART_GetITStatus(USART1, USART_IT_WU) == SET)

  { 

    /* Clear The USART WU flag */  

    USART_ClearITPendingBit(USART1, USART_IT_WU);

    InterruptCounter = 0x01;

  }

}


实际参考代码

然而,在STM32F030中不能配置为USART的start位唤醒。


#define USART_IT_WU ((uint32_t)0x00140316) /*!< Not available for STM32F030 devices */


解决办法,配置USART的接收非空中断:USART_IT_RXNE 


这里写图片描述

关键字:USART  低功耗模式  唤醒  STM32F0 引用地址:USART从低功耗模式唤醒STM32F0

上一篇:Stm32待机模式的进入与唤醒
下一篇:STM32之低功耗——WKUP待机唤醒(LCD显示)

推荐阅读最新更新时间:2024-03-16 16:26

STM32低功耗之待机模式
STM32的3种低功耗模式: 睡眠模式:内核停止,外设如NVIC,系统时钟Systick仍运行。 停止模式:所有时钟都已停止;1.8V内核电源工作;PLL,HIS和HSERC振荡器功能禁止;寄存器和SRAM内容保留。 待机模式:1.8V内核电源关闭;只有备份寄存器和待机电路维持供电;寄存器和SRAM内容全部丢失;实现最低功耗。 STM32的3种低功耗唤醒方式: STM32待机模式: 在待机模式下,所有的I/O引脚均处于高阻态,除了复位引脚、被使能的唤醒引脚和TAMPER引脚。待机模式下只有2uA的电流,停机模式下20uA的电流。 库函数进入待机模式: 使能电源时钟。 设置WK_UP引脚作为唤醒源。 设置SLEEPDEEP
[单片机]
STM32<font color='red'>低功耗</font>之待机<font color='red'>模式</font>
STM32的USART1用DMA方式发送与接收
USART1的DMA发送比较简单,在要发送之前,重新设置好DMA_BufferSize的大小,然后启动DMA就行了。不过在设置这一值时,得先关闭DMA通道。代码如下: DMA_ClearFlag(DMA1_FLAG_TC4); //清DMA发送完成标志 DMA_Cmd(DMA1_Channel4, DISABLE); //停止DMA DMA1_Channel4- CNDTR = sizeof(TxBuffer1) / sizeof(TxBuffer1 );//重设传输长度 DMA_Cmd(DMA1_Channel4, ENABLE); //启动DMA USART1的DMA接收:如果向USART1发送了数据,则数据会通
[单片机]
利用先进MCU的新低功耗模式
尽管 绿色 与产品名称结合在一起已成为表示低功耗的公认符号,但低功耗的准确含义却并未被经常表述。 低功耗MCU的要求会随着应用以及应用中使用MCU的方式的不同而有所变化。例如,在电池供电的恒温器应用中,低功耗主要由器件能够驱动LCD显示屏的最低功耗模式定义,在这种情况下,降低功耗会延长电池的使用寿命。在其他低功耗应用(如电表)中,低功耗是指系统在运行期间消耗的工作电流。第三类系统是需要保持时间的系统,而不管系统的主电源是否存在。停电期间的电表就是第三类系统的一个例子。由于各种应用的要求不尽相同,具有更加灵活的功耗模式的MCU允许设计人员进一步定制系统操作。 在过去,MCU的工作模式用于器件操作;空闲和打盹模式可降低或消除CPU开
[单片机]
利用先进MCU的新<font color='red'>低功耗</font><font color='red'>模式</font>
stm32专题十一:USART(四)USART编程
stm32的串口USART编程要点 先初始化串口所用到的GPIO; 初始化串口,配置pUSART_InitTypeDef结构体; 配置中断NVIC(接收中断,中断优先级); 使能串口; 编写发送和接收函数; 编写中断服务函数; 接下在看具体的代码实现过程: USART初始化配置函数,不难但是过程挺多的,容易遗漏,代码如下: // 串口1 USART1 #define DEBUG_USARTx USART1 #define DEBUG_USART_CLK RCC_APB2Periph_USART1 #define DEBUG_USART_APBxClkCmd RCC_APB2PeriphCloc
[单片机]
stm32专题十一:<font color='red'>USART</font>(四)<font color='red'>USART</font>编程
stm32---usart1与电脑通信
usart.h #ifndef _USART_H_ #define _USART_H_ #include stm32f10x.h #include stdio.h //发送一个字节 void GPIO1_Configuration(void); void USART1_Configuration(unsigned long baund); int fputc(int ch, FILE *f); #endif usart.c #include usart.h #include string.h //重定义fputc(); //printf( hello world ); int fpu
[单片机]
STM32串行通信USART讲解笔记
dragon12345666的专栏 目录视图 摘要视图 订阅 异步赠书:Kotlin领衔10本好书 SDCC 2017之区块链技术实战线上峰会 程序员8月书讯 每周荐书:Java Web、Python极客编程(评论送书) STM32串行通信USART讲解笔记 标签: 中南赵小龙 STM32 串行通信 USART1 2014-04-25 16:58 2741人阅读 评论 (0) 收藏 举报 分类: STM32 学习(9) 版权声明:本文为博主原创文章,未经博主允许不得转载。 目录 (?) STM32串行通信USART程序例举链接:http://blog.csdn.ne
[单片机]
STM32串行通信<font color='red'>USART</font>讲解笔记
STM32F4之USART串口通信
资源:STM32F407有2个UART(通用异步收发器),4个USART(通用异步/同步收发器) 在STM32F407ZET6的手册上有描述, 这些接口所对应的引脚如下: 在这里我们选用串口1进行简单编程: 实现功能吐下: 1.每秒发送一个数字 2.进行数据回传 其所要配置的内容如下: 1.GPIO的时钟使能 2.声明一个GPIO结构体变量,进行定义并进行初始化,主要是开启复用功能 3.将GPIO复用为何,将IO口功能配置为USART功能 4.USART1的时钟进行使能 5.声明一个USART结构体变量,进行定义并进行初始化,设置其波特率,停止位,字长,是否硬件流控制,收发模式,
[单片机]
STM32F4之<font color='red'>USART</font>串口通信
STM323 USART串口通信中断实现
问题描述:利用stm32串口通信,当PC端发送字符8时,LED PB.0闪亮 第一步:配置系统时钟,这个不用多讲,代码就不贴出来了; 第二步:GPIO端口配置: 设置PA.9为复用推挽输出,PA.10为浮空输入,PB.0,PB.1,PB.2输出并初始化PB.0亮 void GPIO_Config() { GPIOA- CRH=0X04B0; GPIOB- CRL=0X0333; GPIOB- ODR=0X01; } 第三步:USART寄存器配置: void USART_Config() { USART1- BRR = 0x1D4C; U
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved