讨论问题:
回想一下刚开始学习嵌入式软件开发的时候是怎么进行的。拿到开发板后,跟着商家提供的学习课程一步一步的照敲代码、编译、烧录、启动开发板。
奥耶!开发板正常运行且与课程中的现象一致;本实验完成,开始攻克下一个实验课程。如果实验过程中遇到编译失败,或者实验现象不一致的,就拿课程附带的样例与自己的代码进行比较,看看哪里错了,就改成一致的,然后重复上述步骤。你是不是也是这样入手的呢?如果不是,那么恭喜你。
固件烧录对于整个开发过程来说,实在是再简单不过的事,也就是接好线,鼠标移至下载按钮,动动手指头,点击下载;烧录成功后,启动开发板。
如果得到预定的实验现象就万岁。如果开发板通电后没有反应,就先认为程序是否有误,检查没有错误,就觉得板子是否有问题。但就是不知有没有想过可能是烧录有问题。
我们来谈谈为什么可能是烧录的问题。烧录有个很关键的点:就是程序烧录到哪个设备的哪个地址。
我们都知道程序是顺序执行的,也就是说,程序存放的起始地址就是这段程序的入口。而CPU执行的第一条指令则是位于程序存储器的0x0地址①。如果该地址上存放的是一条无效或者错误的指令,将会导致CPU执行异常,从而导致无法正确的执行程序。
接下来,将结合51单片机、stm32F407xx、exynos4412的开发板,来探索固件烧录。
相较于其他两款芯片而言,51单片机固件的烧录地址是最为直观的,以芯片STC89C51RC为例。通过查阅STC89C51RC芯片手册,该芯片内部设有用存放程序的程序存储器,大小为4K,地址范围在0000H~0FFFH(图1-1-1)。也就是说在烧录时,应该在烧录工具中,将烧录的起始地址设置为0x0。
看到这是否有所疑惑,此时程序存放的存储器的起始地址是0x0 ,而CPU却是从程序存储器的0x0地址开始的指令,那么CPU又是如何获取到0x0 地址的指令呢?结合stm32F4xx内部的程序存储器地址映射来分析(图1-1-4)。
stm32F407xx芯片内部有个SYSCFG存储器重映射寄存器(SYSCFG_MEMRMP),设置寄存器的MEM_MODE字段(寄存器低二位),可以实现把0x0地址映射到不同的程序存储设备,当该字段配置为(00)b时,把主 Flash 映射到地址 0x0,拨码开关就是这个操作原理。
相较于51单片机和stm32F4xx的固件烧录,exynos4412的bootloader要复杂的多,并且其中涉及多个镜像的烧录地址和运行地址,一旦其中某个镜像的烧录地址出错,就将导致后续的程序无法正常执行。
例如SPL镜像配置的运行地址不是0x0,那么就将导致无法从SPL镜像的程序入口开始执行,导致不可预知的错误;又或者是u-boot镜像地址烧录出错,SPL镜像的大小为14K,但还要包含2K的签名校验信息等,假如少算了这部分大小,就导致u-boot镜像烧录地址错误,被加载到内存中运行的u-boot镜像不完整,无法正常工作。
exynos4412的bootloader与51单片机和stm32F4xx的固件程序最大的区别在于,前者需要加载操作系统至内存中运行,将各种资源的管理权交由操作系统管理。而后两者的固件程序就是通常所说的裸机程序,将由这个裸机程序来管理各种资源。
到此这篇单片机程序烧录方法(单片机代码怎么烧录)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/50154.html