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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下) W5 Z# v* r6 D# d: j( z0 L8 r' B
// 发送缓存
+ ~7 `2 l7 K# w$ n0 d4 {; kchar Send[] = "UART1 test......\n\r";# f2 i) [' A6 g% H. A8 ^) @9 R

  `- v4 G; n& w; R' `8 zextern void UARTconfig()
" Y' z% _, k( V{
3 B" f, i2 Z/ t4 H/ A1 R  O- ~ //使能Uart1
7 M9 U$ n8 V$ E7 Z1 t, I# e PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);% ^8 d( w+ p/ o5 ?/ y" T# V
" ]9 z% k% [5 t$ T- |
// 使能 UART1禁用流控
: W/ j! Y0 H9 R  Z) P: Y UARTPinMuxSetup(1, 0);
8 F. M. X2 n( @
/ E' n$ ]  X2 h8 \ // 波特率 115200 数据位 8 停止位 1 无校验位
$ R- W( k3 Q! ?* g  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
- Z2 O' z. E. |5 S
  w- K& B6 `8 J  // 使能 UART1
0 T. i* }5 c. N) h* [ UARTEnable(SOC_UART_1_REGS);
! @) U4 \  Q8 S8 m$ O  // 使能接收 / 发送 FIFO6 B" C8 D$ V" L
  UARTFIFOEnable(SOC_UART_1_REGS);5 R2 |6 [6 ]1 {* r& [& r
  // 设置 FIFO 级别' u# j* U3 @+ Q+ K3 ]7 v
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
0 d$ I% }7 Y# R3 }, c: @! i; w, W& b( w3 ~  //Uart1中断使能
% E1 t6 w/ K$ k: m" ~3 K  unsigned int intFlags = 0;4 G2 F7 }  h' X' i/ {4 i
  intFlags |= (UART_INT_LINE_STAT  |  \
5 @$ z: w: ?  w            UART_INT_TX_EMPTY |    \
" u( f# O0 V8 T) x* x9 E( F1 S7 E            UART_INT_RXDATA_CTI);# t+ x! h, [3 N# _  g7 z
            * X. P4 C: j" s3 p
    UARTIntEnable(SOC_UART_1_REGS, intFlags);0 @3 @$ F! S; q6 S( Y9 b
}3 R$ F: S4 s9 R% N- |" G
//UART 中断服务函数
" k" _9 g9 z7 m4 W! y- T& {3 O: xvoid UARTIsr(UArg arg)
) D& Q2 ~" r0 Q7 I{5 m" d4 J$ [. n. v  r7 Q
    static unsigned int length = sizeof(Send);- @6 R( o5 q' M& F
    static unsigned int count = 0;
; T! @0 F3 [' y    unsigned char rxData = 0;
  L) w0 _7 ]& i8 ]2 _    unsigned int int_id = 0;
% X- U' G* c) V& O3 r    // 确定中断源7 n/ L! W  U2 T/ p  U2 i$ T' B" R
    int_id = UARTIntStatus(SOC_UART_1_REGS);
) t2 `; t0 N( x+ _* y; j    // 清除 UART1 系统中断, I; A- W; e$ ?. o; J
    IntEventClear(SYS_INT_UART1_INT);
" o% B) x9 Q9 |    // 发送中断+ P# s5 N, ^* m; n& A
    if(UART_INTID_TX_EMPTY == int_id)( E  t- p0 g! H1 Y0 t- k8 l' b  }
    {
) ~; C  q( F8 R$ @7 Y        if(0 < length)+ v4 W% \1 m( {1 e  q$ k; \" F7 ~# @
        {+ w5 v5 j0 ^3 }: H8 ]1 H8 ]8 M
            // 写一个字节到 THR% M# r$ ^7 [1 m$ I6 \/ G7 s$ v
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
! _4 U5 T) O, K; x" e  I2 y- V            length--;
  K. S, z% [& l$ _            count++;3 B* D' w3 C0 m8 a) Y8 `0 r2 N
        }
0 e. I- N1 q& `( B        if(0 == length)
& I' J; X' t0 @& N        {
! B. a7 V; u# k. @            // 禁用发送中断
5 @$ N4 ~# D+ a& G            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
( V7 A& P* [/ h+ _$ G* J/ T        }
; y1 S0 }6 h! ]  Q* C     }
- b& K" ?1 v& t9 A; Y  q* ^' r8 B    // 接收中断/ T- B9 q7 t: @% M& Y$ [% B
    if(UART_INTID_RX_DATA == int_id)6 ?) W" G8 f/ m- m, x
    {& }5 ?, C$ Y4 M4 U' [* D6 h
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
0 [9 Q! V, {$ J0 m% Z% {        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);; _0 @) ?3 C0 i  Y2 S/ `( l2 |
    }
* f/ p- p; L* ~: l2 f; B    // 接收错误
8 u& h8 u2 q1 }* ?* G: {    if(UART_INTID_RX_LINE_STAT == int_id)
8 ^+ J5 x, L6 y1 S0 n+ y    {2 M3 `0 t$ Z5 o
        while(UARTRxErrorGet(SOC_UART_1_REGS))
( }# B  N$ W. E2 Z" I4 D        {9 C" K, ?& Y2 S
            // 从 RBR 读一个字节. e0 E# x" b$ g9 x0 R0 t
            UARTCharGetNonBlocking(SOC_UART_1_REGS);
3 T# u. |5 ~: s        }7 ~1 K$ F$ h* h2 V. k  U8 R$ |( B5 }/ {
    }
. H0 ]: b1 t5 e" g; b    return;
' @4 X/ i" a4 I1 \: a7 j: x# V# }}
2 }' |5 p' k+ [: @  ]; A9 ^  BInt main()- A: @9 |4 H$ X  F* N6 s* n/ k
{ ! p7 M4 [( N: P7 n! p
UARTconfig();//uart 配置0 E' i9 x. [) Y. {/ F. h! O' {0 E
    Error_Block eb;1 A3 f5 m! M- p
    System_printf("enter main()\n");' L3 U( ^1 ^5 q: n
    Error_init(&eb);) Q  M- O6 f8 l( N5 K7 P- B: T
    // 动态创建硬件中断$ N; I! H3 {7 D  @3 k- x" {/ g- ~
    Hwi_Handle hwi1;5 ?4 W9 c' ^3 t' M) k$ o( Z2 P
    Hwi_Params hwiParams;
$ Z& D% {$ z8 T7 M    // 使用默认值初始化参数5 H+ V) p, l$ Y" X" j6 e
    Hwi_Params_init(&hwiParams);* D/ g' }9 F" X
    // 中断事件0 j, ?! r# c4 T
    hwiParams.eventId = SYS_INT_UART1_INT;
# f: a0 n' q, g+ S; U) E: q    // 传递到中断服务函数的参数
9 C" x4 w& i: c9 M    hwiParams.arg = 0;$ o" m. A  C& S' m( ^
    // 不允许该中断自身嵌套3 L6 E* u9 u9 A+ E3 J) J
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;% W' P8 S1 v8 R, T
    // 使能中断" q; \/ @% z; b# ~+ j5 Z
    hwiParams.enableInt = true;
- ~9 @8 H+ _' v! M) y    // 可屏蔽中断 4* F" P6 T4 d0 j% O& E# o  ]& Y$ [1 s
    // 中断服务函数 hwiMain( G  T! Q1 ~8 Y% [$ A" l) R& u9 X9 ~. Q
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);" ^9 w: |+ A" A& D
    if (hwi1 == NULL)
5 ]" s7 |. X% H! h  [" L# p        System_abort("Hwi1 create failed");
' n  ~. j  S3 }    BIOS_start();    /* does not return */
% P0 g1 o9 `6 X& H    return(0);8 g! o; {5 i: J5 U6 j0 C
}$ M5 D6 C$ y1 I3 J% v+ B) ?- ^5 G

0 m2 }1 ?: X& }! ^. h( |$ W+ N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?0 E& S0 ^" A! _4 Q( t' ]
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点% y, H0 J0 ~7 X* ~. c! o6 j
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49* D% z3 D; a0 ~: w& Q* }
在中断服务函数里放置断点

3 V4 g/ c2 \) Y, g参考 GPIO_KEY
7 X. g0 Y+ I8 Y8 r
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-4 07:33 , Processed in 0.039717 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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