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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
8 s: O: Y9 N5 d$ M// 发送缓存$ U4 |3 [& m( O6 Z) g" X, B7 f* g
char Send[] = "UART1 test......\n\r";
, f4 s# A" W0 |4 H* b0 t( U
, i  K, ~7 T5 }7 V4 m' q/ h" @2 Sextern void UARTconfig(), P5 @& Y9 ~5 @8 p
{
- Z: E5 h# M7 v# V5 Z4 B3 J //使能Uart1
+ C. f& p+ L' k6 v( T0 v- s1 b: n PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
  K. T- L' _5 c5 Y' E7 A* Z, ~ 1 O3 P7 u+ E' T
// 使能 UART1禁用流控
+ u: C! u+ Q" l( w  n( Z- l0 r! M  I UARTPinMuxSetup(1, 0);1 i$ O- k( M  e$ M1 t
' q3 d; q2 A% s, Q- o& k. Z8 |
// 波特率 115200 数据位 8 停止位 1 无校验位
$ ]( s. I! v0 K7 {: V8 i5 b  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);4 _, O# ]. A# W4 F9 j5 i% Z
, K4 Y1 o: G. i$ B
  // 使能 UART1
8 O1 {8 s, j/ {( N# {. I+ u- E UARTEnable(SOC_UART_1_REGS);
7 `8 q' O4 g' K! h  // 使能接收 / 发送 FIFO( ~3 p( b, d$ g
  UARTFIFOEnable(SOC_UART_1_REGS);
3 d- c' G7 f7 K/ |  // 设置 FIFO 级别
2 L+ n8 H1 C6 |9 t. P8 {    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);0 c/ R' o# C. s4 ?- V9 d
  //Uart1中断使能5 N& s* m: {  U+ l; k1 W
  unsigned int intFlags = 0;0 z' H; ]0 I- y9 q* y6 f
  intFlags |= (UART_INT_LINE_STAT  |  \: j$ H. o( M0 ?( q3 {5 a
            UART_INT_TX_EMPTY |    \
0 v& l" ]- B# C  z& D+ [, b            UART_INT_RXDATA_CTI);4 ^2 E- D. m9 s0 t+ ~' I
            
( Q; Z% b( N$ G9 |! [1 x* }' f    UARTIntEnable(SOC_UART_1_REGS, intFlags);
% y% P8 b5 D/ Z2 b# H}
& @) M& |% e/ L4 f, e//UART 中断服务函数# ~; N9 w6 f8 Y
void UARTIsr(UArg arg)
/ Z- x  B, Q6 I: I5 T! C) N{& O+ P* J, b% g* d
    static unsigned int length = sizeof(Send);1 l" b1 @  \1 H$ V7 m
    static unsigned int count = 0;
. N: `  Z- b( _  @: ?    unsigned char rxData = 0;
! m$ O3 L& u  ?    unsigned int int_id = 0;8 y5 v% j" C7 a! `
    // 确定中断源
$ N0 b) C# Q; d  D" @    int_id = UARTIntStatus(SOC_UART_1_REGS);
! X* U) _0 G  c! y) _, N    // 清除 UART1 系统中断
6 Y7 `7 e; Y- X7 Q, ^4 `1 k8 w    IntEventClear(SYS_INT_UART1_INT);9 j; m' ^% Z, u5 W0 G) C
    // 发送中断7 p( ?: r% b5 u5 A
    if(UART_INTID_TX_EMPTY == int_id)
2 u) N5 u8 ?& F# |( Y  x" n    {
/ l  S. |: B- q        if(0 < length), b1 `1 E$ d" c' _, m; ]% Q
        {/ x# @$ L1 s& A% L5 U
            // 写一个字节到 THR3 a! i3 E0 Z1 {
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);( t2 X1 _/ z" U9 g4 I2 o" |8 {& M
            length--;
  W2 ?7 v# @: {            count++;
% Z- D( [: a2 z; l( T2 d        }1 t3 ~/ K0 [/ l, N9 \& B
        if(0 == length)
4 [: \$ r% I! d        {7 \5 `9 B! I  l, S+ z
            // 禁用发送中断1 f+ G7 ]  [7 {
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
! s( x2 d/ x" }" G9 T. a& n; J        }
+ m! t. \! p+ Y2 l: q3 h) f     }5 H: i! |  P2 |6 H* `& t4 x
    // 接收中断# ^6 }% h( _9 S' o9 W7 T
    if(UART_INTID_RX_DATA == int_id)% E7 K$ _8 B) j
    {% e& S: {/ ?) r! N! a; O6 }. g5 s
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);$ s. S' k* I* z
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);' t. M" T: l: `$ n  D  g
    }
. R; X; D- C9 z( N8 g    // 接收错误
4 f* E: T0 c5 v' K, D, Y7 x( _  u    if(UART_INTID_RX_LINE_STAT == int_id)6 e6 b' j. A9 R1 e: W6 s
    {
+ p6 _/ _6 n/ g+ L) _        while(UARTRxErrorGet(SOC_UART_1_REGS))- i3 g, r/ D; `2 {% v9 \7 L
        {
: i$ @, A- Z6 T! N; {9 Y            // 从 RBR 读一个字节- T& p1 F  n: H5 r8 M* k
            UARTCharGetNonBlocking(SOC_UART_1_REGS);
3 q! p, s' V2 t- z: O        }* N) b; L1 y& Y9 g$ |# n4 H0 b
    }: T( j  ]  w  k! o3 m1 e
    return;" ]/ d' T) c3 Y; l
}
0 ^! ?  F8 W! Q& |% {7 S- ~$ GInt main()
2 g4 j9 K# ~" H( \0 e{ 0 m0 d2 P1 Q/ E8 k
UARTconfig();//uart 配置  M+ g" V8 e" E% z7 g5 Z4 T
    Error_Block eb;
/ x. `- v2 @# I. d. Y- i1 a2 F    System_printf("enter main()\n");
3 o; N- s3 A8 k" d( s& w4 u9 q    Error_init(&eb);8 B/ x* v" _% e; X$ k
    // 动态创建硬件中断
$ e' @$ `! S3 }4 J$ W    Hwi_Handle hwi1;/ N+ b9 p9 j1 z5 @
    Hwi_Params hwiParams;
1 c% n# ?8 A, @! {2 [3 x0 O, a    // 使用默认值初始化参数
2 [% @. \  ]9 c/ l    Hwi_Params_init(&hwiParams);3 n2 T* ]6 o% N- v7 _
    // 中断事件
) H) ^* t+ q7 A6 r( Q    hwiParams.eventId = SYS_INT_UART1_INT;$ i0 H5 s( A1 h; T* }* Z
    // 传递到中断服务函数的参数
' U8 M  F! D6 g' _/ _) |    hwiParams.arg = 0;* E* k9 a+ G* A+ b
    // 不允许该中断自身嵌套% ~. `2 X- }) y+ q$ O* D
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;( {! @! p( ^% G9 {$ h
    // 使能中断
! O/ H1 k/ |0 Q/ B& c    hwiParams.enableInt = true;
' }& t) [8 {& Q7 E+ m& `$ {* |7 k    // 可屏蔽中断 48 e1 k8 {0 D- g. M0 L1 S0 ^
    // 中断服务函数 hwiMain
% F& i- R/ n# p7 _3 P5 v    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);. o" V4 Y) O, @- P# s
    if (hwi1 == NULL)# J( R( G) A) h& q
        System_abort("Hwi1 create failed");
  b+ S% Z: a& c2 L    BIOS_start();    /* does not return */
6 j  W5 o+ @4 `+ D5 U6 o    return(0);0 u, z# z5 C5 e. m* `
}
8 l( @' |- a" w6 U5 [0 I  z7 `, D* ^8 Z$ E/ ^! e+ F* Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
. n, |' L* _9 `4 L; ?
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
: U9 j( `+ t+ C3 c& o- }
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49" g3 L8 G+ ]; x: T, l
在中断服务函数里放置断点

6 ?. Y) H' P& q( \: t' H参考 GPIO_KEY1 p/ [; i( v7 P5 R/ b
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-10 21:53 , Processed in 0.041149 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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