3.4.8. APP - Fast Boot Soff

3.4.8.1. 概述

Note

软关机状态下快速唤醒开机,适用场景:胎压计。

3.4.8.2. 工程配置

  • app配置,在工程代码中找到对应的文件(apps/demo/transfer/include/app_config.h)进行APP选择,本案例中选择多连,其结果如下所示:

//apps example 选择,只能选1个,要配置对应的board_config.h,配置应用切换时对应选择的应用都要置1
#define CONFIG_APP_FAST_BOOT_SOFF         1 //rtc唤醒快速开关机,使用需要配置板级CONFIG_BOARD_AW33N_FASTBOOT
  • 板级选择,接着在文件(apps/demo/transfer/board/bd57/board_config.h)下进行对应的板级选择如下:

#define CONFIG_BOARD_AW33N_FASTBOOT
#include "board_aw33n_fastboot_cfg.h"

3.4.8.3. 主要功能代码说明

  • 该demo是在软关机状态下基于RTC定时唤醒开机,发出蓝牙广播数据或执行其他操作。

  • 软件初始化状态通过 is_enter_bt 标志位进行是否蓝牙初始化判断。

apps/app/bsp/start/bd57/main.c

void c_main(int cfg_addr)
{
    u8 is_enter_bt = 0;
    u8 data1 = 0;
    u8 data2 = 0;
    u8 data3 = 0;
    u8 data4 = 0;

    u8 p33_reset_flag = p33_rx_1byte(P3_SFLAG0);
    struct maskrom_argv mask_argv = {0};
    mask_argv.pchar = (void *)putchar;
    mask_argv.exp_hook = (void *)exception_analyze;
    mask_argv.udelay = udelay;
    mask_init(&mask_argv);

#if TCFG_UART0_ENABLE
    log_init(TCFG_UART0_BAUDRATE);
#endif
    efuse_init();
#ifdef CONFIG_SDK_DEBUG_LOG
    sdk_cpu_debug_main_init();
#endif
    log_info("hello world AW33N fast-foot-soff demo\n");

    extern void exception_irq_handler(void);
    HWI_Install(1, (u32)exception_irq_handler, 7) ;
    emu_init();
    /*默认把低功耗部分代码加载到power overlay段*/
    lowpower_init();
    power_early_flowing();
    if (is_reset_source(P33_POWER_RETURN)) {
        p33_sfr_read_byte(&data1, &data2, &data3, &data4);
        log_info("p33_data[0x%x 0x%x 0x%x 0x%x]", data1, data2, data3, data4);
    } else {
        data1 = 0;
        data2 = 0;
        data3 = 0;
        data4 = 0; //非唤醒方式,则清零p33寄存器,记忆胎压数据为0
    }

    /* 此处添加读取传感器数据 */

    data1++;
    data2++;
    data3++;
    data4++;
    p33_sfr_save_byte(data1, data2, data3, data4);
    p33_sfr_read_byte(&data1, &data2, &data3, &data4);
    log_info("p33_data[0x%x 0x%x 0x%x 0x%x]", data1, data2, data3, data4);
    // 读完上次记忆在p33寄存器的,就要执行iic读胎压传感器数据,比对数据,设置是否进入蓝牙模式

    // 模拟操作:
    if ((data1 % 3) == 0) { // 每唤醒几次,进一次蓝牙模式
        log_info("system_reset_flag:%d", RESET_CLK_BT);
        /* system_reset_flag(RESET_CLK_BT); // 要进蓝牙,需要执行这个之后 */
    }
    if (is_reset_source(SYS_POWER_LV0_RST)) {
        log_info("P33_LV0_RST -> SYS_POWER_LV0_RST");
        if (p33_reset_flag == RESET_CLK_BT) {
            log_info("P33_LV0_RST -> RESET_CLK_BT");
        }
        is_enter_bt = 1; //非唤醒方式和上电,需要执行一次时钟初始化全流程
    }
    log_info("p33_reset_flag:0x%x", p33_reset_flag);
    log_info("is_enter_bt:%d", is_enter_bt);
    board_init();
    my_malloc_init();

    clk_voltage_init(TCFG_CLOCK_MODE, DVDD_VOL_129V);

    if (is_enter_bt) {
        log_info("clk_early_init");
        board_adc_init();
        flash_system_init(); // SDFILE 初始化
        syscfg_tools_init();
        clk_early_init(TCFG_CLOCK_SYS_PLL_SRC, TCFG_CLOCK_OSC_HZ, TCFG_CLOCK_SYS_PLL_HZ); // 2.4ms
    } else {
        log_info("clk_fast_early_init");
        extern void clk_fast_early_init(u32 pll_frequency);
        clk_fast_early_init(TCFG_CLOCK_SYS_PLL_HZ);
    }


    wdt_init(WDT_8S);
    /* wdt_close(); */
    tick_timer_init();
    log_info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    log_info("       bd57 setup fast-boot-soff demo %s %s", __DATE__, __TIME__);
    log_info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    log_info("chip version: 0x%x", get_chip_version());
    sdk_verison_info();

    ///<---- for lco bt test
    void lco_mode_fpga_init(void);
    lco_mode_fpga_init();
    /* strc32k_test_init(); */
    clock_dump();
    efuse_dump();
    //osc 牵引失败
    if (osc_1pin_sta == 0) { //牵引起振失败
        /* power_set_soft_poweroff(); */
    }
    sys_timer_init();
    board_power_init();
    if (is_enter_bt) {
        system_init();
    }
    power_later_flowing();

    if (is_enter_bt) {
        int save_xosc_hcstrim2vm();
        save_xosc_hcstrim2vm();
    }
    //osc 牵引失败
    /* if ((config_xosc_1pin_en) && (get_osc_1pin_sta() == 0)) { //牵引起振失败 */
    /*     power_set_soft_poweroff(); */
    /* } */

    if (is_reset_source(SYS_POWER_LV0_RST) && (p33_reset_flag == RESET_CLK_BT)) {
        log_info("P33_LV0_RST -> SYS_POWER_LV0_RST RESET_CLK_BT");
    } else {
        //非唤醒模式直接关机
        rtc_lptmr_wakeup_enable(1000 * 5); // 10s定时唤醒
        power_set_soft_poweroff(); //此处关机正常,最早能关机的地方
    }
    app_main();
    wdt_close();
    while (1) {
        ;
    }

}

3.4.8.4. case默认应用资源(默认使用AW33N DEMO开发板)

Note

demo默认占用外设资源如下,具体可以查看board_aw33n_fastboot_cfg.h

I/O口占用情况

PA口 I/O

默认占用情况

PA4

默认打印UART0引脚

PA1

adkey检测引脚

硬件定时器占用情况

定时器

默认占用情况

TIMER0

暂无使用

TIMER1

暂无使用

TIMER2

暂无使用

TIMER3

暂无使用

串口占用情况

串口

默认占用情况

UART0

SDK打印

UART1

暂无使用

UART2

暂无使用