最近在做STM32H750的程序片外加载,选择的外部Flash是W25Q128,W25Q128的驱动程序用的是正点原子的,已经确认过读写和内存映射下的读没有问题,boot程序中初始化QSPI和W25Q128,进入内存映射模式后进行程序跳转,在调试状态看到执行跳转后PC(程序计数器)寄存器的值已经跳到了外部Flash的映射地址中执行,但在执行十几二十条汇编指令后内存映射模式就断开了,0x90000000的地址的值都变成了问号,我尝试在app程序中的mian函数去掉所有内容,就保留了中断向量表的重映射SCB->VTOR = 0x90000000;但还是没有效果,有懂qspi内存映射原理和boot程序跳转原理的专家吗
4条回答 默认 最新
阿里嘎多学长 2025-04-29 23:58关注阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程
程序外部执行遇到问题
你遇到了STM32H750外部Flash(W25Q128)加载的问题,已经确认了读写和内存映射下的读没有问题。下面是一些可能的解决方案:
- 检查QSPI初始化:确保QSPI的初始化正确,包括设置QSPI的 clock、mode、and polarity等参数。
- 检查W25Q128的地址映射:确保W25Q128的地址映射正确,包括设置W25Q128的地址空间和映射关系。
- 检查boot程序的执行路径:确保boot程序的执行路径正确,包括设置boot程序的入口点和执行顺序。
- 检查W25Q128的驱动程序:确保W25Q128的驱动程序正确,包括检查驱动程序的实现和参数设置。
如果以上解决方案都不能解决问题,可以提供更多的信息和代码,例如boot程序的代码、QSPI和W25Q128的初始化代码等,以便更好地帮助你解决问题。
代码示例
// QSPI初始化 QSPI_HandleTypeDef hqspi; hqspi.Instance = QSPI1; hqspi.Init.ClockSpeed = 10000000; hqspi.Init.DualTransfer = QSPI_DUALTRANSFER_DISABLE; hqspi.Init.FastMode = QSPI_FASTMODE_DISABLE; hqspi.Init.DualFlash = QSPI_DUALFLASH_DISABLE; if (HAL_QSPI_Init(&hqspi) != HAL_OK) { // 初始化失败处理 } // W25Q128的地址映射 W25Q128_HandleTypeDef hw25q128; hw25q128.Instance = W25Q128; hw25q128.Init.ClockSpeed = 10000000; hw25q128.Init.AddressSpace = W25Q128_ADDRESS_SPACE_1; if (HAL_W25Q128_Init(&hw25q128) != HAL_OK) { // 初始化失败处理 } // boot程序的执行路径 __HAL_RCC_QSPI_CLK_ENABLE(); __HAL_RCC_W25Q128_CLK_ENABLE();请注意,这只是一个示例代码,实际情况可能需要根据具体的硬件和软件环境进行修改。
解决 无用评论 打赏 举报