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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
! o/ v  d$ s; ^/ h) G" }; q// 发送缓存
( [1 _0 \* _# jchar Send[] = "UART1 test......\n\r";
/ C' }. w7 o8 h4 ~% r/ U8 t9 a
  s5 Q: g& O6 |3 Vextern void UARTconfig()
# N7 N. J9 [% K' U3 M7 q& ]0 j{6 ?- Q7 b. O+ w  A5 T) v
//使能Uart1
9 U9 H0 s4 `! l7 g- K PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; R$ K4 r' [5 h
; q- T- a9 B$ w3 t% E8 { // 使能 UART1禁用流控
5 j6 @# `! R) y UARTPinMuxSetup(1, 0);" U0 |9 f; u. r/ L. K" G' J' M: ]

* v$ U$ q* F3 R, v0 C3 y* } // 波特率 115200 数据位 8 停止位 1 无校验位
; d% `9 N5 }) }# j( [  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);5 R. U9 J- ^6 _9 i) L

( o1 o. V7 E. X& y% l9 p  // 使能 UART11 o+ b% m7 J" R1 k2 X8 n, b& p$ t
UARTEnable(SOC_UART_1_REGS);6 C$ J& d5 T3 o& l
  // 使能接收 / 发送 FIFO0 T) _8 u/ `, Z: l2 b/ m
  UARTFIFOEnable(SOC_UART_1_REGS);# d: W% @/ P4 u0 f
  // 设置 FIFO 级别. Z5 L" G# g& T! f$ u# d0 ?  z3 l5 Y2 {9 {
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);) g% A4 w! B6 O) i, ^3 s
  //Uart1中断使能  K) `. _4 D1 s8 v) z
  unsigned int intFlags = 0;- j; \4 \! f* K: s) b
  intFlags |= (UART_INT_LINE_STAT  |  \- @5 ~# m( _# A5 t2 T5 z
            UART_INT_TX_EMPTY |    \
! C5 [$ R: G6 R( C            UART_INT_RXDATA_CTI);0 F. `' u7 p' }, {/ ?
            ( r9 }8 ^' Z. B) r
    UARTIntEnable(SOC_UART_1_REGS, intFlags);
& w4 A. Q0 b# N4 B}8 B2 A4 {  c: N5 a7 F& l
//UART 中断服务函数
2 K4 ~9 X, _( l) Avoid UARTIsr(UArg arg)9 t1 L' p2 a0 B/ @% h: K! f; F
{
7 `2 Z  H5 G4 k7 N    static unsigned int length = sizeof(Send);
9 Y2 B: `) z* X- `! D5 Y5 ~    static unsigned int count = 0;& Y5 ^; G' a4 c; o
    unsigned char rxData = 0;
; }$ D) J* K+ v' \3 P    unsigned int int_id = 0;
# y5 V9 T9 x8 a( F2 m; e    // 确定中断源
$ g* [  E; g* Z6 j7 a9 K: T5 r    int_id = UARTIntStatus(SOC_UART_1_REGS);; Z7 n4 M( O- W2 @2 C
    // 清除 UART1 系统中断' W8 o( {7 \; \/ D  ^& ?
    IntEventClear(SYS_INT_UART1_INT);6 a5 ]# g( S! j6 A: T8 J
    // 发送中断
8 ?6 e- ^" J4 B, X2 c% |    if(UART_INTID_TX_EMPTY == int_id)
% v5 _4 ~% z; I: C; s2 D; X# H    {6 ]5 `& p7 x5 J
        if(0 < length)' h1 \+ S# c  i' y$ ~, U
        {" g. D1 r, h7 C/ i& I
            // 写一个字节到 THR- w# n4 T" I' ~4 j
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
" r' M: }# o7 ^2 |, g# R            length--;
  ^: I+ V; J5 m: m. ]2 X            count++;
- [% B# y1 y+ |. g        }0 L8 a" q6 K- @& V
        if(0 == length)
4 x: r. R2 h9 w6 L  ?        {$ a& n2 {& E! M6 f/ \  a
            // 禁用发送中断
: |: ?% i/ k& s: I: C            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
: P- T/ F# R' {3 f% F        }
1 x; L. s3 `0 G" c* h, K' ?3 {     }" k6 {% M4 s' r6 d, \1 _: a. M
    // 接收中断5 {8 B; }5 g/ F% z& E. R( h* v
    if(UART_INTID_RX_DATA == int_id): E; q4 `" c' k& H- o6 w7 ~: M/ E
    {
( Y  B/ i& H( [. \9 A- A        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
  t7 u- O1 B+ ]; o6 I        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);$ p' u0 L! U5 C8 l2 C
    }/ @* J. J- W( F" I
    // 接收错误0 x! I& L" {1 z
    if(UART_INTID_RX_LINE_STAT == int_id)- I7 S% X$ f* T- D1 P% G5 |6 Z
    {8 c1 D9 e6 r2 K+ ]& i* C3 H
        while(UARTRxErrorGet(SOC_UART_1_REGS))
# i2 t' V7 Z* V8 M- M' K8 k+ p        {
( h  Q, Z- ~) Z- R+ t& H4 @            // 从 RBR 读一个字节% w& o( f* h8 y% h; ?
            UARTCharGetNonBlocking(SOC_UART_1_REGS);; ]9 p0 m) ~' N9 h9 U/ |! r
        }
; A/ b2 I4 Y/ k    }
3 q2 m$ m, C) s6 H+ |/ z9 ^    return;
6 c( E- [& q6 Q8 W% _. m* A}
( O- h. f. u) w, I7 x3 k) r- Y; X/ AInt main()/ _! O' l2 Z5 ^1 }& n" S3 y) X
{ ) V& v% u5 c) H8 O7 u
UARTconfig();//uart 配置6 K8 G- f. O$ n& c
    Error_Block eb;
- c2 M: v. d. `5 ?  s2 ~7 z" [    System_printf("enter main()\n");
/ r) s: y; D1 \7 o3 o- X! n    Error_init(&eb);
  H0 e. u9 ^1 T) p    // 动态创建硬件中断0 C/ h# |, A  f% D4 v) t) l& Z
    Hwi_Handle hwi1;& H) @" h: R! C& G' \4 o
    Hwi_Params hwiParams;! u( d& M  D4 R' P5 n8 G2 g
    // 使用默认值初始化参数& h# r. O# s  Q. |# Y1 h
    Hwi_Params_init(&hwiParams);
0 l/ q* R& Y2 n# o7 W    // 中断事件
5 G. m9 X6 D) m( i* d: o9 b$ l+ g    hwiParams.eventId = SYS_INT_UART1_INT;3 B8 c0 h  o/ K2 w
    // 传递到中断服务函数的参数
- k5 A# t8 f0 o, U2 ?  V0 Y    hwiParams.arg = 0;; g' Y. _0 f" ?/ J9 ]3 v! Y7 Y9 s
    // 不允许该中断自身嵌套
% N0 q" N! x5 i1 Z    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
% t7 E- ^4 _6 F$ \9 ]    // 使能中断4 F8 H0 F. S+ @$ `5 {! i  j
    hwiParams.enableInt = true;
" ]% C5 E0 }! a4 W2 P    // 可屏蔽中断 4
" k* d+ @1 Z7 q; ]7 h! Q; \8 J6 W    // 中断服务函数 hwiMain
# n* B5 A& r$ X3 V    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
8 k" @# S2 M' q$ v( ]3 v4 q1 k    if (hwi1 == NULL)
: O7 ?0 J8 w: {" }( v; v1 P1 K        System_abort("Hwi1 create failed");
# q! J8 L2 T- b) `& N0 v8 `    BIOS_start();    /* does not return */
; F8 r0 C. ^1 r& j    return(0);4 V4 u5 L1 U* S( m/ V
}/ T# ^8 f" c, l! }% O

( h6 W$ c+ f& b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

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

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点5 k$ j7 i8 J# f- F  R# Z; |+ j+ _7 C
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49+ T. ], w' _$ A/ E
在中断服务函数里放置断点
5 ^6 P! \% J. q. |+ F# |( q' B
参考 GPIO_KEY) Z% I3 \5 d; d
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-25 09:04 , Processed in 0.040775 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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