嵌入式开发者社区

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

作者: Greatwang    时间: 2014-12-1 14:52
标题: 在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下0 M& g. A( Q) o9 j4 w& Y  H
// 发送缓存6 a7 W+ d) p& V
char Send[] = "UART1 test......\n\r";
. m! T% |8 _1 a& L
4 j. K" g/ o' l4 H9 }extern void UARTconfig()1 I, \1 O5 v9 D* E# o" A6 J4 F
{4 d# i- @& h# n; O) X1 B  o
//使能Uart16 r) D# x8 L0 T& G
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);9 |. D7 I6 i7 F

, L" F. Q# e1 n5 e) l3 | // 使能 UART1禁用流控
; _1 n7 C# V, t+ x UARTPinMuxSetup(1, 0);
& U7 c5 M( x# E2 _( D3 l7 a& I - [; ~  d2 H, P
// 波特率 115200 数据位 8 停止位 1 无校验位
* }# D* ?3 |& S; S8 G' f; l4 c4 i  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);" J4 a3 V4 t9 N( e4 m0 p  ^

; l4 c0 s: R% F/ l: m* L  // 使能 UART17 S- W# N6 M/ O3 l% s$ l* P
UARTEnable(SOC_UART_1_REGS);" C9 r; k/ Q0 k: E
  // 使能接收 / 发送 FIFO: x/ @$ G! D- w+ e0 {
  UARTFIFOEnable(SOC_UART_1_REGS);, y& u- d- h% p
  // 设置 FIFO 级别+ W! I( f3 I4 k' O6 C5 D
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
* b8 D$ |5 A8 n9 C: t, E2 e  //Uart1中断使能' M) `! `  b8 A$ P0 U9 o- I! m
  unsigned int intFlags = 0;5 \! X5 d% f; r& [
  intFlags |= (UART_INT_LINE_STAT  |  \
) _! q# m/ ]" [2 p- [/ `) _            UART_INT_TX_EMPTY |    \9 [0 b/ b1 K+ V6 K7 M$ |1 _/ m/ Z1 @6 {
            UART_INT_RXDATA_CTI);* K0 P) I" G- J. J: [$ H  H. z
            . H$ T3 W- b- o3 Q
    UARTIntEnable(SOC_UART_1_REGS, intFlags);
% k5 k; Y- T+ |}
0 x: E% l5 J! \* {//UART 中断服务函数7 F% t. l0 h2 u* S! [7 E# j
void UARTIsr(UArg arg)4 |' V( m1 A8 I! Z) l; W
{' X1 I2 `  K: q( k( d$ E
    static unsigned int length = sizeof(Send);
" M4 }# ^2 L  @3 l/ |5 k    static unsigned int count = 0;' U8 m; v, W4 k) C2 H0 ~. z
    unsigned char rxData = 0;
4 o1 ?/ p8 y, t) _  i    unsigned int int_id = 0;# y- Z) m9 m' L) t& T  }7 a
    // 确定中断源
: w7 q' l) ~- u! I% }    int_id = UARTIntStatus(SOC_UART_1_REGS);8 |! Q% Y, p: P# H7 T; R
    // 清除 UART1 系统中断) J# o. x) O" m8 ]: Q
    IntEventClear(SYS_INT_UART1_INT);
5 Z" \, L0 W" h4 V2 v    // 发送中断
$ {& M6 \* w' B$ x! n    if(UART_INTID_TX_EMPTY == int_id)) ?6 N3 @% I: |6 Y
    {
; K" K( @& Y9 _# S; e        if(0 < length)  u: {/ w" v: U
        {
/ i% A* B, n' W* x            // 写一个字节到 THR
# v% a5 w' }" \. {+ ]: k4 V/ M! @$ ^9 ^            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);. F- x0 i( G7 y% d  b: d
            length--;$ `7 O4 z# E$ J" w
            count++;' V# L: c$ W4 f. T  U4 Q; d
        }
7 z3 L- }! [: b& {7 i- F( ^, {        if(0 == length)4 @! v$ S+ ~) l2 [
        {' }) O& _  @- w, G& e
            // 禁用发送中断% [: `4 ]8 N- r$ q: m% p
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
. a5 d- W$ o; \/ s        }
1 l. u) B) L* K9 k4 g4 X6 Y     }
( q6 }8 ~( Q) q, s; V. _    // 接收中断, |8 |1 w+ B) q5 \* ]  a
    if(UART_INTID_RX_DATA == int_id)# F9 T1 A% c" C# s- _6 o3 @+ K
    {& D) X! P8 ^$ T1 p, X" I
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
, ^/ \8 L$ O* G! N! h% D- ]' N        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
; x: N, d& H! y- e$ z- J    }& z3 p4 a1 U" G
    // 接收错误, p/ ]3 P, s- m6 W
    if(UART_INTID_RX_LINE_STAT == int_id)
) X4 s. n! K$ |6 Z! I  Y    {& Z* ?$ R* x5 e3 z2 D! O7 Q
        while(UARTRxErrorGet(SOC_UART_1_REGS)). K6 H6 W3 U, |  `
        {! q; i5 d8 S" d- C+ I
            // 从 RBR 读一个字节* U' L1 U+ U) F. i. t3 A% q
            UARTCharGetNonBlocking(SOC_UART_1_REGS);. O% X- p% x3 |. [/ `& N
        }
; a, S4 X& _0 ^4 i    }# l: }3 E7 e* V; p, d
    return;
( f# |$ y) l. c, ?# G" ?2 Y) A4 b+ r}
' ^( y# I7 @, V' ^% d6 d8 B" E- aInt main()
' A5 d3 f) U/ C1 Y, g/ z$ [. M{
( p0 E4 M6 A% [# B: }) }( m7 o8 X UARTconfig();//uart 配置
4 [+ N5 s, ~$ y( ]4 w" A    Error_Block eb;
/ f% S, c' g0 F$ n    System_printf("enter main()\n");
" m0 R1 K5 i% h- g    Error_init(&eb);" o0 M, o) x: |8 A
    // 动态创建硬件中断5 F2 W1 \1 I7 l# ]8 H4 r$ l
    Hwi_Handle hwi1;! n9 M8 H) x" f7 x$ y' ]
    Hwi_Params hwiParams;
& s7 \9 f" B* R" D    // 使用默认值初始化参数
- F8 N4 J: I) d    Hwi_Params_init(&hwiParams);, W" n  B, F4 ~9 y
    // 中断事件9 z& @' _3 A0 M) ^0 ~8 ]
    hwiParams.eventId = SYS_INT_UART1_INT;+ f/ ]) G' N. J: }( k% A# O
    // 传递到中断服务函数的参数! B& C% x/ N# M2 O: c
    hwiParams.arg = 0;: j3 I$ \. ^% y! f+ j  j0 ]4 I, Y! u# _
    // 不允许该中断自身嵌套
0 N1 w: s+ X7 i    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
5 i3 G$ x2 z' n# ?9 ~5 ?- Q" R    // 使能中断& T6 Y) o6 V* C8 A1 n* I0 \
    hwiParams.enableInt = true;" q/ ^0 `: }* w& N/ ~1 r
    // 可屏蔽中断 4* t% R$ O" f4 w- ]5 d, `6 o7 Z
    // 中断服务函数 hwiMain. G+ f/ |; v* q( w1 ]- C3 o6 B1 C) z
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
2 m1 b7 q' |" B4 S6 G  a& n    if (hwi1 == NULL)
; I: r- M3 N5 j" V8 d        System_abort("Hwi1 create failed");
' `3 y1 E0 w8 m6 k    BIOS_start();    /* does not return */
1 V( s' {9 s& P: K* U) t% m+ M    return(0);
. R7 h: ~8 j+ v4 v; i}
3 r9 P! G$ |: M: r( t3 q5 V7 ]4 R2 h9 n4 P" F4 O3 g8 J

作者: 希望缄默    时间: 2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?; D2 e4 s9 V( p4 D( P4 H

作者: Greatwang    时间: 2014-12-1 21:49
在中断服务函数里放置断点
, O) e: a+ y5 |, r* h
作者: 希望缄默    时间: 2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49
1 z/ Y; O: m) L  b, `9 H在中断服务函数里放置断点
: j+ c$ J9 _( F& n$ f: e& W9 _
参考 GPIO_KEY
0 t5 ~8 s9 x+ C+ i/ ?0 A( o
作者: cchwhk    时间: 2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了




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