上节,我们介绍了如何编译链接生成helloworld程序。在些基础上,接下来我们就要把这个helloworld程序在stm32板子上运行起来。我使用了两种方法来启动运行这个程序。一种是下章节要介绍的:烧写到内部flash中直接启动运行;另一种则是本节所介绍的:使用redboot引导运行内存中的helloworld程序。
要想使用redboot引导运行内存中的helloworld程序,首先移植好redboot并能成功运行。这已经在stm32移植ecos #4,移植redboot(ROM启动方式)上篇和stm32移植ecos #5,移植redboot(ROM启动方式)下篇两篇文章中介绍了。
当然你也可以跳过本章节,直接使用下章节介绍的方法。
下面开始介绍如何实现使用redboot引导运行。
1. 确保redboot可成功运行
首先,确保你的redboot可使用ROM方式正常启动了。如果还没有,请参考上述两篇文章。
2. 配置ecos的启动类型为RAM类型
这是关键一步,使用ecos图形配置工具配置ecos的启动类型(Startup type)为RAM类型,如下图所示。
3. 重新编译
重新配置ecos启动类型后,重新编译ecos,然后也记得重新编译helloworld程序(先make clean,然后再make一下)。编译方法详见:http://velep.com/archives/551.html。
编译helloworld程序后将生成hello.srec和hello.bin两种格式的目标可执行文件,这里我们使用hello.srec文件,因为这种格式的目标文件包含了应用程序入口地址和内存使用范围,使我们在redboot引导启动程序时不需要再指定入口地址了。
4. 打开超级终端,加载helloworld程序到内存中
打开超级终端,板子上电,进入到redboot的命令行。然后我们使用串口的modem方式把hello.srec加载到内存中去。在redboot的命令行中执行如下命令:
该命令中,选项-v使能加载过程 的详细方式。-m yMODEM选项告知Redboot使用Y调制解调协议传输目标程序文件。键入该命令后,会出现字母C,表示redboot已经作好传输目标程序文件的准备。
在超级终端中,选择传送—>发送文件菜单传输hello.srec文件。这时会弹出如下图所示的对话框。选择对应的目标执行文件,然后选择协议,最后点击发送,则开始传输文件。
注意,协议要选择Ymodem。
传输完成后,对话框自动关闭,redboot会输出信息。如下图所示。
输出的信息包括应用程序的入口(Entry point)和使用的内存范围(address range)以及文件传输状态的概况。这样就把目标执行程序文件加载到内存中指定地址(即入口(Entry point))了。
5. 启动执行内存中的helloworld程序
由于redboot知道了应用程序的加载地址,因此不需要指定redboot go命令的入口地址了。在redboot命令中执行命令:go,则开始运行程序并可看到我们程序打印的输出信息。如下图所示。
推荐阅读相关文章:
- stm32移植ecos系列文章归档
- stm32移植ecos #12,redboot引导启动flash中的应用程序映像文件(上)
- stm32移植ecos #10,移植ecos并成功运行helloworld程序,烧写到内部flash直接运行helloworld程序
- stm32移植ecos #8,移植ecos并成功运行helloworld程序,编译链接生成helloworld程序
- stm32移植ecos #7,移植ecos并成功运行helloworld程序,配置编译生成静态链接库文件
- stm32移植ecos #6,redboot的疑问和问题,redboot是必需的吗?
- stm32移植ecos #5,移植redboot(ROM启动方式)下篇
- stm32移植ecos #4,移植redboot(ROM启动方式)上篇
RedBoot> load -v -m ymodem
CCCC
开始 ymodem 传输。 按 Ctrl+C 取消。
100% 67 KB 3 KB/s 00:00:22 0 Errors
Entry point: 0x64008019, address range: 0x64008000-0x6400d94c
xyzModem – CRC mode, 539(SOH)/0(STX)/0(CAN) packets, 6 retries
RedBoot>
RedBoot>
RedBoot>
RedBoot> go
你好!~我到了这步,执行go,它就不动了~~~请问这个大概是什么原因???
没有任何提示吗?你的板子是怎样的?
我的板子是我公司的手持机的板子,MCU STM32F207ZG, 跟st的开发板MCU F207IG一样的。板子上外部SRAM没调通,nandfalash已经调通,是不是hello程序是加载到外部SRAM的??
之前调readboot的时候,串口不通,后来发现是我板子用的是外部8M晶振,而且用的是UART1,而ST开发板用的是UART3/4,后来我改的CDL文件后就好了!~~
hello程序可以用ROM启动方式直接烧写到flash中运行,所以可以不用加载到外部的SRAM中
我用的是RHEL 5.6, 电路板就是那个百为的 应该是完全兼容的,用minicom传送的,ymodem无法传送,不停的显示Retry 0: NAK on sector。最后显示Tranfer incomplete。退出文件传输,就看到Redboot显示Error:Illegal command: “” 。我怀疑68000e34应该是hello的入口地址。编译hello也没有问题。hello.srec里面也没有68000e34,只有6800e348,会不会是串口设置问题 导致它多发一个0,可是那个6800e348又不是第一行。你能帮我分析分析吗?? 谢谢
首先,确定minicom支不支持xmodem和ymodem传输。如果不带的话,用windows下的超级终端试下。
hello.srec本身带入口地址的,传完后就会在串口中显示出来,或者你用交叉编译工具也可以查看到
我怎么load不了啊 ymodem显示 Error command: “”
是不是命令语法使用不对?贴下你出错的提示信息?