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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

1033

积分

金牌会员

Rank: 6Rank: 6

积分
1033
跳转到指定楼层
楼主
发表于 2019-9-1 19:10:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hechuan519 于 2019-9-1 19:17 编辑 4 {/ x) a  U7 Q7 A1 Y
" G% ?& B  h- O8 H1 E' a3 D7 K2 L
1问题描述如下:用创龙OMAPL138开发板的串口2中断接收并解析串口数据,开启Timer0中断,在Timer0中以1ms的周期通过EMIF读取FPGA数据,测试过程中发现存在如下问题,当定时器Timer0 中断函数中调用GetEmifData()函数,串口则不能接收并解析数据,无法进入串口中断。当定时器0中什么都不做的情况下能正常的解析串口数据,串口数据到来的时候能进入串口中断处理函数,请问这是什么原因呢。以下是main函数
. |; W- T* _( @% _! D5 u, h; n4 n, g& r
void main(void)
{    /*********1.PSC初始化****************/
    PSCInit();// 外设使能配置
3 h  O" n/ x  Z8 r
    /********2.管脚复用设置***************/
    GPIOBankPinMuxSet();    //GPIO 管脚复用配置

! P( z$ U" p: v: Q' r; _3 ?# I/ Z2 k  C
    /********3.DSP中断初始化**************/
    DSPInterruptInit();     //DSP全局中断初始化
    /*********4.外设初始化****************/
    UART2Init();            //UART2初始化
    Timer0_Init();          //Timer0初始化
, ~0 B% P! c4 N( V- T
    UARTInterruptInit();    //惯导UART中断初始化
    Timer0_Interrupt_Init();//影响串口中断了

. Y; N! O! w4 k+ v8 \6 H
    UARTPuts("TronlongUART2 Application..\r\n", -1);
    for(;;){

3 i6 r  c$ ?2 i: r
    }
}
void PSCInit(void)
  V) a1 W  j& Y/ N) D' D{
! o2 T6 `( j: e, u  [. m  \    // 使能 ,对相应外设模块的使能也可以在 BootLoader 中完成9 P# B* Q; ]  ^
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);+ R6 _4 W  v4 ]& P* _
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
) o9 s5 i+ u' L4 ^( K  b, i" y}
串口2中断配置函数
void GPIOBankPinMuxSet(void){   
! V8 {3 _- p0 V4 x% N, L+ ^
        UARTPinMuxSetup(2, FALSE);//串口2引脚复用
}
static void DSPInterruptInit(void){   
4 B$ W: }7 H$ w: O; c7 R+ \
     IntDSPINTCInit();    # Z5 x$ d; O4 ^- }6 ^7 G
     IntGlobalEnable();
}
static void UART2Init(void){    % d$ z& {/ n* l: p9 v0 O
// 波特率460800 数据位 8 停止位 1 无校验位    & o6 Y- N' |, S  H6 u, }* q1 m, ?# h/ F
    UARTConfigSetExpClk(SOC_UART_2_REGS,456000000 / 2, 460800, UART_WORDL_8BITS , UART_OVER_SAMP_RATE_16);     
+ y+ U# U; ~, R$ a% ?
// 使能 UART2    % _) C3 p7 w0 u
    UARTEnable(SOC_UART_2_REGS);   
2 c6 o4 _7 }; p6 v6 K; Y
// 使能接收 / 发送 FIFO            
& |  |' [2 m$ S: `, @: h
    UARTFIFOEnable(SOC_UART_2_REGS);   
/ n) \/ _( s8 v" Q
// 设置 FIFO 级别  // 8 字UARTFIFOLevelSet(SOC_UART_2_REGS,UART_RX_TRIG_LEVEL_1);
}
/*              UART 中断初始化   */
void UARTInterruptInit(void){   
4 [% u# @. Z1 J- a
IntRegister(C674X_MASK_INT4, UARTIsr);    * ^7 [" G6 m7 _4 X9 N- w
IntEventMap(C674X_MASK_INT4,SYS_INT_UART2_INT);   
: [* B$ {$ x3 ~/ P& u; W3 q
IntEnable(C674X_MASK_INT4);    2 }0 e/ H6 I$ r6 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);

* `# A2 S1 ?; j3 N  j7 t$ ]; n
    }
    return;
}
/****************************************************************************/
/*                    定时器Timer0初始*/
/****************************************************************************/
void Timer0_Init(void){   / W  w8 h- m; }- @+ q. M
    TimerConfigure(SOC_TMR_0_REGS,TMR_CFG_32BIT_UNCH_CLK_BOTH_INT);// 配置定时器 /计数器 2 为 32 位模式  
" N- |0 }$ @/ ~4 z3 b6 T% v( W/ N9 g
    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){   
% |7 V( g4 N: L+ j
    IntRegister(C674X_MASK_INT7, Timer0Isr);//注册中断服务函数C674X_MASK_INT7
    IntEventMap(C674X_MASK_INT7,SYS_INT_T64P0_TINT12);// 映射中断到 DSP 可屏蔽中断   & v$ j8 @4 l/ g1 d5 f2 z
    IntEnable(C674X_MASK_INT7);// 使能 DSP可屏蔽中断8    0 p+ ]) Z" k2 |/ N' D
    TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);// 使能 定时器 / 计数器 中断
}
void Timer0Isr(){     
5 s' g  m; s" r7 j7 s, r! E
    TimerIntDisable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);   
" e6 G3 s$ Z! a3 F% B
    IntEventClear(SYS_INT_T64P0_TINT12);    & _, K; L$ H! g$ Z; E
    TimerIntStatusClear(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);     " \2 I3 E4 B4 w
    //中断处理函数7 G, s! A8 U  R, C8 U5 W' g
     GetEMIFData();//若调用此函数,串口有数据到来时,OMAPL138无法进入串口2中断,若屏蔽此函数,则可进串口2中断      
     TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);
}
void GetEMIFData()//测试函数
{    ! k- j$ M% \# d1 H" z. F  z
    unsignedint i=0,j=0;    ( z% X$ s# @! }$ h$ \, W
     for(i=0;i<100;i++){ ' ]6 }) S% k8 Q+ ]9 ~) |2 k
              j=5;   
8 {" t2 |* ?, G" K/ h; T( Q
      }
}  }- s( a4 ]7 G) B* F8 h  |# @
测试发现,在GetEMIFData()函数中for循环100次,串口正确解析一段时间后卡死,当for循环10时,串口可一直接收数据,很疑惑,难道DSP的定时器中断处理函数连一个for循环都处理不过来么?还是其他原因引起的串口无法接收数据问题?
) C! {2 S: {1 F! Y5 Y

  L! k6 E( p  S: N. [: X/ S3 N4 n6 ?; Q4 f: i$ }( u

* I) ?: S  ]3 G3 V; a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-18 14:59 , Processed in 0.037563 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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