0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

APM32F10xx进入低功耗模式的问题分析

Geehy极海半导体 来源:Geehy极海半导体 2024-10-18 16:13 次阅读

1、前言

近日,在学习APM32开发板关于PMU模块的内容,看到很多内容都是调用WFI内核指令进入低功耗模式,于是自己想尝试调用WFE内核指令进入低功耗模式,但在APM32F10xx中,我运用按键中断,在中断调用PMU_EnterSTOPMode库函数,用WFE内核指令进入STOP模式是存在问题的,后经查验解决了问题,于是在此进行了内容记录。

2、相关知识介绍

2.1、低功耗模式概述

当APM32在系统或者电源复位后,芯片处于运行状态,此时HCLK为CPU提供时钟,内核执行程序代码,当CPU不需要运行时,可以采用低功耗模式来降低芯片运行的电流

2.2、低功耗模式

低功耗模式可分为睡眠模式和深度睡眠模式,其中深度睡眠模式分别停止模式和待机模式。而本文的重点则在于讲解进入停止模式。

2.3、进入停止模式配置

wKgZoWcSGQOAfwZxAABt5xbwYxU267.jpg

如上,进入停止模式需要将SCB->SCR->SLEEPDEEP置为1,同时PMU->CTRL->PDDSCFG置为0,同时要执行WFI/WFE指令进入停止模式。其中,两个内核指令的区别如下:

wKgaoWcSGQyAb63jAADUF0xEAB8844.jpg

如上,当调用WFI内核指令时,会直接进入睡眠/深度睡眠模式。当调用WFE指令时,会根据事件锁存器的值来判断能否直接进入睡眠/深度睡眠模式。如下,我做了一个流程图:

wKgaoWcSGROARqqpAAB4FsOIHTY520.jpg

3、问题分析及解决

3.1、配置的关键代码

int main(void)

{

RCM_EnableAPB1PeriphClock((RCM_APB1_PERIPH_T)(RCM_APB1_PERIPH_PMU | RCM_APB1_PERIPH_BAKR));

APM_MINI_LEDInit(LED2);

APM_MINI_LEDInit(LED3);

/* KEY1 KEY2 Set */

//APM_MINI_PBInit(BUTTON_KEY1,BUTTON_MODE_GPIO);

APM_MINI_PBInit(BUTTON_KEY1,BUTTON_MODE_EINT);

APM_MINI_PBInit(BUTTON_KEY2,BUTTON_MODE_EINT);

/* NVIC Priority Set */

NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_1);

NVIC_EnableIRQRequest(EINT0_IRQn, 0, 1);

NVIC_EnableIRQRequest(EINT1_IRQn, 1, 1);

APM_MINI_LEDOn(LED2);

APM_MINI_LEDOff(LED3);

/* Enable PMU Periph Clock */

RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_PMU);

PMU_Reset();

while (1)

{

Delay(0x7FFFFF);

APM_MINI_LEDToggle(LED2);

}

}

voidEint1_Isr(void)

{

if (EINT_ReadIntFlag(KEY1_BUTTON_EINT_LINE)!= RESET)

{

APM_MINI_LEDOn(LED3);

APM_MINI_LEDOff(LED2);

/* Enter STOP Mode */

PMU_EnterSTOPMode(PMU_REGULATOR_LOWPOWER, PMU_STOP_ENTRY_WFE);

EINT_ClearIntFlag(KEY1_BUTTON_EINT_LINE);

}

}

voidEint0_Isr(void)

{

if (EINT_ReadIntFlag(KEY2_BUTTON_EINT_LINE)!= RESET)

{

SystemInit();

APM_MINI_LEDOff(LED3);

/* Wait for system init */

Delay(0xfffff);

EINT_ClearIntFlag(KEY2_BUTTON_EINT_LINE);

}

}

如上代码,按下按键1后会进入睡眠模式,LED2灯灭,LED3常亮。按下按键2后会从睡眠模式中唤醒,LED2跳灯,LED3灯灭。但真实的现象便是按下按键1后,LED2仍处于跳灯状态,但LED3常亮,因此我初步判断第一次运用WFE指令时没有进入停止模式,但我从而验证我的判断?

3.2、PMU_EnterSTOPMode函数

voidPMU_EnterSTOPMode(PMU_REGULATOR_T regulator, PMU_STOP_ENTRY_T entry)

{

/* Clear PDDSCFG and LPDSCFG bits */

PMU->CTRL_B.PDDSCFG = 0x00;

PMU->CTRL_B.LPDSCFG = 0x00;

/* Set LPDSCFG bit according to regulatorvalue */

PMU->CTRL_B.LPDSCFG = regulator;

/* Set Cortex System Control Register */

SCB->SCR |= (uint32_t)0x04;

/* Select STOP mode entry*/

if (entry == PMU_STOP_ENTRY_WFI)

{

/* Request Wait For Interrupt */

__WFI();

}

else

{

/* Request Wait For Event */

__WFE();

}

/* Reset SLEEPDEEP bit of Cortex SystemControl Register */

SCB->SCR &=(uint32_t)~((uint32_t)0x04);

}

如下库API函数中,运用一次WFE内核指令,当我第一次看到这个函数时,并没有发现什么问题,于是,我照着手册深入我的问题探究。于是,我在《Cortex M3与M4权威指南》中找到如下内容:

wKgaoWcSGSOAW2fLAABz8A5CfPE166.jpg

当我们运用WFE内核指令进入停止模式时,一般调用两次WFE内核指令,因为事件寄存器会因为中断事件的产生而置位。这时,在结合2.3中内容,我便知晓了问题的答案。因为在初始化的按键配置中,按键1和按键2连接了外部中断线,当我调用该库函数中,运用WFE指令进入停止模式时,第一次会因为有中断事件的产生,WFE的作用是运用于清除事件锁存器的值,而第二次才用于进入睡眠模式,因此在后面的Demo例程中,我给出了一种解决方法。

注:

在解决问题的过程中,我给出了第二种解决方法,便是不通过按键中断调用WFE内核指令进入停止模式,而是在主函数中直接对按键进行一个是否按键的判断,按下即进入睡眠模式。(这两种方法均已通过实验)。

本次分享到此结束,如有问题大家一起在评论区讨论,谢谢

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1344

    浏览量

    40148
  • 指令
    +关注

    关注

    1

    文章

    603

    浏览量

    35577
  • 开发板
    +关注

    关注

    25

    文章

    4829

    浏览量

    96789
  • PMU
    PMU
    +关注

    关注

    1

    文章

    107

    浏览量

    21531

原文标题:APM32芯得 EP.32 | 基于APM32F103 Stop模式关于WFE内核命令问题分析及解决

文章出处:【微信号:geehysemi,微信公众号:Geehy极海半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    CKS32F4xx系列MCU的低功耗模式之睡眠模式

    本课讲为大家讲解CKS32F4xx系列产品的低功耗模式之睡眠(Sleep)模式。MCU为满足某些应用场景:如小型化低容量设备,长期监测设备等,低功耗
    发表于 06-26 10:02 592次阅读
    CKS32<b class='flag-5'>F4xx</b>系列MCU的<b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>之睡眠<b class='flag-5'>模式</b>

    怎样对STM32F10xx低功耗模式进行配置

    STM32F10xx有哪几种低功耗模式?怎样对STM32F10xx低功耗模式进行配置?
    发表于 09-26 06:31

    STM32F10xxx是怎样进入低功耗模式的呢

    STM32低功耗的工作原理是什么?STM32F10xxx有哪几种低功耗模式?STM32F10xxx是怎样
    发表于 11-29 06:16

    STM32F101xx/STM32F102xx和STM32F103xx低功耗模式

    本文档适用于STM32F1系列微控制器。本文档为要求在STM32F101xx、STM32F102xx和STM32F103xx产品的软件和硬件上实现
    发表于 12-01 06:40

    STM32F1xx是否有任何编码示例来说明如何进入低功耗睡眠模式

    您好,我需要为我的 STM32F103 MCU 使用待机模式。在数据表中说,当 MCU 处于待机模式时,引脚处于高阻抗状态。但是,我需要这些引脚为高电平(这些是输出引脚)。有可能实现吗?或者我应该
    发表于 01-17 08:44

    APM32F030x8_功耗_低功耗stop和standby模式功耗电流异常

    APM32F030x8_功耗_低功耗stop和standby模式功耗电流异常
    发表于 11-09 21:03 0次下载
    <b class='flag-5'>APM32F</b>030x8_<b class='flag-5'>功耗</b>_<b class='flag-5'>低功耗</b>stop和standby<b class='flag-5'>模式</b><b class='flag-5'>功耗</b>电流异常

    APM32F103XC_TMR_关闭DMA进入睡眠模式出现故障

    APM32F103XC_TMR_关闭DMA进入睡眠模式出现故障
    发表于 11-09 21:03 0次下载
    <b class='flag-5'>APM32F</b>103XC_TMR_关闭DMA<b class='flag-5'>进入</b>睡眠<b class='flag-5'>模式</b>出现故障

    APM32F030C8T6_软件问题_进入stop模式之后无法使用按键唤醒

    APM32F030C8T6_软件问题_进入stop模式之后无法使用按键唤醒
    发表于 11-09 21:03 2次下载
    <b class='flag-5'>APM32F</b>030C8T6_软件问题_<b class='flag-5'>进入</b>stop<b class='flag-5'>模式</b>之后无法使用按键唤醒

    APM32F103VCT6_低功耗问题_STOP模式下的功耗异常偏高

    APM32F103VCT6_低功耗问题_STOP模式下的功耗异常偏高
    发表于 11-09 21:03 1次下载
    <b class='flag-5'>APM32F</b>103VCT6_<b class='flag-5'>低功耗</b>问题_STOP<b class='flag-5'>模式</b>下的<b class='flag-5'>功耗</b>异常偏高

    APM32F003F6P6_软件问题_低功耗Halt模式,WUPT只能唤醒一次

    APM32F003F6P6_软件问题_低功耗Halt模式,WUPT只能唤醒一次
    发表于 11-09 21:04 0次下载
    <b class='flag-5'>APM32F003F</b>6P6_软件问题_<b class='flag-5'>低功耗</b>Halt<b class='flag-5'>模式</b>,WUPT只能唤醒一次

    APM32F0xx_SDK工具

    APM32F0xx_SDK工具
    发表于 11-10 11:04 0次下载
    <b class='flag-5'>APM32F0xx</b>_SDK工具

    APM32F0xx_DFP 工具包

    APM32F0xx_DFP 工具包
    发表于 11-10 11:33 4次下载
    <b class='flag-5'>APM32F0xx</b>_DFP 工具包

    CKS32F4xx系列低功耗模式STANDBY模式

    CKS32F4xx系列低功耗模式STANDBY模式
    的头像 发表于 11-06 16:57 413次阅读
    CKS32<b class='flag-5'>F4xx</b>系列<b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>STANDBY<b class='flag-5'>模式</b>

    CKS32F4xx系列低功耗模式SLEEP模式

    CKS32F4xx系列低功耗模式SLEEP模式
    的头像 发表于 11-06 16:59 604次阅读
    CKS32<b class='flag-5'>F4xx</b>系列<b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>SLEEP<b class='flag-5'>模式</b>

    CKS32F4xx系列低功耗模式STOP模式

    CKS32F4xx系列低功耗模式STOP模式
    的头像 发表于 11-06 17:08 551次阅读
    CKS32<b class='flag-5'>F4xx</b>系列<b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>STOP<b class='flag-5'>模式</b>