本文主要对工作中调试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启动相关推荐

  1. DSP芯片TMS320C6678的emif挂载norflash启动

    本文主要对工作中调试C6678的emif flash启动做一个归纳 1.启动原理 2.程序设计 3.BOOTMODE[12:0] 4.程序编码 4.1 BootLoader工程 4.2 APP工程 4 ...

  2. nuc972 配置成SPI nor flash 启动

    nuc972开发板用的是w25q128的spi nor flash (总共16M). 做了如下事情使得从nor flash启动,jffs2文件系统也放在nor flash上: sudo apt ins ...

  3. DSP C6713 EMIF FLASH 启动

    DSP C6713 EMIF FLASH 启动 1. 启动流程 2.程序设计 3.BOOTMODE 4.程序编码 4.1 BootLoader工程 4.2 App工程 4.3 FLASH烧写工程 5. ...

  4. DSP芯片上电后在执行main函数前的执行流程

    以tms320f28377d为例: 假设我们创建工程test: 该项目中需要注意的文件包括(见图1): 1. main.c文件: 2. DSP用于连接.coff(可执行文件)的  .cmd文件: 3. ...

  5. [转]i.MXRT1050 从外部QSPI Nor Flash启动

    晕,不看不知道一看吓一跳,都快两年没有更新我的博客了,哎,惭愧的同时也是感叹时间过的真快啊,之前写博客还高喊着自己快奔三的人了,结果现在都已经迈过去了...不继续说了,都暴露年龄了,咳咳.不过虽然时光 ...

  6. TI DSP TMS320C66x学习笔记之SPI Nor Flash多核程序烧写

    烧写工具链接: https://pan.baidu.com/s/1em4jWjbskpMmNd1uzscjjA 提取码: 82qg 经过一段时间的研究终于把TMS320C6657单核和双核的SPI N ...

  7. DSP从flash启动

    TI的资料上的说明如下: 位于CE1空间的ROM中的代码首先通过DMA/EDMA被搬入地址0处.加载过程在复位信号撤消之后开始,此时CPU内部保持复位状态,由DMA/EDMA执行1个单帧的数据块传输. ...

  8. 创龙TI KeyStone C66x多核定点/浮点TMS320C6678 DSP开发板处理器、NAND FLASH、NOR FLASH

    TL6678-EasyEVM是广州创龙基于SOM-TL6678核心板而研发的一款多核高性能DSP开发板.开发板采用核心板+底板方式,底板采用沉金无铅工艺的四层板设计,尺寸为200mm*106.65mm ...

  9. AM335x SPI Flash启动说明

    本文主要描述如何在EVB335X-II上实现从SPI Flash启动系统,包括启动方式的修改,u-boot编译,SPI Flash的烧写.EVB335X-II使用的SPI Flash型号为W25Q32 ...

  10. DSP在线升级(3)-----一块DSP芯片的片上flash如何烧写2个工程

    DSP在线升级(1)---认识DSP芯片启动流程 DSP在线升级(2)--bootloader的设计框架 DSP在线升级(3)-----一块DSP芯片的片上flash如何烧写2个工程 DSP在线升级( ...

最新文章

  1. Hadoop运维记录系列(三)
  2. error: IO error while decoding xxx.jar with UTF-8
  3. mysql 改成宽松模式_mysql5.6 sql_mode设置为宽松模式
  4. XP的用户账户使用了HTML界面,XP系统点击用户账户显示参数无效怎么办?WinXp下点击用户账户提示参数无效解决方案...
  5. 第37课 神奇的大自然 《小学生C++趣味编程》
  6. 3,外键之表关联关系,修改表,复制表
  7. python解析器原理_Python程序运行原理图文解析
  8. scratch python插件_Scratch3.0设计的插件系统(上篇)
  9. chrome哪个版本最好用_我拥有哪个版本的Chrome?
  10. STR鉴定原理、流程已经报告数据解读指南
  11. Ubuntu 建立局域网
  12. 【解决方法】域名指向本地(127.0.0.1, 0.0.0.0)
  13. ShuZu数组中插入一个数
  14. C++表达式语句实训 对 26 个大写英文字母进行循环加密,输入一个大写英文字母(明文)和一个整数秘钥,输出用秘钥对该大写英文字母加密后的结果(密文)。
  15. Linux下一种 ELF 文件的代码签名验证机制
  16. 什么是嵌入式软件开发?
  17. python----集合
  18. 拉格朗日插值法与牛顿插值多项式
  19. 10大Android手机杀毒软件
  20. msvcp110.dll丢失怎么修复

热门文章

  1. 程序员常用软件,你用了哪些
  2. pe擦除服务器硬盘,如何使用老毛桃winpe的分区助手安全擦除移动硬盘或本地硬盘数据?...
  3. CGLIB动态代理使用介绍
  4. 华硕H81M-CT主板开机报USB Device over current status Detected,15秒后关机维修一例
  5. 对目录的操作(opendir)
  6. 汉字机内码的获取实验( EduCoder实验二)
  7. 斯坦福NLP名课带学详解 | CS224n 第14讲 - Transformers自注意力与生成模型(NLP通关指南·完结)
  8. Qt安装QtCharts | 超简便方法
  9. (转)左耳朵耗子:技术人如何更好地把控发展趋势?
  10. 实战OpenPose项目1:开篇使用文档