【FreeRTOS操作系统教程】第32章 FreeRTOS低功耗之待机模式

标签:
fatfsfreertosstemwinstm32usb |
分类: FreeRTOS |
第32章
FreeRTOS低功耗之待机模式
低功耗是MCU的一项重要的指标,本章节为大家讲解STM32F103,STM32F407和STM32F429的低功耗方式之待机模式在FreeRTOS操作系统上面的实现方法。
本章教程配套的例子含Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407以及F429。
32.1 STM32F103待机模式介绍
32.2 STM32F4xx待机模式介绍
32.3 实验例程说明
32.4
32.1 STM32F103 待机模式介绍
说明:在FreeRTOS系统上面实现待机方式仅需了解这里讲解的知识基本就够用了,更多待机方式的知识请看STM32F103参考手册和Cortex-M3权威指南。
在系统或电源复位以后,微控制器处于运行状态。当CPU不需继续运行时,可以利用多种低功耗模式来节省功耗,例如等待某个外部事件时,用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。
STM32F103有三种低功耗模式:
(1)睡眠模式(Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统滴答定时器Systick等仍在运行)。
(2)停机模式(所有的时钟都已停止)。
(3)待机模式(1.8V电源关闭)。
本章节我们主要讲解待机模式,待机模式可实现系统的最低功耗。该模式是在Cortex-M3深睡眠模式时关闭电压调节器。整个1.8V供电区域被断电。PLL、HSI和HSE振荡器也被断电。SRAM和寄存器内容丢失,只有备份的寄存器和待机电路维持供电。
在实际的待机模式编程时需要清楚哪些问题呢? 请继续往下看。
32.1.1 STM32F103 如何进入待机模式
在FreeRTOS系统中,让STM32进入待机模式比较容易,调用固件库函数PWR_EnterSTANDBYMode即可。
32.1.2 STM32F103 如何退出待机模式
让STM32从待机模式唤醒可以通过外部复位(NRST引脚)、IWDG复位、WKUP引脚上的上升沿或RTC闹钟事件的上升沿。从待机唤醒后,除了电源控制/状寄存器,所有寄存器被复位。
从待机模式唤醒后的代码执行等同于复位后的执行。电源控制/状态寄存器(PWR_CSR)将会指示内核由待机状态退出。
在开发板上面是通过K2按键来唤醒,K2按键使用的引脚就是WKUP引脚。
32.1.3 STM32F103 使用待机模式注意事项
待机模式要注意以下问题:
在待机模式下,所有的I/O引脚处于高阻态,除了以下的引脚:
32.2STM32F4xx待机模式介绍
说明:本小节的内容含STM32F407和STM32F429,在FreeRTOS系统上面实现待机方式仅需了解这里讲解的知识基本就够用了,更多待机方式的知识请看STM32F4xx参考手册和Cortex-M4权威指南。
在系统或电源复位以后,微控制器处于运行状态。当CPU不需继续运行时,可以利用多种低功耗模式来节省功耗,例如等待某个外部事件时。用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。
STM32F4xx有三种低功耗模式:
(1)睡眠模式(Cortex™-M4F内核停止,所有外设包括Cortex-M4核心的外设,如NVIC、系统滴答定时器Systick等仍在运行)。
(2)停机模式(所有的时钟都已停止)。
(3)待机模式(1.2V电源关闭)。
本章节我们主要讲解待机模式,待机模式下可达到最低功耗。待机模式基于Cortex™-M4F深度睡眠模式,其中调压器被禁止,因此1.2 V域断电。PLL、HSI振荡器和HSE 振荡器也将关闭。除备份域RTC寄存器、RTC备份寄存器和备份SRAM和待机电路中的寄存器外,SRAM 和寄存器内容都将丢失。
在实际的待机模式编程时需要清楚哪些问题呢? 请继续往下看。
32.2.1 STM32F4xx 如何进入待机模式
在FreeRTOS系统中,让STM32进入待机模式比较容易,调用固件库函数PWR_EnterSTANDBYMode即可。
32.2.2STM32F4xx如何退出待机模式
让STM32从待机模式唤醒可以通过外WKUP 引脚上升沿、RTC闹钟(闹钟A和闹钟B)、RTC唤醒事件、RTC入侵事件、RTC 时间戳事件、NRST引脚外部复位和IWDG 复位,唤醒后除了电源控制/状寄存器,所有寄存器被复位。
从待机模式唤醒后的代码执行等同于复位后的执行。电源控制/状态寄存器(PWR_CSR)将会指示内核由待机状态退出。
早期工程版本是通过K2按键,即引脚PC13检测RTC的入侵事件进行唤醒,实际测试发现问题较多。本实验将其改为复位按键进行唤醒,可以这么做是因为系统进入到待机模式后,被唤醒后系统的执行过程等同于进行复位。
32.2.3STM32F4xx使用待机模式注意事项
待机模式要注意以下问题:
1、将选择的待机模式唤醒源(RTC闹钟A、RTC闹钟B、RTC唤醒、RTC入侵或RTC时间戳标志)对应的RTC标志清零,防止无法正常进入待机模式。
2、待机模式下的 I/O 状态
32.3实验例程说明
32.3.1STM32F103开发板实验
配套例子:
V4-338_FreeRTOS实验_低功耗(待机模式)
实验目的:
1.
实验内容:
1.
2.
3.
4.
(1)
(2)
5.
6.
(1)
(2)
(3)
(4)
如果此I/O口带上拉,请设置为高电平输出或者高阻态输入。
如果此I/O口带下拉,请设置为低电平输出或者高阻态输入。
a.
b.
c.
n
n
n
(5)
(6)
FreeRTOS的配置:
FreeRTOSConfig.h文件中的配置如下:
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
#endif
#define
configUSE_PREEMPTION
#define
configUSE_IDLE_HOOK
#define
configUSE_TICK_HOOK
#define
configCPU_CLOCK_HZ
#define
configTICK_RATE_HZ
#define
configMAX_PRIORITIES
#define
configMINIMAL_STACK_SIZE
#define
configTOTAL_HEAP_SIZE
#define
configMAX_TASK_NAME_LEN
#define
configUSE_TRACE_FACILITY
#define
configUSE_16_BIT_TICKS
#define
configIDLE_SHOULD_YIELD
#define
configGENERATE_RUN_TIME_STATS
#define
configUSE_STATS_FORMATTING_FUNCTIONS
#define
portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
#define
portGET_RUN_TIME_COUNTER_VALUE()
//#define
portALT_GET_RUN_TIME_COUNTER_VALUE
#define
configUSE_CO_ROUTINES
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
#define
INCLUDE_vTaskPrioritySet
#define
INCLUDE_uxTaskPriorityGet
#define
INCLUDE_vTaskDelete
#define
INCLUDE_vTaskCleanUpResources
#define
INCLUDE_vTaskSuspend
#define
INCLUDE_vTaskDelayUntil
#define
INCLUDE_vTaskDelay
#ifdef __NVIC_PRIO_BITS
#else
#endif
#define
configLIBRARY_LOWEST_INTERRUPT_PRIORITY
#define
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
几个重要选项说明:
u
使能抢占式调度器
u
系统主频72MHz。
u
系统时钟节拍1KHz,即1ms。
u
定义可供用户使用的最大优先级数,如果这个定义的是5,那么用户可以使用的优先级号是0,1,2,3,4,不包含5,对于这一点,初学者要特别的注意。
u
定义堆大小,FreeRTOS内核,用户动态内存申请,任务栈等都需要用这个空间。
u
定义受FreeRTOS管理的最高优先级中断。简单的说就是允许用户在这个中断服务程序里面调用FreeRTOS的API的最高优先级。为了进一步说明这个宏定义的的作用,解释如下:
l
l
l
更多关于这个参数说明请参看第12章。
FreeRTOS任务调试信息(按K1按键,串口打印):
上面截图中打印出来的任务状态字母B, R, D, S对应如下含义:
#define
tskBLOCKED_CHAR
#define
tskREADY_CHAR
#define
tskDELETED_CHAR
#define
tskSUSPENDED_CHAR
程序设计:
u
vTaskUserIF任务
vTaskLED任务
vTaskMsgPro任务 :2048字节
vTaskStart任务
任务栈空间是在任务创建的时候从FreeRTOSConfig.h文件中定义的heap空间中申请的
#define
configTOTAL_HEAP_SIZE
u
u
int main(void)
{
}
u
硬件外设的初始化是在bsp.c文件实现:
void bsp_Init(void)
{
}
u
static void AppTaskCreate (void)
{
}
u
static void vTaskTaskUserIF(void *pvParameters)
{
}
static void vTaskLED(void *pvParameters)
{
}
static void vTaskMsgPro(void *pvParameters)
{
}
static void vTaskStart(void *pvParameters)
{