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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
* Z7 N  X* t  O4 ~+ Q// 发送缓存
, V  ]* u: M+ @char Send[] = "UART1 test......\n\r";
+ S* u; e* D# n" o8 o- u3 g6 D- k+ l1 f/ ~- F1 @4 K# t' A
extern void UARTconfig()
8 G' _: r) z; q4 U{( J1 e4 l9 T1 _' t+ v3 P
//使能Uart1
' Q$ T& S. R+ D" N  ^  O' k PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);4 ?4 D: n: _2 M$ ~
' Q, S3 U! B0 r( @8 ?6 v
// 使能 UART1禁用流控) K% ~: w1 _$ f
UARTPinMuxSetup(1, 0);
( a, }- ?* l5 _. F" f" T( ^+ |( |, | 2 v; l) k: Y0 v& _7 z* [
// 波特率 115200 数据位 8 停止位 1 无校验位8 W: ?* c+ {5 E9 k- m
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);! k- c9 v3 [7 z; h, y& V8 K$ ~( i. r

+ t& B8 X- A- P: E  // 使能 UART1
. Y/ l. [# G" v' g6 i1 a8 C! D, S$ k UARTEnable(SOC_UART_1_REGS);7 w" k+ [) [/ d8 i; i
  // 使能接收 / 发送 FIFO1 l0 h! U* S$ G  P; Q
  UARTFIFOEnable(SOC_UART_1_REGS);
2 A1 ~7 Y' d6 f  // 设置 FIFO 级别
2 s. a7 o9 X& @) T: h7 j    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
( a' [+ `3 |% e! Y! }/ [  //Uart1中断使能
6 X+ D5 q4 d$ i, L  unsigned int intFlags = 0;
% P) Q7 P; {( e' B1 s$ F; K  intFlags |= (UART_INT_LINE_STAT  |  \
6 d0 }3 y9 q- g  h; v$ y6 O" w& s  y* c; J  Q            UART_INT_TX_EMPTY |    \
2 ?0 C# y) \/ J3 g/ B- Z. g" ?            UART_INT_RXDATA_CTI);/ U( ]; [0 |" |- D  C! p( ?
            " ^- U' }3 h4 f, v
    UARTIntEnable(SOC_UART_1_REGS, intFlags);. w1 Z8 u1 b  ^. V1 K& D1 d8 |
}
. ^; J7 X- @. c0 V1 T//UART 中断服务函数
8 Z: @* ~2 N- I3 ?" b* Wvoid UARTIsr(UArg arg)! p! t& s) \+ K
{
1 Q1 \7 r0 K; j! q- E    static unsigned int length = sizeof(Send);% C$ p* U/ t/ u  O1 |) s9 P9 y# s6 P
    static unsigned int count = 0;) r; B6 M9 I7 m% ]
    unsigned char rxData = 0;
; ~3 a9 o7 M' X* n. t2 Q    unsigned int int_id = 0;
8 e; ]' P' D' b' ]/ U# {: C    // 确定中断源. D% ]9 j0 d0 n7 h( w3 U
    int_id = UARTIntStatus(SOC_UART_1_REGS);$ d' k: j! N5 f. Y  s0 f
    // 清除 UART1 系统中断. Q0 o7 Q2 K/ F) q: @6 y
    IntEventClear(SYS_INT_UART1_INT);
5 r9 c/ }3 C5 l7 e4 l    // 发送中断" q% X# m9 G, Z9 V9 k
    if(UART_INTID_TX_EMPTY == int_id)' A2 z& g2 E' q
    {/ m: U2 U6 d' K# T- l4 U
        if(0 < length)- G; i. Y1 O  u/ \, f
        {+ W) I6 g; [- J
            // 写一个字节到 THR, g' T. Z: h; C( O! z; G
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
) f- P" L( m. L( e            length--;. a# D+ K2 J. x8 F; K
            count++;
7 p; h; _( \! B' U        }
6 j0 X( l$ r0 q4 `. c$ _( e" J8 F        if(0 == length)" z2 C/ q; \$ w7 S3 Q
        {  B+ v! k2 {$ v/ R' X9 u
            // 禁用发送中断$ k3 p/ y5 v% g
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);& z9 q( r( I, n; s$ O/ T
        }) k: e/ I- T$ C) c) @( v
     }! X3 k& H  [( s- W+ v' L
    // 接收中断) Y1 ]5 E6 W1 r
    if(UART_INTID_RX_DATA == int_id)/ Q. }' J0 A( O' B* S" W/ _
    {: i1 t+ l4 `! y0 v: q1 Y+ a
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);$ b4 O, ?( t& w
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);3 b! H7 Z% h; r# @8 w( r
    }
$ {# |% b$ L  K) x+ @1 J    // 接收错误
+ ]& ^6 y6 M1 J9 @4 @$ D    if(UART_INTID_RX_LINE_STAT == int_id)7 E  \8 n! O( K% ~0 a, e1 N
    {! W3 A0 _  N4 y
        while(UARTRxErrorGet(SOC_UART_1_REGS))
$ O. ^: ?: ?: ~8 E, s: g4 [        {
* F8 K- h) m+ ~( c4 R9 Y0 K1 I2 u            // 从 RBR 读一个字节
, ?% o2 m3 W8 f* ^& I% G- A            UARTCharGetNonBlocking(SOC_UART_1_REGS);$ _( \8 J0 P  N
        }
1 x% J' n, l" K5 D" x) d; j    }
+ y  o% j6 @6 h% Q    return;
4 Y( f8 F9 X  i2 G4 g}( h2 I2 u' l! M4 k, a) [
Int main()$ ?9 j# L3 D9 \1 x7 E: V
{
- a5 Q- ]* `1 g5 ?, O" {. k4 E UARTconfig();//uart 配置( x/ B1 H1 s" ]) ]: Q3 D
    Error_Block eb;
1 C; P0 H. u' M& U( Y! R$ @    System_printf("enter main()\n");6 ^& W7 m! O5 O/ W; J$ o' q/ s# E
    Error_init(&eb);7 }% h! ^$ [0 t! g# E
    // 动态创建硬件中断3 _* C; q7 L5 r% m6 \9 M* D: q  n
    Hwi_Handle hwi1;
- s4 S6 d8 a- {# d& Z    Hwi_Params hwiParams;
9 @" P& s6 h: d9 E' V    // 使用默认值初始化参数  y3 Q0 M0 E9 N0 m  {# O5 g
    Hwi_Params_init(&hwiParams);
! b* D+ ~$ Q4 Q7 f5 t    // 中断事件: N' z- y+ m# B9 x3 D! C/ C
    hwiParams.eventId = SYS_INT_UART1_INT;
  j: b) h/ `# c    // 传递到中断服务函数的参数" F5 d0 ?: z! [2 B4 b8 D5 P# `
    hwiParams.arg = 0;
# p( \' G" }& R6 s' ?6 {' s! b3 j" X    // 不允许该中断自身嵌套
' d  d; Q2 \' ^7 z. E1 Y  _    hwiParams.maskSetting = Hwi_MaskingOption_SELF;- I+ ]; K4 a7 H8 U' o8 t
    // 使能中断
6 C& r8 U. c4 L0 H6 ]    hwiParams.enableInt = true;
, M6 W5 {, e% ^: L% P    // 可屏蔽中断 4
" P$ L& _' H8 V1 {. @    // 中断服务函数 hwiMain& @& G. n2 W, a, [" ~8 D# |
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
3 p2 F4 h+ `0 ^    if (hwi1 == NULL)
* j. K# n" V6 v  G. |+ J. h+ ]        System_abort("Hwi1 create failed");+ A' H# z# k) _3 e7 p$ O
    BIOS_start();    /* does not return */
+ R# m+ ~9 X- F! X' s    return(0);# q/ {9 a4 e% d6 `& A1 ^
}# B' Y/ s& c3 s  Z* @
" d- z, R% t+ s9 e* `2 \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

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

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
& G1 M+ G& Q  }5 C: h
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
( d4 f" k& ?+ o) f: s" p( H在中断服务函数里放置断点
& V& k7 E  _. ?* m) N
参考 GPIO_KEY' a, O5 z0 Q. N* ]+ X( g; @) _
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-3 20:49 , Processed in 0.046994 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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