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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下- M, `9 c; P. X! W7 v( ]
// 发送缓存
% P4 O# a; m. d; T4 E* Dchar Send[] = "UART1 test......\n\r";( s7 X$ q( q0 T3 K" ^+ U

, Q8 \5 G( d: e# Q: qextern void UARTconfig()* v% g; U/ ~/ U0 l# T! ~5 N
{
- O& @5 i' `6 L% K //使能Uart1
: n; S" Z! }8 w" a9 S PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
' l7 E. q0 [0 D, i! e" a7 B5 l; u 9 w5 i9 Q# ^& }9 o% f* v- X$ s( ?
// 使能 UART1禁用流控
" y% r; X7 m  S! @ UARTPinMuxSetup(1, 0);" I' m8 n2 z+ {0 ^5 m8 M
4 |! q7 |  y5 e, _& ]& O: p0 l7 ~
// 波特率 115200 数据位 8 停止位 1 无校验位
2 o* S. V' c2 i2 r  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
& D" u+ T1 w3 d, R, \
4 |1 \4 Y/ D# q- `8 x1 _# S, n1 [' U  // 使能 UART1
! C( {- H8 \$ K/ Q UARTEnable(SOC_UART_1_REGS);
) ^4 f5 G* j/ `/ O. `( ]& v  // 使能接收 / 发送 FIFO
8 m4 q* Y7 Q# D& e  UARTFIFOEnable(SOC_UART_1_REGS);
% `8 C& e- ^' ]  // 设置 FIFO 级别6 `3 ^1 B0 r/ M. s! `# ^! {# I7 |
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
$ j5 P+ P% a- n( [) j6 `  //Uart1中断使能' E! S- _, Y  i" Z8 p& Y9 k
  unsigned int intFlags = 0;
0 l$ I# ?8 Q; m" I/ `  intFlags |= (UART_INT_LINE_STAT  |  \* Q0 c% ]8 x* H# p
            UART_INT_TX_EMPTY |    \
' V  a$ b2 P& g; _' c  `1 `7 D            UART_INT_RXDATA_CTI);
! j/ _  q) W( I, @9 b9 {            - z3 ?* A$ s' c3 W6 q7 z; I& Z
    UARTIntEnable(SOC_UART_1_REGS, intFlags);
8 p6 C6 {" P. N: Q/ z}
0 A1 z( L- f5 H( {  H+ ]" |//UART 中断服务函数
" i* r5 o% {$ n' G8 s2 Dvoid UARTIsr(UArg arg)
2 ^$ C1 n8 \% R* P! y4 ]: Q+ G{
2 |9 i; U& M/ q' c" |    static unsigned int length = sizeof(Send);2 ?- L9 g( b  Y7 a$ B0 b9 ~
    static unsigned int count = 0;9 }0 ^% T" M2 P. m2 r' D
    unsigned char rxData = 0;
, i. m6 i/ s5 b; ^0 @    unsigned int int_id = 0;
. Z+ A0 |9 O5 s    // 确定中断源7 m, T. S& |( J6 _5 J
    int_id = UARTIntStatus(SOC_UART_1_REGS);4 T8 I7 @) o- D3 M0 g- L5 X% b2 ]- F
    // 清除 UART1 系统中断2 T1 c+ y( p5 L0 n
    IntEventClear(SYS_INT_UART1_INT);
: A$ H+ s0 W7 ?) |2 `    // 发送中断
$ [( E  H) _0 l6 K, v& _$ C    if(UART_INTID_TX_EMPTY == int_id)% L" p$ r% D9 Y
    {* Y0 ^. E; t6 C% P3 W' h
        if(0 < length)
) c( \# n( \+ f+ ?% a: E$ P        {
7 c; F! w/ |, c            // 写一个字节到 THR
3 U4 f3 N" Q" o% W$ V& B! |# M            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
4 c3 G5 y7 P2 h4 a; u) w            length--;" f8 _* v/ [& S" U5 L! Y# v
            count++;: f! C( _( a# |1 ~! p. g2 q0 y
        }/ G, n$ C, G/ _0 |
        if(0 == length)
) N" M. g; ~" W; h4 q  P        {8 ~0 N) H, _" O: h1 Z# @
            // 禁用发送中断
; Y% \& S0 B  [# k( S: g            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);" H" k" s5 _4 @' y
        }; c+ m3 B6 G2 m% ]) E
     }
2 P3 s7 c. U# B$ S+ V, \    // 接收中断
  K. G+ }  _2 ~6 o% y    if(UART_INTID_RX_DATA == int_id)
7 T( Z" l6 ]# g9 `1 a" k    {
% c$ n# k( j- V8 }! O) e3 A        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
; L+ s7 Z/ Y- m; {        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);7 N& t3 X/ G  e& @
    }: ~. y( |0 D% L; P$ D# d
    // 接收错误
0 U# P* D7 W: [" J' w! T8 F    if(UART_INTID_RX_LINE_STAT == int_id). c! \  o& F3 y9 n; K/ i
    {2 L+ S; S1 \, j# X( e7 V' M% C( e
        while(UARTRxErrorGet(SOC_UART_1_REGS))1 C$ I& ?, U" f, J4 }+ j
        {/ |6 F( q( R# f) @2 `
            // 从 RBR 读一个字节
+ p# d) V# i2 R5 c8 \# o; A6 j1 b            UARTCharGetNonBlocking(SOC_UART_1_REGS);
: R1 ^& Q2 n; b        }* N+ m( v8 U' Q
    }
! l9 `- o  Q) a, K    return;; }/ |% I0 O( R
}1 a3 }* w; @1 Z7 v
Int main()
5 W3 v' S0 K: f+ `+ F* D0 Z" {{ ! C# K- f' n* u; p
UARTconfig();//uart 配置  E5 i8 e7 h) K: v  ?2 \
    Error_Block eb;, ~' W! i; U% b
    System_printf("enter main()\n");
) w8 v2 P2 }0 w2 e1 _    Error_init(&eb);; }: y: ~5 D8 u# Q5 h
    // 动态创建硬件中断
' {/ \4 y9 v6 F7 @* m: Y4 e    Hwi_Handle hwi1;" n0 A* R/ {8 g# c' q
    Hwi_Params hwiParams;
8 a% f0 n- {6 X# G    // 使用默认值初始化参数0 s' \  w  \. C
    Hwi_Params_init(&hwiParams);7 e/ V: G( @& }0 Q/ }5 r; U' Y2 A
    // 中断事件
9 c$ `4 I0 }% a) }2 P# ^: s0 ]2 _- u    hwiParams.eventId = SYS_INT_UART1_INT;
* Z& G3 Q' ]& O    // 传递到中断服务函数的参数
: C9 f  z! q& A    hwiParams.arg = 0;& @9 V4 _- B$ k. k( Z6 W3 ]
    // 不允许该中断自身嵌套% M1 C; M+ C5 d9 M% B0 j
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;0 M" i2 {$ K4 w. l6 n3 t
    // 使能中断
6 x: s4 \: b7 M6 C' r' l6 F! R( k    hwiParams.enableInt = true;
1 l) I5 S4 z' ]! N( R    // 可屏蔽中断 4
4 p9 b# k8 v$ e' U/ o' n    // 中断服务函数 hwiMain
3 I0 p, E/ N/ g9 V  t    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);( z% V0 y: I: F/ I3 m
    if (hwi1 == NULL)& V/ }4 \! j* |( t
        System_abort("Hwi1 create failed");( s6 v' u5 J: ^3 }' W/ j# T1 r5 w
    BIOS_start();    /* does not return */
! T$ B3 l" N6 _: w- J, K    return(0);. |( S: }, N' _5 `- n/ d; D! i: S
}
- q' U% ^9 ?3 U9 N7 |' `5 K# e9 [( O* w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
( `0 \& F  W" _) h$ o" U
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
4 R! y; X2 {% i/ s* K& g
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
: R9 ]+ b/ ]: o6 d' b在中断服务函数里放置断点
9 s" W/ Q  |# F2 F
参考 GPIO_KEY
7 u5 g5 z* Q7 }
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-14 17:56 , Processed in 0.037794 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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