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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
- z" }% l8 X* Q4 f3 ^. ]// 发送缓存7 Y1 Q8 ^( s$ i" z! n5 v
char Send[] = "UART1 test......\n\r";1 v4 i2 d: m" P" H: w; S$ Z! _; e

8 C. V# Y% N/ N; Vextern void UARTconfig()
& w, O! @8 B; ?{' c1 N+ W! H1 L
//使能Uart1
/ J. c) P0 w2 t; R2 t( B: e0 ? PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 A# G3 k, m: d' u$ j- p  }* G
, e' Q, g2 L2 U1 P' X$ m // 使能 UART1禁用流控
" i: L$ U$ N" m" s# H% q UARTPinMuxSetup(1, 0);7 }5 O2 G" d8 v( i8 f

+ C5 m9 l- l$ [$ X // 波特率 115200 数据位 8 停止位 1 无校验位
4 A8 h2 j6 j; M  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);* S  K- s7 W8 y4 C
5 k* P" Q/ y1 v/ }$ M
  // 使能 UART1
2 h9 W1 Y! \& ]; c1 g  r/ Y1 c! s UARTEnable(SOC_UART_1_REGS);
" }6 D. E, `5 c! R: P  s$ M3 l  // 使能接收 / 发送 FIFO, i* r3 E0 z2 n' a/ N; W
  UARTFIFOEnable(SOC_UART_1_REGS);0 f/ ^+ H8 B, u# H4 Z9 P
  // 设置 FIFO 级别
8 c( X' @9 U3 Q9 D; U1 I5 r    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
: H& m. u3 F2 ?: P  ?  //Uart1中断使能
  x% Y8 N; Z$ a9 E+ f6 j! J' `4 `  unsigned int intFlags = 0;
& s0 @4 `+ h: E7 n( \9 ^  intFlags |= (UART_INT_LINE_STAT  |  \+ U+ I0 R( j5 g
            UART_INT_TX_EMPTY |    \8 h9 E, U. ^( Y, Y5 v
            UART_INT_RXDATA_CTI);' Z( g, {  o; [+ X, n: ~: m
            ! A1 d7 e/ s+ w
    UARTIntEnable(SOC_UART_1_REGS, intFlags);
& p9 U  h4 m8 z$ q) ?- ~}0 L! t5 w  A, m( k. }
//UART 中断服务函数7 a/ V# @7 p/ V! ]* [: Z
void UARTIsr(UArg arg)
3 ]3 r  b" W/ e* E; |5 }{7 S3 l7 Z/ O9 T! P. _% |- {8 l
    static unsigned int length = sizeof(Send);
% A5 f$ l) l1 L- L! Y    static unsigned int count = 0;
6 a& h% e2 V5 f( V0 D+ q" y$ {! G    unsigned char rxData = 0;, P" W9 @0 K% s/ j
    unsigned int int_id = 0;
9 y2 U1 u. E/ z+ Y& I7 y    // 确定中断源
) W( v+ q5 E; ]) s) A; h, J    int_id = UARTIntStatus(SOC_UART_1_REGS);
3 G# D$ W) I7 Y  ^    // 清除 UART1 系统中断
. R3 i  n5 B: v    IntEventClear(SYS_INT_UART1_INT);/ h+ x* M# y; f1 F( N
    // 发送中断
6 ?! ^; W$ z/ P3 z    if(UART_INTID_TX_EMPTY == int_id), ]( k9 o8 n7 l  j9 ]6 Q
    {; s1 C5 j4 a& P% k/ C1 T
        if(0 < length)" Y" v, s' g* |3 |: ]
        {7 H7 ?" N! W$ A% w. J
            // 写一个字节到 THR
' h6 ]# i/ b: e& d  \( G8 k            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
) ]6 h) T' z# [1 `+ v0 Y- Q            length--;
+ g  Q  _% b0 D  g( x7 i: e            count++;
0 s0 }0 ]: {& B        }
: P: Y  ^& A, F! {, n; P" ~' g        if(0 == length)! q4 _6 T4 ]; `0 @
        {
- j# X0 d* C( ?: k8 S" Q            // 禁用发送中断/ \* b2 S6 C1 k. [2 A$ v
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
0 r) F7 ?) G& }, [  u- i+ ~. @        }7 C: ]( D" k: J5 K8 t
     }
  J: l* K3 u5 |* g8 T    // 接收中断
: D1 S, L- f+ ~' o7 F. g    if(UART_INTID_RX_DATA == int_id)
8 |: b* P- y( |; I/ v7 I; Y( s) l    {
" k! B( F9 F; e# K) ~        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);) ]: J' J7 n  w: {" l
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
0 p5 c! D' s+ }    }
; V$ C7 L1 M4 f0 p    // 接收错误
; G2 d% r! I  p- V7 y& h    if(UART_INTID_RX_LINE_STAT == int_id)
% {, \& z% \& M( J3 \    {
( Q. W0 J' B" [        while(UARTRxErrorGet(SOC_UART_1_REGS))/ b' U& }2 n2 ~0 [
        {
( u8 a) H( T, k6 F            // 从 RBR 读一个字节
# \+ n5 m' d- r: y1 a7 t5 E! h            UARTCharGetNonBlocking(SOC_UART_1_REGS);( |  T; G  D9 r. U: f' }3 P
        }
0 E% h3 n+ ]+ y& Z    }. o8 i% O, |9 v" `+ P& ?, Y
    return;- ]$ m" G& z0 D9 ~
}
( f- @) Q8 r% wInt main()9 k. f8 V3 b3 V  H: ]% @
{
! T( x- g: U6 c% p3 | UARTconfig();//uart 配置) I7 f! z( d) g* J3 h( S
    Error_Block eb;
( F( d6 @# R2 I0 ]1 O# T; n    System_printf("enter main()\n");
" m% k) {+ j9 K- t5 ~    Error_init(&eb);
# D0 [2 U* i; S4 a    // 动态创建硬件中断! S0 ^& P6 x% f2 q! [
    Hwi_Handle hwi1;
3 p! O! e; _7 Y% }5 e' i" c    Hwi_Params hwiParams;
! f' Z/ g+ G$ I    // 使用默认值初始化参数  w9 n: `( E( O! r8 N( O/ b
    Hwi_Params_init(&hwiParams);# l. t( f0 y. `4 g0 _
    // 中断事件/ B9 _) }7 h/ C+ H5 Z
    hwiParams.eventId = SYS_INT_UART1_INT;
. O8 R' }* A: z    // 传递到中断服务函数的参数
7 ]$ U& e& I) n4 M    hwiParams.arg = 0;
8 K( r) @2 u( [  ^& c    // 不允许该中断自身嵌套# a% Z0 P+ p/ ]7 k3 K3 Z' h
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
* K  b. A4 u, _5 M! c+ j    // 使能中断0 B( Z( Q" s4 Z" V8 T/ P
    hwiParams.enableInt = true;5 S/ m  W# i" |+ O* Q' b
    // 可屏蔽中断 4% ~9 V& Q/ L$ Y8 L! C9 A, C% L' l
    // 中断服务函数 hwiMain
/ h' P2 b) O0 M" O    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
- W. M8 b2 M1 q+ ]. H1 \& |    if (hwi1 == NULL)) _9 z* r$ T" W% k
        System_abort("Hwi1 create failed");3 i2 [6 `' f" d0 E0 q
    BIOS_start();    /* does not return */
/ g2 a# _! ]9 C1 r# L( ^    return(0);. Q: i8 t) A2 Y& H
}* g% {2 N% j2 [( w0 u! z

, O# ~1 u, x+ k5 U  ]" r  N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
7 c& F. v. n) s( k/ p& `6 r
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
% g, Z( f' b  z$ t
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49& d" Z% |1 C5 V
在中断服务函数里放置断点

1 q1 P+ `# }+ w7 R/ G; d# j2 N2 J$ h5 F参考 GPIO_KEY9 ?& U) y, D- e7 i5 t8 K$ {
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-16 03:26 , Processed in 0.045325 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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