完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
需求是这样的:
早期软件复位向量在0x33FFF6,FLASHA,由于使用仿真器升级软件不方便,因此做了一个bootloader,占用FLASHA,上电以后,bootloader先运行,接管DSP,根据外部条件判断是否运行用户代码,用户代码位于FLASH B C D E F G H,任意一块,用户程序在编写的时候避开FLASHA,同时把复位向量放到FLASHA之外的地方,比如FLASHC中,复位向量放到0x328000,用户程序和bootloader不公用任何资源和代码,都会分别初始化硬件。 现在的问题是: 我从bootloader跳转到用户代码,该如何操作?直接用LB指令跳转到用户程序的复位向量就可以吗? 上电时DSP处于复位状态,各个寄存器,内存内容都是确定的,但是我从bootloader跳转到用户代码,寄存器,内存都是跳转之前bootloader中的内容,直接跳转到用户代码会不会有问题?虽然用户软件会重新初始化硬件,但是实际中发现一些用户代码运行不正常。两种操作唯一的差别就是不使用bootloader的时候,用户软件时从DSP复位以后开始执行的,而使用bootloader以后,用户软件从bootloader开始运行,如果能实现软复位,将寄存器和内存复位到上电前的状态,就没有问题了。 请ti工程师不吝赐教,这种情况怎么操作比较好?谢谢 |
|
相关推荐
10 个讨论
|
|
王伟01 发表于 2018-10-11 11:45 首先纠正一下,0x33FFF6不是复位向量,是boot to flash的入口地址。如你的设计,芯片上电后,进入flashA的定制bootloader中判断是否要升级,如果不需要,则可以跳转到0x328000处,这是可行的。 所以代码升级后,还是建议复位,使用看门狗或是从新上电。你应该在bootloader中做判断,上电后如果不需要升级,就跳转到用户代码。 Eric - ERIC |
|
|
|
|
|
guigui_7044 发表于 2018-10-11 11:55 感谢纠正复位向量问题,实际的复位向量应该是0x3FFFC0,执行完Boot ROM中的原厂bootloader以后,才会把DSP控制权交给0x33FFF6处的用户代码。 DSP内置的bootloader通过GPIO来选择引导方法,这个实际使用很不灵活,因此我才要实现自己的bootloader。实际上我的bootloader具备一个用户界面和一些命令,类似uboot,可以执行一些简单的单板测试任务,用户代码加载任务。我希望可以从bootloader中直接跳转到用户代码,实际中发现跳转以后,有一些用户代码执行不正常,比如中断无法进入之类。而这些用户代码在不使用bootloader之前,直接跳转到0x33FFF6时是没有问题的。因此我分析,可能的原因是我的bootloader执行的时候改变了CPU寄存器和内存。因此我需要一个方法,在跳转到用户代码的时候将CPU内存和寄存器恢复到DSP内置bootloader执行完毕,转去执行0x33FFF6处代码时的状态。 重新上电或者复位,都会先执行bootloader,会把硬件初始化,所以还是存在这个问题。 |
|
|
|
|
|
guigui_7044 发表于 2018-10-11 11:55 在TI e2e上看到一个讨论帖,我在做的是类似的事情。 里面提到了一个跳转方法,先压栈,然后弹栈,把跳转地址放到RPC寄存器,最后使用LRETR指令返回,这样做的好处在哪里呢? http://e2e.ti.com/support/microcontrollers/c2000/f/171/t/113899.aspx ;; TI File $Revision: /main/7 $ ;; Checkin $Date: May 2, 2006 20:49:39 $ ;;########################################################################### ;; ;; FILE: Init_Boot.asm ;; ;; TITLE: 280x Boot Rom Initialization and Exit routines. ;; ;; Functions: ;; ;; _InitBoot ;; _ExitBoot ;; ;; Notes: ;; ;;########################################################################### ;; $TI Release:$ ;; $Release Date:$ ;;########################################################################### .def _jumpToAppEntry _jumpToAppEntry: ; Initialize the device for running in C28x mode. C28OBJ ; Select C28x object mode C28ADDR ; Select C27x/C28x addressing SETC INTM; ZAPA; MOV @SP,#0; PUSH ACC; PUSH AL; MOV AL, #0x0a08; PUSH AL; MOVL XAR7, #0x3E8000; PUSH XAR7; POP RPC; POP ST1; POP ST0; POP IER; POP DBGIER; LRETR; |
|
|
|
|
|
问题完美解决,附代码:extern void ExitXboot(Uint32 entry)
跟踪代码发现ExitXboot函数返回之前,CPU寄存器已经恢复到复位状态,之前跳转以后运行不正常的用户代码也工作正常了。那么现在的问题是:我现在的bootloader 位于FLASHA,只能更新FLASHA之外的用户代码,如何更新位于FLASHA的bootloader自身呢?也就是说,如何把所有的bootloader内容从FLASHA加载到RAM运行?RAM空间是足够的,代码可以通过不同的load地址和run地址,初始化的时候MemCopy到RAM来实现。代码常量如.econst段该如何处理呢? ;;########################################################################### ;; ;; FILE: ExitXboot.asm ;; ;; TITLE: 2833x Boot Rom Exit routines. ;; ;; Functions: ;; ;; _ExitXboot ;; ;; Notes: ;; ;;########################################################################### .def _ExitXboot .global __stack ;----------------------------------------------- ; _ExitBoot ;----------------------------------------------- ;----------------------------------------------- ;This module cleans up after the boot loader ; ; 1) Make sure the stack is deallocated. ; SP = 0x400 after exiting the boot ; loader ; 2) Push 0 onto the stack so RPC will be ; 0 after using LRETR to jump to the ; entry point ; 2) Load RPC with the entry point ; 3) Clear all XARn registers ; 4) Clear ACC, P and XT registers ; 5) LRETR - this will also clear the RPC ; register since 0 was on the stack ;----------------------------------------------- _ExitXboot: ;----------------------------------------------- ; Insure that the stack is deallocated ;----------------------------------------------- MOV SP,#__stack ;----------------------------------------------- ; Clear the bottom of the stack. This will endup ; in RPC when we are finished ;----------------------------------------------- MOV *SP++,#0 MOV *SP++,#0 ;----------------------------------------------- ; Load RPC with the entry point as determined ; by the boot mode. This address will be returned ; in the ACC register. ;----------------------------------------------- PUSH ACC POP RPC ;----------------------------------------------- ; Put registers back in their reset state. ; ; Clear all the XARn, ACC, XT, and P and DP ; registers ; ; NOTE: Leave the device in C28x operating mode ; (OBJMODE = 1, AMODE = 0) ;----------------------------------------------- ZAPA MOVL XT,ACC MOVZ AR0,AL MOVZ AR1,AL MOVZ AR2,AL MOVZ AR3,AL MOVZ AR4,AL MOVZ AR5,AL MOVZ AR6,AL MOVZ AR7,AL MOVW DP, #0 ;------------------------------------------------ ; Restore ST0 and ST1. Note OBJMODE is ; the only bit not restored to its reset state. ; OBJMODE is left set for C28x object operating ; mode. ; ; ST0 = 0x0000 ST1 = 0x0A0B ; 15:10 OVC = 0 15:13 ARP = 0 ; 9: 7 PM = 0 12 XF = 0 ; 6 V = 0 11 M0M1MAP = 1 ; 5 N = 0 10 reserved ; 4 Z = 0 9 OBJMODE = 1 ; 3 C = 0 8 AMODE = 0 ; 2 TC = 0 7 IDLESTAT = 0 ; 1 OVM = 0 6 EALLOW = 0 ; 0 SXM = 0 5 LOOP = 0 ; 4 SPA = 0 ; 3 VMAP = 1 ; 2 PAGE0 = 0 ; 1 DBGM = 1 ; 0 INTM = 1 ;----------------------------------------------- MOV *SP++,#0 MOV *SP++,#0x0A0B POP ST1 POP ST0 ;------------------------------------------------ ; Jump to the EntryAddr as defined by the ; boot mode selected and continue execution ;----------------------------------------------- LRETR ;eof ---------- |
|
|
|
|
|
王伟01 发表于 2018-10-11 12:38 兄弟,我的情况和你一模一样,也是用LB从bootloader跳转到应用软件,同样遇到了所说的问题,应用软件起来之后运行不稳定,请问你这个exitxboot文件是从哪找到的?直接用exitxboot(应用软件跳转地址,也就是入口点)替代LB就行了么?万分感谢! |
|
|
|
|
|
你好,我也在做和你一样的东西,串口升级28335的Flash; 我的思路是:一上电,串口输出一个界面,用户可以选择升级程序,或运行用户代码; 用户代码烧写到FlashA;升级程序的代码烧写到FlashB,运行时调至RAM中运行; 如果选择升级Flash程序,则通过串口传输HEX文件,并存储到外扩的RAM中运行,内部的RAM不够用; 我的问题是: 用CCS编译出来的.out文件直接通过工具转为.hex格式文件就可以传输了吗? 传输完成后是直接把接受进数组的内容 烧录进Flash 复位后就可以跳到新的Flash代码了吗? |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
690 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
604 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1059 浏览 1 评论
749 浏览 0 评论
普中科技F28335开发板每次上电复位后数码管都会显示,如何熄灭它?
527 浏览 1 评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
170浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
131浏览 14评论
在使用3254进行录音的时候出现一个奇怪的现象,右声道有吱吱声,请教一下,是否是什么寄存器设置存在问题?
129浏览 13评论
TLV320芯片内部自带数字滤波功能,请问linein进来的模拟信号是否是先经过ADC的超采样?
125浏览 12评论
GD32F303RCT6配置PA4 ADC引脚,将PA2代替key功能,PA2连接时无法实现预期功能,为什么?
59浏览 10评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 17:33 , Processed in 1.016378 second(s), Total 59, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号