arm - 如何让STM32F429NI中的bootloader跳转到外部Nor Flash
问题描述
我正在研究 STM32F429NI 评估板,我有一个让 LED 闪烁的代码。我希望闪烁 LED 代码出现在外部或闪存中,并且驻留在内部闪存的引导加载程序必须将控制权转移到 STM32F429NI 的外部或闪存。
STM32F429NI评估板参考手册:https ://www.st.com/en/microcontrollers-microprocessors/stm32f429ni.html#documentation
我遵循的步骤是:
void jump_to_external_flash(uint32_t address)
{
uint32_t msp_value = *(__IO uint32_t*)address;
void (*reset_handler)(void);
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
HAL_DeInit();
__set_MSP(msp_value);
uint32_t rst_handler_addr = *(__IO uint32_t*)(address + 0x4);
reset_handler = (void*) rst_handler_addr;
reset_handler();
}
在 LED 闪烁链接脚本的代码中
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K
CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
FLASH (rx) : ORIGIN = 0x60000000, LENGTH = 64MB
}
解决方案
这很简单。您需要初始化灵活内存控制器 (FMC) 以将外部闪存映射到 uC 地址空间。然后直接跳转到那里的代码。
FLASH 仍将位于正常地址。为外部 FLASH 添加一个新的内存段。
要对其进行编程,您可能需要编写自己的例程。此处示例:https ://github.com/magicmicros/AT25Q641_ExternalLoader
PS 不要在引导加载程序中使用 HAL 功能。
推荐阅读
- c - 如何在 Rust 中正确包装 C 函数指针?
- r - 何运行一个函数(多次)改变全局环境中的变量(tibble)
- python - 如何在带有%的str中包含列表?蟒蛇问题
- gerrit - 在 Gerrit 2.14 中启用头像
- reactjs - 为什么我不能从我的 jsx 中的函数渲染“Hello”?
- youtube-api - YouTube 数据 API - 使用经理帐户将视频上传到 youtube 品牌帐户的频道
- node.js - 在连接池缓存中找不到 poolAlias “default”(将 Express 服务器连接到 Oracle 数据库)
- python - 如何用python建立人口金字塔
- javascript - 谷歌图表不允许我在行创建中使用变量
- java - JPA 不按 LocalDate 和 LocalTime 对记录进行排序