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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

1033

积分

金牌会员

Rank: 6Rank: 6

积分
1033
跳转到指定楼层
楼主
发表于 2019-9-1 19:10:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hechuan519 于 2019-9-1 19:17 编辑 ) Q/ W9 D: _+ l6 Q- i  ]6 L

( F, W. M1 e) ?7 ?  \1问题描述如下:用创龙OMAPL138开发板的串口2中断接收并解析串口数据,开启Timer0中断,在Timer0中以1ms的周期通过EMIF读取FPGA数据,测试过程中发现存在如下问题,当定时器Timer0 中断函数中调用GetEmifData()函数,串口则不能接收并解析数据,无法进入串口中断。当定时器0中什么都不做的情况下能正常的解析串口数据,串口数据到来的时候能进入串口中断处理函数,请问这是什么原因呢。以下是main函数! I  q' |7 r/ Z2 G' s% D
void main(void)
{    /*********1.PSC初始化****************/
    PSCInit();// 外设使能配置

; n" T  n; G, M) u  b( s
    /********2.管脚复用设置***************/
    GPIOBankPinMuxSet();    //GPIO 管脚复用配置
6 Q5 c3 T% z% r2 l8 G; H7 U; U
    /********3.DSP中断初始化**************/
    DSPInterruptInit();     //DSP全局中断初始化
    /*********4.外设初始化****************/
    UART2Init();            //UART2初始化
    Timer0_Init();          //Timer0初始化
% t- @4 j- ]. L9 z( E2 I4 q
    UARTInterruptInit();    //惯导UART中断初始化
    Timer0_Interrupt_Init();//影响串口中断了
  E/ b8 l6 e3 n, f* Z: s8 r
    UARTPuts("TronlongUART2 Application..\r\n", -1);
    for(;;){
2 \  @4 I: s6 F1 W' [- G
    }
}
void PSCInit(void)
; `/ Z) {  S  T8 S; O, z' X% U8 j{
+ ?" a6 g3 T) i" U, h. j# k    // 使能 ,对相应外设模块的使能也可以在 BootLoader 中完成
. x2 v, j8 {  J0 `; ?    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);8 |9 {- u; V4 ?! g3 y: `3 R8 }* g2 t
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
9 }- k/ F: ^" I: z) r}
串口2中断配置函数
void GPIOBankPinMuxSet(void){   
. q6 M( }: \! p- a9 v; Q
        UARTPinMuxSetup(2, FALSE);//串口2引脚复用
}
static void DSPInterruptInit(void){   
' q/ [. u5 M) {, a9 S& `; v
     IntDSPINTCInit();   
. D6 z9 a0 F9 N& Y! ^
     IntGlobalEnable();
}
static void UART2Init(void){      |% I) v6 X. x# W
// 波特率460800 数据位 8 停止位 1 无校验位    % U  D; {9 g- G
    UARTConfigSetExpClk(SOC_UART_2_REGS,456000000 / 2, 460800, UART_WORDL_8BITS , UART_OVER_SAMP_RATE_16);     
+ z- T8 h" p) u) X3 ?3 h
// 使能 UART2   
& w* h; q/ D7 S
    UARTEnable(SOC_UART_2_REGS);   
! U  ]7 G& x" Q4 H& H
// 使能接收 / 发送 FIFO            6 K" P8 ?' q3 m: B7 x: q1 ?
    UARTFIFOEnable(SOC_UART_2_REGS);   
7 x" P- Z+ v& ~6 \
// 设置 FIFO 级别  // 8 字UARTFIFOLevelSet(SOC_UART_2_REGS,UART_RX_TRIG_LEVEL_1);
}
/*              UART 中断初始化   */
void UARTInterruptInit(void){   
2 P: [% O5 C: c8 J- i
IntRegister(C674X_MASK_INT4, UARTIsr);   
6 F1 f% c, ?  r$ Q+ Q
IntEventMap(C674X_MASK_INT4,SYS_INT_UART2_INT);   
8 J  B- y2 X' l  W/ ]+ g/ i* @) G
IntEnable(C674X_MASK_INT4);    : q* F5 t# j1 l7 S
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 k% o# a( @" q
    }
    return;
}
/****************************************************************************/
/*                    定时器Timer0初始*/
/****************************************************************************/
void Timer0_Init(void){   
* s* u# s" y. y/ i' K+ a: j* \9 e
    TimerConfigure(SOC_TMR_0_REGS,TMR_CFG_32BIT_UNCH_CLK_BOTH_INT);// 配置定时器 /计数器 2 为 32 位模式  & l& q* [& R7 t2 ^& l
    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){    ) e% t5 ]5 ^7 j6 J& v7 T
    IntRegister(C674X_MASK_INT7, Timer0Isr);//注册中断服务函数C674X_MASK_INT7
    IntEventMap(C674X_MASK_INT7,SYS_INT_T64P0_TINT12);// 映射中断到 DSP 可屏蔽中断   # ?: e) Y! o4 J
    IntEnable(C674X_MASK_INT7);// 使能 DSP可屏蔽中断8   
: B( C9 z$ I; G5 L
    TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);// 使能 定时器 / 计数器 中断
}
void Timer0Isr(){     ' d- [/ E* `" g4 Q, G5 D9 r
    TimerIntDisable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);    2 r1 l0 F, Y- H; y: c3 U
    IntEventClear(SYS_INT_T64P0_TINT12);   
: x! {0 H$ [0 z7 u3 Q- z
    TimerIntStatusClear(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);     ( Z" Z& T0 a5 L9 k9 H  y# Z
    //中断处理函数9 a' a/ Y* |' }  `% T
     GetEMIFData();//若调用此函数,串口有数据到来时,OMAPL138无法进入串口2中断,若屏蔽此函数,则可进串口2中断      
     TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);
}
void GetEMIFData()//测试函数
{   
8 S9 n1 _. |7 p; G0 ^
    unsignedint i=0,j=0;   
' I2 y: T; B/ v
     for(i=0;i<100;i++){
6 t$ o2 S0 k4 O. h
              j=5;    $ [! O+ i* E$ N6 }5 a
      }
}
9 E- G# F& G2 u1 R4 J测试发现,在GetEMIFData()函数中for循环100次,串口正确解析一段时间后卡死,当for循环10时,串口可一直接收数据,很疑惑,难道DSP的定时器中断处理函数连一个for循环都处理不过来么?还是其他原因引起的串口无法接收数据问题?" f9 K9 l3 P5 w& }; w

) U% i- o% w4 [* m8 N! x/ z- W1 h, t# K) V$ V  [' n

* h2 m0 a# b, X% U& r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-31 07:38 , Processed in 0.036697 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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