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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
. `7 c% g# P4 r' l// 发送缓存
# o: }; }) Q& n7 G# Ochar Send[] = "UART1 test......\n\r";: y6 `; R* {9 p: r6 Q

5 N% |. R  i( S( `extern void UARTconfig()+ S+ }3 P6 }" r
{* `. z7 n% k( t# r5 Y  a0 J5 M
//使能Uart1, F$ K: p9 @! v6 _6 ]5 |1 B
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
( d  w# O# e  ~6 _" l7 l7 R 2 O! h# p( b/ F! s" V
// 使能 UART1禁用流控
! t8 a0 b4 I3 g9 j4 P/ _  [, \) V. @ UARTPinMuxSetup(1, 0);
: \! b0 _0 u" m1 O% t+ T* b5 A1 N( r + v) Q, [, b6 q5 A! Z
// 波特率 115200 数据位 8 停止位 1 无校验位9 c, `* B( Z9 n" ?# `
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
+ z. p7 ?0 e0 s; i. Q( K1 [ 7 ~3 k/ e+ Q: z: c5 D
  // 使能 UART12 y" ?, ~" ~- a: D8 [
UARTEnable(SOC_UART_1_REGS);
! S; c6 U) x* Z  // 使能接收 / 发送 FIFO
" Z" L5 ~* w! T! e( X  UARTFIFOEnable(SOC_UART_1_REGS);  }* x# `( P& D6 ^
  // 设置 FIFO 级别
$ E- g6 {  F0 b5 @7 j& G    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);' p4 W4 P0 e5 g
  //Uart1中断使能
# |$ ^( b! j6 J5 O& s/ D  unsigned int intFlags = 0;
2 l) v& I9 A1 U0 E" h  intFlags |= (UART_INT_LINE_STAT  |  \
( S: U4 W! m2 Z+ v6 K            UART_INT_TX_EMPTY |    \
6 ~' M- e6 w2 {3 A6 z            UART_INT_RXDATA_CTI);
3 P5 j& p( n/ b$ t0 N& {# ?# M            4 z. R0 x5 {2 c$ h+ V, d  n. m
    UARTIntEnable(SOC_UART_1_REGS, intFlags);$ ]  h1 ^9 D" o4 y* [' z
}
' g) i5 z5 r& A7 m  a8 J//UART 中断服务函数. @8 x" h8 R2 M* D3 T/ z. e" s5 m
void UARTIsr(UArg arg)
( L! ?; w" j: Y) @{
/ `% V" ?# T9 o, ~    static unsigned int length = sizeof(Send);: y- @. `( x( Y. d- ]
    static unsigned int count = 0;
: k+ u6 z! ?8 I) z8 O% M    unsigned char rxData = 0;
6 S7 Z  ]0 f: X0 a. X    unsigned int int_id = 0;
( Y) ?3 K* B8 t    // 确定中断源
' j. D0 O( _; r3 f$ w    int_id = UARTIntStatus(SOC_UART_1_REGS);0 {* L# K+ n6 D! M  p
    // 清除 UART1 系统中断
6 a4 q+ ~' B# S7 o2 N3 a* w    IntEventClear(SYS_INT_UART1_INT);  D  c9 l$ P' N
    // 发送中断
7 u, C6 R  n7 L' P0 B, d5 U    if(UART_INTID_TX_EMPTY == int_id)
+ q# b7 g2 G! }1 Z0 a) ?    {( |, }3 _6 G* K/ I; I, _
        if(0 < length)# t6 Q9 J& [! V1 q( R  l0 _
        {+ m+ c$ U5 R; Q1 [. a' X, X
            // 写一个字节到 THR
1 _* J9 K) M2 T. j9 x            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);3 F' [# p2 z, {% H( b
            length--;
1 o  `& v, K, a* ?            count++;& S0 }# V' y7 ]0 Y& R
        }
" k& V* g( p/ H8 l. m" ~1 }# {        if(0 == length). m! ]/ ^$ V  P" c9 ]" G) K: r6 z
        {
& v9 U9 @: ?$ A            // 禁用发送中断
3 P* q! F/ p. g            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
! j5 s# X/ [' [3 O        }
5 B) S5 k, E9 ^1 t# k$ ?& _8 [     }
" h1 G: [5 k4 M$ |4 g7 M2 V    // 接收中断
, ^2 @; `# t, p1 p/ I/ q  U8 t    if(UART_INTID_RX_DATA == int_id)1 p0 ?; G' m) R, s7 E7 c+ g  x! N
    {
( v0 }9 S7 q0 c$ Y, p  s        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);  v' b5 Z- a- h% l
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);  w- ?, b4 |: R. V
    }
4 J' R: k2 f, G7 J    // 接收错误
6 A0 R7 y! r* r1 U! L5 z    if(UART_INTID_RX_LINE_STAT == int_id)
# [" @& S% g7 C3 i    {
* D' ]7 v0 k- L3 Z* f2 M        while(UARTRxErrorGet(SOC_UART_1_REGS))7 u" L; p/ }; r0 r" P) P8 s) {1 U$ ~
        {) X, v7 a6 V' R1 e& _
            // 从 RBR 读一个字节' Z+ d+ J" N4 l0 Z
            UARTCharGetNonBlocking(SOC_UART_1_REGS);+ e  N0 ~* `. M
        }
, T7 u5 }0 L( V& ~. E( w& v2 ]2 i    }
! O2 ~6 H  @' }1 I    return;, L" E. h/ E3 M6 N! Z/ k5 r
}( I) H! O& l) j
Int main()
, o  M8 H1 ^8 \. B{ $ v6 p0 o. V% A) w  f! ]" }* ]* ^
UARTconfig();//uart 配置
) A# R) C: T' q1 h9 T* S    Error_Block eb;* l9 L5 }* @, u7 O/ G4 i
    System_printf("enter main()\n");
% Q# ~6 Z7 N5 i3 X4 D% i3 d8 @& Y    Error_init(&eb);
, X; m- a1 Z: Z$ D: A    // 动态创建硬件中断: H$ M, _5 X) b6 a4 i. W3 L2 K
    Hwi_Handle hwi1;
0 [, E: e. u! {; O% b8 `, H4 G4 R    Hwi_Params hwiParams;: f. o! g$ v( r
    // 使用默认值初始化参数
: U  T5 W. S2 E( @3 u    Hwi_Params_init(&hwiParams);
5 g* `: k/ }6 C/ N/ r    // 中断事件; J" C; g- D) z4 @
    hwiParams.eventId = SYS_INT_UART1_INT;
: l, R9 K4 {, h( n/ X    // 传递到中断服务函数的参数) [! r+ s% q, C' V% |) x# ?
    hwiParams.arg = 0;
$ n% m8 v0 r& b4 N. p0 C    // 不允许该中断自身嵌套' Z3 I5 V1 W, {% @- D
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;. t% B0 x) P8 ^5 N
    // 使能中断
7 W4 ?: ~; M9 Q5 z$ s    hwiParams.enableInt = true;  v* X) X/ m, C7 Z! I) j" [! ]
    // 可屏蔽中断 4
; H4 C+ [6 i9 Q    // 中断服务函数 hwiMain! ?* K  R$ B+ ]' C
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
" B0 V& V& J7 ?0 B    if (hwi1 == NULL)
* V( A5 I5 S6 l1 I: H; }, D        System_abort("Hwi1 create failed");& Z( u  m* W+ P0 E% e1 N. H
    BIOS_start();    /* does not return */
! u0 y5 k/ X  M+ C% e8 K    return(0);
; n+ t0 J# @0 ~# J}0 p2 h  S: [- q& B+ e9 A
  f3 \' m6 J% `. r0 q# t$ E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
+ A8 i- K! M. r在中断服务函数里放置断点
. g  T$ U. Q" G2 F
参考 GPIO_KEY
0 C# C* p$ {. t! Y& W" J
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点; L; R- P1 c/ R
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?' |. u0 z$ n4 z: t
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-26 00:44 , Processed in 0.067409 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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