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 |
暂无使用 |