在sysbios下,uart中断收发数据,程序无法进入中断 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下& `' t+ J+ \5 H. a6 ]
// 发送缓存/ n! b" L0 Q  m/ `
char Send[] = "UART1 test......\n\r";
) A' d' R% W& w; i5 {- j
+ [2 q0 n# f& A/ zextern void UARTconfig()0 w8 v9 b1 T/ n" `7 a
{: F8 R( c+ a9 Y! f  X4 A7 B
//使能Uart1
5 w' n3 g" ?; m PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);$ Q" w) M( |, c7 q

; v  P4 h9 ~1 \- \: l0 A9 P9 ` // 使能 UART1禁用流控/ K0 ]" @- `% r; R0 O2 L: F
UARTPinMuxSetup(1, 0);
) c4 C  `, g4 Q* W8 x
  j% ?7 P( _* k; N" q // 波特率 115200 数据位 8 停止位 1 无校验位! O$ `5 C) L$ s1 j, w$ L
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);, u0 H: }2 I3 V6 i4 j4 v0 Z  ]

7 e7 C8 ?3 J- P- l  // 使能 UART10 [& t* C, Z1 b! p; [8 V
UARTEnable(SOC_UART_1_REGS);) W  H6 E4 U9 b$ U
  // 使能接收 / 发送 FIFO
6 U8 ?( `8 o- i  UARTFIFOEnable(SOC_UART_1_REGS);$ h# O) r2 E) z$ D, [
  // 设置 FIFO 级别
5 I2 ^2 [8 {) T! B    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);9 d$ ?( d) b* x6 l3 c: b
  //Uart1中断使能
  Q3 w+ C; t) R# x  unsigned int intFlags = 0;- i% k1 o6 Y6 b
  intFlags |= (UART_INT_LINE_STAT  |  \
0 C( {/ X& f" \& h0 Q# |; s! Z            UART_INT_TX_EMPTY |    \) M2 ]9 v% Q- p6 d! C1 i
            UART_INT_RXDATA_CTI);) k& i' m: }8 C3 _' z1 Z
            % N( d+ u  K; @. P! H8 G6 U
    UARTIntEnable(SOC_UART_1_REGS, intFlags);
2 i  E. c9 W" o}8 J  g  Y+ e$ p
//UART 中断服务函数! Z* H! e9 t6 N, Q% u
void UARTIsr(UArg arg)1 D, V6 i! q; b5 t4 }
{, h. Q* H4 \' T- K" f: a. k
    static unsigned int length = sizeof(Send);
$ V4 Z' F. w8 w* D' a( O* j    static unsigned int count = 0;9 q9 q  l: o/ h0 F7 G' \: g
    unsigned char rxData = 0;
& Y  _! o5 z( r  N6 Q0 }8 @' Y    unsigned int int_id = 0;. d; P. a, d  e/ m6 ^
    // 确定中断源6 E1 [" g; D3 ^" [, y
    int_id = UARTIntStatus(SOC_UART_1_REGS);) e8 h. \" A" }$ z$ h
    // 清除 UART1 系统中断
6 t: I- \  g1 M! r3 v% A: a    IntEventClear(SYS_INT_UART1_INT);
1 }, ~' @( l2 B: h/ |' p    // 发送中断- j. H  c$ V- _# L" C
    if(UART_INTID_TX_EMPTY == int_id)
% P7 H/ K) q/ p5 I    {# d& c: I* K' p- S; e0 N
        if(0 < length)
5 `4 \  }* f2 `% }" M        {! z/ |0 f! F9 a) X3 u6 G
            // 写一个字节到 THR
5 y4 c3 I3 K6 L" S+ U& |            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
3 L5 j1 B* o% {# u* }* K            length--;
0 s% c9 {+ @  @# b            count++;
8 {4 F1 X6 L& t9 v4 L: J        }/ J2 D; L( L1 T& n
        if(0 == length)
5 s  P3 ~4 O" X7 ^. O/ W- I: y        {) j/ |9 k. W7 }( s/ D' ]7 R
            // 禁用发送中断
2 f( o$ `- _+ ]1 y' o            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);/ ~9 ]  N! I; Z. j. P0 w4 {
        }
+ C0 Q/ e6 t) A) o9 ~     }
) {( [: i; ^1 {( c+ ]- h6 ^' q& m% Q    // 接收中断
/ L5 g: d3 U6 W6 H' n, Z# M    if(UART_INTID_RX_DATA == int_id)
( b" z) m9 }; e$ C, j6 k3 M8 [    {+ b5 T, v, V9 ~( t
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);+ D7 D# a) p1 s7 y& C0 p
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
$ Y' E4 d: ]4 |/ j8 ]$ e1 H' [. s    }& _5 [6 a" W3 a& m
    // 接收错误
; a5 g. Y1 X/ C4 e# K9 ^( T    if(UART_INTID_RX_LINE_STAT == int_id)1 M1 F0 ~- u9 y# x$ Q* Q
    {
% y* `& A/ U( S- ?" i0 s- E7 h        while(UARTRxErrorGet(SOC_UART_1_REGS))0 Z7 n8 E. J0 w) Z' S
        {5 [) p# e- B1 S# @/ U+ v
            // 从 RBR 读一个字节
7 r- o$ j! K7 J; s$ _; D. U            UARTCharGetNonBlocking(SOC_UART_1_REGS);8 _7 }6 a! b! e1 E
        }) F! k, G2 n+ x
    }( d0 ?2 [6 j9 K6 t
    return;% f, H1 Y5 E# y
}
; }" t2 m: `3 ]4 Q. hInt main()
6 C$ F+ ?$ j* c5 {$ i! i# p{
- U# I8 z) i9 C4 P UARTconfig();//uart 配置
8 @" A4 z* j$ d0 z& U$ t3 m  |    Error_Block eb;4 v- M% b2 z$ k0 _% Z
    System_printf("enter main()\n");2 t0 P0 m% S$ u3 A/ H
    Error_init(&eb);
0 T5 n9 o; A% t- \    // 动态创建硬件中断
2 k4 X. m; A( V    Hwi_Handle hwi1;) S# q; U' r& ^+ ~; A: ^
    Hwi_Params hwiParams;0 \* [9 s! Z& v/ O+ M  b3 R
    // 使用默认值初始化参数3 t0 [9 r! ?' E- {
    Hwi_Params_init(&hwiParams);9 n- p' f1 u- y+ O0 `$ m
    // 中断事件/ d8 P- O1 d' j6 U
    hwiParams.eventId = SYS_INT_UART1_INT;; Z5 e$ @2 K' z; _6 j  l& |' q
    // 传递到中断服务函数的参数- a$ \( ^* s, F0 V1 c6 [2 P; F, Z
    hwiParams.arg = 0;
5 l5 |/ d0 ?: ^1 O    // 不允许该中断自身嵌套
* V7 `3 n& k" E/ b9 T2 o. N8 F" ~    hwiParams.maskSetting = Hwi_MaskingOption_SELF;9 h* p& A# ]! E, K( V/ x
    // 使能中断3 o5 Y: f: ?1 p
    hwiParams.enableInt = true;
. Z  W, M/ h' I1 n4 e0 C    // 可屏蔽中断 4
$ [( |. P, l* m    // 中断服务函数 hwiMain6 Q4 W7 v; V  q' z" a5 |. n( L
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);  t6 r8 e( ^& `1 p
    if (hwi1 == NULL)
+ D6 k! w' j6 W3 b        System_abort("Hwi1 create failed");
. v8 ^* M! @% b9 H1 ?* ?8 G    BIOS_start();    /* does not return */
- n7 \" P5 J% h" ?  g" K0 j    return(0);
! O, U% J, e3 R8 }}; W+ \  M4 K8 o: ~, s$ V9 s4 A

2 {# ]  O! K9 }$ J+ ~9 O% |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?/ }& |8 L/ V, `( b6 j6 z) g
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点5 b/ i: G8 d$ v0 s9 v
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49: }3 K# a  D# V6 I
在中断服务函数里放置断点
5 N6 B4 N: H! ]1 \8 A
参考 GPIO_KEY
. D7 e) |. n; N; T
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-1-31 09:00 , Processed in 0.042964 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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