嵌入式开发者社区

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

作者: Greatwang    时间: 2014-12-1 14:52
标题: 在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下/ e+ l* H) j( c% ^0 E1 C4 S% ^
// 发送缓存1 i- ~3 l2 L2 P0 t9 V/ K7 |
char Send[] = "UART1 test......\n\r";  v5 V1 z# T+ a( l' v( r1 ~

& v6 K1 `5 O3 S9 G( Pextern void UARTconfig()5 d) c3 u% u. ]7 h$ T
{
# M7 V. L) d5 s% b) D3 ] //使能Uart1
6 a0 X) n% X3 z  Y" _* n" E PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. q' E7 M5 d- F5 D
8 w2 u8 z5 [9 q! x# X // 使能 UART1禁用流控( `9 @4 Q3 `$ r# j, Z
UARTPinMuxSetup(1, 0);0 p0 K, K5 ], H: h
. v& P' x, V4 A8 ]$ W+ g
// 波特率 115200 数据位 8 停止位 1 无校验位1 ]6 ?# R6 s* G$ X  l
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);" j5 w) W6 h! p7 ]. Y5 I0 \

1 D( ^  _3 h, z. y+ j  // 使能 UART1
0 K  l# {& s' B UARTEnable(SOC_UART_1_REGS);4 r, T) z: w; e# I! p8 m3 B
  // 使能接收 / 发送 FIFO* P" n0 s) s8 q$ c- N4 Z
  UARTFIFOEnable(SOC_UART_1_REGS);
* O. j7 ~6 i, G" C, u  // 设置 FIFO 级别* @& ]9 y& J( b. c: I* w( `
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
( @* v& D; i6 s  //Uart1中断使能) y* r1 ^0 T; A, Q. f+ I% Y
  unsigned int intFlags = 0;, X; [# c1 Y) J  z5 k
  intFlags |= (UART_INT_LINE_STAT  |  \$ t6 ?7 s5 e/ c! ]0 p) N
            UART_INT_TX_EMPTY |    \
$ }% }6 r+ X& r  ~5 A/ i, Y            UART_INT_RXDATA_CTI);+ b, u3 ~' N. ?/ `
            : O8 X9 R# n  R4 d
    UARTIntEnable(SOC_UART_1_REGS, intFlags);4 w& M; R; r0 L  w# v4 K( E+ j" F
}1 b) J5 ~* T5 x
//UART 中断服务函数/ \2 j6 Z6 Q8 z/ f
void UARTIsr(UArg arg)
6 B% P1 |+ T3 y2 }3 Z* P{/ p* M5 D* z( X+ L5 |
    static unsigned int length = sizeof(Send);
/ I9 X& A! t. V, o5 ?+ L4 _& i    static unsigned int count = 0;
' @4 u/ K) x( b. ?; N8 A% t5 N2 P9 V    unsigned char rxData = 0;
- v$ ?+ ?# r! R$ T& u$ p+ S1 d    unsigned int int_id = 0;1 L) g- `* L# h' Q' f
    // 确定中断源
5 a  P7 T! e6 e$ ^9 \    int_id = UARTIntStatus(SOC_UART_1_REGS);
6 N) d& U/ B% W2 y6 k  [    // 清除 UART1 系统中断
# S  @9 p+ I, z; ^. N. B    IntEventClear(SYS_INT_UART1_INT);8 n: A% C/ V6 S2 a' E
    // 发送中断
& H- E  T5 u1 I$ {7 d0 d1 [# }9 Z6 t    if(UART_INTID_TX_EMPTY == int_id)
1 b4 C2 x9 _" P  e# \    {
4 ?+ J/ ]* A; \- b3 e        if(0 < length)
0 c' \% Y' \; P% n# W! |1 l( L        {' m: ?8 w8 Y/ l' r1 A
            // 写一个字节到 THR
! f$ J3 ?8 D- X5 f+ H3 O7 g            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);/ z+ f% N+ I- x7 S3 z3 g% s& g# l  G
            length--;" l& [$ D: j7 T5 Z
            count++;7 m) z2 I, w. B/ s, G/ A
        }
" o6 b: Q2 ]* T8 F        if(0 == length)
" W; `7 J1 Z+ b2 A& v9 S        {$ k2 v4 c9 Q, q4 C
            // 禁用发送中断; y' y& E* t# Z- O
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
% V0 x, ?1 v4 z0 I. Q        }. Q9 l4 z9 e1 v( z9 H, s6 `& q
     }
/ U6 j  H2 o1 h' C1 Z    // 接收中断
, w# _* T# A' U( K% q  p3 v4 {    if(UART_INTID_RX_DATA == int_id)/ q: D* w9 W  S9 U$ ]9 S2 v3 m+ Q
    {( B2 J. U7 R9 c' D7 g5 n
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
" I* x. a* V7 h" H. i% F: A        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);" Y" X( W  |- y8 s% o3 S' M6 G5 p
    }
# X# r. P$ b4 w$ B" {    // 接收错误( _% `$ Q! w9 v
    if(UART_INTID_RX_LINE_STAT == int_id)+ i/ m. J+ x+ U
    {$ j* ~; q) Z. l7 V# l! {7 {
        while(UARTRxErrorGet(SOC_UART_1_REGS))
4 L2 E/ i/ r: M8 k2 Q# U, Y" d4 ?        {
  m; e3 O$ V& P5 u2 Y8 c+ {            // 从 RBR 读一个字节% [$ h: S, L# g+ Q' Q; D3 Y% U
            UARTCharGetNonBlocking(SOC_UART_1_REGS);( h- @% `4 c$ M; M# x8 ~$ i
        }
3 @0 ^. K- ~4 g    }  b8 V. r) k, ~1 ^% N
    return;* F; p# }: M& T# |, K
}
# i6 m/ ]# x$ y3 L( l0 v, MInt main()
5 K" p& o9 R  a( S/ o2 E& }) ~{
$ k9 x5 h8 w6 T0 i! Q; f. t UARTconfig();//uart 配置
5 s& V( {3 Q) w* m% \( S    Error_Block eb;
9 T, T1 D% o7 r/ @    System_printf("enter main()\n");
* O9 X: i1 o* ?) e1 B1 ]0 M    Error_init(&eb);
, c  i4 c4 J) T' U6 N4 ?+ L; g    // 动态创建硬件中断( i  R1 @/ W+ f
    Hwi_Handle hwi1;% G# l$ F5 Y: b$ ]6 F# u9 Y/ d
    Hwi_Params hwiParams;% i7 q: n' k, S+ l' I
    // 使用默认值初始化参数
5 R" q0 b$ j. W    Hwi_Params_init(&hwiParams);
4 t' f' ~6 k" d5 l4 H: u; R- e    // 中断事件; ?( J/ l: u  |8 b5 Q+ a" E: `
    hwiParams.eventId = SYS_INT_UART1_INT;& w8 \0 ]# C" o$ Y
    // 传递到中断服务函数的参数7 W* P& ~6 m2 m+ K3 K
    hwiParams.arg = 0;! D% o3 \% \  W6 o
    // 不允许该中断自身嵌套  `2 N0 ~, B# u6 {
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;+ J7 @2 J2 h* W0 P2 O6 s9 K
    // 使能中断$ Y7 C% B& f# x  @/ y) f7 i' M
    hwiParams.enableInt = true;
, F/ l/ n1 _: a- b1 z+ x  l" v    // 可屏蔽中断 4
' W% w2 d$ U5 v& |4 Q1 k    // 中断服务函数 hwiMain' {: {3 I: F4 q2 B& y$ x
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);% k' Q- w/ W- c& s
    if (hwi1 == NULL)
) S: a% W4 J! Y& p- ^! i        System_abort("Hwi1 create failed");1 G1 D" {8 w; `; h5 Q
    BIOS_start();    /* does not return */
* g4 l- r- x2 x$ H    return(0);
6 B9 }1 e; n3 Y" D0 Y}
! q- {# u& z) q# H* c! R- l3 S! Z0 u# Z& K; u% e0 p$ T

作者: 希望缄默    时间: 2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?2 ?6 F5 N9 D' W9 ?7 i+ j

作者: Greatwang    时间: 2014-12-1 21:49
在中断服务函数里放置断点
  @8 T% E! @! t3 W  g9 p1 M/ B2 J
作者: 希望缄默    时间: 2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49
- ~/ t' w2 J, O+ ]6 s, [/ C6 |在中断服务函数里放置断点

3 s+ h1 t' t4 ~$ W参考 GPIO_KEY
- f, `- B+ T3 t, ^, f* W9 l4 J
作者: cchwhk    时间: 2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了




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