随风~~~ 2025-04-29 23:58 采纳率: 0%
浏览 13

程序外部执行遇到问题

最近在做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)加载的问题,已经确认了读写和内存映射下的读没有问题。下面是一些可能的解决方案:

    1. 检查QSPI初始化:确保QSPI的初始化正确,包括设置QSPI的 clock、mode、and polarity等参数。
    2. 检查W25Q128的地址映射:确保W25Q128的地址映射正确,包括设置W25Q128的地址空间和映射关系。
    3. 检查boot程序的执行路径:确保boot程序的执行路径正确,包括设置boot程序的入口点和执行顺序。
    4. 检查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();
    

    请注意,这只是一个示例代码,实际情况可能需要根据具体的硬件和软件环境进行修改。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月29日