完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
您好:
我使用TMS320C6455,从选择从FLASH启动。程序由于比较大,打算把程序放在DDR2中。我使用的boot.asm代码如下 .title "Flash bootup utility for 6455" .option D,T .length 102 .width 140 COPY_TABLE .equ 0xB0000400 ; EMIF_BPRIO_R .equ 0x70000020 ;emif register EMIF_CE2CFG_R .equ 0x70000080 ; EMIF_CE3CFG_R .equ 0x70000084 ; EMIF_AWCC_R .equ 0x700000A0 ; EMIF_BPRIO_V .equ 0x000000FE ; EMIF_CE2CFG_V .equ 0x32109086 ; EMIF_CE3CFG_V .equ 0x63209104 ; EMIF_AWCC_V .equ 0x40000380 ; .sect ".boot_load" .global _boot _boot: ;************************************************************************ ;* Debug Loop - Comment out B for Normal Operation ;************************************************************************ zero B1 _myloop: [!B1] B _myloop nop 5 _myloopend: nop ;************************************************************************ ;* Configure EMIF ;************************************************************************ mvkl EMIF_BPRIO_R,A4 || mvkl EMIF_BPRIO_V,B4 mvkh EMIF_BPRIO_R,A4 || mvkh EMIF_BPRIO_V,B4 stw B4,*A4 mvkl EMIF_CE2CFG_R,A4 || mvkl EMIF_CE2CFG_V,B4 mvkh EMIF_CE2CFG_R,A4 || mvkh EMIF_CE2CFG_V,B4 stw B4,*A4 mvkl EMIF_CE3CFG_R,A4 || mvkl EMIF_CE3CFG_V,B4 mvkh EMIF_CE3CFG_R,A4 || mvkh EMIF_CE3CFG_V,B4 stw B4,*A4 mvkl EMIF_AWCC_R,A4 || mvkl EMIF_AWCC_V,B4 mvkh EMIF_AWCC_R,A4 || mvkh EMIF_AWCC_V,B4 stw B4,*A4 nop 4 ;**************************************************************************** ;* Copy code sections ;**************************************************************************** mvkl COPY_TABLE, A3 ; load table pointer 加载用户程序代码的起始地址0xb0000400地址放到A3寄存器 mvkh COPY_TABLE, A3 ldw *A3++, B1 ; Load entry point 加载用户程序的 C 语言入口c_int00地址到B1寄存器 copy_section_top: ;循环加载多个段标签 ldw *A3++, B0 ; byte count 本段加载的字节个数 32 比特存储方式 ldw *A3++, A4 ; ram start address 本段要被加载到内存中的 RAM 起始地址 nop 3 [!B0] b copy_done ;have we copied all sections? 判断所有段都被加载完成 nop 5 copy_loop: ;循环加载当前段标签 ldb *A3++,B5 ;将 FLASH 地址中的数放到核寄存器 B5 中 8bit 存储方式 sub B0,1,B0 ; decrement counter 每加载一个字节,字节数减一 [ B0] b copy_loop ; setup branch if not done 判断当前本段加载字节数是否为零 [!B0] b copy_section_top ;判断当前段加载成功后跳转到循环开始地址,加载下一段。 zero A1 ;执行完这条指令 B5 和 A4 中才会有新的数据 [!B0] and 3,A3,A1 stb B5,*A4++ ;将从 flash 中读出的数放到 RAM 地址中,按 8bit 搬移 [!B0] and -4,A3,A5 ; round address up to next multiple of 4 [ A1] add 4,A5,A3 ; round address up to next multiple of 4 ;**************************************************************************** ; jump to entry point ;**************************************************************************** copy_done: ;跳转到 C 语言入口标签 b .S2 B1 ;跳转到 C 语言入口地址 nop 5 在BIOS配置中设置了如下的几个区域。 调试运行没有问题后,使用HEX6X生成烧写文件。 debugflash_boot_test.out -a -map flash_boot.map -memwidth 8 -boot -bootorg 0xB0000400 -bootsection .boot_load 0xB0000000 ROMS [ FLASH: org = 0xB0000000, len = 0x120000, romwidth = 8, files = [.burn_hexflash_boot.hex] ] 最后生成的HEX文件内容如下: 文件烧写进去后无法启动。 请教各位,我哪里做的不对,请指教,谢谢 |
|
相关推荐
13 个讨论
|
|
Shine Zhang,非常感谢你的建议,我按照你的建议调试了BOOTLOADER的功能。在闪灯程序中调用boot功能,能够实现程序重新启动运行,这段BOOTLOADER程序应该没有问题。但是我发现,我把BOOTLODADER程序分配到0x00800000地址,在memory view窗口中查看到的代码和生成的.hex文件的BOOT段代码不一致。在.hex文件中。boot段代码比内存中的少了一部分,也就是生成的boot代码不完整,请问这是什么原因造成的。 在内存中BOOT段的代码。到.endfunc段boot结束。 生成的hex文件中boot代码最后到0xE4800000,比内存中的代码要短。请问这是怎么回事? 我使用的HEX6X.EXE的命令文件如下: debugflash_boot_test.out -a -map flash_boot.map -memwidth 8 -boot -bootorg 0xB0000400 -bootsection .boot_load 0xB0000000 ROMS [ FLASH: org = 0xB0000000, len = 0x120000, romwidth = 8, files = [.burn_hexflash_boot.hex] ] 请指教,谢谢!!! |
|
|
|
|
|
.title "Flash bootup utility for 6455 dsk" .option D,T .length 102 .width 140 COPY_TABLE .equ 0xb0000400 PERLOCK .equ 0x02AC0004 PERCFG0 .equ 0x02AC0008 PERCFG1 .equ 0x02AC002C EMIFA_CE2CFG .equ 0x70000080 EMIFA_CE3CFG .equ 0x70000084 EMIFA_CE4CFG .equ 0x70000088 EMIFA_CE5CFG .equ 0x7000008C EMIFA_AWCC .equ 0x700000A0 DDR_MIDR .equ 0x78000000 DDR_SDCFG .equ 0x78000008 DDR_SDRFC .equ 0x7800000C DDR_SDTIM1 .equ 0x78000010 DDR_SDTIM2 .equ 0x78000014 DDR_DDRPHYC .equ 0x780000E4 PERLOCK_REG .equ 0x0f0a0b00 PERCFG0_REG .equ 0x00001550 PERCFG1_REG .equ 0x00000003 EMIFA_CE2CFG_REG .equ 0x00240120 EMIFA_CE3CFG_REG .equ 0x03091848 EMIFA_CE4CFG_REG .equ 0x8000030C EMIFA_CE5CFG_REG .equ 0x8000030E DDR_SDCFG_REG_S .equ 0x00534A32 DDR_SDRFC_REG .equ 0x000007A1 DDR_SDTIM1_REG .equ 0x2A6D28EB DDR_SDTIM2_REG .equ 0x010201A7 DDR_DDRPHYC_REG .equ 0x00000005 DDR_SDCFG_REG_E .equ 0x00534A32 PLLCTL_1 .equ 0x029A0100 PLLM_1 .equ 0x029A0110 PREDIV_1 .equ 0x029A0114 PLLCMD_1 .equ 0x029A0138 PLLSTAT_1 .equ 0x029A013C DCHANGE_1 .equ 0x029A0144 SYSTAT_1 .equ 0x029A0150 PLLDIV4_1 .equ 0x029A0160 PLLDIV5_1 .equ 0x029A0164 PLLDIV1_2 .equ 0x029C0118 PLLCMD_2 .equ 0x029C0138 PLLSTAT_2 .equ 0x029C013C DCHANGE_2 .equ 0x029C0144 SYSTAT_2 .equ 0x029C0150 PLLM_val .equ 0x00000014 PREDIV_val .equ 0x00000001 PLLDIV4_val .equ 0x00000008 PLLDIV5_val .equ 0x00000004 .sect ".boot_load" .global _boot _boot: ;************************************************************************ ;* Debug Loop - Comment out B for Normal Operation ;************************************************************************ mvkl PERLOCK,A4 ||mvkl PERLOCK_REG,B4 mvkh PERLOCK,A4 ||mvkh PERLOCK_REG,B4 stw B4,*A4 mvkl EMIFA_CE3CFG,A4 ||mvkl EMIFA_CE3CFG_REG,B4 mvkh EMIFA_CE3CFG,A4 ||mvkh EMIFA_CE3CFG_REG,B4 stw B4,*A4 mvkl DDR_SDCFG,A4 ||mvkl DDR_SDCFG_REG_S,B4 mvkh DDR_SDCFG,A4 ||mvkh DDR_SDCFG_REG_S,B4 stw B4,*A4 mvkl DDR_SDRFC,A4 ||mvkl DDR_SDRFC_REG,B4 mvkh DDR_SDRFC,A4 ||mvkh DDR_SDRFC_REG,B4 stw B4,*A4 mvkl DDR_SDTIM1,A4 ||mvkl DDR_SDTIM1_REG,B4 mvkh DDR_SDTIM1,A4 ||mvkh DDR_SDTIM1_REG,B4 stw B4,*A4 mvkl DDR_SDTIM2,A4 ||mvkl DDR_SDTIM2_REG,B4 mvkh DDR_SDTIM2,A4 ||mvkh DDR_SDTIM2_REG,B4 stw B4,*A4 mvkl DDR_DDRPHYC,A4 ||mvkl DDR_DDRPHYC_REG,B4 mvkh DDR_DDRPHYC,A4 ||mvkh DDR_DDRPHYC_REG,B4 stw B4,*A4 mvkl DDR_SDCFG,A4 ||mvkl DDR_SDCFG_REG_E,B4 mvkh DDR_SDCFG,A4 ||mvkh DDR_SDCFG_REG_E,B4 stw B4,*A4 zero B1 _myloop: ; [!B1] B _myloop nop 5 _myloopend: nop ;**************************************************************************** ;* Copy code sections ;**************************************************************************** mvkl COPY_TABLE, a3 ; load table pointer mvkh COPY_TABLE, a3 ldw *a3++, b1 ; Load entry point copy_section_top: ldw *a3++, b0 ; byte count ldw *a3++, a4 ; ram start address nop 3 [!b0] b copy_done ; have we copied all sections? nop 5 copy_loop: ldb *a3++,b5 sub b0,1,b0 ; decrement counter [ b0] b copy_loop ; setup branch if not done [!b0] b copy_section_top zero a1 [!b0] and 3,a3,a1 stb b5,*a4++ [!b0] and -4,a3,a5 ; round address up to next multiple of 4 [ a1] add 4,a5,a3 ; round address up to next multiple of 4 ;**************************************************************************** ;* Jump to entry point ;**************************************************************************** copy_done: b .S2 b1 nop 5 已经对需要的外设寄存器都初始化了,以上是bootloader的代码 |
|
|
|
|
|
vuywsdfwf 发表于 2018-7-25 08:34 Hi,Shine Zhang,我看了你推荐的文档。我在DM642中BIOS的配置中将所有段都放在了SDRAM中,这样是可用从FLASH启动的。 在6455中却不行。我跟踪BOOT执行。在开始B1寄存器保存的还是c_int00在DDR中的运行地址0xe0018560,到boot最后跳转的时候,PC指针就跑飞了。程序没有跳到c_int00中开始执行。 求助~~~~求助~~~~~ |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
341 浏览 1 评论
539 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
781 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
655 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1138 浏览 1 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
69浏览 29评论
211浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
256浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
205浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
65浏览 13评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 09:26 , Processed in 1.187119 second(s), Total 67, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号