USART从低功耗模式唤醒STM32F0

2024-05-07 18:32

本文主要是介绍USART从低功耗模式唤醒STM32F0,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    • 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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968053

相关文章

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

springboot实战学习(1)(开发模式与环境)

目录 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 (3)前端 二、开发模式 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 Validation:做参数校验Mybatis:做数据库的操作Redis:做缓存Junit:单元测试项目部署:springboot项目部署相关的知识 (3)前端 Vite:Vue项目的脚手架Router:路由Pina:状态管理Eleme

状态模式state

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/state 在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。 在状态模式中,player.getState()获取的是player的当前状态,通常是一个实现了状态接口的对象。 onPlay()是状态模式中定义的一个方法,不同状态下(例如“正在播放”、“暂停

软件架构模式:5 分钟阅读

原文: https://orkhanscience.medium.com/software-architecture-patterns-5-mins-read-e9e3c8eb47d2 软件架构模式:5 分钟阅读 当有人潜入软件工程世界时,有一天他需要学习软件架构模式的基础知识。当我刚接触编码时,我不知道从哪里获得简要介绍现有架构模式的资源,这样它就不会太详细和混乱,而是非常抽象和易

使用Spring Boot集成Spring Data JPA和单例模式构建库存管理系统

引言 在企业级应用开发中,数据库操作是非常重要的一环。Spring Data JPA提供了一种简化的方式来进行数据库交互,它使得开发者无需编写复杂的JPA代码就可以完成常见的CRUD操作。此外,设计模式如单例模式可以帮助我们更好地管理和控制对象的创建过程,从而提高系统的性能和可维护性。本文将展示如何结合Spring Boot、Spring Data JPA以及单例模式来构建一个基本的库存管理系统