| 本帖最后由 hechuan519 于 2019-9-1 19:17 编辑 ) Q/ W9 D: _+ l6 Q- i  ]6 L 
 ( F, W. M1 e) ?7 ?  \1问题描述如下:用创龙OMAPL138开发板的串口2中断接收并解析串口数据,开启Timer0中断,在Timer0中以1ms的周期通过EMIF读取FPGA数据,测试过程中发现存在如下问题,当定时器Timer0 中断函数中调用GetEmifData()函数,串口则不能接收并解析数据,无法进入串口中断。当定时器0中什么都不做的情况下能正常的解析串口数据,串口数据到来的时候能进入串口中断处理函数,请问这是什么原因呢。以下是main函数! I  q' |7 r/ Z2 G' s% D
 
 void main(void) {    /*********1.PSC初始化****************/     PSCInit();// 外设使能配置 ; n" T  n; G, M) u  b( s
     /********2.管脚复用设置***************/     GPIOBankPinMuxSet();    //GPIO 管脚复用配置6 Q5 c3 T% z% r2 l8 G; H7 U; U 
     /********3.DSP中断初始化**************/     DSPInterruptInit();     //DSP全局中断初始化     /*********4.外设初始化****************/     UART2Init();            //UART2初始化     Timer0_Init();          //Timer0初始化% t- @4 j- ]. L9 z( E2 I4 q 
     UARTInterruptInit();    //惯导UART中断初始化     Timer0_Interrupt_Init();//影响串口中断了E/ b8 l6 e3 n, f* Z: s8 r 
     UARTPuts("TronlongUART2 Application..\r\n", -1);     for(;;){2 \  @4 I: s6 F1 W' [- G 
     } } void PSCInit(void); `/ Z) {  S  T8 S; O, z' X% U8 j{
 + ?" a6 g3 T) i" U, h. j# k    // 使能 ,对相应外设模块的使能也可以在 BootLoader 中完成
 . x2 v, j8 {  J0 `; ?    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);8 |9 {- u; V4 ?! g3 y: `3 R8 }* g2 t
 PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
 9 }- k/ F: ^" I: z) r}
 串口2中断配置函数 void GPIOBankPinMuxSet(void){    . q6 M( }: \! p- a9 v; Q
         UARTPinMuxSetup(2, FALSE);//串口2引脚复用 } static void DSPInterruptInit(void){   ' q/ [. u5 M) {, a9 S& `; v
      IntDSPINTCInit();    . D6 z9 a0 F9 N& Y! ^
      IntGlobalEnable(); }  static void UART2Init(void){      |% I) v6 X. x# W
 // 波特率460800 数据位 8 停止位 1 无校验位    % U  D; {9 g- G
     UARTConfigSetExpClk(SOC_UART_2_REGS,456000000 / 2, 460800, UART_WORDL_8BITS , UART_OVER_SAMP_RATE_16);     + z- T8 h" p) u) X3 ?3 h
 // 使能 UART2    & w* h; q/ D7 S
     UARTEnable(SOC_UART_2_REGS);    ! U  ]7 G& x" Q4 H& H
 // 使能接收 / 发送 FIFO            6 K" P8 ?' q3 m: B7 x: q1 ?
     UARTFIFOEnable(SOC_UART_2_REGS);    7 x" P- Z+ v& ~6 \
 // 设置 FIFO 级别  // 8 字UARTFIFOLevelSet(SOC_UART_2_REGS,UART_RX_TRIG_LEVEL_1); } /*              UART 中断初始化   */ void UARTInterruptInit(void){    2 P: [% O5 C: c8 J- i
 IntRegister(C674X_MASK_INT4, UARTIsr);    6 F1 f% c, ?  r$ Q+ Q
 IntEventMap(C674X_MASK_INT4,SYS_INT_UART2_INT);    8 J  B- y2 X' l  W/ ]+ g/ i* @) G
 IntEnable(C674X_MASK_INT4);    : q* F5 t# j1 l7 S
 UARTIntEnable(SOC_UART_2_REGS, UART_INT_LINE_STAT |UART_INT_RXDATA_CTI); }  /***********************************************/ /*              UART 中断服务函数               */ /***********************************************/ void UARTIsr() {     unsigned char rxData =0;     unsigned int int_id =0;     // 确定中断源     int_id = UARTIntStatus(SOC_UART_2_REGS);     // 清除 UART2 系统中断     IntEventClear(SYS_INT_UART2_INT);     // 接收中断     if(UART_INTID_RX_DATA== int_id)     {         rxData = UARTCharGet(SOC_UART_2_REGS); 0 k% o# a( @" q
     }     return; } /****************************************************************************/ /*                    定时器Timer0初始*/ /****************************************************************************/ void Timer0_Init(void){   * s* u# s" y. y/ i' K+ a: j* \9 e
     TimerConfigure(SOC_TMR_0_REGS,TMR_CFG_32BIT_UNCH_CLK_BOTH_INT);// 配置定时器 /计数器 2 为 32 位模式  & l& q* [& R7 t2 ^& l
     TimerPeriodSet(SOC_TMR_0_REGS,TMR_TIMER12, 24000*1);//1ms定时准确         TimerEnable(SOC_TMR_0_REGS,TMR_TIMER12, TMR_ENABLE_CONT);} /****************************************************************************/ /*              定时器0中断初始化           */ /****************************************************************************/ void Timer0_Interrupt_Init(void){    ) e% t5 ]5 ^7 j6 J& v7 T
     IntRegister(C674X_MASK_INT7, Timer0Isr);//注册中断服务函数C674X_MASK_INT7     IntEventMap(C674X_MASK_INT7,SYS_INT_T64P0_TINT12);// 映射中断到 DSP 可屏蔽中断   # ?: e) Y! o4 J
     IntEnable(C674X_MASK_INT7);// 使能 DSP可屏蔽中断8    : B( C9 z$ I; G5 L
     TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);// 使能 定时器 / 计数器 中断  }  void Timer0Isr(){     ' d- [/ E* `" g4 Q, G5 D9 r
     TimerIntDisable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);    2 r1 l0 F, Y- H; y: c3 U
     IntEventClear(SYS_INT_T64P0_TINT12);    : x! {0 H$ [0 z7 u3 Q- z
     TimerIntStatusClear(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);     ( Z" Z& T0 a5 L9 k9 H  y# Z
     //中断处理函数9 a' a/ Y* |' }  `% T
      GetEMIFData();//若调用此函数,串口有数据到来时,OMAPL138无法进入串口2中断,若屏蔽此函数,则可进串口2中断            TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE); } void GetEMIFData()//测试函数 {    8 S9 n1 _. |7 p; G0 ^
     unsignedint i=0,j=0;    ' I2 y: T; B/ v
      for(i=0;i<100;i++){ 6 t$ o2 S0 k4 O. h
               j=5;    $ [! O+ i* E$ N6 }5 a
       } }9 E- G# F& G2 u1 R4 J测试发现,在GetEMIFData()函数中for循环100次,串口正确解析一段时间后卡死,当for循环10时,串口可一直接收数据,很疑惑,难道DSP的定时器中断处理函数连一个for循环都处理不过来么?还是其他原因引起的串口无法接收数据问题?" f9 K9 l3 P5 w& }; w
 
 ) U% i- o% w4 [* m8 N! x/ z- W1 h, t# K) V$ V  [' n
 
 * h2 m0 a# b, X% U& r
 |