本帖最后由 hechuan519 于 2019-9-1 19:17 编辑
; c! ]6 F$ H3 q- \
2 r. t! D+ w* r2 S* {" }* g1问题描述如下:用创龙OMAPL138开发板的串口2中断接收并解析串口数据,开启Timer0中断,在Timer0中以1ms的周期通过EMIF读取FPGA数据,测试过程中发现存在如下问题,当定时器Timer0 中断函数中调用GetEmifData()函数,串口则不能接收并解析数据,无法进入串口中断。当定时器0中什么都不做的情况下能正常的解析串口数据,串口数据到来的时候能进入串口中断处理函数,请问这是什么原因呢。以下是main函数
) A( o1 N: E- d9 s7 Yvoid main(void) { /*********1.PSC初始化****************/ PSCInit();// 外设使能配置
3 {) {1 V# t; A2 n1 t: X /********2.管脚复用设置***************/ GPIOBankPinMuxSet(); //GPIO 管脚复用配置 2 Z' ~$ O7 d7 `9 v; v
/********3.DSP中断初始化**************/ DSPInterruptInit(); //DSP全局中断初始化 /*********4.外设初始化****************/ UART2Init(); //UART2初始化 Timer0_Init(); //Timer0初始化
; z+ @* Y, Q+ E+ r UARTInterruptInit(); //惯导UART中断初始化 Timer0_Interrupt_Init();//影响串口中断了
# A, l$ b" T. _* g UARTPuts("TronlongUART2 Application..\r\n", -1); for(;;){
3 f7 o2 N) b' @) n } } void PSCInit(void)
5 f& X# L, Z `& Z{7 s; ~* U- Z* k0 J
// 使能 ,对相应外设模块的使能也可以在 BootLoader 中完成, @% u' J& _' i1 o) A8 R+ `6 n
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
1 W- \3 W1 q/ R9 j2 a PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
0 X0 O1 u" i3 k' K} 串口2中断配置函数 void GPIOBankPinMuxSet(void){ ; w2 Q$ o ?/ K5 d9 C9 v
UARTPinMuxSetup(2, FALSE);//串口2引脚复用 } static void DSPInterruptInit(void){
% p9 r# t3 A7 f+ o4 P9 @ IntDSPINTCInit(); / C4 F7 k- x0 c% g7 d2 T& Q& `
IntGlobalEnable(); } static void UART2Init(void){ 8 I& X) u" A: s0 l" I! F* F
// 波特率460800 数据位 8 停止位 1 无校验位
4 D* A: Q( r4 K4 V1 @; F UARTConfigSetExpClk(SOC_UART_2_REGS,456000000 / 2, 460800, UART_WORDL_8BITS , UART_OVER_SAMP_RATE_16); ) n8 ]4 T0 l) D1 i- I. g) X3 z: z
// 使能 UART2 * S7 T: M4 R& h) P5 g D
UARTEnable(SOC_UART_2_REGS); 1 i8 y9 D: N* i9 M
// 使能接收 / 发送 FIFO ' y9 ?2 I Q+ |! N, P& o
UARTFIFOEnable(SOC_UART_2_REGS);
1 ^1 f0 H- {3 u |* Z3 T7 l1 \6 m // 设置 FIFO 级别 // 8 字UARTFIFOLevelSet(SOC_UART_2_REGS,UART_RX_TRIG_LEVEL_1); } /* UART 中断初始化 */ void UARTInterruptInit(void){
2 F/ f, c- m1 o9 Q IntRegister(C674X_MASK_INT4, UARTIsr);
2 `* Z) J" h) c+ u |: \0 ~% \ IntEventMap(C674X_MASK_INT4,SYS_INT_UART2_INT); - y; v" a( i) G: a- D) s
IntEnable(C674X_MASK_INT4);
) p# \# h/ x( _! 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); 6 Z4 d: ^- B: \
} return; } /****************************************************************************/ /* 定时器Timer0初始*/ /****************************************************************************/ void Timer0_Init(void){ % P! W- C% V9 b
TimerConfigure(SOC_TMR_0_REGS,TMR_CFG_32BIT_UNCH_CLK_BOTH_INT);// 配置定时器 /计数器 2 为 32 位模式
7 L/ K+ k9 I! m* f 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){ 6 ]) Y& V) A/ @/ U' Q; l! z7 n$ y
IntRegister(C674X_MASK_INT7, Timer0Isr);//注册中断服务函数C674X_MASK_INT7 IntEventMap(C674X_MASK_INT7,SYS_INT_T64P0_TINT12);// 映射中断到 DSP 可屏蔽中断 $ Y& c% C0 ]& t3 s( B2 ^
IntEnable(C674X_MASK_INT7);// 使能 DSP可屏蔽中断8
2 _: U5 @8 r \" s" ]6 E1 s TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);// 使能 定时器 / 计数器 中断 } void Timer0Isr(){ 4 \3 p/ g5 A4 O+ V! ?7 `# m, A! D
TimerIntDisable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);
# N1 d7 v& o/ f/ R IntEventClear(SYS_INT_T64P0_TINT12);
! i: n/ U7 r: w, E/ } TimerIntStatusClear(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE); 5 C* @2 A: G: f
//中断处理函数
' c6 l- m' r! x( x GetEMIFData();//若调用此函数,串口有数据到来时,OMAPL138无法进入串口2中断,若屏蔽此函数,则可进串口2中断 TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE); } void GetEMIFData()//测试函数 {
6 V" E* F, w, M* J3 ^ unsignedint i=0,j=0; 7 |. [2 v D" k& e' c6 \6 `' G; J1 ^
for(i=0;i<100;i++){
6 }1 [: l! T0 R& R j=5; 8 ^# m+ C& J; s: y# o
} }! K/ {3 j2 d0 t
测试发现,在GetEMIFData()函数中for循环100次,串口正确解析一段时间后卡死,当for循环10时,串口可一直接收数据,很疑惑,难道DSP的定时器中断处理函数连一个for循环都处理不过来么?还是其他原因引起的串口无法接收数据问题?6 U2 t; y2 _/ G- w" q& D$ r
7 u' ]+ D$ Z; k/ r
$ @. g4 `. N4 {' f/ x! w; X- W4 w7 N7 d ]
|