本帖最后由 hechuan519 于 2019-9-1 19:17 编辑
- c4 y+ d% u, c: Q0 p# m% }
& E. J/ p; c- F4 d- h& z1问题描述如下:用创龙OMAPL138开发板的串口2中断接收并解析串口数据,开启Timer0中断,在Timer0中以1ms的周期通过EMIF读取FPGA数据,测试过程中发现存在如下问题,当定时器Timer0 中断函数中调用GetEmifData()函数,串口则不能接收并解析数据,无法进入串口中断。当定时器0中什么都不做的情况下能正常的解析串口数据,串口数据到来的时候能进入串口中断处理函数,请问这是什么原因呢。以下是main函数
/ f/ k) w! }4 Z# C3 e4 K* jvoid main(void) { /*********1.PSC初始化****************/ PSCInit();// 外设使能配置
5 R, z( a. Z& A: H2 |& `% v* z& u /********2.管脚复用设置***************/ GPIOBankPinMuxSet(); //GPIO 管脚复用配置 , ]) x* a9 D( h' z! V: K
/********3.DSP中断初始化**************/ DSPInterruptInit(); //DSP全局中断初始化 /*********4.外设初始化****************/ UART2Init(); //UART2初始化 Timer0_Init(); //Timer0初始化 4 f C4 J4 ~( h7 k
UARTInterruptInit(); //惯导UART中断初始化 Timer0_Interrupt_Init();//影响串口中断了 ; X9 r( O" A0 a g" @; G
UARTPuts("TronlongUART2 Application..\r\n", -1); for(;;){ 4 }2 b! y- o U V
} } void PSCInit(void)
6 X- j: z1 M% ]: x1 h{
5 N1 \5 r8 ^+ v0 @' E! a- k4 Y // 使能 ,对相应外设模块的使能也可以在 BootLoader 中完成7 y' o' c h/ u& X5 t/ g
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);2 t0 D: J1 r- d. X
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);* @( V6 V2 O0 t; X
} 串口2中断配置函数 void GPIOBankPinMuxSet(void){ ' ^4 E5 g5 f w0 q( K, r- ?
UARTPinMuxSetup(2, FALSE);//串口2引脚复用 } static void DSPInterruptInit(void){ 6 n+ @3 C. V7 B
IntDSPINTCInit();
- s" [7 O: ?* U" } IntGlobalEnable(); } static void UART2Init(void){ ) n) ?% A2 W3 L/ G/ Y8 }
// 波特率460800 数据位 8 停止位 1 无校验位 # ?. _# O+ t2 ]. F, q; p. M/ z
UARTConfigSetExpClk(SOC_UART_2_REGS,456000000 / 2, 460800, UART_WORDL_8BITS , UART_OVER_SAMP_RATE_16); 6 w+ e6 l2 v% c* g8 A
// 使能 UART2
4 g9 e2 h$ u: J! e UARTEnable(SOC_UART_2_REGS);
, P( Q4 j7 w: b9 O6 d+ E // 使能接收 / 发送 FIFO ; G6 n, r$ ?1 @" t/ ?; t# n$ g& g
UARTFIFOEnable(SOC_UART_2_REGS);
. z: l8 }' u9 n# `( G" I/ [/ @8 c // 设置 FIFO 级别 // 8 字UARTFIFOLevelSet(SOC_UART_2_REGS,UART_RX_TRIG_LEVEL_1); } /* UART 中断初始化 */ void UARTInterruptInit(void){ " u; t* h/ @( l! Q, c* ~ s7 S
IntRegister(C674X_MASK_INT4, UARTIsr); , h8 B/ z' |& ~1 O
IntEventMap(C674X_MASK_INT4,SYS_INT_UART2_INT); ; P- q' z5 u% l8 J
IntEnable(C674X_MASK_INT4);
8 l0 `* }5 T! m& v# \ 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);
{+ [: s l6 F/ F, X5 ?. M3 u; }1 y } return; } /****************************************************************************/ /* 定时器Timer0初始*/ /****************************************************************************/ void Timer0_Init(void){ ( e; o5 W" ?; c u
TimerConfigure(SOC_TMR_0_REGS,TMR_CFG_32BIT_UNCH_CLK_BOTH_INT);// 配置定时器 /计数器 2 为 32 位模式 . V# l; ]$ p- A u% O
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. A- G: V1 M& M
IntRegister(C674X_MASK_INT7, Timer0Isr);//注册中断服务函数C674X_MASK_INT7 IntEventMap(C674X_MASK_INT7,SYS_INT_T64P0_TINT12);// 映射中断到 DSP 可屏蔽中断
$ p2 `: b' g' L7 Q7 w9 D, l& L IntEnable(C674X_MASK_INT7);// 使能 DSP可屏蔽中断8
7 h* A) {/ l. E9 i% [* T9 y# Q4 V TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);// 使能 定时器 / 计数器 中断 } void Timer0Isr(){
9 p; O6 f* t2 y7 |- q- Y: O" P TimerIntDisable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE); * e: p A( t, [+ O
IntEventClear(SYS_INT_T64P0_TINT12); * w+ j8 [5 V& n$ ~4 @# S0 X9 W
TimerIntStatusClear(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);
8 r( Y5 m8 |! c: p //中断处理函数( N0 N1 X! ~9 t& D# [+ B/ |! V' k- u
GetEMIFData();//若调用此函数,串口有数据到来时,OMAPL138无法进入串口2中断,若屏蔽此函数,则可进串口2中断 TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE); } void GetEMIFData()//测试函数 { ) E3 `% M- t* ]* r: ^* ` Q
unsignedint i=0,j=0; 0 l. i0 Y. K6 c8 ]9 [$ c
for(i=0;i<100;i++){ % k4 ^8 R; g! T7 K2 [
j=5;
7 Z# B% ^. x' n3 h0 | \ } }) y8 L" y, I0 o% Z+ {8 U9 }! ?2 t
测试发现,在GetEMIFData()函数中for循环100次,串口正确解析一段时间后卡死,当for循环10时,串口可一直接收数据,很疑惑,难道DSP的定时器中断处理函数连一个for循环都处理不过来么?还是其他原因引起的串口无法接收数据问题?
) P7 V7 M2 D* X( g 2 |0 C9 t- g6 B8 b: D
9 ^ A! r/ F4 w; K/ @, d: N Z
2 l! y1 K- H6 K5 t
|