本帖最后由 hechuan519 于 2019-9-1 19:17 编辑 # r$ Z* e; f* q2 _+ B0 Q Q+ A
9 x7 q: _7 Q" l3 y* D
1问题描述如下:用创龙OMAPL138开发板的串口2中断接收并解析串口数据,开启Timer0中断,在Timer0中以1ms的周期通过EMIF读取FPGA数据,测试过程中发现存在如下问题,当定时器Timer0 中断函数中调用GetEmifData()函数,串口则不能接收并解析数据,无法进入串口中断。当定时器0中什么都不做的情况下能正常的解析串口数据,串口数据到来的时候能进入串口中断处理函数,请问这是什么原因呢。以下是main函数
( \* N. l( S& i/ N3 evoid main(void) { /*********1.PSC初始化****************/ PSCInit();// 外设使能配置 ( I! b7 ]' {; [
/********2.管脚复用设置***************/ GPIOBankPinMuxSet(); //GPIO 管脚复用配置 2 `4 y5 F- s4 t/ p7 I' B+ `
/********3.DSP中断初始化**************/ DSPInterruptInit(); //DSP全局中断初始化 /*********4.外设初始化****************/ UART2Init(); //UART2初始化 Timer0_Init(); //Timer0初始化 " m* ]! ~8 Z F, t1 V/ x9 S
UARTInterruptInit(); //惯导UART中断初始化 Timer0_Interrupt_Init();//影响串口中断了 % m6 z& i/ R3 I
UARTPuts("TronlongUART2 Application..\r\n", -1); for(;;){
/ P% M2 v" H) }) k4 [. _$ T+ d2 k6 l } } void PSCInit(void)* b I" s! n( U: x9 T" X5 z0 W) H
{( Y/ A9 m9 N5 W, P7 A
// 使能 ,对相应外设模块的使能也可以在 BootLoader 中完成0 P( d" m+ i- C
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
( D1 [ D1 O0 C0 D! }! p8 ` PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);& _7 g g& b$ `& W6 U; l2 x
} 串口2中断配置函数 void GPIOBankPinMuxSet(void){
8 }/ h; p2 e5 W3 I! t' m UARTPinMuxSetup(2, FALSE);//串口2引脚复用 } static void DSPInterruptInit(void){
1 I$ @) h# e- w5 r# E/ m IntDSPINTCInit(); : Z2 x5 S0 p. F" s
IntGlobalEnable(); } static void UART2Init(void){
) s; C1 b; q7 I! v( ` // 波特率460800 数据位 8 停止位 1 无校验位 3 y$ I' z9 {5 c# K
UARTConfigSetExpClk(SOC_UART_2_REGS,456000000 / 2, 460800, UART_WORDL_8BITS , UART_OVER_SAMP_RATE_16);
$ q* J3 Z1 S* Y3 } // 使能 UART2 5 v6 n; C P4 w
UARTEnable(SOC_UART_2_REGS);
; q$ @7 t0 P8 M3 S' `9 i9 B# J // 使能接收 / 发送 FIFO
& n" p- C- e( W7 l8 T$ X UARTFIFOEnable(SOC_UART_2_REGS);
0 U( \# K$ |: Y# f+ \0 K // 设置 FIFO 级别 // 8 字UARTFIFOLevelSet(SOC_UART_2_REGS,UART_RX_TRIG_LEVEL_1); } /* UART 中断初始化 */ void UARTInterruptInit(void){ - \- c& U2 z; L3 ~% u
IntRegister(C674X_MASK_INT4, UARTIsr); 0 i+ z7 B# D+ K% w; P% n0 k
IntEventMap(C674X_MASK_INT4,SYS_INT_UART2_INT); , }( W2 v: y9 U5 E: ?
IntEnable(C674X_MASK_INT4); 1 F7 X2 B: T0 y1 M
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); * }( P5 w3 ?7 a, |. ]/ f
} return; } /****************************************************************************/ /* 定时器Timer0初始*/ /****************************************************************************/ void Timer0_Init(void){
) Q6 x* z- K; ?+ e9 B7 A o6 D TimerConfigure(SOC_TMR_0_REGS,TMR_CFG_32BIT_UNCH_CLK_BOTH_INT);// 配置定时器 /计数器 2 为 32 位模式 6 k& G9 R- F0 ]; E+ w" J0 k
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){
4 X7 e; ]2 B+ A$ E9 g" T IntRegister(C674X_MASK_INT7, Timer0Isr);//注册中断服务函数C674X_MASK_INT7 IntEventMap(C674X_MASK_INT7,SYS_INT_T64P0_TINT12);// 映射中断到 DSP 可屏蔽中断
X0 v3 h0 r* p% h0 j: | IntEnable(C674X_MASK_INT7);// 使能 DSP可屏蔽中断8
: r" h! _8 G1 K7 N TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);// 使能 定时器 / 计数器 中断 } void Timer0Isr(){ 5 a5 Y0 a4 v; w2 v+ n
TimerIntDisable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);
) d I8 Z9 w2 {! [ IntEventClear(SYS_INT_T64P0_TINT12); 1 m) L; k' C+ P
TimerIntStatusClear(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE); . ~9 @" J! V' o2 I% U( L# H2 [
//中断处理函数
) D o6 o6 c4 c! f9 }6 z GetEMIFData();//若调用此函数,串口有数据到来时,OMAPL138无法进入串口2中断,若屏蔽此函数,则可进串口2中断 TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE); } void GetEMIFData()//测试函数 {
) g; g( e; Q$ S4 T9 f4 l unsignedint i=0,j=0; ( d2 P9 h* x* S
for(i=0;i<100;i++){
0 a2 Q8 N7 ]7 P7 F( c* w j=5; ! Y3 D+ A4 i4 }5 x. o8 H! I- }! |
} }
6 z3 B. Y0 b+ A S# |测试发现,在GetEMIFData()函数中for循环100次,串口正确解析一段时间后卡死,当for循环10时,串口可一直接收数据,很疑惑,难道DSP的定时器中断处理函数连一个for循环都处理不过来么?还是其他原因引起的串口无法接收数据问题?/ M4 W5 o) r4 O9 W0 H
z3 r# N# J1 S& ?6 W, j
* x; Z+ F) [% U# Q% I
+ V F# o5 O/ v% t0 W- Y |