本次测评就来测试一下,待机模式下的retain mode功能。这个功能可以让用户在待机模式保持输出电平状态,用于控制一些有效控制,在待机模式可以把功耗做到很低。
一、retain mode是什么?
1)定义retain mode其实就是在某种电源模式下,保持某些功能的一种模式。
2)GPIO retain mode
重点介绍一下待机模式下GPIO retain mode功能
定义:
GPIO retain mode是指在待机模式下,GPIO的状态(输入、输出、上拉、下拉)能够进行保持。
二、GPIO retain mode原理
在待机模式下,IO口的状态默认是浮空的,但是如果PWR_IORETR寄存器中的 IORETEN bit写11,IO的输出状态是保持的,也就是用户在进入待机模式之前的GPIO状态是被保存下来,在待机期间,GPIO的状态和进入待机模式之前的状态一致。
从待机模式退出之后,只要IORETEN的位还是1,那么相应的GPIO的状态是不会改变的(不管GPIO的状态是不是一致)。只有当清除IORETEN的位后,GPIO的状态才可以改变。
三、代码编写
1、创建工程的过程就不赘述。配置PA5和PB2的状态为输出,初始电平为高电平。
2、主函数代码编写
1)首先开启待机模式GPIO retain功能
HAL_PWREx_EnableStandbyIORetention();
2)进入待机模式
HAL_PWR_EnterSTANDBYMode();
3)整体代码如下
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
//HAL_DBGMCU_EnableDBGStandbyMode();
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
HAL_Delay(5000);
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ICACHE_Init();
/* USER CODE BEGIN 2 */
HAL_PWREx_EnableStandbyIORetention();
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_SuspendTick();
//HAL_PWREx_DisableStandbyIORetention();//当第二次编译加上这条语句时,保持功能就取消了,LED灯不亮
HAL_PWR_EnterSTANDBYMode();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
HAL_Delay(500);
}
/* USER CODE END 3 */
}
四、验证
1、重新上电之后,可以看到LED灯在待机模式保持常亮;
2、测量PB2的引脚电平,也是高电平;3.3V;
忘记拍照了,使用万用表测量,确实是3.3V
3、当清楚IORETEN的位后,LED灯和PB2就不会保持了,处于低电平状态。
总结:在待机模式下,GPIO retain mode功能就可以保持较低功耗的情况,实现GPIO控制的功能。
工程: