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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
( s* C7 m3 I) i' |9 I// 发送缓存+ @# b5 B) ]" P" z+ ]
char Send[] = "UART1 test......\n\r";$ }% c% Y* f, M, ?

) Y5 Z2 h; H' Hextern void UARTconfig()
& W: p5 P9 b% `$ \3 T% I0 ~{
% ~4 ]/ q2 t% ] //使能Uart1; N8 l, q: s7 i% v
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- R9 A4 R$ V" E! u   U' ]9 ]5 A- C  {8 ^/ ?% [6 b( o
// 使能 UART1禁用流控
- D  ^) y) x! I  _6 @; Q# L UARTPinMuxSetup(1, 0);- t* E) I0 x) m" Y. y1 @9 I, w
& ]7 V! M' I6 U/ R. o' {; }
// 波特率 115200 数据位 8 停止位 1 无校验位3 {. I$ Q1 S1 j0 P. a
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
5 e) V1 c8 ]' X: K) L6 G3 _8 S2 I. r
9 V' g! y) ?' z  q% @: b  // 使能 UART1
1 t# _! m" f( ^2 ]. K# t UARTEnable(SOC_UART_1_REGS);
1 S+ p7 k4 g1 l0 Y8 A( u" E  // 使能接收 / 发送 FIFO* b" f; K: @7 a% ]/ Z" G
  UARTFIFOEnable(SOC_UART_1_REGS);' o( g  M: D8 ^1 V8 j+ E
  // 设置 FIFO 级别# W7 g8 F7 [8 m+ e; G4 {; p( M
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);2 N1 U: z) I# N+ E- O  v$ a8 A$ d0 C
  //Uart1中断使能
! I2 r2 A' Z( f+ z, a8 k  unsigned int intFlags = 0;8 c1 F4 m: j) i+ p
  intFlags |= (UART_INT_LINE_STAT  |  \
6 \3 Q. {% G( v4 q" i% S            UART_INT_TX_EMPTY |    \
# Z2 {5 X" X# ]            UART_INT_RXDATA_CTI);
. H. }% K; Y' S            & S/ T9 B, b1 M! _/ }  A
    UARTIntEnable(SOC_UART_1_REGS, intFlags);3 w9 L7 L+ Z( a, M
}
! q3 Q: F( c' k1 u; ?% v//UART 中断服务函数
! ^3 j' |  Y. S0 }# ^, Xvoid UARTIsr(UArg arg)- h; x' S) c. J+ I& y5 S
{
6 u/ j; P0 H' C- I    static unsigned int length = sizeof(Send);
1 b/ L1 i" H) J. _! E! y    static unsigned int count = 0;
4 i7 P- A0 {' i& M/ N    unsigned char rxData = 0;
6 O# I2 k$ U3 T# I6 V+ @    unsigned int int_id = 0;
+ n+ L( R/ @# A    // 确定中断源6 y( Y8 q! p) h
    int_id = UARTIntStatus(SOC_UART_1_REGS);- ^! h$ y+ K( t4 h5 {
    // 清除 UART1 系统中断
) Z- l% Y; j# m, ?- E1 z    IntEventClear(SYS_INT_UART1_INT);+ H) a6 I9 X, a# c% z% ~2 p
    // 发送中断
  Q  v( S* d( }( q% h0 B    if(UART_INTID_TX_EMPTY == int_id)2 A" [* P# C' l/ A
    {: y+ C& X& W" v8 c' W% @" o# C) b0 u
        if(0 < length)  u4 v2 g6 @- P% z( f9 d7 `# F7 [+ ^
        {
8 f& g2 M& V6 E3 b; R0 d            // 写一个字节到 THR! x- _. s& z$ U0 i$ Z$ E/ v
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
  R  u: c2 C) S            length--;% W# [9 E8 k4 t; G4 R7 d8 M$ i  n0 K
            count++;
2 n) x" o- c" t4 a: J/ D        }
! x9 U2 j# I" J' J0 O1 d8 ^        if(0 == length)
6 G! ?9 C9 M) S8 \9 a. U        {
/ t5 e2 Q, d; D# e0 C            // 禁用发送中断+ I" o1 U* [! _5 E% y4 w2 R$ W
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);( w2 o6 }. M) G0 O& H8 Y% d' A) A  x
        }9 N4 W! z. m% r; q" l9 J7 a% _
     }# J5 U8 A0 `2 O3 [
    // 接收中断
# ]+ z/ V3 n" J: z0 |5 m9 L    if(UART_INTID_RX_DATA == int_id)
$ l2 R1 K7 E' x    {' ]2 e$ r8 Q% L
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
" j: X4 l" N- Y9 v/ Y1 b        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);5 }! }% ?# J. g- \
    }3 d) n( M6 t7 X: U
    // 接收错误: t- o9 v/ @+ x# O1 q
    if(UART_INTID_RX_LINE_STAT == int_id)- F' n0 R! T3 T7 z4 r
    {5 I% b: s/ w" L1 Y7 A9 K) B
        while(UARTRxErrorGet(SOC_UART_1_REGS))
5 T# e. O+ `9 ^' ~+ b& i: E        {' `) v3 U# A; j. i6 H; f
            // 从 RBR 读一个字节
6 [# K/ Y7 N9 [' ~            UARTCharGetNonBlocking(SOC_UART_1_REGS);
9 V! ^% Q1 n/ n4 _  d        }
- \# b# o; O7 A) b# ]! n    }
; I2 D/ R1 c- {    return;4 u0 g: m6 ^/ q- y! |) i1 Y
}
4 B6 Q0 g- z4 F0 ZInt main()
; B9 P; Y4 ]0 Z9 D0 i; `{
3 z: ]* u9 }; d. i UARTconfig();//uart 配置, U% ]1 |8 L# E# d  B+ ], q( Z
    Error_Block eb;
+ y' _: S. U7 {6 y    System_printf("enter main()\n");1 G; r/ O5 m' q2 c
    Error_init(&eb);
0 `/ j  j, A" L6 C    // 动态创建硬件中断
5 B2 S% U/ l# M) t, S+ H  f    Hwi_Handle hwi1;" k6 Z" B$ F* P$ D
    Hwi_Params hwiParams;3 S5 F4 {* S( N  Y4 Z* S
    // 使用默认值初始化参数
% U' o3 M; g2 P    Hwi_Params_init(&hwiParams);
+ k2 E, ?) p6 `% P- \, ?- t    // 中断事件1 E3 X2 k) r+ U. H7 p7 D( u
    hwiParams.eventId = SYS_INT_UART1_INT;
6 O# T/ G: Z" c; r. I. ^7 T9 S    // 传递到中断服务函数的参数2 M9 F) E. _$ ?- C5 L+ G
    hwiParams.arg = 0;
- ]4 U7 B( f; z) e( I* r! c    // 不允许该中断自身嵌套
, p+ D8 [' e; c' o    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
" g2 p# ~6 q  o2 U( V5 p! C( [. Z    // 使能中断: _; ^' m% b( ^" {7 k9 }
    hwiParams.enableInt = true;9 R/ _9 X% W& s: F2 H
    // 可屏蔽中断 49 `- A+ _+ N  P  ?9 W; S# P
    // 中断服务函数 hwiMain
  f9 Y/ B3 c0 n- I- p    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
& `) u) K+ j1 o1 _6 f    if (hwi1 == NULL)
6 ~* n: t! c# b5 s( F1 N3 U        System_abort("Hwi1 create failed");2 C; ]9 `& W  h. l- N) }
    BIOS_start();    /* does not return */
, p# ^# }0 e8 t$ H. r" b' C- l8 F' M    return(0);
. P, j  |9 e* v, [% B( o! F! C. R}
4 l+ s4 I5 N, H& T: H
0 I' N( X4 k' w1 g" M1 s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
# L+ K- d! K& s$ S% W4 W
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点+ ^) x, [, Y. Q4 k
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
% p" H, L0 {5 Y, c& _; m在中断服务函数里放置断点

/ a* Z  S' v; v$ D参考 GPIO_KEY# g6 X! z$ {+ L5 t6 ^
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 03:50 , Processed in 0.037752 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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