本帖最后由 lihuasoft 于 2025-2-18 16:09 编辑
也不怕被笑“没见识”了,说实话这是我用过的最高级的MCU,板子到手上电,出厂Demo固件太炫!
(实际操作体验的流畅炫酷感,比图片强太多,我的手机拍不出效果)
把板子翻过来看,就开始有点懵,不知道从哪里入手。于是去ST官网,搜索“STM32H750B-DK”:
点击进入STM32H750B-DK的主页面,在CAD资源里面,找到原理图、PCB图纸:
因为我拿到的板子的小版本是B01(见LCD屏右侧的白底丝印,如下图),所以上面列表里最末一个pdf版的原理图,应该是与硬件最相符的。
在Documentation里面,找到板子的用户手册(UM2488):
MCU的数据手册、参考手册,也同样在ST官网搜索找到:
接下来的日子里,得空就看原理图,现在终于把原理图的主要部分搞懂了。
然后就抑制不住点灯的欲望,想试试CubeMX仓库里那么多的例程。
灯点了,的确亮了:
忽然有些后悔,我的出厂Demo固件就这么没了?
液晶屏一片惨白。虽然也知道那些图片视频资源仍在。
还能恢复出厂效果吗?
开始翻找CubeMX的仓库文件夹:
在Cube的H7 V1.12下面的文件夹Projects里,找到我的板子对应的文件夹:STM32H750B-DK。
这里面,Templates提供了2个模板;
Examples提供了一些外设的独立Demo;
Demonstrations!这里面应该就是我要找的Demo了吧?
编译,下载...一顿操作猛如虎,定睛一看二百五。
下载不成功。
什么?0x90000000?从参考手册上,找到这个地址的定义,是QSPI的地址:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x90100000 0x1000 { ; load region size_region
ER_IROM1 0x90100000 0x1000 {
*.o (RESET, +First)
}
}
LR_TGFX 0x90101000 { ; load region size_region
ER_TGFX 0x90101000 {
*(.IntThirdPartyHeaderSection, +First)
*(InRoot$Sections)
.ANY (+RO)
}
RW_IRAM1 0x24000000 0x80000 { ; RW data
.ANY (+RW +ZI)
*(.sdio_heap)
}
RW_SDRAM 0xD0000000 UNINIT 0x800000 { ; RW data
*(.BmpCacheSection)
*(.FBSection)
}
}
LR_QSPI_TGFX 0x94000000 0x4000000 { ; load region size_region
ER_thp_ext_header 0x94000000 0x40 {
*(.ExtThirdPartyHeaderSection)
}
ER_QSPI_TGFX 0x94000040 {
*(demo_icon_section)
*(demo_**_section)
*(washer_video_section)
*(receipe_video_section)
*(ExtFlashSection)
*(FontFlashSection)
*(TextFlashSection)
}
}
这怎么下载呀。。。不会呀握草,真的没学过这个,只搞过把程序下载到位于0x08000000的MCU片内FLASH。
看来我菜的程度还不是一般,是很菜啊,没办法,只能慢慢学,慢慢来......
但是,在学会之前,这个Demo固件是找不回来了吗?
只能盯着这惨白惨白的屏幕吗......
心情跌落到极点之际,不抱任何希望地打开了readme.txt......
啊哈?而且看见了FULL这个词,兴奋。赶紧从官网下载这个压缩包:
里面有一个批处理文件,执行它!
(期间因为Stm32cube_programmer路径不符,稍稍修改了一下,不算困难)
就这样,下载完成,板子自动重启,出厂Demo固件恢复了。
这才有心情打开批处理文件,好好研究了一下,感慨:学到了,学到了,这个命令行用法,可真酷!
以后写个批处理给负责生产的同事用,会不会很爽滑呀。
下面把刚刚学到的这个批处理,写成注释,记录在这里,以备自己遗忘症发作后再来看看回忆:
::凡是用双冒号开头的行,都是批处理的注释文本
::命令setlocal的作用是,使以下变量的作用域为过程内私有,直至批处理结束,或者endlocal命令出现
@setlocal
::COLOR 0B
::下面这段,定义了几个字符串名,并用来拼接HEX文件名,然后判断HEX文件是否存在
:: Chip Name
@set CHIP_NAME=STM32H750B
:: Main Board
@set MAIN_BOARD=-DK
:: Demo Name
@set DEMO_NAME=STM32Cube_Demo
:: Demo Version
@SET DEMO_VER=V1.0.0
:: Hex filename
@SET HEX_FILE="%DEMO_NAME%-%CHIP_NAME%%MAIN_BOARD%-%DEMO_VER%.hex"
@IF NOT EXIST "%HEX_FILE%" @SET HEX_FILE=%DEMO_NAME%-%CHIP_NAME%%MAIN_BOARD%-%DEMO_VER%_FULL.hex
@IF NOT EXIST "%HEX_FILE%" @echo %HEX_FILE% Does not exist !! && GOTO goError
:: 这段用来拼接下载算法文件名
:: Board ID
@SET BOARD_ID=0
:: External Loader Name
:: REM是注释命令,以它开头的行被注释掉,不执行
REM @SET EXT_LOADER=MT25TL01G_%CHIP_NAME%%MAIN_BOARD%
::MT25TL01G是板子上使用的QSPI存储芯片。ST早已按这些字符串写好文件名,放在了库文件夹里,所以不能搞错
@SET EXT_LOADER=MT25TL01G_%CHIP_NAME%-DISCO
::关于与板子上的存储芯片不一致,下面会有说明
::下面这段,尝试找到STM32_Programmer的正确安装路径
@SET STM32_PROGRAMMER_PATH="%ProgramFiles(x86)%\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin"
@IF NOT EXIST %STM32_PROGRAMMER_PATH% @SET STM32_PROGRAMMER_PATH="%ProgramW6432%\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin"
@IF NOT EXIST %STM32_PROGRAMMER_PATH% @SET STM32_PROGRAMMER_PATH="%ProgramFiles%\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin"
@IF NOT EXIST %STM32_PROGRAMMER_PATH% @echo STM32CubeProgrammer is not installed !! && GOTO goError
@IF NOT EXIST %STM32_PROGRAMMER_PATH% @echo %STM32_PROGRAMMER_PATH% Does not exist !! && GOTO goError
@SET STM32_EXT_FLASH_LOADER=%STM32_PROGRAMMER_PATH%\ExternalLoader\%EXT_LOADER%.stldr
@IF NOT EXIST %STM32_EXT_FLASH_LOADER% @ECHO %STM32_EXT_FLASH_LOADER% Does not exist !! && GOTO goError
::有了安装路径,也有了下载算法文件名,就可以定位到这个下载算法文件
@SET STM32_EXT_FLASH_LOADER=%STM32_PROGRAMMER_PATH%\ExternalLoader\%EXT_LOADER%.stldr
::到这个路径下,的确可以找到这个下载算法文件,如图
::查看MT25TL01G的芯片手册,可知它是一个1G大小的FLASH;
::然而查看实物,板子上是有两个丝印为8ZA15的QSPI-FLASH芯片(图4右下角的2个16脚芯片);
::这在原理图上可以找到答案:
::设置批处理命令窗口的标题文本
TITLE STM32CubeProgrammer Utility for %CHIP_NAME%%MAIN_BOARD%
:: 把 STM32CubeProgrammer 安装路径放入PATH路径环境变量
@SET PATH=%STM32_PROGRAMMER_PATH%;%PATH%
:: 好了,前面的准备工作(拼接HEX文件名、路径、下载算法文件名等)做完,下面开始执行了
::运行STM32_Programmer_CLI.exe,按下载算法执行擦除、下载,结束后重启板子
STM32_Programmer_CLI.exe -c port=SWD index=%BOARD_ID% reset=HWrst -el %STM32_EXT_FLASH_LOADER% -e all -d %HEX_FILE% -HardRst
::命令行参数的解释:
:: -c 即--connect,是连接到设备
:: port=SWD 用什么连接呢?用SWD
:: index=0 默认就是0,也就是连接第1个SWD设备
:: reset=HWrst 连接前执行硬件复位
:: -el 即--extload,即指定一个下载算法,哪个算法呢?即前面拼接好的STM32_EXT_FLASH_LOADER
:: -e all 即--erase all,擦除所有存储扇区
:: -d 即--download,即指定要下载的Hex文件,哪个文件呢?即前面拼接好的HEX_FILE
:: -HardRst 即下载结束后执行硬件重启,仅-c时使用JTAG/SWD的才支持这个选项
::根据STM32_Programmer_CLI.exe的命令返回值,判断是否执行出错了
@IF NOT ERRORLEVEL 0 (
@goto goError
)
完整的批处理命令文件(带注释)在贴子附件里,有感兴趣的可以下载:
#申请原创# |