嵌入式开发者社区

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

作者: Greatwang    时间: 2014-12-1 14:52
标题: 在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
3 p, z, d( u/ I5 d  Q) ^+ b& d// 发送缓存1 W9 E, ~; k9 b! O, n# r
char Send[] = "UART1 test......\n\r";
4 |' [5 b+ G2 J) Y5 u. ?7 p  M0 ]& J
7 M8 Y4 a. A2 ~( h( C9 lextern void UARTconfig()
$ V% i% I# X( k( E- p{( G9 r* X+ g# B1 I/ I  b! x9 j
//使能Uart1
# P4 P7 w8 c& i PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
& `3 O- g: `% J ! K! y. }$ x4 G  P' e
// 使能 UART1禁用流控
0 ~; ?+ Y/ @2 _  J  J$ b6 q7 t UARTPinMuxSetup(1, 0);
  X; ?  D6 S( T/ a- G$ g0 m( O8 \ ! ^# m9 M4 o; I
// 波特率 115200 数据位 8 停止位 1 无校验位
) b. z4 R  _0 `9 D. F  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);/ O  S) u; p9 h9 h  _, w0 J  g5 m6 l

( F; z+ g/ z% P  _% r. f5 N6 @  // 使能 UART18 L) t* f2 I7 d2 {1 g
UARTEnable(SOC_UART_1_REGS);/ u7 L% V% T0 B5 J- {# v. S) G
  // 使能接收 / 发送 FIFO
) f$ k' y$ ?9 e" d/ [" G9 e, [  UARTFIFOEnable(SOC_UART_1_REGS);
( F$ P* _5 l* ^" ?) a$ F  // 设置 FIFO 级别
: v' E! N5 A, K! \1 g9 H/ y6 Q    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
) ^3 |: K( k. b6 y9 u! L" b* d  //Uart1中断使能# O7 t0 w4 d- A
  unsigned int intFlags = 0;' o+ r' Z: Y+ @+ H/ P! F
  intFlags |= (UART_INT_LINE_STAT  |  \1 e# [2 P; e) I7 M# F$ B
            UART_INT_TX_EMPTY |    \
+ |$ G% I' m) q            UART_INT_RXDATA_CTI);
: d# S8 d/ U1 W8 [            
5 M8 ~& M3 p: |9 i) g$ s    UARTIntEnable(SOC_UART_1_REGS, intFlags);
& b0 ?( f% H7 r0 e}
) c& F* a) ?$ _4 C2 M2 O, ~6 y4 A  ]& m5 j//UART 中断服务函数
4 N: d& B$ S; ?+ D2 x( M: i' f5 _void UARTIsr(UArg arg)
, \! h2 }) A% s/ M# M. M{
& D+ \) m: M/ S9 |: z    static unsigned int length = sizeof(Send);
  M$ c& \. L2 ?" h0 z6 _    static unsigned int count = 0;1 W' J8 O3 D6 x" y( b2 k# M
    unsigned char rxData = 0;
8 M3 B4 p" y' z8 T    unsigned int int_id = 0;
7 l# e3 F, B, e0 U) W    // 确定中断源
) j# ]6 p, v  b0 H  F& T    int_id = UARTIntStatus(SOC_UART_1_REGS);
) `5 L' j  n- S( M0 u# [4 ?    // 清除 UART1 系统中断  h2 G% C% S: |: ^2 _, E
    IntEventClear(SYS_INT_UART1_INT);7 B) Z0 T' v% o5 D& _$ G
    // 发送中断
7 c/ r+ f" i# t  b! v    if(UART_INTID_TX_EMPTY == int_id)! A& N6 B4 V! T. P/ {" m
    {4 }: R6 j) S6 y: ^, v
        if(0 < length)
+ W6 c9 j* D" B6 ?7 }4 B& Z        {9 s3 p6 p3 h: ]
            // 写一个字节到 THR
7 Z; S: X; f* N; u; }3 `5 O            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);. @5 @1 M# h( o1 h' l6 P  o
            length--;
7 |! l8 `1 p, n            count++;- X; O9 B1 x( Y* G: s
        }
& o, w6 I, d. Q, ]% E% Q0 N0 t0 d        if(0 == length)/ F3 l" \$ v9 t3 N6 l. f7 L
        {' R7 U6 x. U/ z' ^% n; ~
            // 禁用发送中断3 M  M8 m6 `' \9 `% {
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);; {- d  Q6 M6 M, \# o/ [  d
        }
+ b% `3 b! {  |     }
. s7 o1 T7 @  e    // 接收中断% X7 t3 h4 l' }5 P+ f, F: \1 j* u, K
    if(UART_INTID_RX_DATA == int_id)
  @4 p) N/ n2 h( X$ B) k( ?% f    {+ z$ G' _% v) n
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
: o# x& p8 }' y5 E5 g& H        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
0 p+ |- u+ N, x5 d# b& s    }
& f1 o) r& q. x0 s9 w% r: @    // 接收错误6 W8 J7 E3 d5 Y/ [5 e' @* e0 i/ s
    if(UART_INTID_RX_LINE_STAT == int_id)
% `9 R. B8 T  N+ n* a    {
2 P' E) o0 `: v; _5 v* I$ w( S3 U        while(UARTRxErrorGet(SOC_UART_1_REGS))" A& E  h( E, H5 I. `" X
        {- d$ Z( a) e' G; L
            // 从 RBR 读一个字节
7 i, b2 t: C7 {9 v( r! L            UARTCharGetNonBlocking(SOC_UART_1_REGS);4 D/ l' i* x- E0 L3 N4 M4 M
        }
0 L; t$ J/ g( @    }( Y+ ~, }0 ?  A) x/ T2 o0 I% @0 U3 ?
    return;9 h; m# s, T) A& p
}
( K* X  t1 v  ~" D0 o, xInt main()
* `3 c" i" S, P( q{ ) ?! r, v2 S! E
UARTconfig();//uart 配置( Z2 n  p* _+ Z, ~& n" k9 |
    Error_Block eb;
2 W& v# ]* a5 H2 o2 a' L    System_printf("enter main()\n");
3 n' c7 v1 ~; c    Error_init(&eb);! b3 a/ y' B1 L$ E3 f) w8 e% j
    // 动态创建硬件中断
8 v1 W2 R0 I5 R  g& e    Hwi_Handle hwi1;
( ?- A5 s4 a. S5 W& v- p    Hwi_Params hwiParams;. Y$ _( j+ Y* \4 N% e& ]
    // 使用默认值初始化参数" w, x7 Y# }  Y
    Hwi_Params_init(&hwiParams);
7 E% `/ T# G- q% E3 ]' F    // 中断事件6 U3 `- D# a* L
    hwiParams.eventId = SYS_INT_UART1_INT;8 {  ^# J2 c8 O
    // 传递到中断服务函数的参数. r7 t; }: Z( N4 m- \
    hwiParams.arg = 0;
% R2 V! W2 \$ r$ _% \+ ?8 X5 A    // 不允许该中断自身嵌套
0 e" o, C5 u% R/ Q4 u2 m    hwiParams.maskSetting = Hwi_MaskingOption_SELF;" f& P: I* ?! S$ R0 d; M0 c4 [
    // 使能中断
6 ^# I  |3 p) b* D    hwiParams.enableInt = true;
( V; |7 Z/ ]* q' ?; {    // 可屏蔽中断 41 ~5 t$ X+ q$ a# y0 f7 d; P
    // 中断服务函数 hwiMain
0 k, i0 T" {; p1 T  P    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
2 E; A5 w" T. @    if (hwi1 == NULL)" I* D9 T, l( R1 k! W2 a
        System_abort("Hwi1 create failed");( A( L# f8 ^" S: g$ Y9 r
    BIOS_start();    /* does not return */* C; d( ]% f* ^/ D8 O
    return(0);; s6 q( N7 X& Y/ r4 @
}
9 j- W2 Q0 [! i% B9 H
& d/ U8 L# R+ B7 j3 O  ~4 d
作者: 希望缄默    时间: 2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?
3 f' |8 {8 M* Q
作者: Greatwang    时间: 2014-12-1 21:49
在中断服务函数里放置断点
! H9 R* W5 p+ y9 `, o. m
作者: 希望缄默    时间: 2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:496 Y% k! F2 J- [' J7 E( ^& f2 S
在中断服务函数里放置断点
2 h! ?6 z: d3 }+ n* e2 i" x
参考 GPIO_KEY
4 k' v! G+ S% a! ?) T
作者: cchwhk    时间: 2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了




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