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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
  Y* {$ q6 j( X' \) A; z1 L// 发送缓存
, R1 w1 \8 X! Y/ ]7 K$ schar Send[] = "UART1 test......\n\r";+ q- N9 K# W/ _: o

9 `( ~" b8 f1 p2 _extern void UARTconfig()
% `  F* v7 [* K; R{
! P* C/ a2 \5 `$ c //使能Uart1
7 A" @3 o" O. o5 }0 j1 @: u/ j PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);5 w0 D  k& a1 q% S- N3 P( q8 h- p

! i1 V; a) T% D9 n // 使能 UART1禁用流控! R0 {- R+ B" k8 e# X
UARTPinMuxSetup(1, 0);
. w3 g, F  I* y6 z
0 Z- J' L4 B* o! M2 \. {0 a0 E // 波特率 115200 数据位 8 停止位 1 无校验位
5 J. M" B1 K+ n/ S( L5 j  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
# p4 A; X% a( @7 t. b: Y
& o! [5 j5 t' r1 ?$ u6 x1 q* i% i+ b  // 使能 UART1
1 G6 y0 C( L6 Z- @* E, l+ h UARTEnable(SOC_UART_1_REGS);! k0 W% H0 @7 ?* W" i
  // 使能接收 / 发送 FIFO  m  t$ z* ~1 t2 j- e
  UARTFIFOEnable(SOC_UART_1_REGS);" o2 B* E( P3 ?( ~- V( S
  // 设置 FIFO 级别
; g6 C: B3 o  G. c    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
8 E. a: t# ?& b  //Uart1中断使能
6 Y; k" y$ l' z( A* q' j  unsigned int intFlags = 0;
* t# G5 g0 C# a2 d  intFlags |= (UART_INT_LINE_STAT  |  \
2 `+ z& C# s/ ]% h+ j. F            UART_INT_TX_EMPTY |    \
6 V) S8 g; r" H            UART_INT_RXDATA_CTI);
1 ?7 g/ z" n5 E/ {0 ^; `            1 F6 ~0 W$ v  e# S6 B0 T( f, l7 i
    UARTIntEnable(SOC_UART_1_REGS, intFlags);
- s6 i4 o8 P- ^: |/ a0 h4 v0 ^' s" o}
7 l) a: \) T8 c& [) g% P8 e//UART 中断服务函数+ [- [* j) F3 S) K/ M
void UARTIsr(UArg arg)
) R- A! B' t' c* y; f5 S- n: f8 G{# n2 B+ m7 R2 D) q( I- b8 @
    static unsigned int length = sizeof(Send);0 S( L7 B( ]7 W. {* v# T2 Y/ b
    static unsigned int count = 0;
- L) `7 G6 o6 Y% h, o+ G3 w8 v    unsigned char rxData = 0;
5 `$ N! _4 d9 T0 r' `, B1 v    unsigned int int_id = 0;5 G. T! H8 |; E$ M  }+ O8 }! T) o
    // 确定中断源, m  [& _9 k, V7 D$ \9 e8 v
    int_id = UARTIntStatus(SOC_UART_1_REGS);( o( ]$ R3 ]$ h
    // 清除 UART1 系统中断
! R, f) J$ E* s: H( K    IntEventClear(SYS_INT_UART1_INT);9 \* T" E9 E1 t2 Q) I1 z" ^1 y
    // 发送中断
) ~8 Q) m0 U6 m6 t* {% y    if(UART_INTID_TX_EMPTY == int_id)
; j0 u3 ]2 c* G+ P3 @( x; @    {/ f& i3 c3 V2 K% D+ L7 {, f* f2 F
        if(0 < length)
: k- q9 t. ?- ^: h        {/ o/ x6 C6 e3 D" e/ g
            // 写一个字节到 THR
2 ?  D, f+ {" E6 K6 f            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);6 \7 b- i/ y" W3 A
            length--;' N( A1 \2 A. u8 k
            count++;7 e2 |% d* i) T0 k# s
        }: X$ f" m( }) E
        if(0 == length)) H4 s; l' @6 k6 }' W! v' }
        {, N* w2 C& e- {, L; Y' S4 ?# H5 Y
            // 禁用发送中断
/ a; g/ x, f% H  S            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
7 K! d7 v: f2 O        }
9 D5 ~2 Y1 j6 G5 d6 {0 i5 t: Q     }
" V, v0 }+ O/ i! S    // 接收中断
; D# Q* R/ @2 Z5 ]    if(UART_INTID_RX_DATA == int_id)
( j2 L) t" O  t/ @* q    {
7 F* I1 e) y2 C, W. p5 A/ K7 _        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);; \2 B  D: b- h
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
; d& |9 D" N9 l# D    }
; [2 U0 g$ e$ M* s$ d& ~( e    // 接收错误/ {5 ?/ Z, a) S: D1 o# ]4 V
    if(UART_INTID_RX_LINE_STAT == int_id)1 R9 e8 I4 T6 J2 I1 b
    {
7 z8 g7 J- c- h3 y5 \; A1 F# a9 \        while(UARTRxErrorGet(SOC_UART_1_REGS))
9 h$ U3 e9 ~1 o( S$ d        {4 u) m* D" e7 w: g
            // 从 RBR 读一个字节- e9 d: X& s/ y% v. \
            UARTCharGetNonBlocking(SOC_UART_1_REGS);6 _* S. y, l6 Z5 ^* V' m
        }
6 L3 r' C1 s# v    }; @9 g& B/ Q( q2 T: d2 o
    return;  q! y) Z, A, ^5 d. p5 M
}
! P. }/ n, v2 N% F0 OInt main()
+ z  E- G8 p0 l{
' Y) S1 K) Y9 ? UARTconfig();//uart 配置
1 {9 q! Q) f( y7 R: ^) ]! x- @6 Q$ n: ~    Error_Block eb;
, \0 j( F. E3 H1 {7 u" o    System_printf("enter main()\n");
! ?+ @& Y. j: Y8 W' R4 K; y    Error_init(&eb);# C, ?1 y& x; M- m# c9 q8 }
    // 动态创建硬件中断4 m8 }, W+ @  ~
    Hwi_Handle hwi1;6 @/ N9 h! q7 C
    Hwi_Params hwiParams;
. A: t& y- c% M: i! {    // 使用默认值初始化参数1 ?) d) t/ A8 \+ W: p5 O* j( n& L
    Hwi_Params_init(&hwiParams);7 S/ |1 H( y$ H8 L) C
    // 中断事件
: Y/ C( ^5 r7 y( |2 K    hwiParams.eventId = SYS_INT_UART1_INT;6 b$ k7 h2 D: S8 V
    // 传递到中断服务函数的参数
) m! @/ ?* x6 B% D    hwiParams.arg = 0;1 H) q3 D3 H4 }, B4 V9 y; J
    // 不允许该中断自身嵌套
1 u; v# D  ?1 R% }5 S+ N    hwiParams.maskSetting = Hwi_MaskingOption_SELF;9 r) @3 Y6 J$ ~, I
    // 使能中断
. X1 ~5 X$ J  {+ @    hwiParams.enableInt = true;
: h  x! B# q& L, C' {5 d    // 可屏蔽中断 4! K. G7 \' M: o. \
    // 中断服务函数 hwiMain( Q3 u' W6 |( H* N2 e6 J0 L6 d
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
5 @; k8 @% D' o" _    if (hwi1 == NULL)
# y0 T5 e0 D1 w3 w        System_abort("Hwi1 create failed");
: C8 A' e6 l' F9 {, A* }0 x    BIOS_start();    /* does not return */  |* D9 m" l- T8 {) Q
    return(0);% q. S& m" @3 b; }! v
}) ^9 [& i5 F  r. X1 q( s

- v! W  }/ S1 m3 P" y! j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?3 V+ b% o3 F6 h( o# M4 k
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点+ B0 v9 a# X' W% n( [7 {/ _
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
* Z, U1 d5 K  F! o5 i5 c9 v在中断服务函数里放置断点

" A- U/ T6 R# l. a! [) F4 o9 f参考 GPIO_KEY6 ?; m- L& t4 ~% f8 Y8 L
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 00:10 , Processed in 0.039279 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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