嵌入式开发者社区

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

作者: Greatwang    时间: 2014-12-1 14:52
标题: 在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下" \7 n! _% s9 ?; A2 E' p( w
// 发送缓存
% X0 O: }1 W5 @+ v3 u$ e3 P. pchar Send[] = "UART1 test......\n\r";
& z( K8 S. A8 S4 k8 ~+ R: X+ e0 u! E7 U$ r* G
extern void UARTconfig(), w, c) o% \: K/ ?
{0 @" L2 V! L" U4 f# Q' X, T% N+ p
//使能Uart1
$ K8 ]0 N1 d, g' @- s* w PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);/ q1 v) W1 o$ l/ O+ K$ T

; H; O% F0 W* j, J$ S; F( ^ // 使能 UART1禁用流控
) R" t+ G1 Z& X( B2 G/ A- { UARTPinMuxSetup(1, 0);
, F4 L  ?! P6 U/ H: I+ b! ?
4 M8 e. w4 l+ j# @% T+ z" Z // 波特率 115200 数据位 8 停止位 1 无校验位
+ h$ n" B) @$ D  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
* y8 B/ H' G* Q  {7 ^3 F" ] ( f4 a3 ~' l  D3 s
  // 使能 UART1
% {; q- x7 j* A, F; \$ l UARTEnable(SOC_UART_1_REGS);
5 @4 I* ]& _' D$ r) ]7 Y7 D  // 使能接收 / 发送 FIFO
8 q, k/ _8 C% j8 S. g" ]  e  UARTFIFOEnable(SOC_UART_1_REGS);7 e' s. Y* ]& T% n3 E' J
  // 设置 FIFO 级别- S6 D2 T; G# e+ \6 ~7 t: V
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
4 l: C2 _4 P/ X  //Uart1中断使能6 I+ c* E$ p' j: I' L9 B6 _( e
  unsigned int intFlags = 0;
1 ?8 s5 f. ?6 f6 R# V+ ^% x" [" f  intFlags |= (UART_INT_LINE_STAT  |  \  p5 v; v" v" N7 x& k
            UART_INT_TX_EMPTY |    \( W  a: I# x+ S. I
            UART_INT_RXDATA_CTI);* W  e( @) t7 T+ R
            
# I  X1 ]# h5 `$ ~3 k3 E/ E  B% i" D    UARTIntEnable(SOC_UART_1_REGS, intFlags);, l) G. B1 u2 G3 V( ]1 m/ \
}: ^# a0 B  T8 F# k/ Q; O
//UART 中断服务函数
& e5 E: P- P5 V' G# d4 wvoid UARTIsr(UArg arg)
& m2 S- A- V1 o$ `' o6 I0 [{
' f% w, H( M% t& j7 _) A! z    static unsigned int length = sizeof(Send);
6 [# T- z! {+ S9 E+ U# j& m    static unsigned int count = 0;
. U" U; s! C) F' C6 A    unsigned char rxData = 0;7 Z/ A$ h/ z8 V. P! A. H9 h1 Q
    unsigned int int_id = 0;
) L1 P3 i& w  w" }- d    // 确定中断源7 O4 n* V$ w3 j. [
    int_id = UARTIntStatus(SOC_UART_1_REGS);  l2 Z/ O3 L5 Y, _, L) J( H
    // 清除 UART1 系统中断
( ^9 ~2 Q4 H/ y  s( Z    IntEventClear(SYS_INT_UART1_INT);: T0 k+ ^6 w+ A% R, \- w4 L
    // 发送中断
2 A- u& C: L7 _+ M) b' E    if(UART_INTID_TX_EMPTY == int_id)$ d, s3 I$ N' Z+ v! T
    {. {8 Z& h1 a/ D0 [- g0 Q* s
        if(0 < length)+ C8 W4 d- t5 _7 t9 r$ u
        {/ ~6 F- e+ j: M9 h& }" X( A
            // 写一个字节到 THR
/ Z- m+ f; c( i1 _1 a" R            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
6 \) B$ {! U; N7 @! `( h2 {$ J            length--;
9 _6 P$ u" c) c$ W            count++;' d  K) d, y# c- T
        }
) S3 q, h  |' }& ?  @9 t        if(0 == length)
/ o$ C' q  p8 M) r/ A& S/ v        {
2 m5 `( X; a% k1 }8 [3 H; `            // 禁用发送中断+ A5 b! M; r1 u; U8 v
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
" }9 r6 Y# H5 g$ X        }: V0 C5 y, x0 d/ P7 o6 a* e* z2 B
     }: s' }8 O( }3 E2 \% V8 U
    // 接收中断7 z% x7 M- B* i$ a
    if(UART_INTID_RX_DATA == int_id)
  n7 }' ^: x% d8 ~1 l9 ]    {" e0 W/ \1 n3 u( R! e
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
* I1 j1 X" V- P; v8 ?* {, y        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
( ~: F7 x- R8 }# a8 z- ^    }
. f8 o  H1 n+ l% G7 g- t3 g& ^1 t    // 接收错误
6 }, j! W) Q1 s7 V5 t    if(UART_INTID_RX_LINE_STAT == int_id)
) H' ~9 B. [3 U& v8 h    {3 T( q* C" \8 ]/ P& g4 P
        while(UARTRxErrorGet(SOC_UART_1_REGS))
8 b" l7 |/ o' Q% ~- U- A7 O        {
8 J- {  f; `$ u: @4 {5 k            // 从 RBR 读一个字节; t" V  B7 ?6 g  W! ?% |
            UARTCharGetNonBlocking(SOC_UART_1_REGS);
& V( e+ ^" d8 V3 |+ w* K! y        }- S3 @4 Q5 r4 H4 ~; `' ?% h
    }
- @, m' ^* O( \" a    return;, r5 v7 D. t6 [+ O0 e) a
}
) k3 C! \- g$ VInt main()
$ e! j' z' ]! W$ ~* g{ + i+ N( x2 J- |/ E
UARTconfig();//uart 配置" t' D! p% @  G6 U6 z' g
    Error_Block eb;
$ O" O6 K0 E% g' e' d3 E1 A    System_printf("enter main()\n");
) f* Y+ Q2 \0 \1 }    Error_init(&eb);% M0 F, [' u' c* @8 U
    // 动态创建硬件中断% N  p  p4 A! J
    Hwi_Handle hwi1;
! x$ k" W! a; ^0 Y! |, b; q    Hwi_Params hwiParams;/ T2 }% O1 d/ T* N+ A5 p2 C' Q- e
    // 使用默认值初始化参数0 V. Z# q( g; ?# b* c* g; m
    Hwi_Params_init(&hwiParams);  P. l5 U; T2 w' m( e8 v
    // 中断事件
/ q6 s8 U7 t! X) X2 t3 P) o' U7 X    hwiParams.eventId = SYS_INT_UART1_INT;
6 t$ g1 G2 U* Y' H" H5 s    // 传递到中断服务函数的参数1 D( e6 [- A: E) U+ w, |- I) R
    hwiParams.arg = 0;
* s0 U' q5 ~6 n    // 不允许该中断自身嵌套
" @1 o: h8 m3 v/ S' |0 t    hwiParams.maskSetting = Hwi_MaskingOption_SELF;$ V6 }# `3 n% l; _7 r( i" _
    // 使能中断7 u0 m6 U* ?* W* b$ S
    hwiParams.enableInt = true;4 Q  I* {1 Y! z+ Y) d2 B+ y0 ?
    // 可屏蔽中断 43 g" Y! c7 Q, O4 a  G
    // 中断服务函数 hwiMain
' [% S, b1 U2 \$ L! j8 K    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
) P. f- D5 A: k9 C4 y: O! h    if (hwi1 == NULL)  o2 X' f8 b( |9 g1 M( d+ c
        System_abort("Hwi1 create failed");
! O( V5 ~' v+ ?' ~    BIOS_start();    /* does not return */
7 |0 E; ^$ j. e% [& C2 a  W    return(0);
- \% @3 m( R8 [- a  {+ X}: o- Z! u/ x. o) N

' n9 I' ]0 w. `
作者: 希望缄默    时间: 2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?5 c4 u3 Z# {" G, S

作者: Greatwang    时间: 2014-12-1 21:49
在中断服务函数里放置断点, \# ]4 T) u7 J; ~6 g/ n0 n1 H

作者: 希望缄默    时间: 2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49
; n/ K' H4 Q+ o. D在中断服务函数里放置断点
) c. o6 U. ]/ j% h" [
参考 GPIO_KEY6 t/ r% |: i/ Y2 Q6 v& U. {

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




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