在sysbios下,uart中断收发数据,程序无法进入中断 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8999|回复: 4
打印 上一主题 下一主题

在sysbios下,uart中断收发数据,程序无法进入中断

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下- D) y, A+ L, C3 v) c& @- r
// 发送缓存- n) L  I- A7 f0 w: \
char Send[] = "UART1 test......\n\r";. j) j# O. g! S% X# x  [. ]

% n! S0 f, g/ M+ |extern void UARTconfig()1 p2 W; j$ K- k
{& p. c' b! \2 ]
//使能Uart1" R  K$ X  p0 H+ w  s/ \- y2 Y& r  D; P
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);4 H' T9 r, W, L1 [
  Z  R+ _, w; R6 ~! P8 h  \
// 使能 UART1禁用流控
8 P* Y  e" t9 |- ` UARTPinMuxSetup(1, 0);0 r/ j" _& f6 j. f
/ q" V0 U0 m$ z* g3 f' ^/ q# I
// 波特率 115200 数据位 8 停止位 1 无校验位
+ ]- |, t, B6 n  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);. ~  c7 L  y, x8 ]9 K6 N2 I
3 h% N. m2 O, G  E( a9 z( w4 N2 N$ ?
  // 使能 UART1/ X; Z( P& [+ ?
UARTEnable(SOC_UART_1_REGS);  @3 E$ b" a/ p* V' }* j, ]
  // 使能接收 / 发送 FIFO; \# w- d  l( ]) B
  UARTFIFOEnable(SOC_UART_1_REGS);
7 r) g+ x+ e, ^; G% b7 [  // 设置 FIFO 级别
7 O* C5 o( x8 x" I( |    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);2 f$ H( W+ d* O: ?* m1 L& W
  //Uart1中断使能
0 a# i4 _5 o# t+ J! q* J' i( m$ ~  unsigned int intFlags = 0;
3 ^, x+ C( J' q- v  intFlags |= (UART_INT_LINE_STAT  |  \
9 p% P) i$ {) L0 l2 j; ?: Q4 W            UART_INT_TX_EMPTY |    \
! A6 n8 v6 N/ ?# t. e# c            UART_INT_RXDATA_CTI);# k, v# A5 V- @6 p0 R+ @
            $ y. j3 V: Y  C' R0 q" S# S5 w" M
    UARTIntEnable(SOC_UART_1_REGS, intFlags);
9 B3 e" D4 a4 `/ y  e: X}
6 e5 n1 k$ i- b7 a: [; E//UART 中断服务函数' `1 p9 o" @( y1 c
void UARTIsr(UArg arg)
. ]8 C$ ?3 X4 S! C% e1 r{% M$ h) V+ |& L4 N7 n0 _+ W
    static unsigned int length = sizeof(Send);
6 k9 b* M0 e* b" `7 l& s6 u    static unsigned int count = 0;1 @; P& V$ t$ S1 _; I4 d; @
    unsigned char rxData = 0;
( z1 u3 ~' \6 X* n2 L! d3 i    unsigned int int_id = 0;' F) }% C) ~2 r& [
    // 确定中断源
, f; l4 p+ ?7 H6 u  ?0 X    int_id = UARTIntStatus(SOC_UART_1_REGS);$ O2 m  D* Y* o0 R' t
    // 清除 UART1 系统中断7 [6 q& e1 L+ \4 q4 _* a; \
    IntEventClear(SYS_INT_UART1_INT);
4 I. Q7 R) C/ ~" K    // 发送中断2 W- M2 y: G7 `5 ?: O! J; p
    if(UART_INTID_TX_EMPTY == int_id)
( {" l- T8 B0 B3 m, I; r# h; l8 V    {
, `2 O, r! z: @% s9 w        if(0 < length)' a% r: t) {/ ~# y
        {5 m7 K( V/ A" Q& N2 m% L3 O, J
            // 写一个字节到 THR
* A# Q$ p  T0 q. s1 z            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
, Y( g! s8 k" c$ e            length--;
' o- P) R, ~* L: L( T9 W( ?4 d            count++;* f4 P4 j  l. U% O
        }6 ]' D3 y6 E' F' I
        if(0 == length)  Z% l2 l/ R7 A1 a, O
        {
; C3 a- R/ ]" e, a: o            // 禁用发送中断
5 ^, O: q! `9 J; r; S& s            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
2 \; O- E' B0 P4 M        }* Q6 f: Q7 R4 v: `( d1 @
     }
2 Z% G: k6 {; k& k    // 接收中断
& `( _% ?. O( w& f1 w4 w! R+ }    if(UART_INTID_RX_DATA == int_id)
1 m0 v# |) j, {' V. k  V# D    {' C, ~: j" F2 X/ N* H5 s
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
8 m7 s1 @0 p8 i; L: g- F        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);: _- h, r8 D- t$ g/ M
    }7 f1 v+ l, B- U
    // 接收错误
$ J9 x* w7 ?# P- v- L- I    if(UART_INTID_RX_LINE_STAT == int_id)+ y2 N4 P) C& X9 M
    {
, S: z( j. V. _        while(UARTRxErrorGet(SOC_UART_1_REGS))
  m) c# H" O6 \; n' J6 k        {
. V% g3 A, m9 L& X) R+ l            // 从 RBR 读一个字节
6 p  f, b! ~) i4 u4 \. w" O            UARTCharGetNonBlocking(SOC_UART_1_REGS);. I/ ^3 Y6 w4 j- C! Y" D
        }
, k$ u1 S' h- I. a    }2 ]4 }% {( N" ?7 c
    return;$ d) t/ j8 A3 X" @) ^6 V
}
: Y  @$ D2 z9 `. e. I1 X8 @Int main()6 o# `1 q& v' @6 ]$ O# t* ~0 v! e
{ - I7 |$ @: q$ Y$ T+ ~0 V) J) W
UARTconfig();//uart 配置7 s2 Z. q1 e# S! s* X4 l
    Error_Block eb;% Q" M# I' F$ K$ |4 X8 K- T
    System_printf("enter main()\n");
. `1 I1 ^/ S6 Q* h( }% w7 r    Error_init(&eb);# |- {% p' v$ |) _7 z; w
    // 动态创建硬件中断, O$ j$ ?* F: g; t' e! K% K
    Hwi_Handle hwi1;
% E3 c/ B6 ?4 A7 P" S3 F    Hwi_Params hwiParams;
: Z4 b. F# i2 V    // 使用默认值初始化参数
, z% @) V& }4 v3 j5 ~, W' U2 L    Hwi_Params_init(&hwiParams);3 F* i, h3 ~5 t3 J5 A8 Q1 K
    // 中断事件5 I% N5 g8 \, g( I$ x3 n
    hwiParams.eventId = SYS_INT_UART1_INT;
5 |) h2 I- C  L% d/ ]8 J% K    // 传递到中断服务函数的参数( A% @' ~& j+ b4 P2 I8 y: N
    hwiParams.arg = 0;
+ k+ F7 |" i. z- I    // 不允许该中断自身嵌套  A3 o& T: t& y" f: R
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;* `3 l2 T" x2 a( S' `  y
    // 使能中断
# I+ A( T; M5 W% X2 Y9 V    hwiParams.enableInt = true;
) f1 n* v# i- |8 R2 Y/ A4 p- y    // 可屏蔽中断 4
( a3 r9 n% R' t/ i) t; b, ~    // 中断服务函数 hwiMain
$ Y3 l6 ?+ e0 C$ S  B: u2 ~    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);: l3 `! b& v; ?& ^; i
    if (hwi1 == NULL)+ P5 x4 o) |2 u5 P5 U' E
        System_abort("Hwi1 create failed");) W- V' M  w8 x+ c6 e
    BIOS_start();    /* does not return */2 |/ J! e5 U! {% k. n  q
    return(0);
2 N/ z% ~# j$ U}
( N0 ^% s, |9 e* E( g; @; O6 \! p2 W2 c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
1 p. p/ u, J" t& S7 |& J& e1 p
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
* z) C+ O! t! p! I4 z( H
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49  D/ z! z" Y, j. `6 g
在中断服务函数里放置断点
$ `6 S9 J: T1 x( G4 a2 c6 s8 m7 X
参考 GPIO_KEY0 r8 U3 ^' p8 Q7 y; g, s' _( k
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

积分
115
5#
发表于 2016-8-1 21:05:07 | 只看该作者
请问你解决没,我现在也遇到这个问题了
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-16 23:25 , Processed in 0.040944 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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