TI中文支持网
TI专业的中文技术问题搜集分享网站

tms320c6747 release 版本 uart 工作不正常

debug版本可以。用硬件仿真模式也可以。 就是release版本不可以。

中断函数的所有变量都定义成volatible类型了。

后面试了一下, 在main函数中循环发送一个字符, release版本也不成功

有人能给一些建议吗?

 

cmd文件如下:

-c
-heap  0x3000
-stack 0x3000

MEMORY
{
   L1D:     o = 00F00000h   l = 00008000h
   L1P:     o = 00E00000h   l = 00008000h
   L2:      o = 00800000h   l = 00040000h
  }

SECTIONS
{

    .text       >       L2
    .stack      >       L2
    .bss        >       L2
    .cinit      >       L2
    .cio        >       L2
    .const      >       L2
    .sysmem     >       L2
    .far        >       L2
    .switch     >       L2
 .data       >       L2
  .vecs      >       L2
}

中断向量文件如下

 .global _intcVectorTable
   .global _c_int00
   .global _vector1
   .global _vector2
   .global _vector3
   .global _UART2_isr
   .global _vector5
   .global _vector6
   .global _vector7
   .global _vector8
   .global _vector9
   .global _vector10
   .global _vector11

; This is a macro that instantiates one entry in the interrupt service table.
VEC_ENTRY .macro addr
    STW   B0,*–B15
    MVKL  addr,B0
    MVKH  addr,B0
    B     B0
    LDW   *B15++,B0
    NOP   2
    NOP
    NOP
   .endm

; This is a dummy interrupt service routine used to initialize the IST.
_vec_dummy:
  B    B3
  NOP  5

; This is the actual interrupt service table (IST).
 .sect ".vecs"
 .align 1024

_intcVectorTable:
_vector0:   VEC_ENTRY _c_int00    ;RESET
_vector1:   VEC_ENTRY _vec_dummy  ;NMI
_vector2:   VEC_ENTRY _vec_dummy  ;RSVD
_vector3:   VEC_ENTRY _vec_dummy  ;RSVD
_vector4:   VEC_ENTRY _UART2_isr  ;isr0
_vector5:   VEC_ENTRY _vec_dummy  ;isr0
_vector6:   VEC_ENTRY _vec_dummy  ;isr1
_vector7:   VEC_ENTRY _vec_dummy  ;isr2
_vector8:   VEC_ENTRY _vec_dummy  ;isr3
_vector9:   VEC_ENTRY _vec_dummy
_vector10:  VEC_ENTRY _vec_dummy
_vector11:  VEC_ENTRY _vec_dummy

 

初始化程序

   CSL_DspintcRegsOvly intcRegs = (CSL_DspintcRegsOvly)CSL_INTC_0_REGS;

     uartRegs->PWREMU_MGMT = 0;          // Reset UART TX & RX components
   asm(" NOP 2");  

uartRegs->FCR = 0x0001;
     uartRegs->FCR = 0x0007;             // Clear UART TX & RX FIFOs
     asm(" NOP 2");
     uartRegs->FCR = 0x0000;             // Non-FIFO mode

      uartRegs->LCR |=0x03; //b0,b1置1

     uartRegs->MCR = 0x0000;             // RTS & CTS disabled

  uartRegs->MDR=1; //b0置1
  uartRegs->DLL=136;
  //uartRegs->DLH=0;

  uartRegs->IER = 0x0005;             // Enable interrupts
     uartRegs->PWREMU_MGMT = 0xE001;     // Enable TX & RX componenets

 

  CSR&=0xfffe;//disable global interrupt
     // connect the event to the interrupt 4
     CSL_FINS(intcRegs->INTMUX1, DSPINTC_INTMUX1_INTSEL4, CSL_INTC_EVENTID_UARTINT1);
      asm(" NOP 2");
     // set ISTP to point to the vector table address
     ISTP = (unsigned int)intcVectorTable;
       asm(" NOP 2");

     // clear all interrupts, bits 4 thru 15
     ICR = 0xfff0;
      asm(" NOP 2");

     // b0 :reset b1:NMIE   b4: INT4  enable the bits for non maskable interrupt and
     IER=0x12; //
      asm(" NOP 2");
     // enable interrupts, set GIE bit
     _enable_interrupts();

Denny%20Yang99373:

对比一下编译选项看RELEASE改了什么编译选项引入了这个问题?

还可以对比一下初始化后的串口寄存器和相关中断寄存器

jun yu3:

回复 Denny%20Yang99373:

release 模式下 我 已经把optimization level改成off 了

release 模式下 怎么观察 寄存器内容呢?  我之前都是用仿真器 load .out文件的

Tony Tang:

回复 jun yu3:

观察寄存器跟release模式有什么关系?release仅仅是对应一套编译选项的名字而已。

cmd文件里不要出现下面这部分内存空间,不会用到的内存不要出现在cmd文件里。虽然跟这个问题无关,但这是要注意的习惯.

   L1D:     o = 00F00000h   l = 00008000h   L1P:     o = 00E00000h   l = 00008000h

赞(0)
未经允许不得转载:TI中文支持网 » tms320c6747 release 版本 uart 工作不正常
分享到: 更多 (0)