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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
% }" K& c. q& y2 D6 f' J+ J// 发送缓存2 n/ ^' p3 P* q2 ~6 ~  p
char Send[] = "UART1 test......\n\r";
  p9 q# }& j+ f) s# D! k: m) ?* p/ y) V8 H* m+ n* s) s" y6 v
extern void UARTconfig()5 F& m0 c8 _4 l2 ?
{
$ z/ [; h, F4 M# W/ t8 ^ //使能Uart1
1 `3 f' ?& N8 b! S7 d$ C PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);4 [7 [% q- Q% v# t% z. ?

$ C7 [1 W) U2 C // 使能 UART1禁用流控1 H+ W% x* ~  X/ B1 ?! b# P1 _
UARTPinMuxSetup(1, 0);) s1 ^- ^+ I9 ^( ]5 o
5 |  ^8 M" u/ L4 i6 I/ d
// 波特率 115200 数据位 8 停止位 1 无校验位* n) ~# }2 _& o& {, u
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);1 P( c3 m; e: X, S
# ~0 b8 a$ c$ U/ {
  // 使能 UART1. i. v5 ~2 x0 L
UARTEnable(SOC_UART_1_REGS);+ U( d1 B2 y6 A* V
  // 使能接收 / 发送 FIFO" B% g1 W* n) M$ r  S0 T6 `
  UARTFIFOEnable(SOC_UART_1_REGS);/ x& D9 o8 a% W" N
  // 设置 FIFO 级别
6 w/ N4 C+ k7 `5 F" C2 g- J    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
2 ]$ D, ^/ b5 l5 C9 ?  //Uart1中断使能
) m# E$ Q" P$ R$ P5 j  unsigned int intFlags = 0;
9 i$ W  ]6 r& _5 X; d9 U  intFlags |= (UART_INT_LINE_STAT  |  \
# r1 |* V# T5 h5 O9 V            UART_INT_TX_EMPTY |    \
+ k& A3 ]7 a( E3 f2 z4 w            UART_INT_RXDATA_CTI);& j. a4 f6 m: r' b9 u6 K
            " e# e4 O5 H4 K# X7 X0 z: |6 |
    UARTIntEnable(SOC_UART_1_REGS, intFlags);
* A, c7 w, |* Q6 e$ b}
2 ]3 @: K) ?/ e, S' m& b# |. I9 s//UART 中断服务函数
- a0 \+ [% \# o  V+ x3 j& I" }- h+ Pvoid UARTIsr(UArg arg)
4 r# k) v. c# [' X{5 [" W! }: r- Z4 A
    static unsigned int length = sizeof(Send);5 V. \5 x# b. M5 e& {, q8 P
    static unsigned int count = 0;6 o6 N: v# k. ]$ n# @/ B2 o
    unsigned char rxData = 0;' o/ Z+ g/ W& {
    unsigned int int_id = 0;
; F1 h( S' o. ?! l9 x# ~  t    // 确定中断源
" S; c" x/ G5 Q    int_id = UARTIntStatus(SOC_UART_1_REGS);
  ?0 G; [* U$ r, a3 ]9 f, Y    // 清除 UART1 系统中断! ?. x# d& t9 j8 g7 S
    IntEventClear(SYS_INT_UART1_INT);
6 o! ^2 r8 H5 N% s% L( z    // 发送中断2 |+ R, E. j$ ?) E7 U; {* Z7 ?- ~
    if(UART_INTID_TX_EMPTY == int_id)
) u3 p. X& w" l& Q4 q0 T; Q' a6 _    {
# q1 O4 ?. C) h) [9 i        if(0 < length)9 A$ s/ I  w3 o2 l
        {
& q; S+ I( X& `- `5 `$ L- h            // 写一个字节到 THR1 p4 N* F! U, P* ]0 C+ m
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
8 O( H' J8 k1 {            length--;
6 h  f+ G/ j. `5 s! K% p5 M            count++;5 i- l3 A! e9 j
        }
5 [4 p3 ^! h! q6 T  t; e2 s8 t        if(0 == length)
8 w& S, k1 T0 m$ f! ~        {
2 [- o- t7 @5 U( ~/ a            // 禁用发送中断
/ T- M2 u" d! G            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
+ N6 \' j5 K! q: N$ H. y        }
& s4 z" ?1 ?( M0 J* d5 `* _     }
5 ?  Q5 ^' H- H. s. A8 P    // 接收中断
" g, o3 a$ p( O2 E    if(UART_INTID_RX_DATA == int_id)
  G" y& O7 I# `9 c6 K9 T& [    {$ {% d% z! k- N# ^$ ]
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
; `# k1 O$ C2 y        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
6 c. k- t' K) T. \; V    }
8 z" e5 W7 @8 @3 v    // 接收错误
9 E  m9 u( i6 G2 e* |$ S+ ~4 r    if(UART_INTID_RX_LINE_STAT == int_id)
7 C0 I) O& b( `    {
9 f  ?% A# u8 l, p- E& A% B        while(UARTRxErrorGet(SOC_UART_1_REGS))! w6 H0 r( Y. d4 O
        {% [1 {' f. L( r/ r
            // 从 RBR 读一个字节
4 O6 b7 n9 S1 G$ U& {4 `9 n6 [            UARTCharGetNonBlocking(SOC_UART_1_REGS);
% j# O3 w, }( d        }
  m% o' ^1 Z4 R7 Q& V. Z  ]6 n    }
! U( U& m3 z  b: ^* H8 D    return;
8 j, d* E' ?7 U/ k}, Z1 o% n. a* \$ R3 L) Y8 ?" J
Int main()! B; V6 s; G, ^% M1 B1 z
{ ' t/ }- v( Y0 q% n' Y9 T
UARTconfig();//uart 配置  j$ |2 w$ H; @" B3 j, T
    Error_Block eb;8 |9 q7 o8 k+ E1 @( |/ }7 s
    System_printf("enter main()\n");
" H2 M  S8 _; }( ~- M- p    Error_init(&eb);
) o% U- k1 v, O' p0 j/ C    // 动态创建硬件中断: y5 O- ^# L2 Y7 {
    Hwi_Handle hwi1;
% x1 l7 H5 |% A! x! j    Hwi_Params hwiParams;
. U; o0 ^5 ]: S* e2 E+ _/ W$ e- F    // 使用默认值初始化参数
% l9 o1 J6 x$ W. ]9 }" M    Hwi_Params_init(&hwiParams);
5 a, @! {3 f5 W1 U    // 中断事件2 j/ n, b; q; X4 ^  Q0 L
    hwiParams.eventId = SYS_INT_UART1_INT;6 e' o0 L( d2 d
    // 传递到中断服务函数的参数
2 t" e" j! H! o* A    hwiParams.arg = 0;
0 S% n# ]  X) G8 N$ q- b    // 不允许该中断自身嵌套4 k' S; L7 p) E4 h7 h
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;( K8 a6 R/ z3 m
    // 使能中断
" {8 ^" ~9 W$ l5 X( k2 B) R- q    hwiParams.enableInt = true;/ U4 U' U' _7 F
    // 可屏蔽中断 4$ E" W! {2 e5 F% m
    // 中断服务函数 hwiMain
. U5 j  k& m* `1 \% D6 }; E3 |    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
* [* z# V+ @) e9 K$ B, @    if (hwi1 == NULL)
- d8 [9 k9 [& j( P- j) C% L( C        System_abort("Hwi1 create failed");& {5 J( ~: |- f5 l* y- A7 ]8 W
    BIOS_start();    /* does not return */: ~! Y8 Z- j/ M$ r- V, H
    return(0);+ L# Q6 c: n; O
}; z4 l: A1 L& x8 A

* d/ F+ O: I' ]2 C  U; @6 S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?6 a' I) E- R% P* |
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点1 m* v$ w: Y! Y0 U0 T/ |: r
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
8 ^; |: U( V" E* i! L; s在中断服务函数里放置断点
. O" v$ _8 o3 V- l' B! ]
参考 GPIO_KEY* s3 m" c  s9 ~# n1 [
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-7 21:10 , Processed in 0.038710 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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