最近在调试TMS320C6722的Parallel Flash启动,大约调了两周左右(中间因为找不出错误原因,断了几天),最后调试成功。关于DSP的资料,网上多是关于2812和28335等C2000系列。关于C6000系列,C6713较多一些。所以在这里将C6722的调试过程以及中间遇到的一些问题写下来,希望能够为调试C6722的朋友们提供些帮助。
首先,说下我这里的配置:DSP主芯片为TMS320C6722, FLASH为:SST39VF6401,4M16
因为6722的EMIF地址线只有14根(EM_BA0、EM_BA1、EM_A0~A11),所以要想要想寻址更多的内容,需要6722的GPIO来扩展。在这里,用的是McASP0 AXR的0~4和10~13总共9根GPIO。总共23根地址线,能够寻址2^23=8M,与flash的4M2=8M相对应。因为flash的每个内存单元为16位,而DSP得每个内存单元为8位,所以要将6722的EM_BA1连接flash的最低位地址线A0。
如果绕不过来,可以参考一下这个链接:http://wenku.baidu.com/link?url=55Z5UcY8VwCYmbtGqej6jOQruMbJC39yqY-C2uJoYJcQQQdFKVCm48W-DNCIaZxREzBdxflDcS54UX_BDHPYWNp_n_VDkRtIZDWqqgaCtHG 虽然不是嵌入式的内容,但道理是相通的。
一、简述6722的启动过程
上电后,从0x0000 0000开始运行,CFGPIN0和CFGPIN1两个寄存器会在的上升沿捕获相关引脚的状态(高电位为1,低电位为0),跟启动模式有关的引脚有四个,SPI0的SIMO、SOMI、CLK以及UHPI_HCS,因为6722没有UHPI模块,所以对于6722来说跟启动模式有关的引脚有3个。虽然6722没有UHPI模块,在仿真器状态下查看6722的寄存器,UHPI_HCS始终为1。
参考文献:SPRS370E, P16~18
检测到dsp的启动模式后,在Parallel Flash模式下,它会读取flash的第一个字节的最低两位(这个地方是672x与其它系列不同的地方),也就是0x9000 0000的内容,来确定是8位模式还是16位模式(8位8位的copy,还是16位16位的copy),然后将flash前1k的数据copy到dsp内存以0x1000 0000为起始地址的地方。到这个地方为止,都是DSP自己运作的,不需要人工介入,这段程序是出厂时就固化到6722的ROM里的。接下来就需要人工介入了。copy到dsp内存的1K数据,除了第一个字(32位)外,剩余的代码就是用户自己编写的二次bootloader。ROM copy 1k数据到dsp内存的过程为一次bootloader。然后二次bootloader的作用就是将用户代码从flash0x9000 0400的位置copy到内存RAM里0x1000 0400的位置。
参考文献:SPRAA69D,P5
二、二次bootloader
接下来就是写二次bootloader。因为运行二次bootloader时,c语言环境还没建立起来,所以必须用汇编来写。
内容包含下面几部分:1.配置PLLC;2.配置EMIF;3.copy代码,从0x9000 0400到0x1000 0400;4.跳转到_c_int00
附上二次bootloder代码:
;*************environment:TMS320C6722*********
;*************time:2016/08/07*****************
;*************author:LXD_BUAA**********************
.title "flash boot"
;address of the generated boot table
user_size .equ 0x00003468 ;refer to the .map file
user_ld_start .equ 0x90000400 ;the start location of user's codes loaded in flash
user_rn_start .equ 0x10000400 ;the start location of user's codes run in ram
CFGBRIDGE .equ 0x40000024 ;Controls Reset Of The Bridge BR2. Must Assert RESET After PLL Changed & Must Release Before dMAX/UHPI Acesse
PLLCSR .equ 0x41000100 ;PLL Control/status Register Address
PLLM .equ 0x41000110 ;PLL Multiplier Control Register Address
PLLDIV0 .equ 0x41000114 ;PLL Controller Divider0 Register Address
PLLDIV1 .equ 0x41000118 ;PLL Controller Divider1 Register Address
PLLDIV2 .equ 0x4100011C ;PLL Controller Divider2 Register Address
PLLDIV3 .equ 0x41000120 ;PLL Controller Divider3 Register Address
PLLCMD .equ 0x41000138 ;PLL Control Command Register Address
PLLSTAT .equ 0x4100013C ;PLL Controller Status Register Address
ALNCTL .equ 0x41000140 ;PLL Clock Align Control Register Address
A1CR .equ 0xF0000010 ;The Register Accouting For EMIF FLASH Device
MCASP0_PFUNC .equ 0x44000010 ;Pin function register
MCASP0_PDIR .equ 0x44000014 ;Pin direction register
MCASP0_PDOUT .equ 0x44000018 ;Pin data output register
MCASP0_PDSET .equ 0x4400001C ;To change a pin from 0 to 1 if corresponding pin is configured as GPIO
MCASP0_PDCLR .equ 0x44000020 ;To change a pin from 1 to 0 if corresponding pin is configured as GPIO
.sect ".boot_load"
.global _boot
.ref _c_int00
_boot:
;***************