在sysbios下,uart中断收发数据,程序无法进入中断 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9703|回复: 4
打印 上一主题 下一主题

在sysbios下,uart中断收发数据,程序无法进入中断

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
: d/ N1 y* F4 U* J" o3 h3 ^// 发送缓存; r2 I4 S- U+ ]7 ]" r7 q
char Send[] = "UART1 test......\n\r";
3 m; p5 x, i! F
+ i, N, k( ~1 cextern void UARTconfig()7 @  @2 l" W$ n" h
{
. S! O$ d) O) g0 | //使能Uart1: Q: K% M- k2 y6 }" ^7 C
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 {; j: A0 K5 n( H4 N  L. B7 j 2 P9 X' ^5 E: P7 k6 |/ i3 V
// 使能 UART1禁用流控
' ?5 `* F% I0 j# s* E- O UARTPinMuxSetup(1, 0);
4 r4 z' A( x  Y
% R% L" ~0 [% Q$ w // 波特率 115200 数据位 8 停止位 1 无校验位& |5 P/ B5 x* \# `
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);/ _  b' E. R1 d# Q4 h! \+ G

% c. \1 O/ F6 t7 o$ }8 v0 ^0 @  // 使能 UART1
" f& ?+ H5 v! T  v+ Q UARTEnable(SOC_UART_1_REGS);4 ?- [1 v6 a% g
  // 使能接收 / 发送 FIFO
/ w1 d4 z1 |9 ^" a. ^  UARTFIFOEnable(SOC_UART_1_REGS);
- k3 U+ ^! t( `) a5 Z5 J  // 设置 FIFO 级别' u1 k) }! `0 I
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);) f. ?+ H' e3 _
  //Uart1中断使能( v! G5 V* E$ ^
  unsigned int intFlags = 0;% M! W; o: z$ {$ S# |/ K
  intFlags |= (UART_INT_LINE_STAT  |  \' o' Q3 U1 H- I  @) _+ r; k
            UART_INT_TX_EMPTY |    \! u9 C' U$ ]" @; D$ ]* e' h
            UART_INT_RXDATA_CTI);
) u: o6 O2 b" _' c: S            + F' Q; h* G# q+ E
    UARTIntEnable(SOC_UART_1_REGS, intFlags);9 D8 b( L7 @7 d# t' p+ p
}
9 k; q3 q7 q( b//UART 中断服务函数
1 r" i1 V3 M* l  M. v3 xvoid UARTIsr(UArg arg)
  k7 M/ R8 _* Q+ {{
" k6 V* x  d9 ]9 G( Y    static unsigned int length = sizeof(Send);
# C; e0 G' D6 D9 m8 _    static unsigned int count = 0;8 M2 s# e0 Z( n* v
    unsigned char rxData = 0;. r+ d6 p3 ]( ]1 F( N; ?* |
    unsigned int int_id = 0;, K2 E3 X2 P. M! T5 {( O: m
    // 确定中断源" c1 R) g" @$ ?/ g% {1 m4 c
    int_id = UARTIntStatus(SOC_UART_1_REGS);) }( g! \% V. l
    // 清除 UART1 系统中断8 u* Z' O- n$ i" d
    IntEventClear(SYS_INT_UART1_INT);5 ?$ J6 ^( U8 \7 S( D: d; L! }
    // 发送中断
" y3 k- F" l+ o2 H, @: I) r$ W    if(UART_INTID_TX_EMPTY == int_id)
' S( W) Q0 Q9 L    {
% Z( ?' V1 _+ ?  O7 z        if(0 < length)
2 C  _! h% [: I" Q/ e        {
2 r* W4 f3 e4 Q            // 写一个字节到 THR# ~) I2 H0 |/ N! x
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);0 F' L6 w& f% n2 O6 i
            length--;& C0 f+ T1 u  Z
            count++;
0 `* [! }- w- ?  n  n. I$ C& Y        }# ~! r0 y: `. B4 P$ ~; V
        if(0 == length)
$ z$ c* P0 W2 S% L6 _+ u8 D% Y, c        {7 H4 M; Q- F. X$ Q* }
            // 禁用发送中断
  e) g& W+ W3 p1 y; d) c3 S4 n            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);- |# B6 v; K4 ^# r- ?4 \7 R  `" ~
        }4 P5 a- C6 _: ~/ \+ r3 I
     }
3 W7 r# }0 \: ^, u. W5 ?    // 接收中断4 e6 `9 r0 y) B+ k
    if(UART_INTID_RX_DATA == int_id)
( Q9 c+ Y* N1 }    {: M, T' G/ `7 q
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
) u9 t3 h( F6 ~, A) x" {        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);# N, Y- p4 Y9 ~+ g: W
    }
4 A0 L& D4 v0 n( \+ G& H    // 接收错误
5 k9 y# w2 n& T* @( D+ m+ D+ \    if(UART_INTID_RX_LINE_STAT == int_id), k6 e) d" U9 Q9 L) q2 T
    {
* c  \6 F3 Y4 p1 v: e5 M1 h        while(UARTRxErrorGet(SOC_UART_1_REGS))
# g; @, ^9 t  a" c        {
9 Y+ u% [8 M! v2 P$ b. W            // 从 RBR 读一个字节
% O  H6 V% E/ ?. @' c            UARTCharGetNonBlocking(SOC_UART_1_REGS);
4 f. n& ^( G/ S        }
: a8 i; i8 j7 w; g    }
4 S; W. F3 k, |( D) ^  V    return;
" l; F! n8 C2 ^}6 {, @. H" R8 F% y
Int main()
; n& b& x9 H4 @* Y8 a" v{ + f- }1 w% S; R: {1 a$ g* f
UARTconfig();//uart 配置# j/ n  A; z+ W. \, ^
    Error_Block eb;  E8 H) H5 ~1 a1 }- r
    System_printf("enter main()\n");
# z. X/ [' X# |* h- t: V    Error_init(&eb);
/ J8 H' ~: P7 K. s2 d2 D    // 动态创建硬件中断
! F2 O. l' ~% E    Hwi_Handle hwi1;. p; I1 c/ J& B$ Y, p/ m1 S
    Hwi_Params hwiParams;
8 p! v' o+ ?* Z, X) ^/ I( o- |    // 使用默认值初始化参数( ]  l% {5 p# x5 D8 a+ v) w3 }2 z
    Hwi_Params_init(&hwiParams);2 |* L+ U, i: V. {3 u4 O6 q. H
    // 中断事件4 d' ]' c. }: [% G5 J4 X
    hwiParams.eventId = SYS_INT_UART1_INT;& {% w  O# L6 A7 Z2 F( w
    // 传递到中断服务函数的参数7 {$ e  i; b4 ?" }+ T3 F. t
    hwiParams.arg = 0;
2 d* b$ R5 `- I% }/ H# D" o    // 不允许该中断自身嵌套
, o  P4 M9 c6 A9 G' {    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
2 J9 q+ A5 H7 X4 T% a8 K# t    // 使能中断7 W4 |+ |  L5 |
    hwiParams.enableInt = true;0 ]) r: C- |; c/ |3 L
    // 可屏蔽中断 4
# E: D( ^, U1 z3 E9 K5 K* d    // 中断服务函数 hwiMain5 a% h+ t/ Y: p+ U# T2 c
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);9 ?! A8 S  e5 R5 m$ T# C
    if (hwi1 == NULL)7 T2 p) @% j# {  i: w
        System_abort("Hwi1 create failed");5 ]" M1 D9 {" S8 f
    BIOS_start();    /* does not return */' `/ x  ^; T6 L; t0 P
    return(0);
- g7 X! j  I! h7 }2 L/ J}
1 Z) G' H+ ^* P) Y( f" p
9 r  R; U/ g% W! D& e3 l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
( Q4 F! R! c3 E+ k( }7 a! c( G
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点. }/ a" t( F4 x. c2 c
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
0 B8 C$ y4 k9 y2 ?7 E/ W: f% a6 W  c' s在中断服务函数里放置断点
1 f. M+ Y- \6 Q
参考 GPIO_KEY# A; P  }0 s, e6 ]# T
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

积分
115
5#
发表于 2016-8-1 21:05:07 | 只看该作者
请问你解决没,我现在也遇到这个问题了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-12-25 05:35 , Processed in 0.039297 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表