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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下6 n# U3 ^) q% Q. I- ?- Y. k
// 发送缓存  @  K1 q* d/ c5 b  f
char Send[] = "UART1 test......\n\r";  y; a2 k5 P% b6 E

/ p; @+ e% Z) f1 O1 F! B7 fextern void UARTconfig()& G+ l. q; W9 R! E
{5 g* x- Q1 v9 N6 D& e4 J
//使能Uart1
2 k$ B8 h8 w2 h PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);1 W. `3 N) s: P3 ^7 n2 ?
# U0 z* |* J$ R' ]  m! U
// 使能 UART1禁用流控
, m( m3 O" ]( O" t* j UARTPinMuxSetup(1, 0);- A6 Q4 G+ ?3 [* X, U3 _* ]
: [% C1 L& \2 O
// 波特率 115200 数据位 8 停止位 1 无校验位4 N; r; [" r( r* U7 O8 c2 j
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);; O$ X. L. v8 M+ |
' }, B# f2 `, }7 }) T
  // 使能 UART1& E* ~2 v8 E) w% _/ O5 {) ~
UARTEnable(SOC_UART_1_REGS);
$ ^4 X; A4 ~; B: A  // 使能接收 / 发送 FIFO: \  @/ u5 i  S: T' h$ I9 ^. D
  UARTFIFOEnable(SOC_UART_1_REGS);
9 O- c2 S$ @3 }+ H  // 设置 FIFO 级别
, P: G/ ^$ s7 G; f    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);( F) ~/ Q! b. }
  //Uart1中断使能
/ ?4 e  B& |& A; Q( M6 l  unsigned int intFlags = 0;
) A9 a' }6 s7 |+ _  intFlags |= (UART_INT_LINE_STAT  |  \1 p8 ~- z; K, t8 o, o% Z+ _1 w
            UART_INT_TX_EMPTY |    \
6 s2 h  m3 S6 K, V' t! J            UART_INT_RXDATA_CTI);8 w/ I. y/ p$ v* p- U6 |
            $ \* A* N" o# |. }
    UARTIntEnable(SOC_UART_1_REGS, intFlags);0 k4 W# @* o; ?" [0 O
}
+ y  m' V. Y: C8 \6 t: z* ?9 p//UART 中断服务函数2 \9 C; j. ~* [8 t
void UARTIsr(UArg arg). U/ ^7 W# d2 A, x8 x
{
, H! @2 o1 A  E* `* Z2 m3 D0 V    static unsigned int length = sizeof(Send);
9 x, v. R) B3 ~2 j0 c    static unsigned int count = 0;  O3 J) a; \2 `) M7 o7 n5 t3 S
    unsigned char rxData = 0;) @8 p. k9 W" U+ u
    unsigned int int_id = 0;
7 {/ |! K% c' `+ x) s    // 确定中断源! o% k" b. J) x/ m8 P4 E
    int_id = UARTIntStatus(SOC_UART_1_REGS);
2 s5 Q3 u$ t, ^4 q3 ^    // 清除 UART1 系统中断0 i5 G' j% ]1 \1 @7 f& y+ b, ?/ w
    IntEventClear(SYS_INT_UART1_INT);2 l+ y; P1 \) V- J& U; ?
    // 发送中断# D) X  B- Z0 i6 F$ X' x! ?, y
    if(UART_INTID_TX_EMPTY == int_id)& L" j1 ?8 _8 m5 L+ O
    {7 I5 W, u  V7 b8 i, `9 u9 K# }$ X
        if(0 < length)
/ o: x; z5 c0 h# E% `        {/ a* e& b/ Y0 T' J) u" U6 I- n$ t
            // 写一个字节到 THR8 I; P, |4 |+ _2 i3 Y
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
! q7 _8 A$ ^, E9 z            length--;
! g( ~; w7 c! a: H" f' ^            count++;/ J0 o: @! N6 E0 Z, |
        }
; k7 {! ~" L; W" d; g. c! G4 U% V5 e        if(0 == length)* L+ G5 Q8 `" e2 s7 _
        {! C# ~2 t5 R$ }" c4 W, c' A
            // 禁用发送中断
0 }' B. @; ~- V            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
; h. X' W0 G5 m& h* t        }
& U8 ]0 [/ E2 b( S' Q4 l     }
# z/ E" c  ]7 R3 s/ {  g! y1 z    // 接收中断
, V% S7 |: k7 {    if(UART_INTID_RX_DATA == int_id)! J4 G; b) T( Z+ e8 p
    {* F9 N  `/ w0 k9 p( f
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
" t+ Z1 R) i2 y        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
# b/ j2 a; I5 t: ~% T4 u    }
1 g; t" s/ Z# p4 a  e    // 接收错误! |/ D+ e( ?$ N. ]! S" r6 N- H  l
    if(UART_INTID_RX_LINE_STAT == int_id), n  F: R5 A+ v7 U8 F& T! ^8 d
    {9 k, U' I5 y) j' J" y
        while(UARTRxErrorGet(SOC_UART_1_REGS))
& o& @' M) G- X+ q0 B! x8 s3 r        {
7 j$ n5 `% |" d5 C            // 从 RBR 读一个字节# S7 D  P, q5 g8 v8 L$ y
            UARTCharGetNonBlocking(SOC_UART_1_REGS);
/ W7 G5 r2 o( K* L        }
7 E+ w/ T# ?& A# x  t    }. N  ^/ W, C2 F3 T0 }9 C% s
    return;" N. V% ]  r) l6 M  F
}
; f; Z5 @* y3 eInt main()+ J" K' m1 H4 q% v$ `5 M' F
{
2 G+ s  t' ~/ r6 [ UARTconfig();//uart 配置4 _* y/ E' j2 k  R$ s6 N. o
    Error_Block eb;$ J, `+ ?' s+ O6 U0 P
    System_printf("enter main()\n");
$ U2 B' I9 y, t5 T9 ]4 n    Error_init(&eb);
+ }! z3 Y0 n& x" s  Y6 g    // 动态创建硬件中断
7 B" y5 H! I0 ^( L/ A    Hwi_Handle hwi1;# ^" {% U! j& b" K
    Hwi_Params hwiParams;
7 a, T. T! O2 N% R6 A    // 使用默认值初始化参数
. [! q& ~8 P, k" x( I1 R3 I) }    Hwi_Params_init(&hwiParams);
4 N0 A- S9 z# T/ S    // 中断事件7 j5 I+ W6 b( _0 z# g
    hwiParams.eventId = SYS_INT_UART1_INT;7 v0 p1 v% m+ X- `
    // 传递到中断服务函数的参数
5 x+ v  B6 I$ q. V! U    hwiParams.arg = 0;: ]0 a: j9 a. ]+ L" ~8 [
    // 不允许该中断自身嵌套
, z' Z9 F! h3 Z6 F: H    hwiParams.maskSetting = Hwi_MaskingOption_SELF;! x) O& Y6 H- \; n6 O
    // 使能中断' u( l) z/ z. u1 g
    hwiParams.enableInt = true;
, d' v/ n4 J  A; ]0 z8 o# H. l    // 可屏蔽中断 4
# Q5 }  Y' W8 u9 A1 Y5 b3 a    // 中断服务函数 hwiMain
! S( ^2 F/ R* ^% u    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);% Y" _0 [: ^) P
    if (hwi1 == NULL)
+ F1 y5 T9 \! m% E" ^        System_abort("Hwi1 create failed");) X2 m+ \4 g$ V7 g' e. n2 n
    BIOS_start();    /* does not return */8 @9 q% `, |2 t) o7 Y. Q
    return(0);" J. o! z( |- F
}
" F6 [/ W$ W. t2 N7 c+ d- g* E$ a+ R( w) b: d' ^" ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
5 e8 E2 G1 v" [7 {
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点1 ~1 r( J/ x4 A" d( d% h" J
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
5 l% W3 S( |4 D# K2 F' B2 G2 H在中断服务函数里放置断点
: d  Z& z2 T6 V, g7 P
参考 GPIO_KEY
" W* H# U2 j3 c" w
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-25 07:28 , Processed in 0.041810 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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