8. DA14531 Hibernate模式da14531数据表有关无缝唤醒控制器和所有可用睡眠模式的完整描述。
笔记
您必须创建了一个修改的版本extent_peripheral_template.示例项目,如下所述初始项目章节,在继续之前!
笔记
您必须创建了一个修改的版本extent_peripheral_template.示例项目,如下所述初始项目章节,在继续之前!
静态的空白flash_power_down.(空白){/ *默认SPI配置* /静态的constspi_cfg_t.spi_cfg.={。spi_ms.=spi_ms_mode_master那。spi_cp.=spi_cp_mode_0.那。spi_speed=spi_speed_mode_4mhz.那。spi_wsz.=spi_mode_8bit.那。spi_cs.=spi_cs_0.那。CS_PAD.。港口=spi_en_port.那。CS_PAD.。别针=spi_en_pin.那。spi_capture.=spi_master_edge_capture.那};/ *将接口初始化为spi flash * /spi_initialize.(&spi_cfg.);/ *禁用P0_0上的HW RST,所以它可以用作SPI MOSI * /gpio_disable_hw_reset.();spi_flash_power_down.();/ *重新启用HW复位输入(如果进一步操作时必须被禁用)执行外部闪存) - 必须先设置为输入!* /gpio_configurepin.(spi_do_port.那spi_do_pin.那Input_Pulldown.那PID_GPIO.那错误的);gpio_enable_hw_reset.();}
也必须添加以下包含文件user_empty_peripheral_template.c.文件:
#包括“spi.h”#包括“spi_flash.h”#包括“user_periph_setup.h”#包括“arch_hibernation.h”
user_on_init.
功能:
静态的空白Enter_Ship_Mode.(空白){Arch_printf.(“\ n \ r%s“那__功能__);/ *在进入船舶模式之前,确保所有调试输出都完成* /ARCH_PRINTF_PROCESS.();尽管(GetBits32.(UART2_USR_REG.那UART_BUSY.)!=0.);/ *将设备放入休眠模式,没有RAM保留(唤醒唤醒)功能不返回* /Arch_set_hibernation.(0x20.那/ * p0_5 * /pd_sys_down_ram_off.那pd_sys_down_ram_off.那pd_sys_down_ram_off.那remap_addr0_to_rom.那错误的);}
接下来,我们将通过添加以下内容来保留P0_5gpio_revations.
功能可以在其中找到user_periph_setup.c.文件:
保留_GPIO.(SW2.那sw2_port.那SW2_pin.那PID_GPIO.);
最后,我们将配置P0_5来充当通过添加以下内容的上拉的输入set_pad_functions.
也可以在其中找到的功能user_periph_setup.c.文件:
gpio_configurepin.(sw2_port.那SW2_pin.那input_pullup.那PID_GPIO.那错误的);
接下来,我们必须在设备靴子时将由SDK调用的回调,并将存储我们上面声明的变量中的重置状态。要执行此操作,请添加以下功能user_empty_peripheral_template.c.文件:
空白reset_indication.(uint16_t.reset_stat.){reset_status.=reset_stat.;}
user_app_on_init.
文件中的函数user_empty_peripheral_template.c.,就在之前default_app_on_init.
函数调用:
Arch_printf.(“\ n \ rreset_status:0x%04x“那reset_status.);/ *从闪光灯启动完成所以将其放入最低功率模式* /flash_power_down.();如果((reset_status.&Poreset_stat.)||(reset_status.&hwreset_stat.))){/ *函数不返回* /Enter_Ship_Mode.();}
一旦闪存进行编程,请按如下方式配置终端仿真器:
现在按下Pro开发套件板上的重置按钮(SW1),您应该看到终端仿真器显示的以下内容:
DA14531现在处于船舶(或Hibernate)模式,并且电流非常小。在Pro开发套件上按SW2将唤醒设备并导致它启动广告。发生这种情况时,您将看到终端仿真器显示的以下内容:
再次按RESET按钮(SW1)将返回设备(Hibernate)模式。
笔记
您还可以通过在使用中发现DA14531的当前消耗来确认该示例正在工作SmartSnippets™工具箱。
现在将以下内容添加到开始的开始user_app_on_init.
功能所以我们可以观察到数据被保留:
Arch_printf.(“\ n \ r保留_data:0x%08x“那保留_data.);
接下来,我们需要设置值的值保留_data.
当设备复位时变量,但在次数唤醒时不会唤醒。为此,我们初始化内部的变量如果
包含在内的声明user_app_on_init.
功能如下:
如果((reset_status.&Poreset_stat.)||(reset_status.&hwreset_stat.))){保留_data.=0x1badcafe.;/ *函数不返回* /Enter_Ship_Mode.();}
我们需要确保设备处于休眠模式时保留RAM的内容。为此,我们将传递给的参数更改为Arch_set_hibernation.
功能(从中调用Enter_Ship_Mode.
功能)如下:
Arch_set_hibernation.(0x20.那/ * p0_5 * /pd_sys_down_ram_on.那pd_sys_down_ram_on.那pd_sys_down_ram_on.那remap_addr0_to_ram1.那错误的);
因为我们正在保留RAM,所以基于ROM的引导加载程序不再需要在设备从休眠模式唤醒时加载应用程序。这意味着我们现在只需要在重置设备时将闪光灯放入睡眠模式,而不是从休眠模式唤醒时。实施此更改只需将呼叫移动到“flash_power_down.
在内部找到的功能user_on_init.
所以它在里面如果
陈述。
一旦所有这些变化都已经实施了你的user_on_init.
和Enter_Ship_Mode.
功能应如下:
空白user_on_init.(空白){Arch_printf.(“\ n \ r%s“那__功能__);Arch_printf.(“\ n \ rreset_status:0x%04x“那reset_status.);Arch_printf.(“\ n \ r保留_data:0x%08x“那保留_data.);如果((reset_status.&Poreset_stat.)||(reset_status.&hwreset_stat.))){保留_data.=0x1badcafe.;flash_power_down.();/ *函数不返回* /Enter_Ship_Mode.();}default_app_on_init.();}静态的空白Enter_Ship_Mode.(空白){Arch_printf.(“\ n \ r%s“那__功能__);/ *在进入船舶模式之前,确保所有调试输出都完成* /ARCH_PRINTF_PROCESS.();尽管(GetBits32.(UART2_USR_REG.那UART_BUSY.)!=0.);/ *将设备放入Hibernation模式,RAM保留功能不返回* /Arch_set_hibernation.(0x20.那/ * p0_5 * /pd_sys_down_ram_on.那pd_sys_down_ram_on.那pd_sys_down_ram_on.那remap_addr0_to_ram1.那错误的);}
要测试这些更改,必须将应用程序编译,然后编程到外部闪存中。当设备重置值时保留_data.
变量将是零,然后将设置为0x1badcafe.
,就在设备进入休眠模式之前。然后,通过按下SW2唤醒设备,值保留_data.
变量仍然是0x1badcafe.
,证明它已被保留。通过监视设备重置时生成的串行调试输出以及从休眠模式唤醒时,可以观察到此功能,请参见下文: