嵌入式开发者社区

标题: 在sysbios下,uart中断收发数据,程序无法进入中断 [打印本页]

作者: Greatwang    时间: 2014-12-1 14:52
标题: 在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
& H5 R& O% |5 Q$ \# u' s// 发送缓存
5 `& P! I! c) I; ychar Send[] = "UART1 test......\n\r";
" ?) W& w9 M  a$ N# T  h! Q) |) Z" j) t$ }
extern void UARTconfig()5 A. ]2 q9 g& i: m
{
. Y1 H7 n, a& n: e! g //使能Uart1
& j: i0 R8 A) }: R" C2 f PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
' A/ b, p" u8 d' p; p" ]1 c4 D& ~% o6 j 8 a& {  E6 i: x* h. f. A
// 使能 UART1禁用流控
" e( x3 z; K$ U: p0 t UARTPinMuxSetup(1, 0);/ j" U1 g3 L0 T2 O- Z& ?, t6 l! t

$ S6 e" o5 j0 C0 ^8 L6 | // 波特率 115200 数据位 8 停止位 1 无校验位0 O  N$ i( I* h% U( p3 S/ i
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);) I4 a6 l. D# ]! N) @
, {- R6 V: _- y- u3 P7 {
  // 使能 UART1
; R& J4 s. V1 [8 i6 w; Y4 k UARTEnable(SOC_UART_1_REGS);; R% @5 W1 l) E5 ]! d/ g
  // 使能接收 / 发送 FIFO+ ]4 [  l* W+ @/ y- b1 _* G4 O
  UARTFIFOEnable(SOC_UART_1_REGS);! K9 I* `9 S6 @$ p4 L% k$ Q& }
  // 设置 FIFO 级别
1 |6 ^3 u- i1 g7 A- y    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);! A: U, y/ M0 q' p# Z% H
  //Uart1中断使能  y  r$ _+ @: Y# L
  unsigned int intFlags = 0;6 S( k$ ^5 N% q( c
  intFlags |= (UART_INT_LINE_STAT  |  \
3 M/ ]8 h! G) k0 @  N! p$ q            UART_INT_TX_EMPTY |    \3 a  `: M$ P! v) {6 ?* Z* v
            UART_INT_RXDATA_CTI);
$ S9 f% `& {. w            
% @$ \3 y/ q: h6 a3 D    UARTIntEnable(SOC_UART_1_REGS, intFlags);
3 q( E$ q9 O2 K% n; t; X) d}
! j: A& n. m$ K1 u1 P  e* o//UART 中断服务函数
' `7 B( @# @* {$ ?/ F. ?% ^void UARTIsr(UArg arg)
  m, o: z, F/ G1 R2 p" O5 h9 }& ~{1 N" I" B; \8 k2 w, c
    static unsigned int length = sizeof(Send);/ r4 C0 r, k  t
    static unsigned int count = 0;
# y( t+ I% Q1 m! X6 h# |3 V) X# b    unsigned char rxData = 0;. v4 L/ U. q( U2 A8 s
    unsigned int int_id = 0;# T5 P" x# \' J5 p6 t2 p7 T9 o5 G7 y' W
    // 确定中断源) W0 g- u  }6 P+ G* k, C" F
    int_id = UARTIntStatus(SOC_UART_1_REGS);2 i7 P5 c7 F. V, n  N3 w. q
    // 清除 UART1 系统中断9 q; x7 f5 J) ?
    IntEventClear(SYS_INT_UART1_INT);
) g4 {5 `, j  j    // 发送中断
0 v& w( {- w& K  y5 t8 R, V    if(UART_INTID_TX_EMPTY == int_id)
# W- i. S$ h0 M) R0 n    {
! w/ @6 }. ?8 m; ]7 N. C0 y        if(0 < length)
. t! w2 G; E% j3 Y& x        {# p. w5 H4 o% x* q  C, M1 g
            // 写一个字节到 THR% L) B/ T! X: R( G% N. [/ O) l
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
. N; {3 k( I0 {' m1 G            length--;$ {$ `1 O2 v$ ]3 l* u% B+ N
            count++;# o2 \# P& {7 T; f0 @$ x
        }0 e  W$ x; J4 Q# C$ C0 }4 `% r  M
        if(0 == length)
7 C$ d! s9 f0 Y        {: D+ z! z3 W( e$ N) L6 f; ~
            // 禁用发送中断( E8 S" f1 \. A" G7 [. z: O* }
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);  y8 {5 R* f' z
        }. F3 z9 w' r( I( F' O* ]
     }: H1 b" k0 `* h# n+ W
    // 接收中断
/ m" U/ @8 k4 c% {6 Q    if(UART_INTID_RX_DATA == int_id)" @- A' l" S; D9 j
    {7 ]; B5 Z( R8 X7 S4 o
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
! f& |* ?& O0 W) w/ J, t        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
$ J* Z% Y' s/ J    }+ R  A2 W' ?% S. A7 s# @; D
    // 接收错误4 ~. s: ?' S0 I* `
    if(UART_INTID_RX_LINE_STAT == int_id)5 w* d) S6 e  e' H8 z  e! ^
    {3 @% v0 m0 g2 B3 p$ x- b9 s& o
        while(UARTRxErrorGet(SOC_UART_1_REGS))
, s; H6 f, p  V. {. W4 l- Z- r- C* C        {+ N' t  A7 ~5 D" |
            // 从 RBR 读一个字节% U* X0 ]7 ]4 l& ]9 Z( u
            UARTCharGetNonBlocking(SOC_UART_1_REGS);4 A" L; z% I; B( C$ J0 G) C
        }  E* G; [+ G' e# r0 y
    }
" i. B  I$ N: a/ ^- o+ m    return;
- V/ R$ `; B& N1 A}
3 Z2 r2 n5 [* T) WInt main()4 ]/ k3 Q) ]! {# V: V8 ?9 G0 y. V; J( }1 B
{   ~/ D; u# W1 Y2 R& ~7 }
UARTconfig();//uart 配置
' L$ Y# g4 d) e* I    Error_Block eb;2 \8 [- {* I" k0 F/ R3 E: i
    System_printf("enter main()\n");' P& R0 _2 ^1 @' l# X0 L$ b' F1 B
    Error_init(&eb);
' w4 s) j; G* U# {% w    // 动态创建硬件中断8 s# d' {! [- f# d" K
    Hwi_Handle hwi1;
- ~8 p' F$ n( F: Q- O8 X0 f    Hwi_Params hwiParams;
# ?1 n( N; U9 m2 e$ L. r3 b7 P    // 使用默认值初始化参数* a1 Q5 |' d! t
    Hwi_Params_init(&hwiParams);
: d% T/ Z- t; j5 L" Q7 }$ z* J& L    // 中断事件
" d+ |, a. v9 Q- k$ ~# J7 |1 B    hwiParams.eventId = SYS_INT_UART1_INT;1 ~/ p& n3 Q6 S! V# }: l
    // 传递到中断服务函数的参数
& T& Y* W3 ]7 b$ `    hwiParams.arg = 0;8 L5 e: _3 D  D4 L, u# w# b
    // 不允许该中断自身嵌套
8 e+ J, L6 S: ^- k2 S0 z2 J1 f    hwiParams.maskSetting = Hwi_MaskingOption_SELF;$ Y1 d- w8 ?! k4 u* w
    // 使能中断% Q9 ^2 F" e, g& n: I2 P
    hwiParams.enableInt = true;: d( k5 g' X2 V9 N4 e
    // 可屏蔽中断 4! v; f' _5 F1 f: @3 d  T
    // 中断服务函数 hwiMain
& v! C9 T9 B+ ]; j$ _$ c3 \    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
& Z/ a  \& B. r6 q4 J    if (hwi1 == NULL)
* N' _9 s) R$ V$ X        System_abort("Hwi1 create failed");
! E3 ^: b* v: a5 S, {* {& j# s    BIOS_start();    /* does not return */0 I& m/ q9 {6 b  G3 }. I) }
    return(0);
3 N. e' z* k5 S& v1 ^7 Z, ]  J}( A  v! i' u: H% g8 a8 H
* W  q0 E6 S: b! L

作者: 希望缄默    时间: 2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?
- D3 T  r- |" u" E, F: P6 b
作者: Greatwang    时间: 2014-12-1 21:49
在中断服务函数里放置断点1 @9 _$ B( Q4 L- F. E' i

作者: 希望缄默    时间: 2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49
: t) P) |, A* r& P在中断服务函数里放置断点

  i1 y5 q" B% j  H: o参考 GPIO_KEY0 X6 _$ p$ ^! D7 Q5 B: N3 z0 ]

作者: cchwhk    时间: 2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4