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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下/ O5 s" Z* t) o8 d+ b1 \
// 发送缓存
  x! d3 [5 g' uchar Send[] = "UART1 test......\n\r";
! s$ |: {$ o& m
, v$ I  Q9 J% N7 |extern void UARTconfig()0 x- A: v( Q& W- N
{
! `! L+ Z0 }- Q0 \7 ~ //使能Uart1
! J1 x3 J! X; g# l! K9 r# f) \ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);. ]+ f+ }! C) A
, X7 I* Y( \6 U4 o
// 使能 UART1禁用流控1 s) F, P! c- a& ], f1 D
UARTPinMuxSetup(1, 0);
% a8 M$ [" c# K 0 w$ t0 \4 ?( ~% n% ?3 j0 z
// 波特率 115200 数据位 8 停止位 1 无校验位
5 ^; Y8 A) Z9 y5 t6 a  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);% \7 u( `* [% }6 u* Z
8 q1 W4 j1 Z; g+ s: v. g) [
  // 使能 UART1- J* D- a# H/ I2 q: ~
UARTEnable(SOC_UART_1_REGS);
6 m, d- [$ T2 t  // 使能接收 / 发送 FIFO
) q( z0 v; Y4 M2 c6 \; ^1 O- _  UARTFIFOEnable(SOC_UART_1_REGS);
  k% O) v$ T$ s+ \. x$ ], q  // 设置 FIFO 级别
2 |6 |. f3 t  H* x    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);$ ^/ A$ Q: h8 A& C
  //Uart1中断使能6 D9 a! m7 v" Z
  unsigned int intFlags = 0;( B+ d; n( M4 i9 {
  intFlags |= (UART_INT_LINE_STAT  |  \
# ]9 @  S3 p" u# t            UART_INT_TX_EMPTY |    \
  B, g% ]3 s& H: }, Q+ H8 D1 t            UART_INT_RXDATA_CTI);
$ ]# V# b  R# J              M2 ]5 B9 i6 C) N. `
    UARTIntEnable(SOC_UART_1_REGS, intFlags);8 Q( e2 Q' ~: d" f
}& G3 l2 l' q0 g  p
//UART 中断服务函数
% G7 n% i! J! E/ Y) G+ evoid UARTIsr(UArg arg)6 Q9 W% d2 ~0 [/ B. Y! j
{' U9 T& ]" A. i, ?
    static unsigned int length = sizeof(Send);/ }6 `7 A6 M9 E- v/ K$ j- n
    static unsigned int count = 0;3 X3 {* A7 @" P( Z% c
    unsigned char rxData = 0;, Y5 P+ ~0 i; x* N4 R) V
    unsigned int int_id = 0;; I& K8 |0 _2 m6 A
    // 确定中断源8 ?: G0 B  w5 I' i
    int_id = UARTIntStatus(SOC_UART_1_REGS);0 n, ~9 j: ^, b" p0 t) R6 r
    // 清除 UART1 系统中断! x* O3 L# v- E. E
    IntEventClear(SYS_INT_UART1_INT);
6 h0 b: M2 W  U0 L/ e& S- v3 J3 F    // 发送中断
( S! B" V$ Y  @7 i6 j    if(UART_INTID_TX_EMPTY == int_id)7 i0 w; r1 |" [& S! J- R9 H! D1 r
    {
4 E. V. D. J; n3 c% O        if(0 < length)
3 Z  u7 N* M  E, v. G, y% c0 y* L5 S        {- i" e4 {4 g+ v1 q7 O
            // 写一个字节到 THR
# M" P5 n1 M8 x9 H9 a            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);6 r. T# W. M$ D+ L  Y1 F" Q6 T
            length--;. h1 n) @  ]  M+ D1 T$ |0 [# o. t6 H
            count++;. B" F1 C. I5 U4 I6 V, Z5 @% U
        }" v9 W9 c* _; |7 N
        if(0 == length); J, {$ E) h) J7 C% S7 W8 u
        {
' v- F# U2 m; m8 s/ {( d            // 禁用发送中断
9 }0 x* }5 w: X3 m+ ]% I0 V            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
% U$ V% S+ v0 i! w3 r( r0 [7 c        }( ~+ k  @" [' J/ l( P' A6 K
     }  `: c  B' }/ N* J9 U
    // 接收中断
4 N. A: L5 a- \/ t4 `    if(UART_INTID_RX_DATA == int_id), q- g& G# l% g3 m+ G& u
    {
; n9 U7 ^/ E& O8 \        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
: \2 B* J: A, W6 n* \        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
1 H  \5 t  w( ^    }
9 _; w$ v0 a: D* |5 C, a% G    // 接收错误9 E  f' M8 c4 z& i* b
    if(UART_INTID_RX_LINE_STAT == int_id)
3 F: }$ T5 R, O# w) B- R4 i) ^5 t8 i$ |    {8 X) Z; c) v3 A3 c: T
        while(UARTRxErrorGet(SOC_UART_1_REGS))
$ ?7 H  ?4 z% v6 W3 t" \1 K        {) b! x- D$ l7 ?( F1 a* T
            // 从 RBR 读一个字节, L5 x9 @, {# I) f" {. k8 I8 t* @
            UARTCharGetNonBlocking(SOC_UART_1_REGS);2 _, F1 `; [; \5 K/ k6 i
        }
1 X* B# A+ c/ g* ~$ [3 Z    }$ ]  _% q/ O3 ]9 l/ L  v+ y8 p1 z# h
    return;
0 M7 X# I, o1 R" B3 t}
' }  n) W% D! Q' fInt main()' u: y4 r+ S( g3 |0 N1 {9 ?
{
9 ^0 l3 Z5 J3 A0 P+ ` UARTconfig();//uart 配置! j: o/ a* ~$ R# u; o- J( L
    Error_Block eb;2 k/ |" q- G7 v+ k" @
    System_printf("enter main()\n");
" V+ ?6 f) d6 m  `& ^" q8 d' Z6 U    Error_init(&eb);3 C  @2 i% K& A5 _2 E
    // 动态创建硬件中断
/ V+ O4 v: W% g    Hwi_Handle hwi1;4 b) O. V% ~  W& j
    Hwi_Params hwiParams;" e5 g% x9 [# Q7 u8 C
    // 使用默认值初始化参数. d4 `8 f9 t5 r& d
    Hwi_Params_init(&hwiParams);
0 ^) ~0 z8 W: k' i1 ?    // 中断事件0 P1 T. Q0 G2 @8 C$ N0 J  g8 L
    hwiParams.eventId = SYS_INT_UART1_INT;+ [  K1 C& f; }5 `' ]
    // 传递到中断服务函数的参数
3 q- `& a! R8 s/ j# k* M. T    hwiParams.arg = 0;$ v7 L; S8 j/ x% V5 s) V
    // 不允许该中断自身嵌套4 y9 {! t4 \7 A2 g6 p, T
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;4 ~3 I% N7 p) t5 [+ y9 W3 _0 Z
    // 使能中断9 C$ l8 _* \: ^% }' a
    hwiParams.enableInt = true;0 ~7 n0 N0 P' [6 \8 ?
    // 可屏蔽中断 4
9 U5 t7 m9 J: m3 \6 ~    // 中断服务函数 hwiMain
2 m& A. X7 ]% B, N+ {* G6 ]    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
1 x+ k& O: l. @    if (hwi1 == NULL)4 n) e; f/ L- Y2 z8 f
        System_abort("Hwi1 create failed");
! l9 T) n+ C/ {    BIOS_start();    /* does not return */- ~; q7 y3 L7 E. Q* k$ u* U5 \
    return(0);
2 K3 C; j4 M2 q}
; u( @& p$ ^) v4 R3 k  ]' ?/ v( e! F( ~- G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?  ~% F2 g" L! y  O
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点6 P, e! e- H7 Y. w7 w  E7 p
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
7 S& g0 i  Y1 X6 w. o在中断服务函数里放置断点

6 v. o7 G. h. ]7 ]参考 GPIO_KEY
2 c- D- Q' @# U- ^
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 00:55 , Processed in 0.044872 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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