本帖最后由 hechuan519 于 2019-9-1 19:17 编辑
7 l$ c# B3 ?1 n2 G$ H. ]/ P/ I6 b* k( G1 m j9 t
1问题描述如下:用创龙OMAPL138开发板的串口2中断接收并解析串口数据,开启Timer0中断,在Timer0中以1ms的周期通过EMIF读取FPGA数据,测试过程中发现存在如下问题,当定时器Timer0 中断函数中调用GetEmifData()函数,串口则不能接收并解析数据,无法进入串口中断。当定时器0中什么都不做的情况下能正常的解析串口数据,串口数据到来的时候能进入串口中断处理函数,请问这是什么原因呢。以下是main函数
; Q, v/ c/ k, dvoid main(void) { /*********1.PSC初始化****************/ PSCInit();// 外设使能配置 2 _; s6 E" Q4 H9 B
/********2.管脚复用设置***************/ GPIOBankPinMuxSet(); //GPIO 管脚复用配置 / x* l* Y# D: R5 M& c* H
/********3.DSP中断初始化**************/ DSPInterruptInit(); //DSP全局中断初始化 /*********4.外设初始化****************/ UART2Init(); //UART2初始化 Timer0_Init(); //Timer0初始化 1 T7 R; H5 ?0 Z' Z$ ~9 @
UARTInterruptInit(); //惯导UART中断初始化 Timer0_Interrupt_Init();//影响串口中断了 * r4 {; j W/ y3 ~
UARTPuts("TronlongUART2 Application..\r\n", -1); for(;;){
5 {1 W; M2 O* s* ?7 K1 T } } void PSCInit(void)
$ c, T* j5 g }; v2 _{$ S( N7 ]$ \9 W4 \9 M
// 使能 ,对相应外设模块的使能也可以在 BootLoader 中完成4 Z( P% e6 b. k/ j& _+ V: H
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
6 Y* N; w3 n1 B- z: s. A8 m' F! ~! _8 {/ r PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);( z4 T( \ D& T6 C+ o
} 串口2中断配置函数 void GPIOBankPinMuxSet(void){
; w( [% M i/ }( A1 ^# k4 ` UARTPinMuxSetup(2, FALSE);//串口2引脚复用 } static void DSPInterruptInit(void){
9 C" @0 W5 a$ ^7 U, \; | IntDSPINTCInit();
8 L- f7 Q' j p, m* | IntGlobalEnable(); } static void UART2Init(void){
5 Z( j* \- f6 J // 波特率460800 数据位 8 停止位 1 无校验位 " q" h' l# t/ J" ?8 }
UARTConfigSetExpClk(SOC_UART_2_REGS,456000000 / 2, 460800, UART_WORDL_8BITS , UART_OVER_SAMP_RATE_16); 2 l- r& \$ [9 E
// 使能 UART2 7 Q' [, M H' K! }9 G- Z
UARTEnable(SOC_UART_2_REGS);
) u# m+ g( o5 x7 h- t6 o$ u // 使能接收 / 发送 FIFO 8 ^9 J8 C6 f0 b$ w- p
UARTFIFOEnable(SOC_UART_2_REGS); % n7 _' z$ } j0 B V0 s( r
// 设置 FIFO 级别 // 8 字UARTFIFOLevelSet(SOC_UART_2_REGS,UART_RX_TRIG_LEVEL_1); } /* UART 中断初始化 */ void UARTInterruptInit(void){
6 Y' H2 s5 u$ Z5 b1 f$ H IntRegister(C674X_MASK_INT4, UARTIsr);
6 ^6 i9 Z) ?; n8 T2 o2 W; x+ k IntEventMap(C674X_MASK_INT4,SYS_INT_UART2_INT); , j- v8 w4 F4 f8 }7 |. X8 i* w$ V( s
IntEnable(C674X_MASK_INT4);
- ]# r4 r2 B; h* a: q 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 u. S" G' b8 X } return; } /****************************************************************************/ /* 定时器Timer0初始*/ /****************************************************************************/ void Timer0_Init(void){ * Y0 Y1 K/ w* q. F, l9 G4 g. |
TimerConfigure(SOC_TMR_0_REGS,TMR_CFG_32BIT_UNCH_CLK_BOTH_INT);// 配置定时器 /计数器 2 为 32 位模式 . @ I. r3 I 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){ + J9 X8 Y6 n' f. ^/ H$ _, q
IntRegister(C674X_MASK_INT7, Timer0Isr);//注册中断服务函数C674X_MASK_INT7 IntEventMap(C674X_MASK_INT7,SYS_INT_T64P0_TINT12);// 映射中断到 DSP 可屏蔽中断
7 L. m. ^( g. v9 ]# X: o" a IntEnable(C674X_MASK_INT7);// 使能 DSP可屏蔽中断8
% v7 l- A7 C0 {. q$ }& p" C TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);// 使能 定时器 / 计数器 中断 } void Timer0Isr(){ " `4 E+ c# s$ Q% |9 x0 P2 }0 R+ J
TimerIntDisable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE); h8 V/ j. Q: x4 C( b- j) s2 R5 k
IntEventClear(SYS_INT_T64P0_TINT12); 2 A, K/ [/ y/ H! |5 T6 R4 g
TimerIntStatusClear(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);
: E5 O+ Q n! l //中断处理函数5 V& i4 F6 l& z% D8 @
GetEMIFData();//若调用此函数,串口有数据到来时,OMAPL138无法进入串口2中断,若屏蔽此函数,则可进串口2中断 TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE); } void GetEMIFData()//测试函数 {
P* g. w* Q) f, b; G, P8 C$ x unsignedint i=0,j=0;
2 `( {# y- Y% H5 x* o/ _) M- L for(i=0;i<100;i++){
( p3 M/ w& x. S3 H" K; f j=5;
$ `# j. g! \& ~. Z# X } }( Y9 }1 u: u# H! B- {$ M5 v
测试发现,在GetEMIFData()函数中for循环100次,串口正确解析一段时间后卡死,当for循环10时,串口可一直接收数据,很疑惑,难道DSP的定时器中断处理函数连一个for循环都处理不过来么?还是其他原因引起的串口无法接收数据问题?
# C& M+ S5 M( t) G i! n1 c 3 r% r; W, g' L
+ m8 P: N: y# [6 u
1 C4 m! [3 i1 B% d( |8 d. O/ Y |