嵌入式开发者社区

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

作者: Greatwang    时间: 2014-12-1 14:52
标题: 在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
" f" E0 P/ O# }) S! ]+ j4 J3 T// 发送缓存
9 V, W1 V# r7 F- Y6 t9 \char Send[] = "UART1 test......\n\r";
! u! r' R; u. p- g' N6 I) N. A- E
3 T. ?! S, Y2 p0 ?9 sextern void UARTconfig()6 C5 |1 C: m0 ^8 f
{
5 c- T3 `( X2 P7 x) W //使能Uart1( M$ z, I4 [4 _) l4 [# k( M0 y$ f# e$ a2 U
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);- d4 y+ F& |/ u9 a, P0 e& }
# I; v+ D$ V8 E5 K& m, J
// 使能 UART1禁用流控
: H3 ]! e; m$ V( y- z/ _! E0 } UARTPinMuxSetup(1, 0);; O4 G3 y  _3 Q9 S' Z

1 T, F2 w: S# C% ?/ z: X) u' s // 波特率 115200 数据位 8 停止位 1 无校验位- h" X0 `' M6 t7 k
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
$ y/ ~4 l$ a2 E, O6 r: r7 P
& c" G8 N; @, k  // 使能 UART13 A+ C; s9 n% A% l1 c0 f3 q
UARTEnable(SOC_UART_1_REGS);
- g. e9 _. g! {  h% z/ N  // 使能接收 / 发送 FIFO$ E5 B( L& K2 H1 U! s1 a
  UARTFIFOEnable(SOC_UART_1_REGS);  @' A' ]) t  l  G
  // 设置 FIFO 级别) G7 H/ K2 J7 d7 p; u% n
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);% a6 O% \1 X1 O6 ]. a& @+ N
  //Uart1中断使能
  W0 P- J6 h: o' a  unsigned int intFlags = 0;& T" P1 r* q3 a1 \" l! F) c2 D7 z
  intFlags |= (UART_INT_LINE_STAT  |  \
# P: x3 P7 _1 {! p) w+ v- d            UART_INT_TX_EMPTY |    \8 H  q4 R' B4 U$ z, n) w
            UART_INT_RXDATA_CTI);
3 R0 G' i' v! E+ ^. w5 A; R& l( @% N$ D            
  f' @% P$ ^# g$ s+ u. k# B    UARTIntEnable(SOC_UART_1_REGS, intFlags);
' k/ j" \6 P8 s}$ m) r! H1 P2 [2 D
//UART 中断服务函数4 B1 ^8 X. Y. L9 J- V, \0 U4 g
void UARTIsr(UArg arg)% U, K- P( R; [- B/ N) t
{
- A( \, Y8 [  D0 i    static unsigned int length = sizeof(Send);
3 y' U  z! N2 |* ~) u    static unsigned int count = 0;, K& H! ~! H8 u# M, s% M* p
    unsigned char rxData = 0;
4 U5 f: x* I2 }2 t( C) A    unsigned int int_id = 0;" A8 A2 ^4 B# a2 n
    // 确定中断源/ {( M/ [5 [* k, R" K5 y" ^# Q
    int_id = UARTIntStatus(SOC_UART_1_REGS);( e/ _/ [0 z) H# d! X
    // 清除 UART1 系统中断# [4 }! o3 t6 N& {7 N$ }- `
    IntEventClear(SYS_INT_UART1_INT);% E3 |7 N! Y. T, d
    // 发送中断
/ E0 N$ B2 C2 s1 y' l6 j/ A    if(UART_INTID_TX_EMPTY == int_id)( m$ ]* [' C! M3 w% m
    {
5 H* F. P! B/ L4 m- F        if(0 < length)6 q1 ~2 ?& w+ y5 M3 m
        {
) T5 r+ c. H+ @+ X: R+ J            // 写一个字节到 THR
) u- [0 z7 O& O            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);" z* I: h4 f, @$ v' P
            length--;
6 \3 P% n3 \: V) o/ a' j9 A9 m( O            count++;
; C6 J! @) k! N% q5 j# m. H        }) b/ w. K  L$ U
        if(0 == length)
8 P: V. H; e9 A( d        {# Y& `2 }% P) I7 k
            // 禁用发送中断
& j( d5 V( f0 F1 {0 K  Z8 J, H            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);6 R0 ^; }& m; w8 ^5 b% m
        }5 r& ^: R: L& d/ X0 f
     }
" x% T; j9 y* J/ v) l    // 接收中断
) o  b$ V8 ?4 ~: k    if(UART_INTID_RX_DATA == int_id)
  |( N8 }  r/ r4 v    {4 a* d4 f* u* Y4 _1 K+ f3 O
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);9 S8 r0 z) B& g# x' Z+ o' h. d$ f2 i
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);5 B2 R9 H# A+ b
    }) o9 `2 h% Y$ V4 k* }! C; C
    // 接收错误# e3 g, d! P" e
    if(UART_INTID_RX_LINE_STAT == int_id)2 d0 p& L* B0 D4 C3 \, R: Y
    {
& ?2 m& B" I' m0 a% m! D7 M8 C        while(UARTRxErrorGet(SOC_UART_1_REGS))
) X5 a' p/ S+ W  I3 E2 ~! K1 s        {
* f( L5 E: J( B* [1 p( {            // 从 RBR 读一个字节
7 C6 U, d3 I+ f            UARTCharGetNonBlocking(SOC_UART_1_REGS);0 p. [4 y7 y$ a: n
        }
' h" S1 s. k* U% j    }$ C8 e- M) D  u& ~3 F! j
    return;
( _' H  q+ y! z2 y6 Q* h5 p}& X7 T4 A" B+ Z* h9 `4 l
Int main()) `/ e7 ]2 k- {( B$ H
{
- ~* @4 B: z  R" {4 p UARTconfig();//uart 配置: q: i6 f/ H) e  q3 T" ?/ S7 j3 A
    Error_Block eb;3 L4 u* N: L7 @7 N  e/ v
    System_printf("enter main()\n");% ^' f) l$ i% \  k) t
    Error_init(&eb);
2 s3 |/ m! E; F! P    // 动态创建硬件中断5 r6 y+ J% Z( l. i
    Hwi_Handle hwi1;
- @  L: l/ G) r. ?2 U, w7 u    Hwi_Params hwiParams;
2 {2 b% O7 V0 m& m! P3 \# _2 L  C& \    // 使用默认值初始化参数
1 G  X; P4 ~- T) o$ Y    Hwi_Params_init(&hwiParams);  J( F/ b; t1 H3 r
    // 中断事件0 N3 c; u/ r: Y8 d! }* o( N
    hwiParams.eventId = SYS_INT_UART1_INT;
# U. k! W; c% i7 `/ e# x    // 传递到中断服务函数的参数
2 n7 M) w5 J+ ~9 d7 u    hwiParams.arg = 0;/ S2 U9 }  v0 }* \$ L# n! P: M
    // 不允许该中断自身嵌套' c  U3 v& A$ ]( S
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
0 D- H( p+ y5 B9 C/ p    // 使能中断9 e5 e! Q# L4 f/ |+ b- A- J
    hwiParams.enableInt = true;
+ h. x. Q& l/ ^' D    // 可屏蔽中断 46 O9 F8 S! }9 \( {2 V8 y
    // 中断服务函数 hwiMain9 m* V$ N2 O: Y2 t5 {0 l# }
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);1 k+ I2 l$ t) y$ z- k9 v
    if (hwi1 == NULL)6 _9 ]( b8 \8 Z+ T0 l8 ]9 T/ E
        System_abort("Hwi1 create failed");
; i/ O! a( f) Z& r1 S' c% c$ U    BIOS_start();    /* does not return */
/ K: M1 Q' ~( |1 l( `    return(0);. Q  l/ ]# [: ?
}* G1 L# h/ {4 }& w& Q4 ]

% k4 y8 Q( P, U+ X$ W6 E8 z# R( t+ |
作者: 希望缄默    时间: 2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?# w) L9 E4 {! d1 d/ D! q

作者: Greatwang    时间: 2014-12-1 21:49
在中断服务函数里放置断点
8 T% a- u, `& d6 |
作者: 希望缄默    时间: 2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49
. ^) r) ]5 u" n2 {6 G8 @& `" Y在中断服务函数里放置断点

: X2 R0 W1 t$ }, C' M; w参考 GPIO_KEY
5 L. G' a# H* M( J' S( |
作者: cchwhk    时间: 2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了




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