天天看点

从零实现 Cortex-M7从驱动到应用(一)分散加载+SDRAM+SPI_FLASH

接下来我将与大家分享H750的开发,最终实现emwin的运行。

搭建环境

cubemx

由于cubemx老版本不支持H750,所以只能用新版本,注意:老版本支持工程路径为中文,新版本不支持!

需要H750的板级包,在cubemx上保存工程时会提示缺少,按下一步安装即可,cubemx上还是很快的。

MDK

如果V5.20不支持,那么就安装V5.23。

因为之前没有用过H750,因此缺少H750的板级包,所以需要安装。在MDK中更新板级包十分麻烦,速度也慢,最好是在外部下载好,安装完。

LED翻转实验,验证代码能够正常运行的最有效手段

  1. 配置cubemx
  2. 生成代码
  3. 配置DEBUG
  4. 移植驱动sys.c delay.c led.c key.c
  5. 添加应用代码,并下载查看效果,若LED0、LED1按照1S翻转状态,那么就表示成功

关于code\RO\RW\ZI

从零实现 Cortex-M7从驱动到应用(一)分散加载+SDRAM+SPI_FLASH

用时:3h

分散加载

移植SPI_FLASH

H750为了降成本,flash只有128K,面对大量工程文件的时候一定是不够用的,因此需要SPI_FLASH分担一部分代码。

核心代码放在STM_FLASH中,不重要的代码放在SPI_FLASH中。

相比于 MDK 自己生成的分散加载文件,我们自己编写的相对复杂一些, qspi_code_scf.scf

分散加载文件包含 2 个加载域, 3 个运行域,分别是:

LR_m_stmflash 加载域, 起始地址为: m_stmflash_start(宏定义,实际值: 0X0800 0000),

大小为: m_stmflash_size(宏定义,实际值: 0X20000)。它包含二个运行域分别是:

ER_m_stmflash 运行域,起始地址为: m_stmflash_start(宏定义,实际值: 0X0800 0000),

大小为: m_stmflash_size(宏定义,实际值: 0X20000)。

RW_m_stmsram 运行域,起始地址为: m_stmsram_start(宏定义,实际值: 0X2400 0000)

大小为: m_stmsram_size(宏定义,实际值: 0X80000)。

LR_m_qspiflash 加载域,起始地址为: m_qspiflash_start(宏定义,实际值: 0X9000 0000)

大小为: m_qspiflash_size(宏定义,实际值: 0X80000)。它包含一个运行域:

ER_m_qspiflash 运行域,起始地址为: m_qspiflash_start(宏定义,实际值: 0X9000 0000)

大小为: m_qspiflash_size(宏定义,实际值: 0X80000)。

具体的存储器分配情况为:

ER_m_stmflash 运行域,包含: *.o (RESET, +First)开始到 delay.o 结束的相关代码,这些代

STM32H750 开发指南(HAL 库版)

码运行在内部 FLASH,可以得到最佳的性能。需要注意的是:这些代码大部分都是必须放到内

部 FLASH,否则无法正常运行!!

ER_m_qspiflash 运行域,所有没有在 ER_m_stmflash 运行域指定的代码,都被放在这个运

行域,这些代码运行在外部 SPI FLASH,速度比内部 FLASH 慢一些。

RW_m_stmsram 运行域,所有变量及堆栈(RW Data + ZI Data)都存放在这个运行域。

以上分散加载文件,由正点原子编写,为了方便大家使用,不用频繁修改.sct 文件,特意

将.ANY ROM 区域放在外部 SPI FLASH,这样大家在新增.c 参与编译时,默认就是存放在外部

SPI FLASH 的,这样使用起来就更方便。

注意:

1, 如果你新增的代码,对速度有要求,可以将其对应的.o 添加到内部 FLASH,即放在:

ER_m_stmflash 运行域。

2, 如果添加新代码后,程序无法正常运行(通常表现为黑屏/不启动),可以尝试将新增

的.o 放到 ER_m_stmflash 运行域后(重新编译)再尝试。如果还不行,可以尝试将所

有代码都放到 ER_m_stmflash 运行域后再尝试。

步骤:

将分散加载文件由默认改为原子编写的 qspi_code_scf.scf。

然后在初始化中加上对SPI_FLASH的初始化。

按照之前所说,若不对SPI_FLASH初始化,程序起不来,初始化后才能正常。

编译出现警告

按照原子的分散加载文件执行有很多警告,是一些没有的.o文件,可能是为了以后使用方便,故把所有该放在STM_FLASH的.o都先放好,但是奇怪的是例程编译没有警告。

把没有的.o先屏蔽掉,但是还有一个警告:..\SCRIPT\qspi_code_scf.scf(70): warning: L6329W: Pattern sys.o(RO) only matches removed unused sections.

从零实现 Cortex-M7从驱动到应用(一)分散加载+SDRAM+SPI_FLASH

所以没什么大问题,人家只是提醒一下你而已。

下载时出现问题:

从零实现 Cortex-M7从驱动到应用(一)分散加载+SDRAM+SPI_FLASH

选择适当的编程算法。对于部分芯片类别来说,由于内外Flash有别,应根据需要选择适当的算法,否则无法达到烧录目的。

因为我们采用分散加载,故外部flash的部分也要参与编译的。解决成功

下载后程序不执行,经过debug发现,出现死机情况。解决办法:将SPI_FLASH的初始化靠前。

代码成功执行了!

之后会用到内存管理实验的功能,所以我们先把MPU内存保护和内存管理实验的驱动移植过来。

我看到还有用到SPI_FLASH的,那么我们再移植他吧。

总结:

到现在为止,我们已经搭建好了环境,从keil、cubemx、分散加载。

我们已经可以继续在这个工程的基础上添加功能了。

发现一个问题,cubemx生成会把我的分散加载文件的配置给修改成默认的,因此我们还需要每次cubemx生成后检查一下该配置!

把分散加载文件改掉再试一遍功能,能否正常。

至此,我们工程环境已经配置好了,时间也已经过去了一天半,中间几次想放弃,还是坚持下来了,加油!

舜发于畎亩之中,傅说举于版筑之间,胶鬲举于鱼盐之中,管夷吾举于士,孙叔敖举于海,百里奚举于市。故天将降大任于是人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。

如果你有好的想法,请私信我,欢迎讨论。

继续阅读