DSP芯片TMS320C6678的spi挂载flash启动
本文主要对工作中调试C6678的spi flash启动做一个归纳
- 1.启动原理
- 2.程序设计
- 3.BOOTMODE[12:0]
- 4.程序编码
- 4.1 BootLoader工程
- 4.2 APP工程
- 4.3 FLASH烧写工程
- 5. 生成image文件
- 5.1 BootLoader工程
- 5.2 APP工程
- 6.烧录工具
细节方面可能不多,只关系到spi启动部分,启动的原理啥的参照我的另一篇文章。
DSP芯片TMS320C6678的emif挂载norflash启动
1.启动原理
spi启动是根据bootmode的配置方式和生成的镜像内包含的配置数据,把用户的代码拷贝到相应位置并运行的。
而emif启动是直接在flash中运行,默认不进行代码拷贝。
2.程序设计
为了代码设计方便,和另一篇文章相同,依然把代码分成两个部分,一个是BootLoader工程,一个是APP工程。由BootLoader工程将APP工程拷贝到相应的内存地址中。
3.BOOTMODE[12:0]
参考TMS320C6678.pdf 29-30页。
Bit12-11:这一项根据flash芯片手册配置,一般spi flash的驱动做好了这一项就知道选什么了。
Bit10:spi操作的模式,4-pin模式还是5-pin模式。
Bit9:SPI的地址宽度,决定了SPI FLASH地址能访问多大,一般把BootLoader放在FLASH开头,所以选16-bit、24-bit应该都没影响。
Bit8-7:SPI的片选信号,选好自己烧写程序的FLASH芯片所接的片选。这个要么看原理图,要么问硬件。
Bit6-3:选择从SPI FLASH中加载哪个参数表。支持0-15个。按我的理解可能是可以生成16个不同的不同的参数表,实现复位启动不同的功能。但是有同样的需求可以在BootLoader里实现,没必要调试这个参数。选择的是0。
Bit2-0:选择SPI,没什么好说的。
4.程序编码
同emif启动一样,我创建了3个工程:BootLoader工程,APP工程,还有一个FLASH烧写工程。
4.1 BootLoader工程
BootLoader工程需要烧写到FLASH偏移地址0处。cmd配置如下:
-c
-heap 0x1000
-stack 0x4000MEMORY
{/* Local L2, 0.5~1MB*/VECTORS: o = 0x00840000 l = 0x00000200LL2_RW_DATA: o = 0x00840200 l = 0x0003FA00
}SECTIONS
{.vecs > VECTORS.bootentry > LL2_RW_DATA.text > LL2_RW_DATA.cinit > LL2_RW_DATA.const > LL2_RW_DATA.switch > LL2_RW_DATA.uart_ws > LL2_RW_DATA.stack > LL2_RW_DATAGROUP{.neardata.rodata.bss} > LL2_RW_DATA.far > LL2_RW_DATA.fardata > LL2_RW_DATA.cio > LL2_RW_DATA.sysmem > LL2_RW_DATA
}
.blversion段用来存放一些BootLoader的版本信息。
BootLoader工程还需要有一段汇编,用来保证当前运行地址为0x70000000,跳转_c_int00。
.global BOOTLOADER_entry.ref _c_int00.sect ".bootentry"; begin of BOOT_start
BOOTLOADER_entry:b _c_int00nopnopnopnopnopnopnop.byte "Bootloader"
之后需要设置程序入口函数为BOOTLOADER_entry,设置编译会有警告,属正常现象。如下图:
下面为BootLoader的搬运APP的部分代码:
#define APP_IMAGE_POSITION 0x70300000
int main(void)
{// 装入从APP_IMAGE_POSITION开始的应用程序boot-tableunsigned int *p = (unsigned int*)APP_IMAGE_POSITION;FLASH_BOOT_FX entryAddr;unsigned int len;unsigned int* pos;//获取程序入口地址entryAddr = (FLASH_BOOT_FX)(*p++);//每次搬运4字节while(1) {len = *p++;len = (len+3)>>2;if(len == 0)break;pos = (unsigned int*)*p++;for(i=0; i<len; i++)*pos++ = *p++;}//跳转APP的程序入口函数entryAddr();
}
当然BootLoader不可能只有上述代码,还需要先配置工作频率,初始化DDR,初始化要使用的一些功能。如果需要多核启动,还需要将其他核的启动地址填进去。如果有多个镜像的启动需求也需要自己实现。
4.2 APP工程
APP工程虽然烧写到FLASH基地址0x70300000,但是BootLoader会把APP搬运到DDR3中,因此需要配置cmd文件,将.text、.cinit等所有段放入DDR3中。cmd配置如下:
-heap 0x1000
-stack 0x2000MEMORY
{/* Local L2, 0.5~1MB*/LL2_RW_DATA: o = 0x00800200 l = 0x0003FE00 /* Shared L2 2~4MB*/VECTORS: o = 0x0C000000 l = 0x00000200SL2: o = 0x0C000200 l = 0x001FFE00/* External DDR3, upto 2GB per core */DDR3_R_DATA: o = 0x81000000 l = 0x01000000 /*set memory protection attribitue as read only*/DDR3_RW_DATA: o = 0x82000000 l = 0x06000000 /*set memory protection attribitue as read/write*/DDR3_CODE: o = 0xF0000000 l = 0x09000000 /*set memory protection attribitue as execution only*/DDR3_UART_DATA: o = 0xFF000000 l = 0x00FFFFFF
}SECTIONS
{.vecs > VECTORS.text > SL2.cinit > SL2.const > SL2.switch > SL2
// .uart_ws > DDR3_UART_DATA.uart_ws > SL2.coresync > SL2.stack > DDR3_CODEGROUP{.neardata.rodata.bss} > DDR3_CODE.far > DDR3_CODE.fardata > DDR3_CODE.cio > DDR3_CODE.sysmem > DDR3_CODE.btsect > SL2.mysect > SL2}
APP工程不需要配置程序入口函数。
4.3 FLASH烧写工程
FLASH烧写工程主要用于将生成的image文件烧录入SPI flash的相应地址。此工程需要把生成的两个image文件分别烧写到0和0x30000。烧录地址可以随意,只要两个工程地址不重叠就行。
如果想要开发在线更新的程序,可以将此工程整合进APP或者BootLoader工程中。
5. 生成image文件
工程编译生成的.out文件不能直接烧录到FLASH运行,需要转换成.bin文件烧写。当然,生成image文件不止一种方法,此处只是我使用的方法。
生成image文件需要工具如下:
一般来说双击.bat文件就会自动生成.bin的可烧录文件了。
生成BootLoader的方法和APP的方法很不同。因为APP只需要是.bin文件我们自己的BootLoader可以解析就行了,严格来说什么格式都行。BootLoader的格式还需要整合进一个参数表进去,用到的工具都不一样。
5.1 BootLoader工程
BootLoader工程需要以下工具:
其中需要自己填写的如下,顶多改几个路径,大部分不用变。
/* nysh.spi.map */
section {boot_mode = 50param_index = 0options = 1core_freq_mhz = 1000exe_file = "bootloader.i2c.ccs"next_dev_addr_ext = 0x0sw_pll_prediv = 1sw_pll_mult = 20sw_pll_postdiv = 2sw_pll_flags = 1addr_width = 24n_pins = 4csel = 0mode = 0c2t_delay = 0bus_freq_mhz = 0bus_freq_khz = 500
}
上面就是参数表,根据实际情况填写。大多数参数我也忘了代表什么含义了。
/* core0.rmd */
../Debug/bootloader.out
-a
-boot
-e _c_int00ROMS
{ROM1: org = 0x0C000000, length = 0x100000, memwidth = 32, romwidth = 32files = { bootloader.btbl }
}
/* spibootMulticore.bat */
hex6x core0.rmdb2i2c bootloader.btbl bootloader.i2cb2ccs bootloader.i2c bootloader.i2c.ccsromparse nysh.spi.mapccs2bin i2crom.ccs bootloader_spirom.bin 1 1 copy bootloader_spirom.bin ..\..\6678_spi_flash_write\firmware
生成.bin文件只需要双击spibootMulticore.bat文件就行了。
还有一个为了方便测试,自己建的清理文件clean.bat。用不用无所谓。
/* clean.bat */
del /a /f /s /q *.btbl *.i2c *.ccs *.hex *.bin
5.2 APP工程
APP工程只需要以下工具即可:
下面为elf2hexRelease.txt
..\Debug\APP_TEST_NO_OS.out
--outfile=APP_TEST_NO_OS.hex
--map=APP_TEST_NO_OS.map
--memwidth=32
--romwidth=32
--order=M
--intel
--fill=0xffffffff
--boot
--bootorg=0x00000000
下面为geneRelease.bat
hex6x elf2hexRelease.txt
hex2bin APP_TEST_NO_OS.hex
copy APP_TEST_NO_OS.bin ..\..\6678_spi_flash_write\firmware
双击geneRelease.bat文件即可生成.bin可烧录文件。
6.烧录工具
烧录工具已上传,使用当前时间最新版火绒安全杀过毒了,有病毒和我无关呦。
DSP6678_SPI_FLASH烧录文件转换工具.rar
DSP芯片TMS320C6678的spi挂载flash启动相关推荐
- DSP芯片TMS320C6678的emif挂载norflash启动
本文主要对工作中调试C6678的emif flash启动做一个归纳 1.启动原理 2.程序设计 3.BOOTMODE[12:0] 4.程序编码 4.1 BootLoader工程 4.2 APP工程 4 ...
- nuc972 配置成SPI nor flash 启动
nuc972开发板用的是w25q128的spi nor flash (总共16M). 做了如下事情使得从nor flash启动,jffs2文件系统也放在nor flash上: sudo apt ins ...
- DSP C6713 EMIF FLASH 启动
DSP C6713 EMIF FLASH 启动 1. 启动流程 2.程序设计 3.BOOTMODE 4.程序编码 4.1 BootLoader工程 4.2 App工程 4.3 FLASH烧写工程 5. ...
- DSP芯片上电后在执行main函数前的执行流程
以tms320f28377d为例: 假设我们创建工程test: 该项目中需要注意的文件包括(见图1): 1. main.c文件: 2. DSP用于连接.coff(可执行文件)的 .cmd文件: 3. ...
- [转]i.MXRT1050 从外部QSPI Nor Flash启动
晕,不看不知道一看吓一跳,都快两年没有更新我的博客了,哎,惭愧的同时也是感叹时间过的真快啊,之前写博客还高喊着自己快奔三的人了,结果现在都已经迈过去了...不继续说了,都暴露年龄了,咳咳.不过虽然时光 ...
- TI DSP TMS320C66x学习笔记之SPI Nor Flash多核程序烧写
烧写工具链接: https://pan.baidu.com/s/1em4jWjbskpMmNd1uzscjjA 提取码: 82qg 经过一段时间的研究终于把TMS320C6657单核和双核的SPI N ...
- DSP从flash启动
TI的资料上的说明如下: 位于CE1空间的ROM中的代码首先通过DMA/EDMA被搬入地址0处.加载过程在复位信号撤消之后开始,此时CPU内部保持复位状态,由DMA/EDMA执行1个单帧的数据块传输. ...
- 创龙TI KeyStone C66x多核定点/浮点TMS320C6678 DSP开发板处理器、NAND FLASH、NOR FLASH
TL6678-EasyEVM是广州创龙基于SOM-TL6678核心板而研发的一款多核高性能DSP开发板.开发板采用核心板+底板方式,底板采用沉金无铅工艺的四层板设计,尺寸为200mm*106.65mm ...
- AM335x SPI Flash启动说明
本文主要描述如何在EVB335X-II上实现从SPI Flash启动系统,包括启动方式的修改,u-boot编译,SPI Flash的烧写.EVB335X-II使用的SPI Flash型号为W25Q32 ...
- DSP在线升级(3)-----一块DSP芯片的片上flash如何烧写2个工程
DSP在线升级(1)---认识DSP芯片启动流程 DSP在线升级(2)--bootloader的设计框架 DSP在线升级(3)-----一块DSP芯片的片上flash如何烧写2个工程 DSP在线升级( ...
最新文章
- Hadoop运维记录系列(三)
- error: IO error while decoding xxx.jar with UTF-8
- mysql 改成宽松模式_mysql5.6 sql_mode设置为宽松模式
- XP的用户账户使用了HTML界面,XP系统点击用户账户显示参数无效怎么办?WinXp下点击用户账户提示参数无效解决方案...
- 第37课 神奇的大自然 《小学生C++趣味编程》
- 3,外键之表关联关系,修改表,复制表
- python解析器原理_Python程序运行原理图文解析
- scratch python插件_Scratch3.0设计的插件系统(上篇)
- chrome哪个版本最好用_我拥有哪个版本的Chrome?
- STR鉴定原理、流程已经报告数据解读指南
- Ubuntu 建立局域网
- 【解决方法】域名指向本地(127.0.0.1, 0.0.0.0)
- ShuZu数组中插入一个数
- C++表达式语句实训 对 26 个大写英文字母进行循环加密,输入一个大写英文字母(明文)和一个整数秘钥,输出用秘钥对该大写英文字母加密后的结果(密文)。
- Linux下一种 ELF 文件的代码签名验证机制
- 什么是嵌入式软件开发?
- python----集合
- 拉格朗日插值法与牛顿插值多项式
- 10大Android手机杀毒软件
- msvcp110.dll丢失怎么修复
热门文章
- 程序员常用软件,你用了哪些
- pe擦除服务器硬盘,如何使用老毛桃winpe的分区助手安全擦除移动硬盘或本地硬盘数据?...
- CGLIB动态代理使用介绍
- 华硕H81M-CT主板开机报USB Device over current status Detected,15秒后关机维修一例
- 对目录的操作(opendir)
- 汉字机内码的获取实验( EduCoder实验二)
- 斯坦福NLP名课带学详解 | CS224n 第14讲 - Transformers自注意力与生成模型(NLP通关指南·完结)
- Qt安装QtCharts | 超简便方法
- (转)左耳朵耗子:技术人如何更好地把控发展趋势?
- 实战OpenPose项目1:开篇使用文档