嵌入式开发者社区

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

作者: Greatwang    时间: 2014-12-1 14:52
标题: 在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下" m  J4 z$ l. t) ]# s$ N( \3 H
// 发送缓存
0 R1 ]6 ?- X* [% X, @* U1 Q; ]char Send[] = "UART1 test......\n\r";
$ Q$ ?4 [8 d9 `  B: M: }1 ^9 q3 T
extern void UARTconfig()
3 b' _, N1 j( ?# w+ Z{
  _# ~) P$ s9 Q! Z6 `; r //使能Uart1  J7 E, L8 ?2 R' x  a: i) [
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);5 H- S) B+ Y5 F" ?4 P4 L) Y

  K7 P4 y! ^; r& F, K+ s; y // 使能 UART1禁用流控3 }& ^8 e3 }( G, c2 ]3 q( m7 z
UARTPinMuxSetup(1, 0);
5 J) C" V, A3 _' H
( q. Z' w' E5 A$ K9 |+ p2 r) i; ? // 波特率 115200 数据位 8 停止位 1 无校验位6 v' ]  P3 b, u& e
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
- s% _; t- t2 i- n0 i- r $ F1 N8 L% E" @) U
  // 使能 UART1" d' n; @$ j* J. E: e' j# j3 k9 \
UARTEnable(SOC_UART_1_REGS);
8 I' P5 f( c  q% `  // 使能接收 / 发送 FIFO1 {( l& j" F9 A* ?( I5 A
  UARTFIFOEnable(SOC_UART_1_REGS);
! i8 _5 c" T& I5 b" H: G  // 设置 FIFO 级别4 r, o% e3 Z( g- y3 _! I
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
. H1 k3 l- c! Q; y+ b4 c  //Uart1中断使能0 t- d- y) L4 G8 K1 k% O
  unsigned int intFlags = 0;4 l# C  c$ M: s" T# s
  intFlags |= (UART_INT_LINE_STAT  |  \7 t2 Q6 w7 T' P' F
            UART_INT_TX_EMPTY |    \9 G" S1 o2 x. ~) W9 c( }
            UART_INT_RXDATA_CTI);0 H0 V) N$ i$ w% `& m7 p. i5 l' b
            
+ J; p0 j: P4 D  A" N% E" ?& B( Q8 b    UARTIntEnable(SOC_UART_1_REGS, intFlags);
( g4 a8 H4 r+ k8 x}
* a: X1 @! ]# S//UART 中断服务函数
( c) }8 I0 S9 {( x* Lvoid UARTIsr(UArg arg)
: h8 s# ?. i! d5 `{
% n$ n4 _5 c3 K    static unsigned int length = sizeof(Send);
2 \. p" I1 V6 c, _* C    static unsigned int count = 0;
" T" K9 Q0 \8 n3 Q# H6 Y$ E6 I7 _9 {    unsigned char rxData = 0;
9 Q3 P8 M  V# _0 i- q) y0 ]    unsigned int int_id = 0;
* r4 w+ X  [$ q! B6 O    // 确定中断源6 Y2 K5 s5 b' o, T. Y8 K, g; V
    int_id = UARTIntStatus(SOC_UART_1_REGS);
1 N/ {5 q/ T. [+ w; R+ J    // 清除 UART1 系统中断* e! |0 [4 e4 P# ]/ T; S6 J
    IntEventClear(SYS_INT_UART1_INT);
' b7 C' s4 @1 Z' k% E8 i  C    // 发送中断
. J/ u5 `" ^; }    if(UART_INTID_TX_EMPTY == int_id)- h. T2 l: |3 }3 i5 T
    {
7 b6 K1 U; L/ k/ i; k( H1 s0 u        if(0 < length)) t% k9 ]5 ~- _% @' m+ |% T7 v
        {
# J4 g- S$ F* s) L" o/ c8 k6 O            // 写一个字节到 THR
) H/ q) }5 X6 N            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);3 `; t# M& Y5 E- s; L+ J
            length--;
, f* J# l: N/ \4 o3 C3 }1 r            count++;2 z& X) |8 G) @" V5 R# x. {
        }
8 }' q& H" R1 z/ P9 m: Q( L6 `        if(0 == length)% D, E3 S- S+ ?, g$ A+ W/ [7 U7 V
        {; z; c8 Z5 B9 d7 S2 q; c7 R
            // 禁用发送中断. E/ o6 R- e% U* s) p, K# Y
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);! T0 s. Y2 l7 ?" A; S( D. Y& r7 q
        }* O; h" Y+ g; ~6 k, ?  ^+ g; ~3 _
     }- O+ F8 V; A. M( V$ T4 W5 m0 x' H
    // 接收中断
% t( \# W. n: N1 S    if(UART_INTID_RX_DATA == int_id), ?5 L& D6 v* K
    {0 u  }/ V1 T. K- q+ f) A
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
* y6 E; X5 q( h3 \  \0 x) `        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);) z/ |8 c" S6 r$ J/ r
    }
* e, x' ?! D4 {% |& g    // 接收错误4 o; ?$ q- n3 ?8 h' X
    if(UART_INTID_RX_LINE_STAT == int_id)  y- L3 u( @! [4 w. t
    {
/ c  U: t! ~; k        while(UARTRxErrorGet(SOC_UART_1_REGS))$ [$ e+ A8 w  t7 g
        {
1 p2 J8 n& x1 L8 Y% ?            // 从 RBR 读一个字节
. G) _: v% ?& X' H5 n/ P0 X            UARTCharGetNonBlocking(SOC_UART_1_REGS);. K& C) l' g2 j5 z
        }* e6 {; i$ G" Q# E9 [7 A6 ^
    }
6 M0 f2 R4 K5 z' M5 {    return;
4 s9 y/ T; }+ F! J* c}" f/ D3 T7 N8 w4 H
Int main()
5 Z, @; k6 w0 V7 O{
1 Y: w4 k# |; H  z# B* T UARTconfig();//uart 配置
7 c$ f6 i( c# E) U9 N& x* |    Error_Block eb;
% q/ N# c* B7 T0 ^8 i( a# {    System_printf("enter main()\n");3 h+ O5 C" [: {+ q# |3 m- h) s
    Error_init(&eb);: e9 ?. u' A" h; m! `3 {# p% K: K( L$ [
    // 动态创建硬件中断
5 x# w9 o2 S& |4 a/ [4 G    Hwi_Handle hwi1;
6 H7 x3 S6 a5 p' C    Hwi_Params hwiParams;" x% m: r* s- ]- O) y* ]+ _/ U9 M; D
    // 使用默认值初始化参数
+ A% F% X' G$ F, i    Hwi_Params_init(&hwiParams);4 A2 S- P! d. V+ l3 J  V  n: j2 Y
    // 中断事件
. `/ l* f* a# s, G1 A& O  ]    hwiParams.eventId = SYS_INT_UART1_INT;
& m# K1 r, [/ g4 [3 w, `- |' H    // 传递到中断服务函数的参数
% P2 \5 E$ X4 f    hwiParams.arg = 0;0 ~' n" n  }& v4 ~  R
    // 不允许该中断自身嵌套
* I1 E: Z( j* j5 B' h    hwiParams.maskSetting = Hwi_MaskingOption_SELF;- r! Y6 s' c% ]- l% L1 r, N
    // 使能中断
' ^9 q5 J/ Q( ^( W& ~1 d    hwiParams.enableInt = true;$ m2 b2 E( y3 b) o9 O: o" s
    // 可屏蔽中断 4, f4 a$ w8 z5 ~. L1 p9 i' U2 P  X, ?
    // 中断服务函数 hwiMain
$ E: ~5 V! G- e% }9 {6 B    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);' p* ]$ x6 t. ~; P* w% p5 z
    if (hwi1 == NULL)4 P: t% C  u! h! N( s
        System_abort("Hwi1 create failed");
1 |2 r5 r% ~, P% k0 q    BIOS_start();    /* does not return */2 {! R" |# c: z! P+ w- t
    return(0);9 T6 F' i- k( y4 p1 _  [* ~; @5 ?
}
" q" P& X: n- `+ Q' f' U4 q  |+ S& m( c* `

作者: 希望缄默    时间: 2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?6 S! [/ s- ^/ B0 J. \! X

作者: Greatwang    时间: 2014-12-1 21:49
在中断服务函数里放置断点1 s' W" \* x3 r$ j8 A; m

作者: 希望缄默    时间: 2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49
6 T, ?! ^4 |4 j9 R3 G在中断服务函数里放置断点

8 I8 J1 Y# `. Y9 m" w  [( ~参考 GPIO_KEY
8 p7 j( q9 K& j( [
作者: cchwhk    时间: 2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了




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