嵌入式开发者社区

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

作者: Greatwang    时间: 2014-12-1 14:52
标题: 在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下* j, A7 _) X" S% B6 v4 D% M4 P
// 发送缓存3 i3 D% C8 z2 s* ?8 h
char Send[] = "UART1 test......\n\r";
7 I! ~9 g% G. W2 @0 q# ~6 m5 Q
: n# o+ B; T0 [6 ?extern void UARTconfig()
8 j3 J4 [# Y3 n- `{2 J$ V+ ]. a2 r% A
//使能Uart17 ?! |0 ?  d+ g7 d% Y7 y, S
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
1 {4 I  p! O7 b7 b( n9 m  {$ x 9 Y# Q5 d' [0 Z
// 使能 UART1禁用流控
' v: x' }5 F; _$ I: K! t, f$ o- h UARTPinMuxSetup(1, 0);1 e6 B' c, Q  ^2 v
5 V. P2 e" h( ]; {
// 波特率 115200 数据位 8 停止位 1 无校验位* r; i9 `- M: G+ q; ~3 r
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
% ?" d5 ?5 I9 B* c" c. X! M* S6 U6 e - u& O/ [5 m' |, A$ l- {
  // 使能 UART14 V. [- _8 h- W& |" r# @; ~" {: q
UARTEnable(SOC_UART_1_REGS);- z& Y4 W) V7 o# ]- @2 J
  // 使能接收 / 发送 FIFO
5 C1 i$ b% D% g7 `" s  N) T2 u  UARTFIFOEnable(SOC_UART_1_REGS);
) E4 u$ }$ _5 f  // 设置 FIFO 级别
' v6 J: r- n2 P- M' z/ L  N2 n, M' @    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);  }( K  o$ d+ L1 B3 y6 ]
  //Uart1中断使能
6 T6 v. r! V2 J7 W) K: M  unsigned int intFlags = 0;
; e) n3 G" F" D1 Q  intFlags |= (UART_INT_LINE_STAT  |  \! T1 H3 k7 M. ]
            UART_INT_TX_EMPTY |    \4 u5 \2 \0 u/ Z
            UART_INT_RXDATA_CTI);0 f& i$ [! l9 Q3 t5 u4 g
            * D3 e% F$ l, W" K0 n' r
    UARTIntEnable(SOC_UART_1_REGS, intFlags);
9 L+ V6 _( S: e# t& y}, S7 u8 i) v  T% ~$ A% J' I1 x
//UART 中断服务函数
# k/ R. ~. O" ]  g: U0 j' Z" Zvoid UARTIsr(UArg arg)
+ A2 q, l" o. J6 O3 K: g{# G! g8 W" j- O1 g: ^3 k( c) Q; f: q
    static unsigned int length = sizeof(Send);
) _: X' S- h5 W4 J    static unsigned int count = 0;( y* X. w; G% E4 H2 l1 M; u( {* H, W
    unsigned char rxData = 0;
" T! O; B& v  g3 G' p5 i: i    unsigned int int_id = 0;
0 f! C: q! {4 o4 e    // 确定中断源; `/ S# [) T  |/ ]' x! C- p
    int_id = UARTIntStatus(SOC_UART_1_REGS);# i, Q4 B; I* h2 g$ o* x. D
    // 清除 UART1 系统中断
2 B; k" S, S5 e7 `+ j, L$ |    IntEventClear(SYS_INT_UART1_INT);4 o9 @8 s/ g1 |* W, M1 O8 F: q
    // 发送中断/ V( y, L! m% Z$ h  ?" s+ c
    if(UART_INTID_TX_EMPTY == int_id)
4 ^+ Z7 w+ _* A" k* r8 v% L    {" W: S# t" g: }' H, Y" _  d; Y
        if(0 < length)1 X6 U& h& S5 R9 h% j
        {
% b  a# ]$ K+ |& M9 z  L            // 写一个字节到 THR
6 H2 Z: w, @. Y3 _0 n5 @8 A) l/ j; g& S  Q            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);' B) P6 D+ U  F& j) b/ F7 `
            length--;0 D+ A; ]0 H$ j. |- G; E
            count++;& C8 c& \! S9 k! _3 Y) _' K% S3 D
        }* p! A" T8 d' X  }! X6 g
        if(0 == length)( E2 W5 F! z4 [. ?! A6 f! u
        {
1 k. }! o. }7 I8 m            // 禁用发送中断" Q$ ~& h  z, O: B. E' i
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
, u+ j6 J3 u1 a/ u5 q        }9 p. h6 p7 F& j; E& f& m0 r
     }% y; N; }6 U& j1 a7 O  e, f
    // 接收中断; T$ \8 K6 l* s: m
    if(UART_INTID_RX_DATA == int_id)
4 f. d; K7 B% N' q- q    {
. }7 m2 V9 M9 Q! t9 Q. E        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);) }2 W! r* U' j- q/ E# h9 x
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
7 @! C) {: c- H    }
$ Y; `) Q( l+ B8 e    // 接收错误# ]5 u; T; L0 p8 F+ w
    if(UART_INTID_RX_LINE_STAT == int_id)5 w$ J& W) ~6 f: T9 L
    {
. i# k5 Y4 G7 j) j        while(UARTRxErrorGet(SOC_UART_1_REGS))7 i$ P  w1 W2 U
        {
/ F) \4 ]; N7 m! B9 A            // 从 RBR 读一个字节7 r: Q8 ]# D. J, G) F
            UARTCharGetNonBlocking(SOC_UART_1_REGS);6 s6 r5 c  S# w  x6 M, m  m0 r
        }
8 F3 L$ F9 T6 E" U    }
6 @: S5 u# M* n* c5 y, e  f    return;
- e4 l0 X8 C9 p' S: h# q}
. }6 ?: G) }" UInt main()
" V+ c8 d: A; k8 z{ 5 A: ~% P: h3 h+ b
UARTconfig();//uart 配置
/ E) S9 L& {: G$ q9 x: z2 e5 l$ c    Error_Block eb;, e8 s; t, g. j5 I
    System_printf("enter main()\n");
9 a7 H1 [' e; g. k0 I# [    Error_init(&eb);' b$ x% l/ A) ~; |; m
    // 动态创建硬件中断4 ?/ G5 m( a1 }  Z( b7 Z1 K6 C
    Hwi_Handle hwi1;7 E' X3 p' P9 m, w3 ^
    Hwi_Params hwiParams;
$ K/ H; R+ E0 C  d    // 使用默认值初始化参数0 J  m$ G& R8 d) N% d
    Hwi_Params_init(&hwiParams);% Z* Q) F# h1 q' N6 }
    // 中断事件
. a) p# `) {# K; V, \    hwiParams.eventId = SYS_INT_UART1_INT;
7 l' r8 ?1 F" G7 t- F    // 传递到中断服务函数的参数6 N$ Y) u. }" @0 j
    hwiParams.arg = 0;. }% V$ v4 n" P! M) c! s: A
    // 不允许该中断自身嵌套
/ e5 Q/ d; u+ Y    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
2 n7 N. |8 q" _1 W+ ^: a6 T    // 使能中断
( n7 @! ]2 J- L% F) N; F    hwiParams.enableInt = true;
- k0 i# C3 E9 U    // 可屏蔽中断 47 M: i3 i7 `, k: L- v* a1 s8 ]  P
    // 中断服务函数 hwiMain3 s8 |4 d! ?, l
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
. ?. R3 X4 o& C+ t- V) k# b0 Y    if (hwi1 == NULL)% c7 {4 v6 \" V/ @
        System_abort("Hwi1 create failed");& E# f$ m* ]5 u3 ^! \1 N
    BIOS_start();    /* does not return */
* B0 C, X6 m% A& W    return(0);' W2 w/ E" ]' n" G
}
6 @1 \% ^# D' s8 T2 x9 g- v4 }9 q& Z6 r

作者: 希望缄默    时间: 2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?
0 B2 V, z* N/ W/ c# {; I$ C
作者: Greatwang    时间: 2014-12-1 21:49
在中断服务函数里放置断点' ^. H! k5 N& g3 U' C+ O

作者: 希望缄默    时间: 2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:495 b5 u8 b8 y& C* W
在中断服务函数里放置断点
1 f( t. t) |9 P/ l
参考 GPIO_KEY, e2 k3 M3 C9 o/ L8 m' n* q

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




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