需要配置外部Flash跑代码,主要有以下几点: 1、修改scatter文件,外部flash总线地址范围是从0x00800000~0x00B00000,所以其大小0x00300000字节(3MB) 因此,需要将scatter文件中的0x00403000全部替换为0x00803000,加载长度修改为0x00300000 2、硬件上外部flash的IO分配的是CS=P07, MOSI=P08 CLK=P09 MISO=P02, 注意应用预留这4个口; 另外,我司的EVB上有预留flash封装,需要短路F_VCC和VBAT,以及焊接HOLD的上拉R8(10K)和C14(0.1uF); 3、代码配置,主要是休眠后唤醒需要重新配置flash,因为休眠芯片会断电所有外设; 并且需要将唤醒后通过CO_SECTION_RAMTEXT属性将相关的函数的代码放入RAM中运行; 4、测试OK的Flash是puya的P25Q80U,附件文件解压后有测试OK的bin和对应的main.c以及scatter文件, 该bin会通过P05输出波特率为921600的打印信息,通过蓝牙可以搜索到名称为"----6621D----"的设备; #if EXT_XIP_FLASH_ENABLE #define EXT_FLASH_CS_PIN (7) #define EXT_FLASH_MOSI_PIN (8) #define EXT_FLASH_CLK_PIN (9) #define EXT_FLASH_MISO_PIN (2) CO_SECTION_RAMTEXT static void ext_xip_flash_restore(void) { static sf_config_t ext_flash_config={.delay=5, .freq_hz=6, .width=2}; pmu_pin_mode_set(BITMASK(EXT_FLASH_MOSI_PIN), PMU_PIN_MODE_PU); pinmux_config(EXT_FLASH_CS_PIN, PINMUX_SFLASH1_CSN_CFG); pmu_pin_mode_set(BITMASK(EXT_FLASH_CLK_PIN), PMU_PIN_MODE_PP); pinmux_config(EXT_FLASH_CLK_PIN, PINMUX_SFLASH1_CK_CFG); pmu_pin_mode_set(BITMASK(EXT_FLASH_CLK_PIN), PMU_PIN_MODE_PP); pinmux_config(EXT_FLASH_MOSI_PIN, PINMUX_SFLASH1_SI_CFG); pmu_pin_mode_set(BITMASK(EXT_FLASH_MOSI_PIN), PMU_PIN_MODE_PP); pinmux_config(EXT_FLASH_MISO_PIN, PINMUX_SFLASH1_SO_CFG); pmu_pin_mode_set(BITMASK(EXT_FLASH_MISO_PIN), PMU_PIN_MODE_PU); sf_enable(HS_SF1, 0); sf_config(HS_SF1, 0, &ext_flash_config); // bool flash_detect; // flash_detect=sf_detect(HS_SF1, 0); } #endif CO_SECTION_RAMTEXT static void peripheral_restore(void) { #if defined(CONFIG_LOG_OUTPUT) uart_open(DEBUG_UART, DEBUG_UART_BAUDRATE, UART_FLOW_CTRL_DISABLED, NULL); #endif } CO_SECTION_RAMTEXT static void power_sleep_event_handler(co_power_sleep_state_t sleep_state, co_power_status_t power_status) { switch(sleep_state) { case POWER_SLEEP_ENTRY: break; case POWER_SLEEP_LEAVE_TOP_HALF: peripheral_restore(); #if EXT_XIP_FLASH_ENABLE ext_xip_flash_restore(); #endif break; case POWER_SLEEP_LEAVE_BOTTOM_HALF: break; } } |