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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
0 j: S1 i: w+ ?2 n// 发送缓存
, @5 V1 ~0 f" y- [! V) K5 xchar Send[] = "UART1 test......\n\r";
' d2 {  Y& v- B( l1 J& {& j( E/ q" R) M: d* j8 ~" y, i
extern void UARTconfig()
% N' K  ]7 n! l5 Z2 A{' @) d9 Y4 b% b2 m) j% A' ~
//使能Uart1$ A: R4 L$ A; K5 W1 F: k( _. a
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 E+ S" g  a  E + x( k7 [% n! X" i5 P& E0 e* `
// 使能 UART1禁用流控. Q0 S& G! [: E: a- Z" Z  d; _
UARTPinMuxSetup(1, 0);
) k& H7 E( ^5 ^$ z# H& I$ ]& v % q: N& ?2 [# I9 _8 R7 K
// 波特率 115200 数据位 8 停止位 1 无校验位
# J' L% n8 @+ e' Y, H! Q: r  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
0 y! C  t! x5 d7 K; Z
/ c  }0 p( V/ h5 E0 V6 U8 |% F  // 使能 UART1
0 W, l  s; W+ h UARTEnable(SOC_UART_1_REGS);
: a' ]/ m3 J) O' A9 _* B, p. t  // 使能接收 / 发送 FIFO# G3 D% W" S7 o( G1 }+ h, M
  UARTFIFOEnable(SOC_UART_1_REGS);
+ p6 d7 u6 Z. A2 `  // 设置 FIFO 级别' w8 S6 z, c- E$ a6 N2 ~5 E
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);; g/ V4 ~; I9 m1 |* N. N
  //Uart1中断使能
; s) {1 m; m- P; q/ r  unsigned int intFlags = 0;0 S6 @* W- f1 X* C
  intFlags |= (UART_INT_LINE_STAT  |  \2 W) v/ o% a# K5 ~
            UART_INT_TX_EMPTY |    \
4 L; H+ i; j/ {9 w            UART_INT_RXDATA_CTI);9 Y, ?' q0 N7 S7 ?7 K1 X9 e
            1 F0 z$ w) k3 B# Q( u$ b; G$ |
    UARTIntEnable(SOC_UART_1_REGS, intFlags);6 A, P) B9 b! ]. A2 |, n% S8 h
}
& V0 G: x! O0 o" B# |2 f//UART 中断服务函数
6 B2 K9 k3 G% I- |: t- w9 `* @void UARTIsr(UArg arg)
" ^7 T0 d/ {) ~* }# e; K  A{
# Y5 ]! \; H" `# J% q    static unsigned int length = sizeof(Send);* i% r" z9 p5 Z/ p
    static unsigned int count = 0;
; `0 J* K2 I" f& X. y. k    unsigned char rxData = 0;) o6 ?# F5 Q7 P1 K) r0 `
    unsigned int int_id = 0;5 c3 E, L% v( t; \* |3 |
    // 确定中断源
; O' ~& I! y, \' N: H6 H    int_id = UARTIntStatus(SOC_UART_1_REGS);1 A: M5 y! w8 y! K0 y& P/ V
    // 清除 UART1 系统中断
3 G& A1 O- _0 G  Y5 q5 B0 z# A  ]    IntEventClear(SYS_INT_UART1_INT);
4 t" I  w4 J6 F: w6 V- U6 n    // 发送中断- P5 T- b2 A" Y% _! W
    if(UART_INTID_TX_EMPTY == int_id)' L# T3 t7 j$ C2 |/ {5 S9 s
    {
: h. w3 f3 ^# l5 M. r$ y        if(0 < length)
$ ~1 C+ X/ E3 w; T1 ~        {& k( H4 o& {8 H
            // 写一个字节到 THR+ F. `! }9 I% ]/ t) w7 s
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
% l' Q- Z" ~; s; ]. F- z: C            length--;
. d8 t" A2 j6 R% O, f1 s0 W3 H2 w            count++;8 N: O5 E& f! R4 Q" c* ?9 d
        }& M. v( K& d7 i' a3 D6 J
        if(0 == length)9 A1 ]0 v7 a9 b
        {
- {' I1 P! \7 e, ]; V3 Q/ w0 d            // 禁用发送中断# V* n5 w: y# x0 L' b! C9 R& O
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);5 f' A) x, |% ?9 D# h7 X( V
        }* l: R* X$ r- {9 T: g( W
     }5 H4 @" M. I' a' R2 Z
    // 接收中断
4 |8 W+ k# d$ u; ^    if(UART_INTID_RX_DATA == int_id)2 b. {) O" a5 N! d. K
    {& s' k$ j( h, ~2 A2 ~* h
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
2 Y3 C$ [" |0 \2 B        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);2 p! G8 U% j1 v9 B
    }
9 \! B' D9 Z4 w" j0 T$ U    // 接收错误
" X8 X9 I* S3 i/ B! }5 ^3 n; C/ `    if(UART_INTID_RX_LINE_STAT == int_id)& A/ U- E: b- A  w$ J$ Q# X
    {1 U1 Y6 h( x! N
        while(UARTRxErrorGet(SOC_UART_1_REGS))# V- b1 G. x4 R, j
        {
# R/ p! S4 v' T$ D            // 从 RBR 读一个字节5 W) j% B8 V$ s7 G1 F+ ~* _8 {
            UARTCharGetNonBlocking(SOC_UART_1_REGS);' P8 A) K9 t0 z0 X0 s8 W3 u
        }- l3 g& G/ r! F+ B3 o) U
    }
, v& F; X1 d7 I! G/ \' R/ ]. s. V    return;
* |: X# Z% T/ N}* V/ m8 G' J4 _3 Y4 Z
Int main()- m8 N0 _  n% c; G( O6 q
{ $ L# A0 g) g4 c
UARTconfig();//uart 配置
, L4 \9 ~. R. G7 d    Error_Block eb;1 j5 z6 ?" N7 P  I5 t9 {
    System_printf("enter main()\n");1 ?" u9 b" c, x3 c, [
    Error_init(&eb);" W( m+ D5 R( `: P- H- c8 n3 ~
    // 动态创建硬件中断" G) m# z/ U! E. R9 C& }) y
    Hwi_Handle hwi1;
, M; J; U& `. U$ F  M  w    Hwi_Params hwiParams;) i) |) J* O4 o, B$ O' h4 _* i
    // 使用默认值初始化参数
  Q1 A, s  |2 T  a    Hwi_Params_init(&hwiParams);
, ?1 E- T; I2 T0 b1 t4 Q    // 中断事件
8 d4 C. G/ M! A' f. z9 e/ r    hwiParams.eventId = SYS_INT_UART1_INT;
% D! ]! ^$ \2 K    // 传递到中断服务函数的参数7 b. L( C1 J# ?+ V! u) E  U5 M* `
    hwiParams.arg = 0;
' p/ D( R) a3 {! v; }: k, _2 e    // 不允许该中断自身嵌套
! `0 r- Z- Q- L    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
6 j7 [- X& o6 h& X    // 使能中断5 w  j, o. [9 [5 F; u
    hwiParams.enableInt = true;
' u4 W( \2 l5 L1 A: C8 S9 _    // 可屏蔽中断 4
/ c$ t$ @, B& @: j, {% H8 f9 N    // 中断服务函数 hwiMain, X. @# p) o8 k1 ^- i8 q
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
" _% D8 S$ b6 w) m  H  Z  O    if (hwi1 == NULL); G- R* v; ~% K8 y
        System_abort("Hwi1 create failed");
, a6 O, [/ k5 }% \    BIOS_start();    /* does not return */# u- {7 D) W5 Z4 m
    return(0);
& Y4 R0 a7 x7 g. |; F0 N}% |  V. w( w9 j) i
$ A; [" J3 ?' p7 Z  i, Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
+ h: v. q! f; A
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点( F- \5 Y7 d9 m( K* o, q
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
& k4 V) o( j9 U5 a  d- b在中断服务函数里放置断点
" i2 G) }9 m' J" m0 S
参考 GPIO_KEY2 g& ]# x; {, `4 h# r
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-18 18:15 , Processed in 0.040720 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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