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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
" c: b% I! m: I5 I// 发送缓存
) P' i, L. w# s7 ]% y7 X  u" m5 [char Send[] = "UART1 test......\n\r";# s6 E1 g; O1 t- Y& B" q% M
5 `" z; x' a8 y$ o/ i
extern void UARTconfig()
( V" T3 }8 P" W{
5 o" L8 n, c7 a" p' k+ Q //使能Uart1
- a0 @2 S2 R/ d- |3 } PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
# G+ p; i$ p  G" T
* V, W0 ?; W+ v4 x8 g+ M // 使能 UART1禁用流控
# N" [- b7 {; w2 u$ V" W  b0 \ UARTPinMuxSetup(1, 0);
/ u6 s. L4 t+ F, ]; |
" ]. Y/ P- t" g8 ^3 |. }$ w // 波特率 115200 数据位 8 停止位 1 无校验位7 N; t# l9 g# M1 K* D( K9 j) ~$ ?
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
* }% B9 X$ C9 w3 G: w9 m% B, \
0 o6 c+ P- M8 M) |/ P1 G  // 使能 UART1! h2 e# P. k5 w2 J$ c' q
UARTEnable(SOC_UART_1_REGS);
1 g1 o3 D! K8 Y: |- q+ b' n  // 使能接收 / 发送 FIFO) n* B/ W- y  Y- ~" y
  UARTFIFOEnable(SOC_UART_1_REGS);! |* I# q" t: E% ~0 P
  // 设置 FIFO 级别
1 {9 b3 m9 t) r8 t' n& S    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);- t! k6 ?3 A) z6 |  O- H4 a+ a
  //Uart1中断使能" i- g; w4 a, F3 Q
  unsigned int intFlags = 0;5 ^% L3 [' y0 ]/ z4 Y8 p) z
  intFlags |= (UART_INT_LINE_STAT  |  \& B9 \* S. A2 g: U4 R5 G
            UART_INT_TX_EMPTY |    \6 ^% L0 k7 l+ T' a3 U
            UART_INT_RXDATA_CTI);# v* w3 x* T/ d( r! ~6 j4 `
            
6 t+ T/ [+ y4 T) q8 i    UARTIntEnable(SOC_UART_1_REGS, intFlags);
$ o! v/ }5 f7 ?' r' M}" y' g. G9 ]! k9 j5 y0 o7 x
//UART 中断服务函数
& }2 j8 Q0 U; [) M9 Svoid UARTIsr(UArg arg)
0 n- S8 `7 H% ?7 t4 a{. m3 B4 K# `6 i& j* e& _+ T
    static unsigned int length = sizeof(Send);% f3 m' [  `; b. x
    static unsigned int count = 0;
9 `, P0 Q+ O7 J1 O/ O    unsigned char rxData = 0;
9 Z9 I, f4 F0 l3 F7 y; ]    unsigned int int_id = 0;
1 j5 }" X/ N+ W/ o: _    // 确定中断源4 R( O# c9 |1 P1 [& ]) @
    int_id = UARTIntStatus(SOC_UART_1_REGS);
5 D  ~. m0 B2 W5 V    // 清除 UART1 系统中断
+ e  J: Q! z/ o8 O/ _" v, ]    IntEventClear(SYS_INT_UART1_INT);
8 M; ]. W- T4 l) m9 ^! ]5 h7 R8 O3 u    // 发送中断
1 b7 X- F9 x. B9 j3 K9 v& J- H+ c! N    if(UART_INTID_TX_EMPTY == int_id)
- h2 S5 W  l( ]' C8 ?: M0 ~    {: y1 F5 ~: k2 ?; Y
        if(0 < length)
* {. w, o  _8 ^( b; A" r        {
8 w/ S2 d  F, p# U( Y% v            // 写一个字节到 THR
7 G& C! W- V4 T            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
' f( C: \' f  I0 ?9 {, s/ ]            length--;% _& Q( b/ J6 P
            count++;
; J8 d3 U8 K* E. L/ I        }  a2 A1 k# L, i8 v& b$ w6 s
        if(0 == length)5 i' w% S( e3 f8 y, |) s; f
        {3 V: e8 z4 ]) z, A, w/ W. v
            // 禁用发送中断
2 O4 W5 t4 P# _! P            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
& B1 |3 W% S; F/ y! a6 ]        }
+ ]7 t/ u4 V6 W. P" t" k; \# W/ U     }
! h3 }3 c8 o( k9 u3 j    // 接收中断8 S( b/ B" B% i$ i5 ?/ P
    if(UART_INTID_RX_DATA == int_id)& L8 K2 \' j0 X' G
    {- E- m, Y- t! y# [3 ~- F. W2 ?+ \
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
: J6 }4 U3 W! Y3 n& d        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);7 f: n& e: i- B: V8 g, r! }7 J
    }4 d% C) O) n5 K$ o( n, e9 ~1 r: u
    // 接收错误
( H! o$ S% c9 {    if(UART_INTID_RX_LINE_STAT == int_id)
) ~) l% I0 N3 Z% C" x% ~, y    {
6 a  _( n. K4 v/ ]9 {* H        while(UARTRxErrorGet(SOC_UART_1_REGS))
. Q6 ~! T; r& n4 ?4 K( Y4 `        {2 T$ p3 k) Q% w
            // 从 RBR 读一个字节
! j: J. d4 Z1 ~. }4 o) V2 Q3 V            UARTCharGetNonBlocking(SOC_UART_1_REGS);
) K- `4 l0 S! c' t        }1 N$ g& _. @; r
    }
# x& H9 l# n5 M7 Z: y3 @    return;
) ^* B. F) l$ q7 b( X' J3 C}
. A' o& Q( y7 V' x/ ^' D, {$ SInt main()
* B% h+ K, R: X/ _{ + W- e: P1 `. F" ^
UARTconfig();//uart 配置7 k6 Z! j0 Y$ V9 O, [
    Error_Block eb;
' q9 E; Q) @" D* s. }1 d    System_printf("enter main()\n");
2 _2 v# C2 I0 K6 O5 m; ~    Error_init(&eb);
3 r' b5 C9 o& S& B2 r, u    // 动态创建硬件中断
7 V, [0 z6 Y1 O    Hwi_Handle hwi1;
7 r% p+ ^9 z" N. [    Hwi_Params hwiParams;, c! }7 X) n5 r6 T# e9 j
    // 使用默认值初始化参数
9 [5 p; l9 Q6 r  u$ Q    Hwi_Params_init(&hwiParams);. ~8 s- l& v' G5 H( R
    // 中断事件% q; \  r. z3 u
    hwiParams.eventId = SYS_INT_UART1_INT;
0 H" k* @, N+ Q! Y3 h    // 传递到中断服务函数的参数7 r7 i' k, ^" Q
    hwiParams.arg = 0;6 {  Z; F% ?+ F- R
    // 不允许该中断自身嵌套. r0 h6 }2 [# b* x! c- w, l
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
$ [( E2 n5 k& v& a* _& f    // 使能中断5 G5 C. \+ l* y6 K) Y
    hwiParams.enableInt = true;8 p) T& Y2 A3 M8 e8 `$ h
    // 可屏蔽中断 4
! p0 F/ u/ c$ `' n    // 中断服务函数 hwiMain
' N: T( `' e# ~( f9 a  C8 g4 N    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);$ A9 F5 R) J1 n5 ?8 N' q
    if (hwi1 == NULL)3 _- S+ I" K# g/ P% a, n# S) A* Y
        System_abort("Hwi1 create failed");
. O3 k. p. U- y1 U6 O    BIOS_start();    /* does not return */7 X: S3 V* }7 I7 w+ x
    return(0);
+ Y' O" q1 ]' U% N4 N}4 v. C* y% ]- ~

& y  O4 V; l7 q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
5 t! Q) G! Q0 q. [" K
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
" B' j: e' V' l6 u, ~0 g
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
2 q1 ?6 U$ u" v8 ~6 x* b在中断服务函数里放置断点

: O2 y, z8 G" _0 u' ]- a$ Q参考 GPIO_KEY
( U3 H9 I9 C& l* p1 @
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 23:39 , Processed in 0.037871 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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