This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我用楼主的ASM文件可以实现中断,但是又出现其他问题,我的串口函数只能收,不能发,用我原来的asm文件,串口收发是没有问题的。我用的是UART0
极度郁闷,希望高手提点。qq147699355 邮箱 hanjia0604@126.com
我的asm文件如下;
;******************************************************************************
;* BOOT v4.6.4 *
;* Copyright (c) 1996-2010 Texas Instruments Incorporated *
;******************************************************************************
;****************************************************************************
;* BOOT.ASM
;*
;* THIS IS THE INITAL BOOT ROUTINE FOR TMS470 C++ PROGRAMS.
;* IT MUST BE LINKED AND LOADED WITH ALL C++ PROGRAMS.
;*
;* THIS MODULE PERFORMS THE FOLLOWING ACTIONS:
;* 1) ALLOCATES THE STACK AND INITIALIZES THE STACK POINTER
;* 2) CALLS AUTO-INITIALIZATION ROUTINE
;* 3) CALLS THE FUNCTION MAIN TO START THE C++ PROGRAM
;* 4) CALLS THE STANDARD EXIT ROUTINE
;*
;* THIS MODULE DEFINES THE FOLLOWING GLOBAL SYMBOLS:
;* 1) __stack STACK MEMORY AREA
;* 2) _c_int00 BOOT ROUTINE
;*
;****************************************************************************
.if __TI_TMS470_V7M3__
.thumbfunc _c_int00
.else
.armfunc _c_int00
.endif
;****************************************************************************
; Accomodate different lowerd names in different ABIs
;****************************************************************************
.if __TI_EABI_ASSEMBLER
.asg _args_main, ARGS_MAIN_RTN
.asg exit, EXIT_RTN
.asg main_func_sp, MAIN_FUNC_SP
.elseif __TI_ARM9ABI_ASSEMBLER | .TMS470_32BIS
.asg __args_main, ARGS_MAIN_RTN
.asg _exit, EXIT_RTN
.asg _main_func_sp, MAIN_FUNC_SP
.else
.asg $_args_main, ARGS_MAIN_RTN
.asg $exit, EXIT_RTN
.asg _main_func_sp, MAIN_FUNC_SP
.endif
.if .TMS470_16BIS
;****************************************************************************
;* 16 BIT STATE BOOT ROUTINE *
;****************************************************************************
.if __TI_TMS470_V7M3__
.state16
.else
.state32
.endif
.global __stack
;***************************************************************
;* DEFINE THE USER MODE STACK (DEFAULT SIZE IS 512)
;***************************************************************
__stack:.usect ".stack", 0, 4
.global _c_int00
;***************************************************************
;* FUNCTION DEF: _c_int00
;***************************************************************
_c_int00: .asmfunc
.if !__TI_TMS470_V7M3__
.if __TI_NEON_SUPPORT__ | __TI_VFP_SUPPORT__
;*------------------------------------------------------
;* SETUP PRIVILEGED AND USER MODE ACCESS TO COPROCESSORS
;* 10 AND 11, REQUIRED TO ENABLE NEON/VFP
;* COPROCESSOR ACCESS CONTROL REG
;* BITS [23:22] - CP11, [21:20] - CP10
;* SET TO 0b11 TO ENABLE USER AND PRIV MODE ACCESS
;*------------------------------------------------------
MRC p15,#0x0,r0,c1,c0,#2
MOV r3,#0xf00000
ORR r0,r0,r3
MCR p15,#0x0,r0,c1,c0,#2
;*------------------------------------------------------
; SET THE EN BIT, FPEXC[30] TO ENABLE NEON AND VFP
;*------------------------------------------------------
MOV r0,#0x40000000
FMXR FPEXC,r0
.endif
;------------------------------------------------------
;* SET TO USER MODE
;*------------------------------------------------------
MRS r0, cpsr
BIC r0, r0, #0x1F ; CLEAR MODES
ORR r0, r0, #0x10 ; SET USER MODE
MSR cpsr_cf, r0
;*------------------------------------------------------
;* CHANGE TO 16 BIT STATE
;*------------------------------------------------------
ADD r0, pc, #1
BX r0
.state16
.endif
;*------------------------------------------------------
;* INITIALIZE THE USER MODE STACK
;*------------------------------------------------------
LDR r0, c_stack
MOV sp, r0
LDR r0, c_STACK_SIZE
ADD sp, r0
;*-----------------------------------------------------
;* ALIGN THE STACK TO 64-BITS IF EABI.
;*-----------------------------------------------------
.if __TI_EABI_ASSEMBLER
MOV r7, sp
MOV r0, #0x07
BIC r7, r0 ; Clear upper 3 bits for 64-bit alignment.
MOV sp, r7
.endif
;*-----------------------------------------------------
;* SAVE CURRENT STACK POINTER FOR SDP ANALYSIS
;*-----------------------------------------------------
LDR r0, c_mf_sp
MOV r7, sp
STR r7, [r0]
;*------------------------------------------------------
;* Perform all the required initilizations:
;* - Process BINIT Table
;* - Perform C auto initialization
;* - Call global constructors
;*------------------------------------------------------
BL __TI_auto_init
;*------------------------------------------------------
;* CALL APPLICATION
;*------------------------------------------------------
BL ARGS_MAIN_RTN
;*------------------------------------------------------
;* IF APPLICATION DIDN'T CALL EXIT, CALL EXIT(1)
;*------------------------------------------------------
MOV r0, #1
BL EXIT_RTN
;*------------------------------------------------------
;* DONE, LOOP FOREVER
;*------------------------------------------------------
L1: B L1
.endasmfunc
.else ; !.TMS470_16BIS
;****************************************************************************
;* 32 BIT STATE BOOT ROUTINE *
;****************************************************************************
.global __stack
;***************************************************************
;* DEFINE THE USER MODE STACK (DEFAULT SIZE IS 512)
;***************************************************************
__stack:.usect ".stack", 0, 4
.global _c_int00
;***************************************************************
;* FUNCTION DEF: _c_int00
;***************************************************************
_c_int00: .asmfunc
.if __TI_NEON_SUPPORT__ | __TI_VFP_SUPPORT__
;*------------------------------------------------------
;* SETUP PRIVILEGED AND USER MODE ACCESS TO COPROCESSORS
;* 10 AND 11, REQUIRED TO ENABLE NEON/VFP
;* COPROCESSOR ACCESS CONTROL REG
;* BITS [23:22] - CP11, [21:20] - CP10
;* SET TO 0b11 TO ENABLE USER AND PRIV MODE ACCESS
;*------------------------------------------------------
MRC p15,#0x0,r0,c1,c0,#2
MOV r3,#0xf00000
ORR r0,r0,r3
MCR p15,#0x0,r0,c1,c0,#2
;*------------------------------------------------------
; SET THE EN BIT, FPEXC[30] TO ENABLE NEON AND VFP
;*------------------------------------------------------
MOV r0,#0x40000000
FMXR FPEXC,r0
.endif
;*------------------------------------------------------
;* SET TO USER MODE
;*------------------------------------------------------
MRS r0, cpsr
BIC r0, r0, #0x1F ; CLEAR MODES
ORR r0, r0, #0x13 ; SET USER MODE
MSR cpsr_cf, r0
;*------------------------------------------------------
;* INITIALIZE THE USER MODE STACK
;*------------------------------------------------------
LDR sp, c_stack
LDR r0, c_STACK_SIZE
ADD sp, sp, r0
;*-----------------------------------------------------
;* ALIGN THE STACK TO 64-BITS IF EABI.
;*-----------------------------------------------------
.if __TI_EABI_ASSEMBLER
BIC sp, sp, #0x07 ; Clear upper 3 bits for 64-bit alignment.
.endif
;*-----------------------------------------------------
;* SAVE CURRENT STACK POINTER FOR SDP ANALYSIS
;*-----------------------------------------------------
LDR r0, c_mf_sp
STR sp, [r0]
;*------------------------------------------------------
;* Perform all the required initilizations:
;* - Process BINIT Table
;* - Perform C auto initialization
;* - Call global constructors
;*------------------------------------------------------
BL __TI_auto_init
;*------------------------------------------------------
;* CALL APPLICATION
;*------------------------------------------------------
BL ARGS_MAIN_RTN
;*------------------------------------------------------
;* IF APPLICATION DIDN'T CALL EXIT, CALL EXIT(1)
;*------------------------------------------------------
MOV R0, #1
BL EXIT_RTN
;*------------------------------------------------------
;* DONE, LOOP FOREVER
;*------------------------------------------------------
L1: B L1
.endasmfunc
.endif ; !.TMS470_16BIS
;***************************************************************
;* CONSTANTS USED BY THIS MODULE
;***************************************************************
c_stack .long __stack
c_STACK_SIZE .long __STACK_SIZE
c_mf_sp .long MAIN_FUNC_SP
.if __TI_EABI_ASSEMBLER
.data
.align 4
_stkchk_called:
.field 0,32
.else
.sect ".cinit"
.align 4
.field 4,32
.field _stkchk_called+0,32
.field 0,32
.bss _stkchk_called,4,4
.symdepend ".cinit", ".bss"
.symdepend ".cinit", ".text"
.symdepend ".bss", ".text"
.endif
;******************************************************
;* UNDEFINED REFERENCES *
;******************************************************
.global _stkchk_called
.global __STACK_SIZE
.global ARGS_MAIN_RTN
.global MAIN_FUNC_SP
.global EXIT_RTN
.global __TI_auto_init
.end
一直被一个问题困扰着,就是ARM核要用SPI的EDMA,DSP核要用mcasp的EDMA,但是这两个EDMA通道怒属于同一个edma控制器,但是手册上写着同一个edma控制器有4个EDMA3_0_CC0_INT[3:0],但是在库.h的中断向量表里面同一个EDMA控制器只有一个中断完成向量,两个核可以同时用中断的方式使用同一个EDMA通道控制器的不同通道吗?比如ARM用SPI EDMA中断方式,DSP用MCASP EDMA中断方式,如果可以的话怎么用?因为我在库文件里面只找到一个中断向量,但是芯片手册里面有4个中断向量。
#1. SPI与EDMA都属于CC0的事件。
#2. CC0在AINTC上有中断号EDMA3_0_CC0_INT0,在DSP上有事件EDMA3_0_CC0_INT1。
#3. 那么要同时用,则在ARM端通过EDMA的shadow region 0控制SPI的EDMA, 在DSP端通过shadow region 1 控制MCASP的EDMA就可以了。
BWT,我没看到有4个shadow region的中断事件EDMA3_0_CC0_INT[3:0],只看到2个EDMA3_0_CC0_INT[1:0]
bingliang chen 说:edma通道控制器错误处理只有一个中断向量,但是它在双核里面都对应一个中断号,双核里面可以同时注册同一个edma通道控制器错误处理中断嘛?
理论上是可以,因为中断事件的产生可以分发到两个中断控制器,两个中断控制器都会收到这个中断信号,如果两边都使能了,则都会进入中断服务程序,剩下的看你软件怎么处理了。