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中 ...
随机推荐
- [转]查找问题的利器 - Git Bisect
转自:http://gitbook.liuhui998.com/5_4.html 假设你在项目的'2.6.18'版上面工作, 但是你当前的代码(master)崩溃(crash)了. 有时解决这种问题的 ...
- Bootstrap Table的使用小结
1.Jquery中的一些东西学习一下子,补充完善一下,毕竟有些时候没有使用到 这个方式很有用,在使用bootstrap table的时候,选择当前已经选择的节点的事件中的ID的值 当前rows中有很多 ...
- 线程pthread_cleanup_push的简单例程.
http://www.cnblogs.com/hnrainll/archive/2011/04/20/2022149.html #include<stdlib.h> #include< ...
- python:生成器进阶
1,列表推导式 值 for 循环 2,生成器表达式 g=(i for i in range(10)) print(g) for i in g: print(i) 3,列表推导式与生成器表达式的区别 # ...
- js数组去重(多种方法)
// js数组去重 Array.prototype.fun1 = function(){ var arr = this, result = [], i, len = arr.length; for(i ...
- ccenteros 部署 redis
step one : yum install redis -- 安装redis数据库 step two:安装完成之后开启redis 服务 service redis start syste ...
- sql*plus
[sql*plus创建txt文档编辑sql语句] (1)创建一个txt,命名doc SQL> ed doc; /*ed 文件名*/ (2)在doc.txt文件编辑sql语 ...
- 对AFNetworking的二次封装
HttpTool.h #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> typedef void(^HttpS ...
- java实现简单计算器功能
童鞋们,是不是有使用计算器的时候,还要进入运行,输入calc,太麻烦了,有时候甚至还忘记单词怎么拼写,呵呵程序员自己写代码实现,又简单,又方便啊 以下为代码(想要生成可执行工具可参考:http://w ...
- Delphi 版FindWindow 和 FindWindowEx 的语法和用法
FindWindow(lpClassName, {窗口的类名}lpWindowName: PChar {窗口的标题}): HWND; {返回窗口的句柄; 失败返 ...