OMAPL138 串口中断与定时器Timer0,Timer2中断冲突的问题 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6437|回复: 0
打印 上一主题 下一主题

[未解决] OMAPL138 串口中断与定时器Timer0,Timer2中断冲突的问题

[复制链接]

1

主题

1

帖子

1033

积分

金牌会员

Rank: 6Rank: 6

积分
1033
跳转到指定楼层
楼主
发表于 2019-9-1 19:10:21 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 hechuan519 于 2019-9-1 19:17 编辑 6 A: s4 m$ l1 }/ y! Y4 w

; |/ f5 v/ s* v: H, [. C1问题描述如下:用创龙OMAPL138开发板的串口2中断接收并解析串口数据,开启Timer0中断,在Timer0中以1ms的周期通过EMIF读取FPGA数据,测试过程中发现存在如下问题,当定时器Timer0 中断函数中调用GetEmifData()函数,串口则不能接收并解析数据,无法进入串口中断。当定时器0中什么都不做的情况下能正常的解析串口数据,串口数据到来的时候能进入串口中断处理函数,请问这是什么原因呢。以下是main函数
8 R8 D  o% G9 A" l2 ]7 ~
void main(void)
{    /*********1.PSC初始化****************/
    PSCInit();// 外设使能配置

2 o  E% a9 X8 t7 K% a/ w, T
    /********2.管脚复用设置***************/
    GPIOBankPinMuxSet();    //GPIO 管脚复用配置
4 u8 p% s" z6 Y+ t$ y
    /********3.DSP中断初始化**************/
    DSPInterruptInit();     //DSP全局中断初始化
    /*********4.外设初始化****************/
    UART2Init();            //UART2初始化
    Timer0_Init();          //Timer0初始化
% w$ G% O. E' k' S% g' j3 ~
    UARTInterruptInit();    //惯导UART中断初始化
    Timer0_Interrupt_Init();//影响串口中断了
/ P+ x4 K1 X+ X& o% i7 t  P* |
    UARTPuts("TronlongUART2 Application..\r\n", -1);
    for(;;){
1 i4 q2 `' M2 S
    }
}
void PSCInit(void)
# Z5 B7 X# n' z3 U; Y# e{
& w- V- d& E4 G% g+ @  `2 _$ N    // 使能 ,对相应外设模块的使能也可以在 BootLoader 中完成$ p8 z. l! E7 B  s8 W4 R: \
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);# m6 v. B  N: a3 [& ~; A
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);: D0 g! ?' k$ p$ x7 P5 Q( i
}
串口2中断配置函数
void GPIOBankPinMuxSet(void){    % K7 Z7 [6 w2 C4 y, i  i8 w& G, w! f
        UARTPinMuxSetup(2, FALSE);//串口2引脚复用
}
static void DSPInterruptInit(void){   
$ ?4 D7 K5 `8 a# b
     IntDSPINTCInit();    / E4 \! O* E. N" j
     IntGlobalEnable();
}
static void UART2Init(void){   
, \" [6 c+ W2 L' K; U$ u
// 波特率460800 数据位 8 停止位 1 无校验位    6 f$ K. @: d& R8 j9 J+ l0 m+ y; J
    UARTConfigSetExpClk(SOC_UART_2_REGS,456000000 / 2, 460800, UART_WORDL_8BITS , UART_OVER_SAMP_RATE_16);     0 e0 B& \, B4 _8 A3 {1 {/ f/ f* v
// 使能 UART2    " Z  h) S8 b8 f0 ~) v7 }
    UARTEnable(SOC_UART_2_REGS);    8 g* `/ B: w8 B' }  ~
// 使能接收 / 发送 FIFO            
" C* |, Y% b3 Y, i) [9 M
    UARTFIFOEnable(SOC_UART_2_REGS);   
- S7 S9 s4 P# X! c5 Z1 y
// 设置 FIFO 级别  // 8 字UARTFIFOLevelSet(SOC_UART_2_REGS,UART_RX_TRIG_LEVEL_1);
}
/*              UART 中断初始化   */
void UARTInterruptInit(void){   
/ T6 q# h1 g" K
IntRegister(C674X_MASK_INT4, UARTIsr);   
! a# G+ e( j3 s
IntEventMap(C674X_MASK_INT4,SYS_INT_UART2_INT);   
3 a) p+ x' p/ ~5 I  O$ N6 {$ K$ F
IntEnable(C674X_MASK_INT4);    & }7 {( @+ {% o) r1 g" m4 o% ?
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);
9 @, N0 a2 X# }+ x% k1 i0 t; E  A
    }
    return;
}
/****************************************************************************/
/*                    定时器Timer0初始*/
/****************************************************************************/
void Timer0_Init(void){   
% h7 N# x7 I7 R& T
    TimerConfigure(SOC_TMR_0_REGS,TMR_CFG_32BIT_UNCH_CLK_BOTH_INT);// 配置定时器 /计数器 2 为 32 位模式  ( q7 u  E7 J- A( F) Y2 ^: [6 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){    9 ~$ d  W! R$ U
    IntRegister(C674X_MASK_INT7, Timer0Isr);//注册中断服务函数C674X_MASK_INT7
    IntEventMap(C674X_MASK_INT7,SYS_INT_T64P0_TINT12);// 映射中断到 DSP 可屏蔽中断   0 F" l6 y3 ]5 p5 ]7 Q
    IntEnable(C674X_MASK_INT7);// 使能 DSP可屏蔽中断8    , O/ |2 d* w& I! R& f8 M
    TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);// 使能 定时器 / 计数器 中断
}
void Timer0Isr(){     ( r6 V* T0 g+ i6 v& T
    TimerIntDisable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);    9 e# e8 p( ]2 C! s' T
    IntEventClear(SYS_INT_T64P0_TINT12);    0 X* n( L, I' u5 ^9 V3 M2 F$ l
    TimerIntStatusClear(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);     
& }6 e7 _! B2 O" Y' d* s, x
    //中断处理函数+ p# j' G# Y4 O
     GetEMIFData();//若调用此函数,串口有数据到来时,OMAPL138无法进入串口2中断,若屏蔽此函数,则可进串口2中断      
     TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);
}
void GetEMIFData()//测试函数
{    + ^  a5 Q: C& e+ Z' g  T- r  h  w
    unsignedint i=0,j=0;    $ s+ L' n. D; x, I  C( d
     for(i=0;i<100;i++){
$ v9 J+ ]$ y+ U
              j=5;    4 i0 g' ~; n4 S' D( q! n- I" n
      }
}5 d  b+ C! F$ i" e+ L4 Z( a
测试发现,在GetEMIFData()函数中for循环100次,串口正确解析一段时间后卡死,当for循环10时,串口可一直接收数据,很疑惑,难道DSP的定时器中断处理函数连一个for循环都处理不过来么?还是其他原因引起的串口无法接收数据问题?
2 t4 H0 @+ R& y
# ], Z) t, ^3 ~

: \# \2 {/ H' f- W5 P, E$ q- k. w0 M7 N9 C) N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-11-18 15:19 , Processed in 0.040609 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表