• 【正点原子STM32连载】 第三十二章 停止模式实验 摘自【正点原子】APM32F407最小系统板使用指南


    1)实验平台:正点原子stm32f103战舰开发板V4
    2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
    3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html##

    第三十二章 停止模式实验

    本章介绍APM32F407低功耗模式中的停止模式,进入停止模式后,所有的时钟都将被停止以降低功耗,在停止模式下可以被任意中断唤醒。通过本章的学习,读者将学习到低功耗模式中停止模式的使用。
    本章分为如下几个小节:
    32.1 硬件设计
    32.2 程序设计
    32.3 下载验证

    32.1 硬件设计
    32.1.1 例程功能

    1. 按下KEY0按键,点亮LED1并进入停止模式,按下KEY_UP按键,退出停止模式并熄灭LED1
    2. LED0闪烁,指示程序正在运行
      32.1.2 硬件资源
    3. LED
      LED0 - PF9
      LED1 - PF10
    4. 按键
      KEY0 - PE4
      LEY_UP - PA0
    5. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
      32.1.3 原理图
      本章实验介绍APM32F407低功耗模式中的停止模式,不涉及连接原理图。
      32.2 程序设计
      32.2.1 Geehy标准库的PMU驱动
      Geehy标准库中提供了配置进入停止模式的驱动函数,其配置步骤如下:
      ①:进入停止模式
      在Geehy标准库中对应的驱动函数如下:
      ①:进入停止模式
      该函数用于进入停止模式,其函数原型如下所示:
      void PMU_EnterSTOPMode(PMU_REGULATOR_T regulator, PMU_STOP_ENTRY_T entry);
      该函数的形参描述,如下表所示:
      形参 描述
      regulator 停止模式下调压器的工作状态
      例如:PMU_REGULATOR_ON、PMU_REGULATOR_LOWPOWER(在apm32f4xx_pmu.h文件中有定义)
      entry 进入停止模式的方式
      例如:PMU_STOP_ENTRY_WFI、PMU_STOP_ENTRY_WFE(在apm32f4xx_pmu.h文件中有定义)
      表32.2.1.1 函数PMU_EnterSTOPMode()形参描述
      该函数的返回值描述,如下表所示:
      返回值 描述
      无 无
      表32.2.1.2 函数PMU_EnterSTOPMode()返回值描述
      该函数的使用示例,如下所示:
    #include "apm32f4xx.h"
    #include "apm32f4xx_pmu.h"
    
    void example_fun(void)
    {
        /* 配置以WFI方式进入停止模式,同时配置调压器进入低功耗模式 */
        PMU_EnterSTOPMode(PMU_REGULATOR_LOWPOWER, PMU_STOP_ENTRY_WFI);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    32.2.2 PMU驱动
    本章实验的PMU驱动主要负责向应用层提供停止模式唤醒按键的初始化和进入停止模式的函数,同时实现唤醒按键的中断回调函数。本章实验中,PMU的驱动代码包括pmu.c和pmu.h两个文件。
    因为本章实验中停止模式的唤醒方式与上一章实验中睡眠模式的唤醒方式一致,都是可以由任意的中断唤醒,且均使用了KEY_UP按键的外部中断进行唤醒,因此本章实验中停止模式唤醒按键的相关宏定义、停止模式唤醒按键的初始化及其中断回调函数均与上一章实验一致,因此请读者自行查看上一章中的相关内容。
    PMU驱动中,进入睡眠模式的函数,如下所示:

    /**
     * @brief	进入停止模式
     * @param	无
     * @retval	无
     */
    void pmu_enter_stop(void)
    {
        /* 执行WFI,进入停止模式,同时设置调节器工作在低功耗模式 */
        PMU_EnterSTOPMode(PMU_REGULATOR_LOWPOWER, PMU_STOP_ENTRY_WFI);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    从上面的代码中可以看出,该函数调用了函数PMU_EnterSTOPMode()以WFI方式进入停止模式,接下来MCU便会进入停止模式,等待任意的中断唤醒,因此在执行此函数前,需要先关闭部分中断,以免误唤醒。
    32.2.3 实验应用代码
    本章实验的应用代码,如下所示:

    int main(void)
    {
        uint8_t key;
        uint8_t t = 0;
        
        NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_3);	/* 设置中断优先级分组为组3 */
        sys_apm32_clock_init(336, 8, 2, 7);					/* 配置系统时钟 */
        delay_init(168);										/* 初始化延时功能 */
        usart_init(115200);									/* 初始化串口 */
        led_init();											/* 初始化LED */
        key_init();											/* 初始化按键 */
        lcd_init();											/* 初始化LCD */
        pmu_wkup_key_init();								/* 初始化唤醒按键 */
        
        lcd_show_string(30, 50, 200, 16, 16, "APM32", RED);
        lcd_show_string(30, 70, 200, 16, 16, "STOP TEST", RED);
        lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
        lcd_show_string(30, 110, 200, 16, 16, "KEY0:Enter STOP MODE", RED);
        lcd_show_string(30, 130, 200, 16, 16, "KEY_UP:Exit STOP MODE", RED);
        
        while (1)
        {
        		key = key_scan(0);
        		
        		if (key == KEY0_PRES)
        		{
        			LED1(0);			/* 点亮LED1,提示进入停止模式 */
        			pmu_enter_stop();	/* 进入停止模式 */
        			LED1(1);			/* 熄灭LED1,提示退出停止模式 */
        		}
        		
        		if ((t % 20) == 0)
        		{
        			LED0_TOGGLE();
        		}
        		
        		t++;
        		delay_ms(10);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    从上面的代码中可以看出,在完成相关的初始化操作后,便不断地扫描按键,若扫描到KEY0按键被按下,则会点亮LED1后进入停止模式,此时所有的时钟将会停止,从该停止模式唤醒需要有任意的中断产生,因此可以由KEY_UP按键产生外部中断来唤醒停止模式。退出停止模式后,LED1将被熄灭。
    32.3 下载验证
    在完成编译和烧录操作后,可以看到LED0闪烁提示系统正在运行,此时可以按下KEY0按按键,可以看到LED1亮起,但LED0不再闪烁,这是因为系统已经进入停止模式了,此时再按下KEY_UP按键,即可从停止模式下唤醒,可以看到LED1熄灭,LED0继续闪烁。

  • 相关阅读:
    c++里对 new 、delete 运算符的重载
    React知识点系列(1)-每天10个小知识
    2022-ISCTF-部分MISC和PWN
    一种分布式深度学习编程新范式:Global Tensor
    luogu P1873 [COCI 2011/2012 #5] EKO / 砍树
    C#的多线程UI窗体控件显示方案 - 开源研究系列文章
    linux kvm 命令行安装Windows xp虚拟机
    Go-知识并发控制mutex
    maven工程使用sonar扫描代码
    Hadoop 集群时间同步设置
  • 原文地址:https://blog.csdn.net/weixin_55796564/article/details/132875412