硬汉嵌入式论坛

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

[SPI/QSPI] 适用于STM32H750的QSPI Flash下载算法(HAL版)

[复制链接]

12

主题

147

回帖

183

积分

初级会员

积分
183
发表于 2020-12-7 13:45:00 | 显示全部楼层 |阅读模式
之前寄存器版的https://forum.anfulai.cn/forum.php?mod=viewthread&tid=91749

因为最近硬汉推出HAL版的,而我之前一直尝试却没有成功,现在有了硬汉的成功案例,所以决定再尝试一番。

经过几天的摸索,推出下面的带串口打印调试的版本。
Mdk_Flm.zip (1.3 MB, 下载次数: 339)

这个版本与硬汉的几点区别:
1、完全采用CubeMX生成的工程和源码。
2、带串口打印调试功能,可以清楚地查看整个Flash擦除、下载和校验的过程。
3、不必重定义HAL_InitTick,不必关中断。
4、不必注释掉stm32h7xx_hal_rcc.c、stm32h7xx_hal_rcc_ex.c和stm32h7xx_hal_qspi.c中的一些函数和语句。
5、在Init中由fnc可判断即将进入Verify校验过程,此时才打开内存映射功能,没必要次次进入。
6、采用CubeMX自动生成的时钟初始化函数,采用MCU内部的64MHz时钟,避免外部时钟的频率的不确定性(不一定是25MHz)。

以下是一次下载的串口输出情况:
[2020-12-07 12:59:57.082]
DeviceID: 0xEF16
Init Erase 0x90000000 200000000Hz

[2020-12-07 12:59:57.297]
BlankCheck 0x90000000 4096 0xFF

[2020-12-07 12:59:57.485]
EraseSector 0x90000000

[2020-12-07 12:59:57.704]
BlankCheck 0x90001000 4096 0xFF

[2020-12-07 12:59:57.907]
EraseSector 0x90001000

[2020-12-07 12:59:58.125]
BlankCheck 0x90002000 4096 0xFF

[2020-12-07 12:59:58.311]
EraseSector 0x90002000

[2020-12-07 12:59:58.527]
BlankCheck 0x90003000 4096 0xFF

[2020-12-07 12:59:58.713]
EraseSector 0x90003000

[2020-12-07 12:59:58.930]
UnInit Erase

[2020-12-07 13:01:37.218]
DeviceID: 0xEF16
Init Program 0x90000000 200000000Hz

[2020-12-07 13:01:40.739]
ProgramPage 0x90000000 4096

[2020-12-07 13:01:44.276]
ProgramPage 0x90001000 4096

[2020-12-07 13:01:47.788]
ProgramPage 0x90002000 4096

[2020-12-07 13:01:51.301]
ProgramPage 0x90003000 312

[2020-12-07 13:01:51.502]
UnInit Program

[2020-12-07 13:03:29.791]
DeviceID: 0xEF16
Init Verify 0x90000000 200000000Hz

[2020-12-07 13:03:33.320]
Verify 0x90000000 4096

[2020-12-07 13:03:36.833]
Verify 0x90001000 4096

[2020-12-07 13:03:40.363]
Verify 0x90002000 4096

[2020-12-07 13:03:43.877]
Verify 0x90003000 312

[2020-12-07 13:03:44.062]
UnInit Verify


从以上带时间戳的输出易见,Init调用之前MDK要花费大量时间(100秒左右)来做一些准备工作,很容易让人误认为MDK处于死机状态。
这可能是HAL版下载算法的一个缺点,因为生成的FLM文件较大。
源码中的存在几个多余的文件,比如stm32h7xx_hal_i2c.c,是CubeMX自动添加的,这些功能其实没有用到,可以删除,编译后还可以减小FLM尺寸。

此外,硬汉FlashPrg.c中的ProgramPage函数存在一个影响不大的BUG:
    while(size > 0)
    {
        if (QSPI_WriteBuffer(buf, adr, 256) == 1)
        {
            QSPI_MemoryMapped();

            return 1;   
        }
        size -= 256;
        adr += 256;
        buf += 256;
    }

当size小于256的时候,第1次始终写入256个字节的数据。然后第2次size<0退出while循环。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2020-12-7 14:39:15 | 显示全部楼层
楼主这个版本,能正常做这种方式的调试不

爽,一种非常给力的STM32H7内部Flash和QSPI Flash混合运行程序的方式,不再需要用户单独制作BOOT和APP
https://forum.anfulai.cn/forum.p ... 1011&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

12

主题

147

回帖

183

积分

初级会员

积分
183
 楼主| 发表于 2020-12-7 15:14:47 | 显示全部楼层
eric2013 发表于 2020-12-7 14:39
楼主这个版本,能正常做这种方式的调试不

爽,一种非常给力的STM32H7内部Flash和QSPI Flash混合运行程序 ...

有时间再试试,可能不适合这种混合下载方式。特别是在调试的时候。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-15 07:35 , Processed in 0.051970 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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