接下来我将与大家分享H750的开发,最终实现emwin的运行。
搭建环境
cubemx
由于cubemx老版本不支持H750,所以只能用新版本,注意:老版本支持工程路径为中文,新版本不支持!
需要H750的板级包,在cubemx上保存工程时会提示缺少,按下一步安装即可,cubemx上还是很快的。
MDK
如果V5.20不支持,那么就安装V5.23。
因为之前没有用过H750,因此缺少H750的板级包,所以需要安装。在MDK中更新板级包十分麻烦,速度也慢,最好是在外部下载好,安装完。
LED翻转实验,验证代码能够正常运行的最有效手段
关于code\RO\RW\ZI
用时: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.
所以没什么大问题,人家只是提醒一下你而已。
下载时出现问题:
选择适当的编程算法。对于部分芯片类别来说,由于内外Flash有别,应根据需要选择适当的算法,否则无法达到烧录目的。
因为我们采用分散加载,故外部flash的部分也要参与编译的。解决成功
下载后程序不执行,经过debug发现,出现死机情况。解决办法:将SPI_FLASH的初始化靠前。
代码成功执行了!
之后会用到内存管理实验的功能,所以我们先把MPU内存保护和内存管理实验的驱动移植过来。
我看到还有用到SPI_FLASH的,那么我们再移植他吧。
总结:
到现在为止,我们已经搭建好了环境,从keil、cubemx、分散加载。
我们已经可以继续在这个工程的基础上添加功能了。
发现一个问题,cubemx生成会把我的分散加载文件的配置给修改成默认的,因此我们还需要每次cubemx生成后检查一下该配置!
把分散加载文件改掉再试一遍功能,能否正常。
至此,我们工程环境已经配置好了,时间也已经过去了一天半,中间几次想放弃,还是坚持下来了,加油!
舜发于畎亩之中,傅说举于版筑之间,胶鬲举于鱼盐之中,管夷吾举于士,孙叔敖举于海,百里奚举于市。故天将降大任于是人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。