嵌入式开发者社区

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

作者: Greatwang    时间: 2014-12-1 14:52
标题: 在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
& ~6 l* O8 b. b  o& `7 k9 U  D6 s2 O// 发送缓存
9 ~/ r/ i& U$ G& p  M5 rchar Send[] = "UART1 test......\n\r";
% j2 _2 P7 L1 R" `5 M% k9 p) l1 x/ p5 y  r5 D  N
extern void UARTconfig()
  Z9 }0 O  f* M) \{; {, ~; a" \: v' ^
//使能Uart17 }3 w0 R% g0 ~( h
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);( x1 ~; e* y0 o% @, e3 L/ h
* o, ]9 A" d7 }6 h5 s5 ?
// 使能 UART1禁用流控/ u: X4 p, M$ ^) t
UARTPinMuxSetup(1, 0);
' L/ g/ t' q/ @  I
4 Y2 t! |# m" k+ O$ F6 `) u // 波特率 115200 数据位 8 停止位 1 无校验位
" V; b) c2 K1 a) A  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
, F: k1 d8 e# j6 A4 V$ S  q# Z& D
! v- k; T+ t3 M! j; C( i1 l  // 使能 UART13 G* [2 ~7 U' j7 a
UARTEnable(SOC_UART_1_REGS);
6 d  o2 q4 Z- Z3 z  // 使能接收 / 发送 FIFO
/ R, Q' O5 x+ N% s- |- [1 z/ m3 I  UARTFIFOEnable(SOC_UART_1_REGS);8 N  [; R7 T! V
  // 设置 FIFO 级别
9 y5 s  |/ P$ t' @    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
0 l( K2 G' J6 q7 w& n8 a( X  //Uart1中断使能
" T6 ?- Q* D) Z$ v: r  unsigned int intFlags = 0;  y1 u# X& k) f1 x2 I- d7 M1 Y$ o
  intFlags |= (UART_INT_LINE_STAT  |  \; F* V! F1 r6 m+ ?. B* e" ]% X8 j
            UART_INT_TX_EMPTY |    \+ B& y3 F$ |6 x9 u3 m7 \/ I
            UART_INT_RXDATA_CTI);6 A: x4 u( a) _
            7 x4 \! U2 h  {6 k' ^
    UARTIntEnable(SOC_UART_1_REGS, intFlags);+ P5 N. Z- }8 y( x3 ?3 [% V" u
}: ~( @* E. g" U# c4 Q" G# O- y: ~
//UART 中断服务函数9 ?' n5 z8 p' ^4 v
void UARTIsr(UArg arg)
) @8 N6 t% X3 l' Y# G7 r! o% r{
- j1 p& W( J; Q) F; V+ }" ^' D    static unsigned int length = sizeof(Send);8 L0 U1 f$ x, m. R- z3 N
    static unsigned int count = 0;
- R4 |3 u% f8 [' A# J6 N3 p    unsigned char rxData = 0;4 L9 M3 P) ?+ e+ ?$ r, R
    unsigned int int_id = 0;# K" \( W+ o2 d( U" ^
    // 确定中断源
) q% ^0 w1 M; A, ]! J$ x8 V, ]2 R    int_id = UARTIntStatus(SOC_UART_1_REGS);
! ?! R$ O/ Q2 F& l" \2 N6 W    // 清除 UART1 系统中断
. l6 M- `- e$ Q) w1 I    IntEventClear(SYS_INT_UART1_INT);
- }& `8 B" M- Q8 \    // 发送中断
/ c. C5 X+ o/ {2 _: Z6 f% u' r    if(UART_INTID_TX_EMPTY == int_id)
9 G  P' |: N- `    {4 m9 d$ L1 p0 @1 _- \# _/ A
        if(0 < length)
1 X0 s' l* p0 k        {
" `0 G+ ?/ T, |. B( j            // 写一个字节到 THR
9 s5 n* {; t& e            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);" U% {/ l; {5 k6 y. ?* u
            length--;
& b+ o! `5 r' C; A4 z' N            count++;" K+ ]' W) B9 V) t. P5 r' ~
        }3 \; V$ x. Q) A) c: m: E7 v! [& \
        if(0 == length)2 b- X- \/ o. A
        {
7 E' O5 _! t: \/ S9 ?9 e            // 禁用发送中断7 g! ^' d) B  k; D
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);9 N* ?! |8 V3 C6 s7 w1 K
        }
8 G( z. V- P: {8 j$ d3 `     }
  l% Q# Y6 j. @7 c7 N1 Y    // 接收中断1 w6 P  n0 R& p5 ?$ J" k  ^
    if(UART_INTID_RX_DATA == int_id)
; x3 z4 N( m. _  [! e    {, |, S' c" ]6 e
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);( a4 e( g5 f* l: L8 i5 N" ?
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
: z+ [, }- @- w( ]# I    }
% c) i! @0 z8 M0 w6 t: m    // 接收错误% |/ o' i8 s1 e! b) G. h: O# i
    if(UART_INTID_RX_LINE_STAT == int_id)
% L+ @  ~5 G; d    {) Z, |# y* |) }' m
        while(UARTRxErrorGet(SOC_UART_1_REGS))
7 [9 I  W, f) \1 y* t: K2 H1 r7 t        {
& H% _' R# v1 O/ `            // 从 RBR 读一个字节
) X. b$ s1 D2 G# e! k0 E- u            UARTCharGetNonBlocking(SOC_UART_1_REGS);& D- I% @! s0 e5 W( h. G
        }/ A; A1 H( Z) j4 s- R5 g; K
    }
1 T  t0 ?/ f! d* _5 Z2 P! G. s: H    return;
! a/ S$ l5 ~! O  ]) B; r6 ~}
6 m( H: @- A2 k( @  k% nInt main()
& P8 @, B/ o! s; }{
; {" Z# O0 L8 I4 @/ y UARTconfig();//uart 配置
" d# Q: h* i. o' z" m    Error_Block eb;
5 S6 E2 Q' W$ A: t$ u1 a3 t9 F; e    System_printf("enter main()\n");1 n- s, `( b0 V/ X: S, h5 W0 n
    Error_init(&eb);
" {6 n- ]! g( C, V8 R    // 动态创建硬件中断/ [2 Y* D, k# F1 U- W
    Hwi_Handle hwi1;8 C  f! u, c2 z1 S0 X: @% A2 d1 w
    Hwi_Params hwiParams;
, \: R6 `# ^2 o3 ?/ S; H0 {    // 使用默认值初始化参数
0 K% \8 K0 K1 S3 e, O% Z2 h$ O: w    Hwi_Params_init(&hwiParams);, K$ b" N% w0 I8 m' N  H( u$ z5 u* O
    // 中断事件0 e7 f% n* q9 s8 a
    hwiParams.eventId = SYS_INT_UART1_INT;- q' Y. b, x* A' u
    // 传递到中断服务函数的参数
4 W7 h8 i4 C6 j7 l# ^+ w, U+ I    hwiParams.arg = 0;
' t+ t. @/ `3 M* ]( c; B2 X) F    // 不允许该中断自身嵌套( F4 I! z" w; y2 D! p
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
5 D1 `' Q5 M7 R1 S8 C6 X    // 使能中断
: e% I; J0 v1 y7 a) H9 I    hwiParams.enableInt = true;0 S% H4 f' n' a4 h7 r% f
    // 可屏蔽中断 4  \# W* }: Z8 i0 l1 D% o
    // 中断服务函数 hwiMain* x- Q; {* W1 a. _
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
* d/ i6 y2 |" K( h1 N    if (hwi1 == NULL)
4 M9 t/ h  x* L; H2 X; H        System_abort("Hwi1 create failed");
( _9 N* ^7 {' B' N% K4 K    BIOS_start();    /* does not return */+ \$ I, V0 c9 z1 m$ Q1 u$ @4 h6 F
    return(0);
. I4 n4 I, c) W/ `; L8 q}
% Y: h% \- E- q* e) e) l" C( \+ F, R

作者: 希望缄默    时间: 2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?: Y1 ^. @) Z! s1 t8 h& r

作者: Greatwang    时间: 2014-12-1 21:49
在中断服务函数里放置断点
! J8 b& t$ S* x1 }1 o7 j& U( N# q/ s7 F
作者: 希望缄默    时间: 2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49( o9 N: D2 t: w; c0 U
在中断服务函数里放置断点
  ~/ A$ W1 B/ l+ |! B# f2 e
参考 GPIO_KEY
" g& k- O, Y0 W2 n5 T
作者: cchwhk    时间: 2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了




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