硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5171|回复: 32
收起左侧

[SPI/QSPI] 关于使用QSPI FLASH下载算法时遇到的问题

  [复制链接]

3

主题

40

回帖

49

积分

初级会员

积分
49
发表于 2020-11-30 10:56:37 | 显示全部楼层 |阅读模式
我使用的是STM32F767板子,问题一:一开始使用了网上下载的STM32F767_W25Q256.FLM,和内部FLASH下载算法一起添加进去。我需要在W25Q256上定义一个初始化的数组。其他程序就放在内部FLASH,然后查看map文件,也确实是这么分配的内存地址。结果就出错了,下载flash超时。

问题二:后来我就单用W25Q256作为FLASH,把代码全部放在外部FLASH中,查看map文件,代码也确实没有在0x08000000地址上,都在0x90000000上。但是进入调试,程序就进不去main函数,出现了如下问题error 122: AGDI: memory read failed (0xFFFFFFFE),程序就卡死在这个地址下。

请问这两个问题要如何解决,我现在没有一个明确的方向,硬件方面是没有问题的,新买的开发板,下载其他正常程序是可以的。
cuowu.png
map.png
下载.png
回复

使用道具 举报

4

主题

18

回帖

45

积分

新手上路

积分
45
发表于 2020-11-30 11:43:46 | 显示全部楼层
QSPI应该要启动配置的,程序全部放在外置qspi里不行吧,cpu的内部最起码应该有配置qspi的程序感觉。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2020-11-30 12:22:41 | 显示全部楼层
算法问题,参考我的重新制作吧,算法一定要和你的板子通用才行,不能随意下载使用。参考我自己做一个即可,也比较简单。

我这个是HAL版的,修改比较省事
【安富莱】STM32H7用户手册发布,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔,更新至87章(2020-11-16)
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980


QQ截图20201130130013.png
回复

使用道具 举报

3

主题

40

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2020-11-30 14:44:06 | 显示全部楼层
jnny_cn 发表于 2020-11-30 11:43
QSPI应该要启动配置的,程序全部放在外置qspi里不行吧,cpu的内部最起码应该有配置qspi的程序感觉。

那样就是两种下载算法混合使用,我试过把QSPI的代码放在内部FLASH中,结果就是flash Timeout
回复

使用道具 举报

3

主题

40

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2020-11-30 15:11:49 | 显示全部楼层
eric2013 发表于 2020-11-30 12:22
算法问题,参考我的重新制作吧,算法一定要和你的板子通用才行,不能随意下载使用。参考我自己做一个即可, ...

这个文档和所有程序我都下过了,嘿嘿嘿。不过这H7的代码想转成F7的代码应该很麻烦的把,现在确实是都是寄存器版本的下载算法程序。我下载的算法程序我看过了,QSPI配置和我开发板是对应的,所以我也不清楚是怎么回事
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2020-11-30 17:09:54 | 显示全部楼层
HuSanKeke 发表于 2020-11-30 15:11
这个文档和所有程序我都下过了,嘿嘿嘿。不过这H7的代码想转成F7的代码应该很麻烦的把,现在确实是都是寄 ...

HAL版的修改比较简单,比如我H7上做好SPI Flash的。简单修改就可以用那个F4,非常方便,这就是HAL库的优势。
回复

使用道具 举报

3

主题

40

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2020-11-30 21:15:47 | 显示全部楼层
eric2013 发表于 2020-11-30 17:09
HAL版的修改比较简单,比如我H7上做好SPI Flash的。简单修改就可以用那个F4,非常方便,这就是HAL库的优 ...

在H7工程上直接改HAL库吗?我在网上看到的算法程序大都是差不多的,试过很多都不行。
回复

使用道具 举报

17

主题

101

回帖

152

积分

初级会员

积分
152
发表于 2020-11-30 21:25:24 | 显示全部楼层
HuSanKeke 发表于 2020-11-30 21:15
在H7工程上直接改HAL库吗?我在网上看到的算法程序大都是差不多的,试过很多都不行。

直接用硬汉的,网上的寄存器写的太丑了,用硬汉的随便套
回复

使用道具 举报

3

主题

40

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2020-11-30 22:22:47 | 显示全部楼层
eric2013 发表于 2020-11-30 17:09
HAL版的修改比较简单,比如我H7上做好SPI Flash的。简单修改就可以用那个F4,非常方便,这就是HAL库的优 ...

对于F767我放弃了,我试了试H750的,我按照硬汉的算法程序稍微修改了下,下载算法可以和内部算法一起用,程序也可以下进去,但是运行到QSPI FLASH的代码就进入硬件中断,请问这是怎么回事呢?QSPI我也设置成内存映射模式了。
回复

使用道具 举报

3

主题

40

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2020-12-1 10:04:13 | 显示全部楼层
初晴sama 发表于 2020-11-30 21:25
直接用硬汉的,网上的寄存器写的太丑了,用硬汉的随便套

我用硬汉的套在H750上,倒是能下载了,但是运行到QSPI FLASH的代码就进硬件中断,不知道是什么情况
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2020-12-1 16:30:20 | 显示全部楼层
HuSanKeke 发表于 2020-12-1 10:04
我用硬汉的套在H750上,倒是能下载了,但是运行到QSPI FLASH的代码就进硬件中断,不知道是什么情况

内存映射是不是有点问题。
回复

使用道具 举报

3

主题

40

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2020-12-1 17:12:33 | 显示全部楼层
eric2013 发表于 2020-12-1 16:30
内存映射是不是有点问题。

昂,我觉得问题应该就出在这,因为运行到外部代码,就是cannot access memory,但是我目前还不知道解决办法,芯片是STM32H750VBT6
回复

使用道具 举报

17

主题

101

回帖

152

积分

初级会员

积分
152
发表于 2020-12-1 18:44:07 | 显示全部楼层
HuSanKeke 发表于 2020-12-1 17:12
昂,我觉得问题应该就出在这,因为运行到外部代码,就是cannot access memory,但是我目前还不知道解决办 ...

解决办法很简单,烧录一段数组到外部,然后映射读出来,读不对就是映射代码不对
回复

使用道具 举报

3

主题

40

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2020-12-1 21:55:12 | 显示全部楼层
初晴sama 发表于 2020-12-1 18:44
解决办法很简单,烧录一段数组到外部,然后映射读出来,读不对就是映射代码不对

你的意思是先不在外部FLASH中放代码,先定义一个数组在外部,然后在观察窗口看变量吗
回复

使用道具 举报

3

主题

40

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2020-12-1 22:03:47 | 显示全部楼层
初晴sama 发表于 2020-12-1 18:44
解决办法很简单,烧录一段数组到外部,然后映射读出来,读不对就是映射代码不对

我刚才试了一下,在0x90000100地址简单初始化定义一个数组,然后观察窗里它的值就全是FF,那看来就是映射出问题了。可是这个问题至今还是没头绪啊。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2020-12-2 01:08:33 | 显示全部楼层
HuSanKeke 发表于 2020-12-1 22:03
我刚才试了一下,在0x90000100地址简单初始化定义一个数组,然后观察窗里它的值就全是FF,那看来就是映射 ...

你的内存映射配置看下。
回复

使用道具 举报

3

主题

40

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2020-12-2 08:47:31 | 显示全部楼层
int QSPI_MemoryMapped(void)
{
    QSPI_CommandTypeDef s_command = {0};
    QSPI_MemoryMappedTypeDef s_mem_mapped_cfg = {0};
   

    /* 基本配置 */
    s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;      /* 1线方式发送指令 */
    s_command.AddressSize = QSPI_ADDRESS_32_BITS;             /* 32位地址 */
    s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;  /* 无交替字节 */
    s_command.DdrMode = QSPI_DDR_MODE_DISABLE;                /* W25Q256JV不支持DDR */
    s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;   /* DDR模式,数据输出延迟 */
    s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;            /* 每次传输都发指令 */
   
    /* 全部采用4线 */
    s_command.Instruction = QUAD_INOUT_FAST_READ_4_BYTE_ADDR_CMD; /* 快速读取命令 */
    s_command.AddressMode = QSPI_ADDRESS_4_LINES;                 /* 4个地址线 */
    s_command.DataMode = QSPI_DATA_4_LINES;                       /* 4个数据线 */
    s_command.DummyCycles = 6;                                    /* 空周期 */

    /* 关闭溢出计数 */
    s_mem_mapped_cfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;
    s_mem_mapped_cfg.TimeOutPeriod = 0;

   
    if (HAL_QSPI_MemoryMapped(&QSPIHandle, &s_command, &s_mem_mapped_cfg) != HAL_OK)
    {
        return 1;
    }

    return 0;
}
别的算法程序没有,我就按照这配置的每一项按寄存器配的,结果也是一样的。H7系列就是会进入硬件中断,至于F7连下载都超时
回复

使用道具 举报

3

主题

40

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2020-12-2 08:51:25 | 显示全部楼层
按照硬汉的代码,device换成H750了,其他也没啥改动。代码附上

V7-060_QSPI Flash的MDK下载算法制作.rar

11.18 MB, 下载次数: 32

改的H750算法代码

回复

使用道具 举报

0

主题

84

回帖

84

积分

初级会员

积分
84
发表于 2020-12-2 10:33:48 | 显示全部楼层
谢谢,,学习下。。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2020-12-2 10:57:30 | 显示全部楼层
HuSanKeke 发表于 2020-12-2 08:47
int QSPI_MemoryMapped(void)
{
    QSPI_CommandTypeDef s_command = {0};

加大QSPI Flash的分频,我的是100MHz刷的,看来你的板子刷不了100MHz跑内存映射,可以尝试设置为50MHz跑。
回复

使用道具 举报

3

主题

40

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2020-12-2 11:27:52 | 显示全部楼层
eric2013 发表于 2020-12-2 10:57
加大QSPI Flash的分频,我的是100MHz刷的,看来你的板子刷不了100MHz跑内存映射,可以尝试设置为50MHz跑 ...

我试了一下,还是不行。   

p = (char *)&QSPIHandle;

    for (i = 0; i < sizeof(QSPI_HandleTypeDef); i++)

    {

        *p++ = 0;

    }
    /* 复位QSPI */

    QSPIHandle.Instance = QUADSPI;   
    if (HAL_QSPI_DeInit(&QSPIHandle) != HAL_OK)

    {

        return 1;

    }

    /* 设置时钟速度,QSPI clock = 200MHz / (ClockPrescaler+1) = 100MHz */

    QSPIHandle.Init.ClockPrescaler = 2;

    /* 置FIFO阀值,范围1 - 32 */

    QSPIHandle.Init.FifoThreshold = 4;

    /*

        QUADSPI在FLASH驱动信号后过半个CLK周期才对FLASH驱动的数据采样。

        在外部信号延迟时,这有利于推迟数据采样。

    */

    QSPIHandle.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_HALFCYCLE;

    /* Flash大小是2^(FlashSize + 1) = 2^25 = 32MB */

    QSPIHandle.Init.FlashSize = QSPI_FLASH_SIZE; //QSPI_FLASH_SIZE - 1; 2020-03-04, 需要扩大一倍,否则内存映射方位最后1个地址时,会异常

    /* 命令之间的CS片选至少保持1个时钟周期的高电平 */

    QSPIHandle.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_5_CYCLE;

    /*

       MODE0: 表示片选信号空闲期间,CLK时钟信号是低电平

       MODE3: 表示片选信号空闲期间,CLK时钟信号是高电平

    */
    QSPIHandle.Init.ClockMode = QSPI_CLOCK_MODE_3;

    /* QSPI有两个BANK,这里使用的BANK1 */

    QSPIHandle.Init.FlashID = QSPI_FLASH_ID_2;

    /* V7开发板仅使用了BANK1,这里是禁止双BANK */

    QSPIHandle.Init.DualFlash = QSPI_DUALFLASH_DISABLE;

    /* 初始化配置QSPI */

    if (HAL_QSPI_Init(&QSPIHandle) != HAL_OK)

    {

        return 1;

    }


这是我的QSPI配置,因为我用的不是开发板,是H750的电路板,用的是BANK2,第二块QSPI区域,之前用W25Q256读写函数是通的。所以IO口应该不会有问题。
回复

使用道具 举报

3

主题

40

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2020-12-2 21:39:06 | 显示全部楼层
我现在认为可能问题不在算法程序上,是我应用的程序里,
我在LED初始化(把LED文件设成存在外部)的前面初始化了QSPI,W25Q256芯片,还有CRC校验,这次发现可以运行到LED代码,但是执行完LED的初始化就出不去了,死在了下图的位置上。

附上我应用程序的main函数
int main(void)
{

        Cache_Enable();                                        //打开L1-Cache
        HAL_Init();                                        //初始化HAL库
        Stm32_Clock_Init(160,5,2,4);        //设置时钟,400Mhz
        delay_init(400);                                //延时初始化
        uart_init(115200);                                //串口初始化
        MX_CRC_Init();
        QSPI_Init();
        W25QXX_Init();
        QSPI_MemoryMapped();
        LED_Init();                                                //初始化LED时钟
        KEY_Init();
        MPU_Memory_Protection();                //保护相关存储区域
       
    LCD_GPIO_Init();       
       
        while(1)
        {
                i++;
                delay_ms(10);
                if(i==20)
                {
                        LED2_Toggle;        //LED2 闪烁
                        i=0;
                }                  
        }
}





微信图片_20201202213346.png
回复

使用道具 举报

3

主题

40

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2020-12-2 21:44:49 | 显示全部楼层

很奇怪,程序貌似一直在执行这些代码,难道代码从0x90000000区域回不去0x08000000了吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2020-12-3 09:34:43 | 显示全部楼层
HuSanKeke 发表于 2020-12-2 21:44
很奇怪,程序貌似一直在执行这些代码,难道代码从0x90000000区域回不去0x08000000了吗?

继续排查下。
回复

使用道具 举报

3

主题

40

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2020-12-3 10:59:30 | 显示全部楼层
现在真的是一点办法都没有了,,没辙了没辙了。没有一点进展了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2020-12-3 11:05:16 | 显示全部楼层
HuSanKeke 发表于 2020-12-3 10:59
现在真的是一点办法都没有了,,没辙了没辙了。没有一点进展了。

实在搞不定就放弃吧
回复

使用道具 举报

3

主题

40

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2020-12-3 11:22:27 | 显示全部楼层
eric2013 发表于 2020-12-3 11:05
实在搞不定就放弃吧

那我再问一下,我使用H750内部只有128KB的FLASH,但是我需要用到一个450kb大小的数组,这种情况还有没有什么解决方法呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2020-12-4 09:54:39 | 显示全部楼层
HuSanKeke 发表于 2020-12-3 11:22
那我再问一下,我使用H750内部只有128KB的FLASH,但是我需要用到一个450kb大小的数组,这种情况还有没有 ...

不行就直接使用跟我的算法文件一样的芯片,使用一样的引脚,这样还省事些。
回复

使用道具 举报

3

主题

40

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2020-12-5 17:09:06 | 显示全部楼层
eric2013 发表于 2020-12-4 09:54
不行就直接使用跟我的算法文件一样的芯片,使用一样的引脚,这样还省事些。

嗯嗯,也是一种办法把。谢谢你
回复

使用道具 举报

17

主题

88

回帖

139

积分

初级会员

积分
139
发表于 2020-12-15 16:06:06 | 显示全部楼层
楼主,解决了吗,我移植f7也是timeout
回复

使用道具 举报

3

主题

40

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2020-12-15 21:50:06 | 显示全部楼层
into 发表于 2020-12-15 16:06
楼主,解决了吗,我移植f7也是timeout

问题还在搁置中,没有搞,因为实在没办法了
回复

使用道具 举报

3

主题

40

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2020-12-15 21:54:16 | 显示全部楼层
今天晚上我又重新拾起来再研究研究,我直接套用硬汉的MDK下载算法的工程,修改了芯片型号H750VBT6,改了QSPI的管脚配置。结果仍然是成功进入调试,运行到外部FLASH代码就进入hardfault。仍然找不到问题所在
回复

使用道具 举报

3

主题

40

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2020-12-15 21:59:56 | 显示全部楼层
eric2013 发表于 2020-12-4 09:54
不行就直接使用跟我的算法文件一样的芯片,使用一样的引脚,这样还省事些。

我想问一下,我这种情况下,就算使用boot方式是不是也跳转不到QSPI FLASH中
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 20:20 , Processed in 0.306286 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表