本帖最后由 hechuan519 于 2019-9-1 19:17 编辑 ) L- Q9 i) z2 r8 }/ l D
% M$ O7 j9 s6 ^: b* a1问题描述如下:用创龙OMAPL138开发板的串口2中断接收并解析串口数据,开启Timer0中断,在Timer0中以1ms的周期通过EMIF读取FPGA数据,测试过程中发现存在如下问题,当定时器Timer0 中断函数中调用GetEmifData()函数,串口则不能接收并解析数据,无法进入串口中断。当定时器0中什么都不做的情况下能正常的解析串口数据,串口数据到来的时候能进入串口中断处理函数,请问这是什么原因呢。以下是main函数
; H1 ?" b. A7 e: l- e: @void main(void) { /*********1.PSC初始化****************/ PSCInit();// 外设使能配置
' Q8 G5 F. M8 Y: B /********2.管脚复用设置***************/ GPIOBankPinMuxSet(); //GPIO 管脚复用配置 0 L8 R/ Y+ R9 u% R: J3 K7 x
/********3.DSP中断初始化**************/ DSPInterruptInit(); //DSP全局中断初始化 /*********4.外设初始化****************/ UART2Init(); //UART2初始化 Timer0_Init(); //Timer0初始化
* ?* @+ C8 U/ P- U k5 w UARTInterruptInit(); //惯导UART中断初始化 Timer0_Interrupt_Init();//影响串口中断了
% a, }1 i$ i2 ] UARTPuts("TronlongUART2 Application..\r\n", -1); for(;;){ 4 [, G9 @3 J f3 @
} } void PSCInit(void)
8 ?* @8 f; o( |: n{! K4 p4 r" i4 m) i( o
// 使能 ,对相应外设模块的使能也可以在 BootLoader 中完成
7 J+ L8 N2 V* A; ~4 f7 S PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
6 C4 Y. V" Q: j: f- E PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);7 {& r5 ?, j# C- a% h, K. g
} 串口2中断配置函数 void GPIOBankPinMuxSet(void){
- x; V( {4 o7 M6 V( ?) h9 i1 x UARTPinMuxSetup(2, FALSE);//串口2引脚复用 } static void DSPInterruptInit(void){
; M" _0 }( f7 ] IntDSPINTCInit();
3 `1 B8 P( X w IntGlobalEnable(); } static void UART2Init(void){
$ g0 D$ ~9 W; h5 P# \ t // 波特率460800 数据位 8 停止位 1 无校验位 0 {2 Y" Z3 j$ i- v+ T4 V- z' p
UARTConfigSetExpClk(SOC_UART_2_REGS,456000000 / 2, 460800, UART_WORDL_8BITS , UART_OVER_SAMP_RATE_16); , V# W/ y- g+ M0 P
// 使能 UART2
4 b4 d' ~( l( C+ L% ^3 w UARTEnable(SOC_UART_2_REGS); 3 K+ |& ?# s' q1 x! ~9 p" M
// 使能接收 / 发送 FIFO
4 A$ V9 o' ?0 R8 I- _0 m s9 O UARTFIFOEnable(SOC_UART_2_REGS);
4 y6 Z( ]5 ?5 ` // 设置 FIFO 级别 // 8 字UARTFIFOLevelSet(SOC_UART_2_REGS,UART_RX_TRIG_LEVEL_1); } /* UART 中断初始化 */ void UARTInterruptInit(void){
9 M8 @) N: l. v IntRegister(C674X_MASK_INT4, UARTIsr); . c# F) e( U3 V3 r6 b( l
IntEventMap(C674X_MASK_INT4,SYS_INT_UART2_INT);
- b. ~# X+ r9 @1 J IntEnable(C674X_MASK_INT4);
( }% s7 }4 g! |( o& c, s7 P 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);
# n1 l! ^9 B. K/ E/ ?8 q } return; } /****************************************************************************/ /* 定时器Timer0初始*/ /****************************************************************************/ void Timer0_Init(void){
& G# m$ t' z# F2 N+ \* |' v TimerConfigure(SOC_TMR_0_REGS,TMR_CFG_32BIT_UNCH_CLK_BOTH_INT);// 配置定时器 /计数器 2 为 32 位模式
r# C0 `0 {4 X. S* a( i: u, n- Q# J 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){ : @! }0 m) f$ } w* e3 x
IntRegister(C674X_MASK_INT7, Timer0Isr);//注册中断服务函数C674X_MASK_INT7 IntEventMap(C674X_MASK_INT7,SYS_INT_T64P0_TINT12);// 映射中断到 DSP 可屏蔽中断
, B8 [$ g5 R( c8 ^6 q4 N& C IntEnable(C674X_MASK_INT7);// 使能 DSP可屏蔽中断8 ( B4 ]6 N0 ^# ^& k9 E
TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);// 使能 定时器 / 计数器 中断 } void Timer0Isr(){ 3 F9 \9 D' D" W6 c, X4 ? \' ~
TimerIntDisable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE); 4 H$ N8 b( {7 s& @
IntEventClear(SYS_INT_T64P0_TINT12);
: x" w" Z1 a# ?$ E$ ~! A TimerIntStatusClear(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE); 5 F, S1 v9 Q" ?: `7 z
//中断处理函数
$ a Y- q6 }" P# a GetEMIFData();//若调用此函数,串口有数据到来时,OMAPL138无法进入串口2中断,若屏蔽此函数,则可进串口2中断 TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE); } void GetEMIFData()//测试函数 { : L2 g8 P, y9 r5 b- z1 f
unsignedint i=0,j=0;
$ Q1 Z ^# U' u" ^2 \+ L( D ~, h for(i=0;i<100;i++){ 5 X c6 H( _5 y! v
j=5;
8 ^$ ]) o5 O' X* q } }
/ i# n& }# g0 @9 ~. D: q& b, V测试发现,在GetEMIFData()函数中for循环100次,串口正确解析一段时间后卡死,当for循环10时,串口可一直接收数据,很疑惑,难道DSP的定时器中断处理函数连一个for循环都处理不过来么?还是其他原因引起的串口无法接收数据问题?& _, p# e1 ?) E
; z+ ~: E+ ^/ G) h9 V) L
W1 G+ S4 b4 Y5 d- y) _& V q" o5 o% m! T6 N; S6 `
|