嵌入式开发者社区

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

作者: Greatwang    时间: 2014-12-1 14:52
标题: 在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
$ T5 e- L) c/ Q* d# W# s// 发送缓存
& ?9 G  g* J6 c# Vchar Send[] = "UART1 test......\n\r";
7 y1 _  J8 Y; T4 e0 V6 Q+ @
% Y; M" {4 a5 a$ Iextern void UARTconfig()
: x2 P9 i- Y- |& I/ _7 U{) i9 I! _1 m4 h  v
//使能Uart17 f( Q; I/ v, N* D0 M& X
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
# V' h( {( P, P2 I
# @6 S% s& z  L // 使能 UART1禁用流控
% i, f4 M3 I9 N/ Y+ n UARTPinMuxSetup(1, 0);
2 A/ P+ @+ A* q7 m/ m, v9 G . y) K1 `# i! O# C7 I
// 波特率 115200 数据位 8 停止位 1 无校验位
: ]" c* T2 u6 B  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);% ?. l% W3 W" v# \2 g+ n

3 u4 x8 M3 C' }0 F. G# r  // 使能 UART1& f' \" C" J1 \, h9 x! c) P& G
UARTEnable(SOC_UART_1_REGS);7 _# o- u! r) P3 ^$ b$ u
  // 使能接收 / 发送 FIFO  b# r, O5 q' m) x6 m
  UARTFIFOEnable(SOC_UART_1_REGS);9 e: Q6 d/ i, f. u8 i6 Q- P8 S
  // 设置 FIFO 级别
) R, u: m+ N* p' H  h0 C; {  a    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);8 r6 {$ n: ?: ]9 U% V2 e0 ~# d
  //Uart1中断使能; m: j7 p) Q9 C' j) g- g
  unsigned int intFlags = 0;
, K. t; X  s# |  i3 H6 j  intFlags |= (UART_INT_LINE_STAT  |  \" X* G, a: [9 ]: W
            UART_INT_TX_EMPTY |    \
$ p4 M6 I" f# w5 u5 \4 `            UART_INT_RXDATA_CTI);$ w5 |) o& b6 i  l& b" r
            
* ^1 @) F5 _2 [1 d% @3 J+ F    UARTIntEnable(SOC_UART_1_REGS, intFlags);
/ X9 }, k9 V6 O9 p, i}5 R# ?7 n0 M$ L+ l3 R
//UART 中断服务函数
% t! l8 G5 p. `, i$ Ovoid UARTIsr(UArg arg)
: o/ J; Z; I( w/ _/ u{1 \. I* j2 `9 f5 z
    static unsigned int length = sizeof(Send);0 v7 Q# ?/ z3 i
    static unsigned int count = 0;1 Z) j- u( h8 ^
    unsigned char rxData = 0;
5 t4 V' }2 E: ~$ J; W0 m" P: u    unsigned int int_id = 0;9 y1 b5 U0 t2 _1 D9 y
    // 确定中断源
# K8 u7 Y# r' i+ X    int_id = UARTIntStatus(SOC_UART_1_REGS);: n9 S3 W1 H/ G
    // 清除 UART1 系统中断
9 e& I9 Y) y5 f5 {" T7 e+ L    IntEventClear(SYS_INT_UART1_INT);" Y# ^$ f9 k+ ]0 h
    // 发送中断
* n2 d) ]5 L) M  b    if(UART_INTID_TX_EMPTY == int_id)/ L& U. c1 _- |' x: j
    {9 N+ L! ?+ O5 y" w
        if(0 < length)
! C. u: |1 S7 T. `1 P* M        {
# F$ @" Y, F& C, H0 D            // 写一个字节到 THR% v$ H6 `/ W% t- d2 f: r5 p, A- Z
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);: I* H# ^% y) x/ R* \  p
            length--;
5 y3 R+ y" `# r1 X            count++;
+ j! K( Q' ^$ `" X4 ?/ z        }3 o. |. K* w9 a0 W3 y
        if(0 == length)" T* l) h- y  j7 [4 p/ d
        {
8 O$ H4 x" C, ]            // 禁用发送中断# C  h! [: e2 M. |( M; V. k3 i
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
2 q+ f% T  L7 H* f' z- ]        }
5 g- B2 r2 l- L0 w' H( b     }) C& E- P( C  h$ n6 s6 a& d1 g
    // 接收中断
6 u0 \* h3 I% W- N8 @' W    if(UART_INTID_RX_DATA == int_id)
+ g# X2 `, s! x3 M4 L    {# i: H5 Y# Y1 a
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
* J/ d; ?4 N! _) j0 G2 F        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
- ]# M/ E' |+ |7 l% {4 C8 j) \    }
5 O7 f8 o: W' y    // 接收错误
: c0 l  X6 s" v5 x    if(UART_INTID_RX_LINE_STAT == int_id)
+ H( j0 }- @( b3 f$ x' s" E    {$ s' ?, b" J) x; l- G
        while(UARTRxErrorGet(SOC_UART_1_REGS)); K8 S6 v' I4 X; v) q* y6 A# ]
        {
$ a* |. t# O/ \$ A% m            // 从 RBR 读一个字节6 `/ n2 G' ~6 S1 t6 v& S4 d
            UARTCharGetNonBlocking(SOC_UART_1_REGS);( z/ ?% W. h$ E; V3 G# G
        }
0 C8 q' e: @3 a9 L5 }+ b! J    }
4 [. G8 o% s0 u  O    return;
# k/ L4 I) S6 E  H) O}
  P6 l' r! G0 bInt main()7 L; R6 H3 W. R1 b8 d
{
2 N9 o& l: U1 V UARTconfig();//uart 配置+ s2 g9 g$ u0 D; m
    Error_Block eb;
, Q# q5 [/ u7 c3 Q; b  ~    System_printf("enter main()\n");3 s) H% q: g6 R
    Error_init(&eb);
0 O9 v3 E! R5 Y; B: y: e/ r    // 动态创建硬件中断
& J- J- O; X+ m; S' c    Hwi_Handle hwi1;4 b9 s- X) l5 F) j
    Hwi_Params hwiParams;
9 P5 B+ A: ], ]    // 使用默认值初始化参数+ M/ z9 d  I# @6 ]3 ?' T. S
    Hwi_Params_init(&hwiParams);+ `2 a* a6 {' @: @+ _7 }; t
    // 中断事件
& M- O& k  [- t& W- t+ d6 T% B    hwiParams.eventId = SYS_INT_UART1_INT;
, x# E) O0 v  ?8 F    // 传递到中断服务函数的参数) m; z1 B- W+ H7 j. P4 R
    hwiParams.arg = 0;1 }9 N2 h6 y. B
    // 不允许该中断自身嵌套* Y5 h" Y4 K- E
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;5 U$ l7 z# E9 A' F% ^8 C) Y; F
    // 使能中断9 X- o  f7 P+ z/ M/ Y6 w
    hwiParams.enableInt = true;
- j' ]. Q/ U% `( D( x2 C- t    // 可屏蔽中断 4
3 {* U0 G* e- O- b2 E. z. h3 i1 A/ M    // 中断服务函数 hwiMain
/ M/ |5 |! h8 W! e    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);) C9 ^, s2 t5 U: ?4 x: T$ C
    if (hwi1 == NULL)
$ l: R, ~  {# v        System_abort("Hwi1 create failed");
* ?+ s  m6 p. C) R" c# M4 C& M) F    BIOS_start();    /* does not return */
# J% u2 v. E. g2 R( _; c( o- b    return(0);$ L% X( a7 V- D6 g$ h, D4 j
}
: X: {7 s! H) }% F& s. `" b  V. M4 ^( o; Y

作者: 希望缄默    时间: 2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?
  q! {" R& f+ k: k/ y* N1 G$ p
作者: Greatwang    时间: 2014-12-1 21:49
在中断服务函数里放置断点
4 F6 H8 a; _, h
作者: 希望缄默    时间: 2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49
- O" X6 m4 m5 e6 W# S: s在中断服务函数里放置断点
+ T1 W/ P* @/ U. P, ^
参考 GPIO_KEY
: x- W2 e! |9 h6 x& M5 O
作者: cchwhk    时间: 2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了




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