嵌入式开发者社区

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

作者: Greatwang    时间: 2014-12-1 14:52
标题: 在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下5 F& o; `+ f  E6 i, x% t: n
// 发送缓存
; {, ~4 ]) M- \char Send[] = "UART1 test......\n\r";
% z& i8 M! r% {: J$ n
, o4 T9 e) M0 t. m3 E0 n$ yextern void UARTconfig()0 q4 \, |7 C+ V! f; g, ~- Q) z
{& f' W- E% l' _1 e
//使能Uart1
- Z9 K" ?2 R' X PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
, F: P7 q( q0 a4 p5 n/ k' S9 P ) b- Z- P  ]# V. y7 }" i9 Q  i/ U
// 使能 UART1禁用流控
: i* n# I7 K+ b! A0 O4 q% _ UARTPinMuxSetup(1, 0);9 }7 q- g( j& h$ S1 X

$ t# l. x$ {8 H2 [* I; ^* P! x // 波特率 115200 数据位 8 停止位 1 无校验位5 s% m: J* s" O- P/ l
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);) v$ `* F) ]: h6 z1 O

) f! V4 M8 V9 f8 a2 b  {, I, t7 @; \  // 使能 UART1
' r. D( u  r' f  k/ ?4 p' u UARTEnable(SOC_UART_1_REGS);2 L% \: v% R# C9 L2 ?
  // 使能接收 / 发送 FIFO
# i' A: m  v/ i+ D! ^4 Q8 d1 x" g' J  UARTFIFOEnable(SOC_UART_1_REGS);# @. g( E7 [1 v* s- K6 I: q
  // 设置 FIFO 级别
: m9 v, b# H2 Y* x# O6 @# K    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
9 L2 V/ l( S5 S" J. j+ n  //Uart1中断使能4 l$ B2 F4 ^7 h, d5 N8 |* ~" Q' q, `
  unsigned int intFlags = 0;8 i5 {$ r4 X3 D2 l/ N/ z$ r* `
  intFlags |= (UART_INT_LINE_STAT  |  \& B  M; C. W7 p9 r# O
            UART_INT_TX_EMPTY |    \
0 b2 t( q8 H2 a  G2 ~2 N3 y1 p            UART_INT_RXDATA_CTI);* A# n" K1 M& A) V& C
            * ?, q& N# p" V2 O9 k
    UARTIntEnable(SOC_UART_1_REGS, intFlags);6 y4 b0 _$ C( Z9 H* u
}
! z' Q# A+ i: \, ^1 s, o//UART 中断服务函数: {( Q$ n5 {3 i" I% G
void UARTIsr(UArg arg)+ \+ g( C, n" r9 v4 V& B; O  n
{
5 k$ \! e% e4 b. h/ g    static unsigned int length = sizeof(Send);( M1 \9 J& A, L2 o1 D
    static unsigned int count = 0;- u9 L5 T) M5 P
    unsigned char rxData = 0;# c9 V7 D6 ~& D/ j
    unsigned int int_id = 0;6 S! H: }+ F  U3 Y# d
    // 确定中断源
% m6 Z9 Z$ ~8 c# `' |    int_id = UARTIntStatus(SOC_UART_1_REGS);. }% L$ g9 I# |& E7 \! O% m
    // 清除 UART1 系统中断
+ r# @+ i- L$ G, X0 O) F$ |    IntEventClear(SYS_INT_UART1_INT);
4 K5 J$ ?  m% v4 C; q    // 发送中断
7 v' P9 Q* k" M0 c    if(UART_INTID_TX_EMPTY == int_id)
; c+ W& G; ?6 h9 f2 A    {8 I/ u, E/ ~8 u+ U+ Z! V
        if(0 < length)* w4 s# M$ w6 W5 g4 f, D" b  |
        {
" W- r; ~' o, }+ k; C            // 写一个字节到 THR) p% M* G. U" `, i, c: b
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
. a* N4 s( b; @: F/ Z6 O5 @% ]            length--;0 ]% v9 k+ G1 ^0 K% N
            count++;
: C' Z/ u; k4 _        }0 X; e6 M7 x( t* T
        if(0 == length)
: Z; X/ ]' P8 S4 x* Z; V        {
) z& U/ g: q6 U9 Y8 `, H; _            // 禁用发送中断7 P5 ?8 `" g* Q8 o! o- g
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);) b, G% X6 O) O3 C
        }- x0 Y" Y2 u6 B+ j; }  ?4 N" b7 l
     }
! ?; X$ B$ b8 }    // 接收中断
- l9 X/ m3 ~' I" @) z. A& U* R* |    if(UART_INTID_RX_DATA == int_id): b( [# }- m- z
    {, g, j: H% |3 y4 J- x
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
' ?. n$ u+ z$ l- C3 L4 W        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);- F( Y* X+ T  \6 W& J
    }
- g4 x) J# W4 u9 ~( V1 G! t) T    // 接收错误& O, A7 k4 u; Q* _$ \% p7 y
    if(UART_INTID_RX_LINE_STAT == int_id)
+ _3 ?0 f" C' r  u: o3 [    {
+ f1 T- V" k6 c& I        while(UARTRxErrorGet(SOC_UART_1_REGS))
2 \3 S3 O% p3 R' @5 C        {
1 _/ ?4 Y* b- L% `" h4 X6 U" w  E            // 从 RBR 读一个字节7 q' H' w! X4 _
            UARTCharGetNonBlocking(SOC_UART_1_REGS);
" b0 y0 a- u7 r. z% l& ]( ?0 g        }, O. Z) Z3 y; [+ e/ c4 y
    }
2 b% [/ J* u: f    return;* u) v- v4 c! I0 @6 Z$ [" _
}$ q+ d6 }4 `% B8 l
Int main()" q3 ]) T# P/ M) w; c" Q
{
- v4 m3 M& `% n UARTconfig();//uart 配置' L: z; {; k! e9 S( P* Q
    Error_Block eb;6 r5 |+ {1 ~5 s1 K& H- ~$ ?
    System_printf("enter main()\n");
9 s2 ]0 M$ u# p" F# B  e8 F3 w# V    Error_init(&eb);0 y7 G) g% E8 M$ O  ^
    // 动态创建硬件中断$ ]! ~1 E# h/ @& |
    Hwi_Handle hwi1;
+ w) F0 c6 t) a. P    Hwi_Params hwiParams;5 D* A( G& S! S. @
    // 使用默认值初始化参数8 V$ L, }* Q. L' S
    Hwi_Params_init(&hwiParams);8 p. r) X: G  c) Z/ p' ]
    // 中断事件
4 s% `, J: }! a    hwiParams.eventId = SYS_INT_UART1_INT;( f" S. K% C% k. K7 \
    // 传递到中断服务函数的参数  o/ _( F& y( D" L5 ?0 W1 e
    hwiParams.arg = 0;
4 p. r' \5 c) v2 @3 {3 K    // 不允许该中断自身嵌套7 b- M7 D, w& X% g7 ]4 y% [
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;/ g6 J) q. U/ {4 t' T
    // 使能中断: V4 U% d+ [9 @( y$ R
    hwiParams.enableInt = true;6 Y3 L( r; `; |/ }
    // 可屏蔽中断 4
* I( U) F$ e( W% h    // 中断服务函数 hwiMain: k1 ]' D7 F7 b0 t; J5 l6 U7 D7 i4 D
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);6 Z9 [: g6 C" s
    if (hwi1 == NULL); U3 n+ [9 F6 B. y0 @
        System_abort("Hwi1 create failed");
5 }' j' m1 @; k    BIOS_start();    /* does not return */
, B; g. P5 N5 s) y1 l, j: k    return(0);
% g( b  u4 Q+ a" d}
  z# Q( A9 ^* l" _( `, p; E; {" f8 E

作者: 希望缄默    时间: 2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?/ j& b8 }- z) w( \" U1 ]+ [

作者: Greatwang    时间: 2014-12-1 21:49
在中断服务函数里放置断点
' ]5 w% A7 ?9 q5 g# ^6 H
作者: 希望缄默    时间: 2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49  ?4 m1 Y3 J& w# O! o4 ]
在中断服务函数里放置断点
$ G; U6 t  P- M. m# Q0 R6 b8 `
参考 GPIO_KEY
0 p) i* m$ }! m& u  V- R
作者: cchwhk    时间: 2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了




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