在sysbios下,uart中断收发数据,程序无法进入中断 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下0 T1 w  t3 ?/ S- \2 s8 Z
// 发送缓存
3 B& R8 ?) Q/ ^& Xchar Send[] = "UART1 test......\n\r";% E2 P5 p( c7 u& y& J

0 Y' @0 F8 `8 j! O* V5 pextern void UARTconfig()2 x* j! ?* X0 X. ?) ?' I5 A& Y. H4 \# V
{1 ~1 V% h( a+ z; K% }) R3 |
//使能Uart1
0 A' t1 W3 K8 x- j6 ? PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);& i! C9 E9 y& O

1 ?' v. M- Y  a/ Y) c" K // 使能 UART1禁用流控
  I: C8 D. l& z UARTPinMuxSetup(1, 0);
8 }) X! T7 c+ k* R, f8 i   |$ U' o% M' m% n8 i' n
// 波特率 115200 数据位 8 停止位 1 无校验位
- r( X0 V" ^) l" Y' e6 B9 _  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);: @5 r2 q& v5 T% G

' s. C1 v. g6 j' t. ]- _4 R. t3 e/ H  // 使能 UART18 ?' [% ~& i# v& D
UARTEnable(SOC_UART_1_REGS);$ ^% v, i. b5 ~2 d
  // 使能接收 / 发送 FIFO. f( a, N1 v9 s+ H: O7 f+ I
  UARTFIFOEnable(SOC_UART_1_REGS);
5 `1 O! R5 ~7 f. m2 n% ]& l9 G  // 设置 FIFO 级别) g. M( E! C* d! L8 [! j
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
8 D5 d  F$ p) b3 {8 O: j' G' \  //Uart1中断使能
  l5 F3 P0 Z. n3 M1 W. ]% n  unsigned int intFlags = 0;6 N. k. J6 C& V# u2 `
  intFlags |= (UART_INT_LINE_STAT  |  \; \( w1 n, |1 j4 M% D
            UART_INT_TX_EMPTY |    \
" V  Z" x- n' v1 q, [            UART_INT_RXDATA_CTI);3 D. S& A$ t9 a* D! p
            # \- N, z. j& K' c3 U4 R5 X
    UARTIntEnable(SOC_UART_1_REGS, intFlags);* W% x% B5 m) O4 s( c2 X
}  n  m' [0 Y& A& g& M
//UART 中断服务函数
* B" m1 X( l1 H. l+ Q. R3 ]void UARTIsr(UArg arg). z& }; o8 r* C) D4 Q. o
{) q* `. j. |* u' h" E0 l, M
    static unsigned int length = sizeof(Send);1 }* R2 i6 K' K
    static unsigned int count = 0;' X0 L5 }' m5 {  A! \- _
    unsigned char rxData = 0;
5 @2 D$ B$ N- N    unsigned int int_id = 0;, B2 J* Z& Y$ c$ j" ~
    // 确定中断源$ X, q$ ?. u) c. E" u
    int_id = UARTIntStatus(SOC_UART_1_REGS);- z6 _2 w% h( }8 {8 k. O
    // 清除 UART1 系统中断$ j( \; v6 G% ^
    IntEventClear(SYS_INT_UART1_INT);  \0 k+ w8 i" f8 n0 G: \9 o
    // 发送中断
, n: D: n" |: f    if(UART_INTID_TX_EMPTY == int_id)$ R' W7 w: r. L7 a2 V8 i. T$ h
    {
4 G" x0 E# H. t9 j" i0 u        if(0 < length)
* Q, c, t! m" t& y2 {$ C" [$ u        {
1 I. n) n5 p6 m4 b1 J5 c/ w4 A            // 写一个字节到 THR" v: H$ A4 A& {
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
5 v, V3 ~5 g9 A+ T1 z" z            length--;
% Y3 g+ `$ K- }1 e+ z# I, t4 V7 i( h            count++;/ Y6 f  H5 C* v- x  t; d
        }
2 W' L  c; j/ U9 k2 W- P        if(0 == length)
8 L3 w! D8 r; h/ V        {- R# I8 a6 ~  {' O
            // 禁用发送中断% V! Q# N/ O2 ~8 R$ a% x
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
- {$ ]: A9 p. t8 B9 U) m) W1 A7 t        }
5 q' f2 B+ X) E3 t1 a  {' j" b     }- }7 P8 c- m8 ~5 Y
    // 接收中断3 ~# P  y+ t0 D( u( a4 S
    if(UART_INTID_RX_DATA == int_id)! U( N2 f" m8 @8 I
    {
) x! j6 M" m6 `+ Y) V( S        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
  K" \% i4 l0 N3 K* T7 J) y0 H        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
% b& y  S  b0 `" P/ Z0 D: c. ]    }" G  o/ ?. M& H* h: Y% R
    // 接收错误
5 `' D% J* G, }7 e    if(UART_INTID_RX_LINE_STAT == int_id)/ M+ ?5 G% G+ b1 j& }; v6 b% Q# _
    {+ i8 I" q/ b0 ?9 O& t
        while(UARTRxErrorGet(SOC_UART_1_REGS))- Q( h6 {' q+ D
        {
6 M/ ]% r0 W7 n( n3 _            // 从 RBR 读一个字节3 F& e; c# D. ^6 L; t6 x
            UARTCharGetNonBlocking(SOC_UART_1_REGS);
3 H8 A- D: E) n$ d        }/ p  ~$ c" o3 u/ o. [1 o
    }
1 |! l* e. }9 p. I, e3 E, {    return;
: T% i9 r5 @# X* o; n}. i. U7 l  N& Q8 Q$ }
Int main()% O4 f/ v( ?$ N. B6 W" x$ L0 c
{ " l) Z) U! @  U; B( G2 }9 t
UARTconfig();//uart 配置
- r6 U  Y4 U9 }) {1 w    Error_Block eb;
6 C3 p& ]% x1 u" o& H/ d    System_printf("enter main()\n");
! t. L, z  |. J9 t, |) l+ f% J    Error_init(&eb);
+ U. D/ j# }  ~- N    // 动态创建硬件中断
; g- R4 C3 p+ o- J) J3 M4 ]    Hwi_Handle hwi1;2 ^% k' p' _/ T6 r+ l
    Hwi_Params hwiParams;
: y% u) {* T% F9 q. M/ o    // 使用默认值初始化参数$ Z/ x* [* t% C# g
    Hwi_Params_init(&hwiParams);5 `3 _% L2 W9 n
    // 中断事件
2 t" |& {6 i9 B    hwiParams.eventId = SYS_INT_UART1_INT;
3 {9 D" H# O4 G" |7 R2 O- `& y    // 传递到中断服务函数的参数8 x" t& d4 M+ F. Q" A( C# Z; n; F
    hwiParams.arg = 0;# I( B  |7 a8 ?" `+ c% V
    // 不允许该中断自身嵌套
3 D2 `$ ]" [* {, L  s    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
) v& n4 v2 g; v6 F; y    // 使能中断( l# O' k% y3 R# y
    hwiParams.enableInt = true;
3 H+ J  d! n( `9 z+ e7 ^    // 可屏蔽中断 4
, i2 p% q, d; Y0 a' Z. X  I" d    // 中断服务函数 hwiMain6 G& g) f8 z6 p+ ?
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);: w) W/ B( p. a
    if (hwi1 == NULL)
' T: S4 U9 \# Z        System_abort("Hwi1 create failed");* ?1 `4 O1 t" s! R; D. {7 Q) }
    BIOS_start();    /* does not return */( Z/ ?9 J: K8 }
    return(0);4 w) N, d$ a* [% O  M
}
& j5 T" |7 [7 b, R- [, q( J- h; U$ s/ j8 N# b8 q* ~$ B  {, P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
. W+ s9 M4 k: [6 a
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点; g/ i5 l0 M( s& M1 K2 E
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
2 d' ^: m3 g; m: T  ^4 Z3 B在中断服务函数里放置断点
5 ?+ N. U! ?: h+ I
参考 GPIO_KEY4 |2 p' |+ Q+ V- o
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-1-24 05:57 , Processed in 0.043152 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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