本帖最后由 hechuan519 于 2019-9-1 19:17 编辑 6 T+ C# R3 i& C# f6 Y" a
{% m) _4 T3 }0 ?
1问题描述如下:用创龙OMAPL138开发板的串口2中断接收并解析串口数据,开启Timer0中断,在Timer0中以1ms的周期通过EMIF读取FPGA数据,测试过程中发现存在如下问题,当定时器Timer0 中断函数中调用GetEmifData()函数,串口则不能接收并解析数据,无法进入串口中断。当定时器0中什么都不做的情况下能正常的解析串口数据,串口数据到来的时候能进入串口中断处理函数,请问这是什么原因呢。以下是main函数+ K9 b7 m% E. m8 j) S: ^
void main(void) { /*********1.PSC初始化****************/ PSCInit();// 外设使能配置 4 `' e j7 R9 s' Q3 ?
/********2.管脚复用设置***************/ GPIOBankPinMuxSet(); //GPIO 管脚复用配置 * u1 Y* I6 s2 x2 O0 K2 J) l
/********3.DSP中断初始化**************/ DSPInterruptInit(); //DSP全局中断初始化 /*********4.外设初始化****************/ UART2Init(); //UART2初始化 Timer0_Init(); //Timer0初始化 & r7 W- p: t, H7 j
UARTInterruptInit(); //惯导UART中断初始化 Timer0_Interrupt_Init();//影响串口中断了 9 ~7 [/ h* E6 B7 a6 H% N
UARTPuts("TronlongUART2 Application..\r\n", -1); for(;;){
% y, J# m2 L; ` o* T } } void PSCInit(void)+ V) f- ]. Z6 G8 t! T5 z
{
7 v" t7 D' `' I) K& A! x // 使能 ,对相应外设模块的使能也可以在 BootLoader 中完成" B( ^% ]* [/ W
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);5 B) E" S! o3 W3 x4 k# x
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);2 W( O' X6 y" H |
} 串口2中断配置函数 void GPIOBankPinMuxSet(void){
) c1 Z s/ m- n UARTPinMuxSetup(2, FALSE);//串口2引脚复用 } static void DSPInterruptInit(void){ ' L! M8 \( f; \+ o1 J/ f" S* h
IntDSPINTCInit();
4 M7 H. h' V+ p. Y2 n IntGlobalEnable(); } static void UART2Init(void){
$ P$ x% W N h3 w+ _4 { // 波特率460800 数据位 8 停止位 1 无校验位
0 t" {( ~. y# k8 y6 ? UARTConfigSetExpClk(SOC_UART_2_REGS,456000000 / 2, 460800, UART_WORDL_8BITS , UART_OVER_SAMP_RATE_16);
7 p8 Q7 H5 ]; }, R // 使能 UART2
, r5 j; p8 \* x UARTEnable(SOC_UART_2_REGS); # g6 ?( ^& H) a( @0 ?
// 使能接收 / 发送 FIFO $ O! q7 o0 m- [& X1 l2 a* ?
UARTFIFOEnable(SOC_UART_2_REGS); & Q6 l2 L/ u/ @5 ?3 r
// 设置 FIFO 级别 // 8 字UARTFIFOLevelSet(SOC_UART_2_REGS,UART_RX_TRIG_LEVEL_1); } /* UART 中断初始化 */ void UARTInterruptInit(void){ 3 ~9 a( H+ v) J* |( |
IntRegister(C674X_MASK_INT4, UARTIsr); , d# M$ _: r2 H- Z/ I# ^
IntEventMap(C674X_MASK_INT4,SYS_INT_UART2_INT); : w9 L( w7 F' X/ g5 k
IntEnable(C674X_MASK_INT4);
7 [) a! M1 j0 g 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); ; t' \6 W3 F. v! j8 K3 U* u4 A+ D
} return; } /****************************************************************************/ /* 定时器Timer0初始*/ /****************************************************************************/ void Timer0_Init(void){
3 l0 n7 @& A: b( Y5 t TimerConfigure(SOC_TMR_0_REGS,TMR_CFG_32BIT_UNCH_CLK_BOTH_INT);// 配置定时器 /计数器 2 为 32 位模式
% z6 c3 r3 l/ \- G+ F1 S 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){
# z2 G" ]7 _: B3 K* {) z IntRegister(C674X_MASK_INT7, Timer0Isr);//注册中断服务函数C674X_MASK_INT7 IntEventMap(C674X_MASK_INT7,SYS_INT_T64P0_TINT12);// 映射中断到 DSP 可屏蔽中断
- d0 L/ K0 F! L: S' N1 P% I7 R IntEnable(C674X_MASK_INT7);// 使能 DSP可屏蔽中断8 9 R5 e0 i+ j2 d
TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);// 使能 定时器 / 计数器 中断 } void Timer0Isr(){ 0 b9 [' e( C5 W3 r% u4 M# b( {
TimerIntDisable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);
3 j9 U- ^- x- _9 Y IntEventClear(SYS_INT_T64P0_TINT12); 9 y$ w% Y2 G b5 ~. |/ p
TimerIntStatusClear(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE); 1 W' N- @% U5 X+ W; l" Q
//中断处理函数
- c$ l3 W; g l GetEMIFData();//若调用此函数,串口有数据到来时,OMAPL138无法进入串口2中断,若屏蔽此函数,则可进串口2中断 TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE); } void GetEMIFData()//测试函数 {
/ {( X% k, j1 g2 w. M+ M unsignedint i=0,j=0;
1 ` J# q W/ v; ? for(i=0;i<100;i++){ 6 Z: }) Z2 F+ w& z% y& E+ P& o+ T" k
j=5;
( Z* J9 K: |6 o* n3 N- Z8 j8 r } }- @& d# j: {& L/ ^
测试发现,在GetEMIFData()函数中for循环100次,串口正确解析一段时间后卡死,当for循环10时,串口可一直接收数据,很疑惑,难道DSP的定时器中断处理函数连一个for循环都处理不过来么?还是其他原因引起的串口无法接收数据问题?6 H9 j$ M$ E% ~5 X( n
) ]$ ^1 d" I* N$ E2 k* z
) t% X: z$ a; j/ a5 p$ a. r' K: t. o3 A+ s( O: M; ^
|