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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
; f4 I# L) {- X8 q9 Y" ]/ l// 发送缓存: v$ c% I) k2 }9 r3 M$ T) I
char Send[] = "UART1 test......\n\r";
* j6 _2 [: Q  \, G6 s0 `
4 m( f* W$ i) p/ Z& Zextern void UARTconfig(), ~0 W( n  S* S, s+ v
{
9 j- s* I! l+ t8 H //使能Uart1: g# m' w( I+ Q7 S
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
+ G: `9 K! @% W$ C& s' | , Y4 |. o/ E5 P/ Q
// 使能 UART1禁用流控. p/ S" }% ]8 i: `4 \6 M
UARTPinMuxSetup(1, 0);
2 L* j; x+ F' S# |: p* E
. d* \) m8 n9 c) ?: d // 波特率 115200 数据位 8 停止位 1 无校验位0 M- n6 h" V& d% v$ X
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
+ e% V* P, Z- ?# N, f' f8 u4 b% ^ 6 A( Y2 l, l' E0 W9 @
  // 使能 UART1
8 \& [" q/ r+ R) t9 M$ z UARTEnable(SOC_UART_1_REGS);* n2 y% _" S3 }1 O  F
  // 使能接收 / 发送 FIFO  ?! k- ?7 X9 L% ?$ f- I4 `1 @
  UARTFIFOEnable(SOC_UART_1_REGS);
. x$ z  q. w7 Y' t% e- o( T5 r  // 设置 FIFO 级别2 D+ f% ^# o- z+ h9 M( H
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
. g; \4 Y8 H1 A5 m4 W4 j  //Uart1中断使能+ L, A( @! m$ t: v
  unsigned int intFlags = 0;4 |4 o# c4 u1 N. A, z4 ~5 g
  intFlags |= (UART_INT_LINE_STAT  |  \
( F* T  @- P& K- E& D) ?/ h7 {            UART_INT_TX_EMPTY |    \$ u; }- b3 X3 K9 \
            UART_INT_RXDATA_CTI);1 Q6 u1 w7 \- s8 |, I# B9 K
            
$ {) L3 D0 \( \- A6 @    UARTIntEnable(SOC_UART_1_REGS, intFlags);
/ I9 ~6 A0 E- ]4 V}' I4 ^' v8 ^- c$ }
//UART 中断服务函数
0 @' J' A( h; O( W- l, c3 I6 |& tvoid UARTIsr(UArg arg)
% s3 L: c3 Y8 h$ {{
& W7 |3 P6 a0 q: p( Q    static unsigned int length = sizeof(Send);
6 x& j/ L2 e. r- e' V, z3 q! ~  r0 [    static unsigned int count = 0;
  V4 R: u0 X2 ~; Z    unsigned char rxData = 0;" D  C& _) J. P1 i$ z" L4 D
    unsigned int int_id = 0;; z! Y( ^- }2 I5 ^
    // 确定中断源3 P, e! _! T6 w  E& Z) U# E. h3 {
    int_id = UARTIntStatus(SOC_UART_1_REGS);
1 t. ?6 P3 [% ^5 R) B4 `    // 清除 UART1 系统中断' S" f% j7 o( b- {! X) H/ H
    IntEventClear(SYS_INT_UART1_INT);1 Z( y, `5 T4 J) z# s" a
    // 发送中断
2 x$ u3 }( p% H2 e1 ~0 e) Y    if(UART_INTID_TX_EMPTY == int_id)
2 V0 S0 `+ E6 p8 X/ Z9 k    {( \" o  L8 B: `/ D  ?
        if(0 < length)
0 z$ J4 n6 l- ?. l$ g        {
9 J. N; U# d  ]5 s% ~; q            // 写一个字节到 THR* n7 ]6 }3 D. Z  c5 P) u* J0 p
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
( ~6 _! t& M# m1 c  ^1 A9 O            length--;9 |+ ]5 w4 Y. k; e
            count++;
* r1 `$ L; M/ C" d" t. h        }
- W) h# T" ]9 {        if(0 == length)2 _/ E- c6 H* [  F4 l
        {9 N9 H8 n5 f6 m1 v. x
            // 禁用发送中断
4 A( G& ^! D2 f1 Y0 f            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);8 Y: G( j5 `8 T( j
        }2 _, r- O/ M/ a- T, t: M8 _
     }6 V$ G6 D! T. {6 e
    // 接收中断
5 h+ L5 D# a4 m3 f3 r3 ]    if(UART_INTID_RX_DATA == int_id)% Q4 E8 j  A5 m! d
    {2 g# e1 @8 i% D3 a
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
' q3 \! Q* j: U0 r        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
  ~  x5 m& T) D6 P4 P8 r2 }    }$ c: I6 V9 ~  L9 A
    // 接收错误
7 q8 G! Q6 A  ^. o- {! G    if(UART_INTID_RX_LINE_STAT == int_id)3 p/ r# `9 P) o/ R
    {
6 \3 }/ f' ^9 w) {* @) N        while(UARTRxErrorGet(SOC_UART_1_REGS))
6 l9 @+ w$ B( k5 l        {4 ?3 E6 h& V5 ~9 Y0 p' ?* b" P
            // 从 RBR 读一个字节
3 z; I& K: C0 G( W            UARTCharGetNonBlocking(SOC_UART_1_REGS);
4 Q' _( ?- \" w9 S+ Y9 w        }( @, V3 u5 c: C2 _* t6 A" S/ R7 ?
    }
2 Z' F  i$ e) ]6 J    return;
) e0 @" M. Z' D- v- [5 Z}' _9 ^: X5 Z  H% L( z$ m3 }
Int main()/ \$ |; l8 {6 M3 s8 }3 m* o: X
{
  Q, f+ x  k9 I7 w1 c6 E UARTconfig();//uart 配置
. c6 F$ ]# W3 j. x/ a    Error_Block eb;% t2 C/ \2 r1 D
    System_printf("enter main()\n");
! H. i4 T, K; x3 i( w$ q    Error_init(&eb);
# e, R+ b% ?7 ]! s% O0 K! }    // 动态创建硬件中断
, U: `8 a+ r$ {  e$ W8 {2 }# ]; _    Hwi_Handle hwi1;8 i7 c- O5 H+ x
    Hwi_Params hwiParams;
0 O7 B) Q) a. e. y- {: g3 [! R* V    // 使用默认值初始化参数
$ [% g! q% i6 V) j* d! O    Hwi_Params_init(&hwiParams);  b$ m( i9 U% u& W, N0 u. R7 j( J9 v
    // 中断事件
  T: o. X4 h: b) f* ^& B% @    hwiParams.eventId = SYS_INT_UART1_INT;8 X3 o  u% a3 M: ~7 {1 b+ S: G
    // 传递到中断服务函数的参数
* V) e1 U2 g! c& g3 i- H    hwiParams.arg = 0;5 \" y" |9 {/ j$ W
    // 不允许该中断自身嵌套# \" g4 H# x  ~) X# N5 l; Z
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;! X: K# v) r! D
    // 使能中断$ y. b5 J3 t, q
    hwiParams.enableInt = true;; s# k3 w0 Q$ M% U% l) e
    // 可屏蔽中断 48 A' |) P$ E* B9 _$ Q, ]
    // 中断服务函数 hwiMain
: `  V: x) b2 \    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);5 U' E* P) L, y
    if (hwi1 == NULL)3 p) T7 B$ r4 K2 d, c6 b( P& G
        System_abort("Hwi1 create failed");' r) F5 H0 m( J5 E
    BIOS_start();    /* does not return */
* g$ |- L# ~1 z3 s+ `    return(0);
" p6 A' t8 C' W2 r, q}
4 X) z0 m# L8 Q3 ^6 \# t; E: [* s  I( S3 j( A; b, _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?/ x( K& n1 M2 s) U4 M
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点7 {9 q5 C+ \1 Y
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
4 N) M: U  c0 M' W4 p% E在中断服务函数里放置断点
" z% s, y* `' p3 x, B8 t4 D1 F
参考 GPIO_KEY
2 @$ f. V3 o4 L. e4 ^
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-29 13:46 , Processed in 0.040792 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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