CC3200模块的内存地址划分和bootloader(一)
1. CC3200的内存地址划分非常特殊,如果没测试的话,很容易懵逼。我们先看芯片手册里面的内存地址。芯片的RAM是256KB,下图的0x2000 0000-0x2003 FFFF,正好是256KB。

2. 首先明确一个概念,CC3200是没有内部FLASH的,所以在运行的时候需要把程序全部拷贝到RAM里面。也就是IAR编译的.bin文件不能超过RAM的空间。启动地址是0x2000 0000,当然第一个启动的程序是芯片内部固化在ROM的bootloader(我们称之为一级BOOT),这个主要作用就是用于串口升级,驱动库之类的。然后要注意这个一级BOOT也需要使用内存16KB,它使用的内存地址是0x2000 0000---0x2000 4000

然后看下以getweather(用户例程)为例子,看下icf文件,这个用户例程使用的是0x2000 4000---0x2003 FFFF
define region SRAM = mem:[from 0x20004000 to 0x2003FFFF];
使用UNIFLASH时,烧写界面如下(不需要OTA升级功能(远程无线升级))。

3. 假如我们需要OTA(远程无线升级)升级功能的话,我们需要二级BOOT(用户bootloader),这个用户bootloader和上图的On chip ROM(bootloader)是两个完全不同的,前者是我们自己改写的,用于OTA升级用途的,后者是TI固化的串口升级。先启动后者On chip ROM(bootloader)这个用户完全不用关心,再启动用户的bootloader。
4. 在二级BOOT使用中,需要用到工程有3个,application_bootloader,relocator(在application_bootloader工程的里面),以及应用代码比如get_weather。relocator这个工程的作用就是先把用户的重定向功能。看一下3个工程的地址空间,查看工程里面的icf文件。
application_bootloader工程 0x20000000 to 0x20004000
relocator工程 0x20004000 to 0x20004100
get_weather工程 0x20004000 to 0x2003FFFF
看下图在工程目录下有一个程序,bootgen.exe的用途是把两个工程的bin(application_bootloader.bin和relocator.bin)文件合并成一个bootmgr.bin。程序首先启动On chip ROM(bootloader),从外部SPI FLASH读取这个合并的bootmgr.bin文件到内部RAM里面,然后执行relocator工程,任务是重定向到application_bootloader,application_bootloader工程从外部SPI FLASH读取get_weather.bin到内部RAM,并执行get_weather。以上步骤需要UNIFLASH烧写工具的配合。CC3200在外部的SPI FLASH上面有一个文件系统,application_bootloader通过文件名找到get_weather.bin。
$PROJ_DIR$\bootgen.exe $PROJ_DIR$\..\relocator\ewarm\Release\Exe\relocator.bin $EXE_DIR$\bootmgr.bin $EXE_DIR$\application_bootloader.bin
IAR的配置选项。我们需要明确程序是从0x20004000开始启动的(因为一级BOOT占用了前16KB空间)。

5. 关于以上还有一个问题,需要澄清,既然后面2个工程都是0x20004000起始地址,凭什么说先启动relocator的
application_bootloader工程 0x20000000 to 0x20004000
relocator工程 0x20004000 to 0x20004100
get_weather工程 0x20004000 to 0x2003FFFF
这个要从UNIFLASH的烧写说起,UNIFLASH把bootmgr.bin烧写到/sys/目录下,并且重命名为mcuimg.bin,所以On chip ROM(bootloader)启动寻找/sys/目录下的mcuimg.bin。然后mcuimg.bin根据/sys/mcubootinfo.bin的信息启动/sys/mcuimg1.bin(也就是get_weather.bin)。注意注意,IAR工程里面的icf文件的RAM地址一定要写对。如上。

同理看下/sys/mcuimg1.bin,也是重命名。总结起来,不管用不用

6. 总结一下。
(a)烧写分为两种,支持OTA升级(一级BOOT+二级BOOT+应用)。不需要OTA(一级BOOT+应用)
(b)两种烧写方法,应用的icf写法一样的。
(c)0x20004000是写死的,有人说我的用户bootloader想多写点东西,0x20000000到0x20004000的空间不够了怎么办,也是有办法的,以后讲。
(d)由于第一次/sys/mcubootinfo.bin这个文件是空的,所以bootloader选择启动/sys/mcuimg1.bin,这个牵扯到OTA升级,具体细节不讲了。
CC3200模块的内存地址划分和bootloader(一)的更多相关文章
- CC3200模块的内存地址划分和bootloader,启动流程(二)
1. 首先启动内部ROM固化的BOOT,然后这个ROM启动需要使用内存空间0X2000 0000 --- 0X2000 4000共16K的空间.一级BOOT的作用是串口升级和驱动库. 2. 然后是二级 ...
- Java 内存区域划分 备忘录
最近看了<深入理解虚拟机>的内存分配与管理这部分的内容,这里做一个的总结,以加深我对知识点的理解,如有错误的地方,还望大神们指出,我及时更正: 内存区域划分 首先是下面这幅图: 图 1. ...
- 利尔达CC3200模块第一篇之-wlan_ap例程测试
1. 本次采用利尔达的CC3200模块,CC3200主时钟80M,内部没有flash,必须外接SPI Flash.本次测试采用利尔达科技的CC3200的底板和模块(左边).烧写连接VCC, GND, ...
- 利尔达CC3200模块烧写程序笔记
1. 硬件使用利尔达的CC3200模块,仿真下载器使用利尔达的FTDI仿真器,硬件完全兼容官方的仿真器.仿真器支持IAR的调试,单步运行等操作. 2. 硬件连接接线说明: RXD, TXD, GNG, ...
- python基础——16(re模块,内存管理)
一.内存管理 1.垃圾回收机制 不能被程序访问到的数据,就称之为垃圾. 1.1.引用计数 引用计数是用来记录值的内存地址被记录的次数的. 每一次对值地址的引用都使该值的引用计数+1:每一次对值地址的释 ...
- JVM执行Java程序时内存的划分
Java虚拟机在执行Java程序过程中会把它所管理的内存区域划分为若干个不同的数据区域. Java虚拟机所管理的内存包括以下几个运行时区域: 1.程序计数器(Program Couter Regist ...
- Java 内存区域划分
JVM的内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内存又是如何划分的 ...
- JVM的内存区域划分
JVM的内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内存又是如何划分的 ...
- C/C++中内存区域划分大总结
C++作为一款C语言的升级版本,具有非常强大的功能.它不但能够支持各种程序设计风格,而且还具有C语言的所有功能.我们在这里为大家介绍的是其中一个比较重要的内容,C和C++内存区域的划分. 一. 在c中 ...
随机推荐
- NO.007-2018.02.12《白头吟》两汉:卓文君
白头吟_古诗文网_解析_鉴赏_赏析 白头吟 两汉:卓文君 白头吟:乐府<楚调曲>调名.据<西京杂记>卷三载,蜀地巨商卓王孙的女儿卓文君,聪明美丽,有文采,通音乐.孀居在家时,与 ...
- 记一次MySQL手工注入
本来想找个装安全狗的站试下绕过,safe dog没找到,但随便一搜搜到一个小站有SQLi,正好借此机会复习下手工注入(新版Firefox我吐槽一下,hackbar这么好用的工具,说阉割就阉割,哎) 小 ...
- CodeForces-822D 【最小素因子应用】
任意门:https://vjudge.net/problem/CodeForces-822D D. My pretty girl Noora time limit per test 1.5 secon ...
- DEM、DTM和DSM的区别
一.DTM(Digital Terrain Model) 数字地面模型是利用一个任意坐标系中大量选择的已知x.y.z的坐标点对连续地面的一个简单的统计表示,或者说,DTM就是地形表面形态属性信息的数字 ...
- C# .Net Framework4.5中配置和使用managedCUDA及常见问题解决办法
主要参考英文帖子.我就不翻译了哈.很容易懂的. 先说明我的运行平台: 1.IDE:Visual Studio 2012 C# .Net Framework4.5,使用默认安装路径: 2.显卡类型:NV ...
- Cesium.js隐藏logo等信息
css: .cesium-widget-credits{ display:none!important;}js: var viewer = new Cesium.Viewer('cs', { anim ...
- javascript操作Date对象
Date 对象用于处理日期和时间. 创建 Date 对象的语法: var myDate=new Date() Date 对象会自动把当前日期和时间保存为其初始值. 参数形式有以下5种: new Dat ...
- java中String、包装类、枚举类的引用传递
一般情况下,我们认为Java中了除了八种基本数据类型,其他都是对象,进行引用传递: 但是:String.包装类.枚举类作为参数传递后发现,没有达到引用传递的效果,很多人认为它是值传递! 首先,对象肯定 ...
- Angularjs实例3
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- Nacicat for Oracle 绿色版 亲测可用
参考: http://blog.csdn.net/u013107634/article/details/52741591 https://blog.csdn.net/zhengyikuangge/ar ...