DSP芯片TMS320C6678的spi挂载flash启动


细节方面可能不多,只关系到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 0x4000

MEMORY
{
	/* Local L2, 0.5~1MB*/
	VECTORS:		o = 0x00840000  l = 0x00000200
	LL2_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_DATA
	GROUP
	{
		.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_int00
				nop
				nop
				nop
				nop
				nop
				nop
				nop

				.byte		"Bootloader"

之后需要设置程序入口函数为BOOTLOADER_entry,设置编译会有警告,属正常现象。如下图:
在这里插入图片描述
下面为BootLoader的搬运APP的部分代码:

#define APP_IMAGE_POSITION          0x70300000
int main(void)
{
	// 装入从APP_IMAGE_POSITION开始的应用程序boot-table
    unsigned 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 0x2000

MEMORY
{
	/* Local L2, 0.5~1MB*/
	LL2_RW_DATA: 	o = 0x00800200  l = 0x0003FE00   

	/* Shared L2 2~4MB*/
	VECTORS: 		o = 0x0C000000  l = 0x00000200
	SL2: 			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_CODE
	GROUP
	{
		.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 = 50
 param_index = 0
 options = 1
 core_freq_mhz = 1000
 exe_file = "bootloader.i2c.ccs"
 next_dev_addr_ext = 0x0
 sw_pll_prediv = 1
 sw_pll_mult = 20
 sw_pll_postdiv = 2
 sw_pll_flags = 1
 addr_width = 24
 n_pins = 4
 csel = 0
 mode = 0
 c2t_delay = 0
 bus_freq_mhz = 0
 bus_freq_khz = 500
}

上面就是参数表,根据实际情况填写。大多数参数我也忘了代表什么含义了。

/* core0.rmd */
../Debug/bootloader.out
-a
-boot
-e _c_int00

ROMS
{
	ROM1:  org = 0x0C000000, length = 0x100000, memwidth = 32, romwidth = 32
	files = { bootloader.btbl }
}
/* spibootMulticore.bat */
hex6x core0.rmd

b2i2c bootloader.btbl bootloader.i2c

b2ccs bootloader.i2c bootloader.i2c.ccs

romparse nysh.spi.map

ccs2bin 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

  • 12
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值