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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下2 I  \; B2 T  q# T# `
// 发送缓存0 C, i) ~6 F1 N/ F, z
char Send[] = "UART1 test......\n\r";! T3 h8 r+ H- C: a, t3 J4 }: T1 c- |

  x. i) C8 @9 {  _/ @2 sextern void UARTconfig()! Q0 Z, z. P$ M1 a$ x
{- N. V5 a1 {. }: m
//使能Uart1
$ Z" Z( G3 l* |7 }* Q PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 X* ^- {4 h' t. R$ \  P+ o; v * Q  M2 A5 d3 y- `1 Y
// 使能 UART1禁用流控  \, }9 x: T" z2 l8 Y) [' n
UARTPinMuxSetup(1, 0);
* [, x* y% p- C  x0 u4 w" U) J 5 ]  B5 b) I. v$ Z9 u6 A( y! m
// 波特率 115200 数据位 8 停止位 1 无校验位4 k2 e9 O1 p! I
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);0 P7 i& c9 Q3 P1 n- \# r1 ]

2 e# L9 B. M0 T" w3 Q  // 使能 UART1) Q, L8 S% C" U: V- C% e, {8 n
UARTEnable(SOC_UART_1_REGS);
; h- I- i- N8 \( P' d  // 使能接收 / 发送 FIFO( g' o; f* X' i( z
  UARTFIFOEnable(SOC_UART_1_REGS);" G+ A8 o7 s1 V/ }
  // 设置 FIFO 级别! i: D1 L2 s3 M  E% t
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
& a  o$ |4 _* k6 m/ \/ Y2 R3 b  //Uart1中断使能
) q0 ~# R+ W; x  unsigned int intFlags = 0;
2 i8 n, N- W" w# D6 [0 x  intFlags |= (UART_INT_LINE_STAT  |  \
' t3 }8 y0 V$ H% U9 e% Z' A            UART_INT_TX_EMPTY |    \
/ L6 S# ^. b8 N2 l4 S            UART_INT_RXDATA_CTI);% w2 W& D/ V/ N; s$ M
            7 p1 ]- N$ B) m
    UARTIntEnable(SOC_UART_1_REGS, intFlags);
: M2 n, `+ s% }$ X4 `# h7 o}" {% m  B$ {% H# V6 }9 r
//UART 中断服务函数
5 e2 g1 K+ B. g  ]* nvoid UARTIsr(UArg arg)8 t$ ?& U8 e9 g9 }+ b" l
{  d2 g( V/ F; x
    static unsigned int length = sizeof(Send);6 D2 _! w- y: Y- o# O5 u
    static unsigned int count = 0;
( a  Z( U( u% j5 E1 P. i; w    unsigned char rxData = 0;
& F: d" a3 j1 F    unsigned int int_id = 0;
" y- \' Z) Y$ l. a    // 确定中断源# F9 ^1 ~" Q, P" m% E
    int_id = UARTIntStatus(SOC_UART_1_REGS);1 l8 h% W% u8 g' B
    // 清除 UART1 系统中断7 k% ?: f3 O/ G; D. C' z
    IntEventClear(SYS_INT_UART1_INT);
$ h- J7 e, `" G" K! e, e    // 发送中断) `  Z  q0 _) U: x" I6 U4 a$ w* e
    if(UART_INTID_TX_EMPTY == int_id)! C, E  A, b% e& x" |3 r* D( \
    {! [- u/ Y  q2 c! e& C2 X/ y
        if(0 < length): r! l& x* |# b
        {) E, J- F3 J/ w2 s
            // 写一个字节到 THR: J  @  P  T9 f; a' H* ~8 G5 _
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);& w* I  \& j) y
            length--;  T4 {- b, w4 t( B: O: ~
            count++;
4 d8 i/ I2 {7 Q( T9 ]" g" j+ W4 ?7 m        }
: Z: m' D! {9 t        if(0 == length)
/ h- S& a2 J! I' N* r; e- O        {
1 t) h0 g& }+ F9 y; n& `3 M9 M            // 禁用发送中断
/ a( `  P/ ]7 K* y            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
  X, ^% l/ N) }; j' l4 ^. B        }
! `4 M: t6 n- g2 [( \& y0 R% m     }
) Y: Y$ F- A% Q  [# L0 f( i( A$ A    // 接收中断1 q2 B; w% ]7 w# |$ @$ O8 j
    if(UART_INTID_RX_DATA == int_id)- O4 }0 `0 x; H7 \
    {
, |; v; n+ J7 X; x! J, m- z        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);% m! A4 o+ C  J
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);+ T, B8 ^/ D( \. ?3 a7 @
    }
( p" T4 i6 [9 K7 u) D    // 接收错误
' p: I# |4 ^, q+ b    if(UART_INTID_RX_LINE_STAT == int_id)
; d0 O$ a  t- K3 N  e! |    {1 I3 z  i$ Q4 E2 n4 D
        while(UARTRxErrorGet(SOC_UART_1_REGS))
, A: R( W& M; ]4 {& G% m        {% M' Y1 \* K0 w  X  r6 Q9 B
            // 从 RBR 读一个字节4 e, P6 g7 _# n% n
            UARTCharGetNonBlocking(SOC_UART_1_REGS);. `8 I  A# B/ x. W1 ^
        }
( M) A  w) a0 L( N4 |( u- s3 F    }
4 ^, v; C" o! |8 H3 M- n    return;
  ?" P) \: P& a/ T! U: L8 k5 o}6 f5 o6 |' y/ S; w+ M+ @/ `
Int main()
& N1 o- z$ _$ T! H  C! U0 {7 C% c6 |{ - s- n2 ?5 K1 E$ _, b
UARTconfig();//uart 配置
3 x" E& J7 a8 @( _  p; a    Error_Block eb;
1 q0 H( y8 V( h$ z; v2 G4 e    System_printf("enter main()\n");% @! J( s% ^) B, J6 b2 I
    Error_init(&eb);' l# Y* Y5 d9 x* e" s  ]
    // 动态创建硬件中断- z9 p: |6 \+ `! k
    Hwi_Handle hwi1;. O5 V2 A0 X; }- x2 @+ D5 D
    Hwi_Params hwiParams;) j. r# Z) Y( G3 e
    // 使用默认值初始化参数
2 _1 U  ~4 Q) m3 B    Hwi_Params_init(&hwiParams);9 k: k, I! A; q: q- A* d0 L2 m
    // 中断事件
: _+ N0 s  T  |# r) }9 P    hwiParams.eventId = SYS_INT_UART1_INT;
* m. h/ C8 F1 m4 i    // 传递到中断服务函数的参数
  A( H/ V- G/ L    hwiParams.arg = 0;! w& `' j7 j9 @, T
    // 不允许该中断自身嵌套9 J/ s: N) \- R! e0 ~" e
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
" B' X" g3 g+ C1 u* s( N( c    // 使能中断& J7 I* L6 |, t9 P- Q
    hwiParams.enableInt = true;
5 j* ^% k- l( ]' e4 T7 r    // 可屏蔽中断 4
2 J6 X8 Q; u2 t3 C1 i  O. Z; y    // 中断服务函数 hwiMain% A) k) A- G: Z, ~5 T
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
* E) Q6 F# Q  [4 y' k( m3 a; A    if (hwi1 == NULL)
) p. a0 {+ l9 z        System_abort("Hwi1 create failed");! ?9 b! R. S$ W
    BIOS_start();    /* does not return */( A! }4 }& j- I3 w+ L# A, W* X$ R
    return(0);, V" I8 R4 Z& B8 V+ ^1 P( G
}
5 m' `( R( z* P+ W8 k1 [4 D( |
, z! V% q# e( s+ H& S7 D, b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49! e4 u; I6 g% Q# N! Z
在中断服务函数里放置断点
1 V" A1 K- B# f3 h) L  \' ^( K
参考 GPIO_KEY3 f1 w' [; W; k- ]  U' D
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
3 e% p6 k" ]* s7 u0 k" q
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?. F0 @' \2 `2 G6 `; A
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-18 03:05 , Processed in 0.041374 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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