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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
, A$ F0 `1 D: s" T: q/ i// 发送缓存
8 C: B% a: C! uchar Send[] = "UART1 test......\n\r";
% x, Y, R* r2 Z0 o" f1 x
6 z: C# ?2 A, P* T7 ~/ Lextern void UARTconfig()
1 j) k% K: p. H& J{
6 u( q; c/ @9 d+ q //使能Uart14 f, m5 u5 J2 g+ l# Y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 n4 N8 f* e3 q) k , Y  n5 E) }" V9 V3 P
// 使能 UART1禁用流控
- l; w8 B1 Q: v6 x  [* R3 _ UARTPinMuxSetup(1, 0);+ c5 n/ I$ u. `$ |" i
( h! Z; [3 G, N& h. o
// 波特率 115200 数据位 8 停止位 1 无校验位
' U" X2 k3 a$ d, x  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);+ X4 P4 Q% c; X" c
- C# G" ^% `& \3 F
  // 使能 UART1
0 y, c  \  T6 R3 y UARTEnable(SOC_UART_1_REGS);+ h2 P) J9 V9 k/ h. \! }5 L
  // 使能接收 / 发送 FIFO. l8 a# ]! h4 `& [4 f1 I
  UARTFIFOEnable(SOC_UART_1_REGS);8 ~- A/ E& \( H- e* g
  // 设置 FIFO 级别7 q5 L3 |+ U/ j$ |! ]9 t; W2 K' k
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
3 ]2 t; L: s1 D5 S+ X* O9 {% F  //Uart1中断使能
' J& [  z+ @( C  unsigned int intFlags = 0;" y* S# ^& _2 m
  intFlags |= (UART_INT_LINE_STAT  |  \
2 z; b* c$ |3 u5 }3 v            UART_INT_TX_EMPTY |    \4 |8 c6 |5 p' P/ E" ~# p9 r# j$ `9 z
            UART_INT_RXDATA_CTI);
8 P% M3 y: e+ M( I" }- H, M            0 y' i' Z+ @: q
    UARTIntEnable(SOC_UART_1_REGS, intFlags);
9 D8 F& X6 H  ?}; }9 d! Y# k" g
//UART 中断服务函数& Z9 X# w5 C! |& L/ F
void UARTIsr(UArg arg)
; x* w! O+ u, U) g! W{: d/ w  x) p; P3 E0 X3 c
    static unsigned int length = sizeof(Send);; P7 K1 w, q1 z
    static unsigned int count = 0;) y# Q6 U- F- C; O' ^5 @4 I
    unsigned char rxData = 0;5 @/ }$ ?( K$ e! C9 P% _. F" n
    unsigned int int_id = 0;" m/ i4 M) L( R
    // 确定中断源
2 g( L! ?( p9 U. V  S' s    int_id = UARTIntStatus(SOC_UART_1_REGS);
+ W/ H! a1 Q8 [" P. J    // 清除 UART1 系统中断7 A3 ^& V) u; C) @7 r' Z3 L. g
    IntEventClear(SYS_INT_UART1_INT);
" W1 D+ q  y5 _% L, L9 C    // 发送中断" I1 o8 g& K0 b8 N
    if(UART_INTID_TX_EMPTY == int_id)8 d1 a# R6 t  u8 p3 `& p, d
    {* u- b3 t1 f! \+ O5 v" Z3 p& w# T
        if(0 < length)
  T" Z  g: _% o8 O- d        {3 v7 }4 R( E, ~) a' Q5 Z1 {8 a* g
            // 写一个字节到 THR
  P! z* G+ ~! X7 m            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
( H  ?9 m0 p4 }1 y$ \3 I/ T            length--;
( a- a( T$ A' k! f+ V/ B            count++;
5 f" S" G8 g" x2 Z+ q0 _1 g        }/ w& {& m3 P7 Z
        if(0 == length); s, M, r( u- n5 p2 V2 N* w0 M8 b
        {
- s2 B# G# M/ p7 y* y7 L! R, D            // 禁用发送中断
6 k" f1 _) X  o& h6 C8 v3 z1 ?            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
( y1 s& v" ]8 S$ y. ^$ I        }3 l2 x3 m2 Z7 C7 Y+ ^
     }! _$ ?5 [$ S, H  X
    // 接收中断8 e  \$ c9 g# ]$ e
    if(UART_INTID_RX_DATA == int_id)
  p* x0 R9 o" N! P    {2 M6 e. g' I2 I- F
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
; ?: u: |4 \3 D3 b        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);7 ~4 U) V* A6 R$ M, T
    }7 ^4 k9 k& N$ Q( @/ ^
    // 接收错误; u. O" a) I7 v2 s% c& k
    if(UART_INTID_RX_LINE_STAT == int_id)0 B, a( z8 W) ?, \. y9 r2 `
    {: e- L; u% B  c4 |( k
        while(UARTRxErrorGet(SOC_UART_1_REGS))6 S4 `' F8 a1 S" K8 ]% Y
        {3 p' z" `, {3 T; E, ?% z
            // 从 RBR 读一个字节
6 z: @, {/ ]3 `            UARTCharGetNonBlocking(SOC_UART_1_REGS);
4 x' B+ W- v0 ]        }$ b' o; V- x& |/ O4 {1 g
    }
& F7 N' @0 c( A! i$ K2 n0 B    return;
* B, K6 N) x9 ]8 y2 C+ @' ^}  v  N9 P. W% ]' R
Int main()
9 j! b" X& u, Z$ W5 l{ 5 f$ O1 s0 D) T, k7 k2 @
UARTconfig();//uart 配置
* B) b2 o2 i6 L" A    Error_Block eb;* l4 V7 {% N# k6 v' h  L
    System_printf("enter main()\n");; e8 q& M0 a# h* N
    Error_init(&eb);  _4 ^( G/ _& b5 [/ ~
    // 动态创建硬件中断3 f" G0 F: H+ `' \* U  R! \
    Hwi_Handle hwi1;& B4 g% m: `  n! j+ P
    Hwi_Params hwiParams;& N8 g, }. v# m- P9 r/ {& A$ W: r
    // 使用默认值初始化参数  a, H/ n3 T, w+ T
    Hwi_Params_init(&hwiParams);9 {# M3 r' M$ T, t6 [1 B+ Z
    // 中断事件
+ Z" p  r, F' N; I    hwiParams.eventId = SYS_INT_UART1_INT;
& `9 r+ K, I" I& Q1 H    // 传递到中断服务函数的参数
7 f$ I" {+ X/ l2 Q3 `$ w    hwiParams.arg = 0;7 Z+ i$ N% U* Y; M& y
    // 不允许该中断自身嵌套# m4 C' Z4 f/ T$ K- e7 U
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;2 ?4 t5 y# T( I( j7 i- ]
    // 使能中断7 h0 X* F& T5 v0 ^# X
    hwiParams.enableInt = true;( \( v* `9 f" c+ t3 l
    // 可屏蔽中断 4
1 m( h8 b* O. h8 }% M( ~1 o9 X    // 中断服务函数 hwiMain
7 S$ g. f$ E# ^7 @, a9 F    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);  P$ B0 m+ m5 d
    if (hwi1 == NULL)
, `4 z- K: C0 A3 a4 K        System_abort("Hwi1 create failed");8 C# S' G/ d2 F" `
    BIOS_start();    /* does not return */
8 b2 E; o5 G1 ~1 _$ F$ W, l    return(0);
6 X& y# ~1 n2 ~+ `}
# `) I# @4 W( v0 X1 b: V/ x% S7 y0 T& ^$ z) n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
# a' Y* ]% t6 ~) I
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
" ^4 V9 E! [- t% ^: G* R- u
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
0 x* I5 v2 B% ]在中断服务函数里放置断点

- i. F/ U1 _) ]* |参考 GPIO_KEY
  b0 w0 c. P" o7 b# h, Z; F
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 23:54 , Processed in 0.040207 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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