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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
" B( [+ J4 s! y; n6 R% Q// 发送缓存4 Z! \2 f8 E" e* H/ `; m" A# G8 N" w
char Send[] = "UART1 test......\n\r";; k7 T! M4 T5 z1 ]
/ g1 _8 A* O5 Z  m9 ?' z/ s
extern void UARTconfig()- K6 Q: i1 b' S' g: s
{
. u- A& ~& U, N' q //使能Uart1
& N! u6 W4 z5 t6 i; @ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);: x1 P8 ?0 k+ c6 y6 G" J
) D( f3 u$ d; j9 Y9 W- g
// 使能 UART1禁用流控
: e, W0 t+ {7 G UARTPinMuxSetup(1, 0);
" n' h" v; c. a! ?2 N. a
) u) m( S/ a8 w- A // 波特率 115200 数据位 8 停止位 1 无校验位
2 A) ?2 h6 y% {9 [4 f( ]  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);$ O+ Q' V9 f; ~  |

# p  s0 f) I- P  // 使能 UART1. T4 r% ~& H0 \4 ^6 I* Q% x- @
UARTEnable(SOC_UART_1_REGS);6 Q& g8 f+ `" b
  // 使能接收 / 发送 FIFO- h3 h% q  |4 @. m
  UARTFIFOEnable(SOC_UART_1_REGS);
' d& [/ \6 b1 g& i  // 设置 FIFO 级别
' r: ^# e! G. T, A5 b3 M  a/ N    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
/ b- L3 D- ^: d8 Y( p  g  //Uart1中断使能
* A0 X6 h7 _  N9 }0 W  unsigned int intFlags = 0;
4 I, u0 q0 D. `, `; D# o# n" h  intFlags |= (UART_INT_LINE_STAT  |  \
0 `4 M+ ]8 N% {. x+ S            UART_INT_TX_EMPTY |    \
+ J- s/ n) E6 x            UART_INT_RXDATA_CTI);' |  {' @! K8 z% G: s/ m5 W" |
            
6 k. E+ T: r2 F2 x) F3 U, A; V    UARTIntEnable(SOC_UART_1_REGS, intFlags);9 ]9 w0 @. J" ?. ]  ^# P% V# X
}- Y, [, k4 v: Y3 R6 h% G( I5 N7 u
//UART 中断服务函数
  h; k1 B- N/ Z0 f9 `void UARTIsr(UArg arg)
; X; C: N& o: ?& ]+ Y{
0 v, p( N; L6 B, c% ?3 y    static unsigned int length = sizeof(Send);
  B9 X, |9 Y  R1 m    static unsigned int count = 0;" W" \( k5 U. ~( C* ]; p5 |  D6 O
    unsigned char rxData = 0;
4 s4 `/ _6 v! a) R  F+ Q    unsigned int int_id = 0;' |0 {8 |* t0 B, V0 Y4 D
    // 确定中断源, U9 L+ K1 h8 ^: i
    int_id = UARTIntStatus(SOC_UART_1_REGS);
7 ]" l$ `$ C7 |+ _4 J- ?    // 清除 UART1 系统中断
( y8 k& Z8 W8 a    IntEventClear(SYS_INT_UART1_INT);
! e# g0 x. a/ H# V4 W    // 发送中断
3 \; q( v3 _7 v3 u, z5 r    if(UART_INTID_TX_EMPTY == int_id)
8 A3 @" a, V1 a! J5 z    {
4 R) h# C& |1 V3 ^5 D        if(0 < length)
# F( v. N/ z* t0 @        {2 Y4 |, q9 M. `6 A: e
            // 写一个字节到 THR
# p# x1 [, t; f6 ?. Z: k            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
; t) V2 I1 ~, m" X# Q# e! a            length--;
7 A  _- t& G2 j9 x1 i            count++;
5 t# t3 i9 o* {2 l: a! J( o        }
- @" b4 L6 X  r; l        if(0 == length)
/ R" J( }* H* k: e* d. k        {% ]! f8 V$ ^0 S; E& m; a
            // 禁用发送中断
3 g* _4 m" D. I8 S2 ^7 ~: g            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
* ~7 L  B# ]" [3 p# s7 m/ p        }5 E/ d8 k' ?& ?6 P& \
     }* K' B+ G) D4 U6 f1 n2 V5 f
    // 接收中断
* }- b* M. a) _  X& n5 }  _7 r    if(UART_INTID_RX_DATA == int_id)
4 r6 F( ^9 c4 o9 w  k/ P5 F2 a    {
8 Z3 A8 \; n4 i8 l( v0 A; h        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);  ~- M, L! k* V) u% X# e
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
0 w; q0 T  W  A( b/ I    }0 K% r+ a' ^8 ]5 }1 W& B
    // 接收错误
/ c3 z0 J, K- j0 a  R4 N2 w    if(UART_INTID_RX_LINE_STAT == int_id)
% A& \& O  T- l' q1 u+ z6 B) z    {4 k. M$ J, x. B$ ]/ G1 _
        while(UARTRxErrorGet(SOC_UART_1_REGS))
: r: E) w1 P  t        {" Y0 g' X  E% f& I) ~
            // 从 RBR 读一个字节/ d, V3 P" ~+ [7 W1 f$ p
            UARTCharGetNonBlocking(SOC_UART_1_REGS);
& Z; }; x7 Q" A* j" |7 F        }" [' r( \; e7 F/ l/ C
    }
* P. C5 x$ U( J' d5 W/ E! C    return;
! y5 G8 w( ^( Z8 p}  {$ Z: v* H/ `$ J6 }8 G, S/ D4 H
Int main()0 k7 }* T/ s- E4 X3 I
{ 1 }5 c& g' e. o/ j' W' L! L
UARTconfig();//uart 配置' T& X1 o5 r( @; ]
    Error_Block eb;% x; I' s9 |. X3 [7 ~4 s. U
    System_printf("enter main()\n");, k5 }% i/ @# |( \  Q# X) ^( q2 \0 N' ?
    Error_init(&eb);
$ \, @) q  d8 E, c, C    // 动态创建硬件中断0 @, O- g% w  _5 j7 g
    Hwi_Handle hwi1;: g7 i% }! N3 F
    Hwi_Params hwiParams;0 {5 S! \+ H2 m7 q" m; H" r& t
    // 使用默认值初始化参数4 Z5 p5 j/ u' m7 E% r# J
    Hwi_Params_init(&hwiParams);/ q/ n- X0 r2 J5 H" ?* m: q
    // 中断事件
$ D2 e& R- [. j9 Q: O5 q    hwiParams.eventId = SYS_INT_UART1_INT;5 |9 _6 i5 V9 x9 P( u, p  n* Z) u. ^
    // 传递到中断服务函数的参数! }: K2 v: M: G2 ]
    hwiParams.arg = 0;
2 u; ^: l9 k( a6 [8 ?1 @, T    // 不允许该中断自身嵌套5 ]9 A8 N6 Y' K- Q7 o3 ?  @& E
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;$ j+ d8 ?, s  [5 E  o" J
    // 使能中断, _4 t1 Z' U* ]* u2 n+ E
    hwiParams.enableInt = true;' P0 F6 P: [/ ~* E
    // 可屏蔽中断 4% e/ q4 q7 L; _$ P
    // 中断服务函数 hwiMain5 \2 ?. T  T% i( k0 x8 b
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);" T; ^& {- k& g! Y! H9 V
    if (hwi1 == NULL)
# `, u: w$ v$ c$ g% }" F        System_abort("Hwi1 create failed");
" a0 |: m& l7 v* L- {0 M- J9 ~    BIOS_start();    /* does not return */) J  b- M! L" R
    return(0);
7 c4 Y4 M) ^- Y}5 u/ x) D2 B5 y6 h, U' ~  k

  ?& S) w% [. Z* r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?+ z' e) t  T( N6 ]6 d/ Y" `" u( b
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
+ l$ D6 r& r5 L' a! u% F; }" H
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49% Q2 Y2 ^- s" Q$ s( U4 }4 _; n8 d
在中断服务函数里放置断点
0 s) Y5 ]! \% K3 e, S
参考 GPIO_KEY
# q- r" a( V# u9 ^1 R
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 23:01 , Processed in 0.039634 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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