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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下$ G( q: A7 G& y. L8 o  J6 S
// 发送缓存
4 H4 \, D- B; g# _6 achar Send[] = "UART1 test......\n\r";
1 a4 ]) f4 B  W" r
0 M6 w5 F0 H; ^4 B, ?/ v7 v, @1 mextern void UARTconfig()
/ `7 O' ?) W, B' J  D3 c9 t{
0 X  y6 `" I8 D) `% ` //使能Uart1% u/ y- S% R, y! f- h3 H: ?0 l* B
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);# h1 o7 W7 U- }+ a' `
; q  j- V) F8 b- X" j
// 使能 UART1禁用流控4 {# V3 x7 I$ M! Y2 G; Y
UARTPinMuxSetup(1, 0);) Y. x9 P1 K" [/ h  C5 ^5 T& C# C

7 `. Z  h1 v3 ]" {9 H% r0 N // 波特率 115200 数据位 8 停止位 1 无校验位5 S% c* |% l# h7 P$ {
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);2 r! s: w; W6 n0 U! s

% {0 v9 u* S  H- c& h  // 使能 UART1
) m+ w5 t# u- ]6 Y; o' x6 W! y UARTEnable(SOC_UART_1_REGS);
  j( O2 Y! y# c) ~; G- L% C5 D/ D  // 使能接收 / 发送 FIFO
% Z. ~# v8 D8 F1 E! C" V& Z  UARTFIFOEnable(SOC_UART_1_REGS);9 w" ^, \' C' R$ Q; [( ?
  // 设置 FIFO 级别! t( [+ P! q* t2 d5 a
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);) c  w0 X) ]4 K2 y
  //Uart1中断使能# Z( j. ^4 H" I- s+ [+ @
  unsigned int intFlags = 0;2 N: K3 J$ E' d* S8 f" W
  intFlags |= (UART_INT_LINE_STAT  |  \
, m7 S& j" Y9 d            UART_INT_TX_EMPTY |    \  c+ J6 g# L1 ~3 a/ F6 j, Q
            UART_INT_RXDATA_CTI);7 [$ y% t; m; a; F5 j  y
            ' ~- ^9 m+ S; G5 A5 P
    UARTIntEnable(SOC_UART_1_REGS, intFlags);6 h- Y% j% [" M! y- {4 ^
}( }7 r. E2 `* }. b7 x$ b# D7 s
//UART 中断服务函数
+ m1 Q9 g+ a1 L, ivoid UARTIsr(UArg arg)
; G( |, m1 u4 c3 }& s; y( ~{4 @2 y, ]( B9 r; q1 C; h
    static unsigned int length = sizeof(Send);
+ D# O* g- |- I* w9 f    static unsigned int count = 0;' b' D8 M( x; H* Q; E" d
    unsigned char rxData = 0;0 h( U0 ]/ q. H
    unsigned int int_id = 0;+ D! r9 p' p( w! V. w! \0 R
    // 确定中断源
+ C* q* u+ P8 B    int_id = UARTIntStatus(SOC_UART_1_REGS);5 |% x0 [, n) e, y
    // 清除 UART1 系统中断( J, V" o) s) G% H: J- v+ X
    IntEventClear(SYS_INT_UART1_INT);
3 [0 L# h* ~+ i3 m    // 发送中断
+ X  u' f2 [6 i9 h% l- b    if(UART_INTID_TX_EMPTY == int_id)/ P" k" ?, B% H
    {
  M- v6 d. `( x" }" ?4 s        if(0 < length)) |' C2 D: o( w( E# E; p
        {& o, r. r) ^( {4 P( a; r0 L0 U! J3 S
            // 写一个字节到 THR
2 w8 ^* i/ P/ n; l            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
" h4 N5 v0 G% E0 w7 f            length--;
0 `% c; c8 x/ R+ F            count++;  ^  `' w1 t! l6 `0 R
        }
' R  e/ C9 Y$ V+ i        if(0 == length)
7 k! a1 g" y& v1 \, Z9 m        {
' X1 G* z  d2 N3 [2 g& z/ o5 Y            // 禁用发送中断: }. E0 L2 i" j( t& d1 Y7 P
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);" [# \% }% H% T
        }3 s2 O3 m4 e- Z1 Z
     }
' \4 h# c) \! G* x    // 接收中断! C( c2 H( {3 V# ^4 u: R' A5 O6 B
    if(UART_INTID_RX_DATA == int_id)6 {0 t0 X3 ?0 m  n0 ]  o# t
    {* q; c4 @# |% C0 k$ [* A
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
. T) n. b' W* [9 w% M2 a5 l& j        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);. A' v& X7 r( S/ `8 ^' B
    }( @9 }7 n0 w& }7 C: B
    // 接收错误( a# b! ^5 @# E- m! d/ P! w9 |/ s
    if(UART_INTID_RX_LINE_STAT == int_id)" m3 S6 @+ M- S
    {5 c" ~% P. ~% c! y9 {
        while(UARTRxErrorGet(SOC_UART_1_REGS))
& G3 z1 z, _9 O9 e$ X* h        {, t5 _: `6 z: K  g
            // 从 RBR 读一个字节
; d% _4 o( r4 U            UARTCharGetNonBlocking(SOC_UART_1_REGS);6 ^6 N! N1 Z  S
        }" ~' `" i3 v, X' O6 w' R' G
    }
5 [5 ~- B9 |8 c5 ]% `1 {9 A    return;" }8 M" ]5 j& y& H$ U* W* }
}
( o' O5 N- n7 a0 \0 F* Y: ]" YInt main()& D! b$ i9 X6 s/ [* t
{ ' Z, M/ C& ?4 V, a
UARTconfig();//uart 配置7 g, c' M8 Z# T3 t2 T9 O6 T4 z
    Error_Block eb;; v! z; ^( G" L  d
    System_printf("enter main()\n");
1 {0 C8 c& x$ }1 j9 C( j! a    Error_init(&eb);! n- f4 ]5 L6 w: y- o6 }# b8 n
    // 动态创建硬件中断
" V) d# E! o- B* Z$ f( L. R    Hwi_Handle hwi1;9 q" j; H" c" M
    Hwi_Params hwiParams;
# C+ A3 _, o8 j& D    // 使用默认值初始化参数) w" D( M) M+ Y$ J/ \
    Hwi_Params_init(&hwiParams);
4 V1 O( R. V2 f# R5 D$ v, o( A& J    // 中断事件
( q: X, Z, K3 `: Y    hwiParams.eventId = SYS_INT_UART1_INT;
8 g/ B6 W" J4 E  V& O! O+ a! V    // 传递到中断服务函数的参数. p- K! r# j% I' W4 @
    hwiParams.arg = 0;4 W& z4 ^' P% K, f
    // 不允许该中断自身嵌套
) z. ^4 m- Z" c& x: ]/ T( Z, g& R0 O    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
0 A4 o, b" T# X, G. U    // 使能中断
  v: j% B. D: h5 t1 r    hwiParams.enableInt = true;
5 G) t# A1 Y4 {    // 可屏蔽中断 4, ]8 q& w  m- T3 j  w+ u2 {0 u
    // 中断服务函数 hwiMain
1 P6 j6 o+ Y% Y5 L  ]    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);' F9 U; |8 _8 t4 Q( m! S6 L
    if (hwi1 == NULL)! T" b- r5 T! u5 \, z* ], O" G
        System_abort("Hwi1 create failed");
/ `% |- s: a1 A* J9 r    BIOS_start();    /* does not return */
5 X7 E7 X9 j+ F& M* w    return(0);
6 v1 D  L  P8 Y5 w  h6 x) o}' \7 a6 r5 D# c4 L8 m' j
0 m8 i& F3 D3 e! Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?. w! I0 r# I) F. e$ n7 P, ?; H' d
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
) Y4 Z* }, }# |6 W$ c+ r
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
% t- ?0 L* o2 w0 v" B  \在中断服务函数里放置断点

/ B0 b  T9 K+ Y: N# ~参考 GPIO_KEY
. B; l1 O' e' F2 D( `
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-19 06:52 , Processed in 0.037405 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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