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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下0 N* z1 g' U# x6 d
// 发送缓存. e# t) Z  d8 e5 z
char Send[] = "UART1 test......\n\r";
0 d% c: Z4 z- g& M, l2 M
+ g* C: u2 G) ^( s: yextern void UARTconfig()
$ G- e$ A; I6 `9 c{
: B/ m$ r; Z1 |: B- [ //使能Uart1" r: ]  |1 ~0 W& @; I! u
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);9 U0 u7 O( k& ^% H( _
/ D9 z) V* u/ F
// 使能 UART1禁用流控
  g3 U' ~4 B+ Z8 k- s, V/ K( x& {% s UARTPinMuxSetup(1, 0);
& f. s# h' I& Z/ n) t 7 o9 k" o* m) t' m: h  [
// 波特率 115200 数据位 8 停止位 1 无校验位
: m$ E" V. `& Q9 c2 y- K: G  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);" Z, ?, h7 j: b5 O& s
; d9 @" l, Z( Y( Q5 U
  // 使能 UART12 Z+ |$ u6 O5 Y, l, c
UARTEnable(SOC_UART_1_REGS);- G+ _- q" `' j7 o2 z( j
  // 使能接收 / 发送 FIFO
: a% O; N/ ^; q  e: _9 d4 j  UARTFIFOEnable(SOC_UART_1_REGS);
3 R) H8 C; {  |. H) W# T6 q  // 设置 FIFO 级别
! M0 O1 v; l7 G) S    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);, Z& K1 {2 @) c# w4 [
  //Uart1中断使能
& y, }! w1 i" |1 }  unsigned int intFlags = 0;; G8 |+ k8 v  p  ]  r
  intFlags |= (UART_INT_LINE_STAT  |  \
! j- Y: f% b6 W' Z2 a# d            UART_INT_TX_EMPTY |    \; y* @; @+ }% f7 p3 m" m
            UART_INT_RXDATA_CTI);
% F1 R8 @4 x8 S# D# b% D* ^            
; I+ ^3 `, w! z    UARTIntEnable(SOC_UART_1_REGS, intFlags);7 L4 b1 K& O& E; J7 R9 U" m7 q
}
' x0 N2 f" e3 I8 T) e4 I//UART 中断服务函数2 g/ I) g' O$ U
void UARTIsr(UArg arg)1 d/ L1 K* U; A' i. }& Q) S
{
' l. @$ Z( F1 I4 S' q    static unsigned int length = sizeof(Send);7 k3 Z, l6 v9 V. A. J  W1 T
    static unsigned int count = 0;! z: a( o9 d% S+ V. |8 u" ^7 B9 d0 w
    unsigned char rxData = 0;
+ y8 {6 w; _- t" t    unsigned int int_id = 0;
: C( c7 ^6 ], F; ?    // 确定中断源+ o/ U$ ]7 u8 x* A: n. E
    int_id = UARTIntStatus(SOC_UART_1_REGS);
1 J8 ?" z2 q9 e8 d, {& S    // 清除 UART1 系统中断
$ z  [9 L3 ^2 @# v3 y- c* d    IntEventClear(SYS_INT_UART1_INT);
, I  r) k; I" v( g2 V" [& i    // 发送中断
& C4 @* ?! ]6 r" B8 o    if(UART_INTID_TX_EMPTY == int_id)
1 E* O* b& T0 E9 |; s    {
( _, f( \6 k) ^: l$ w1 f0 J6 O        if(0 < length)
: @4 e9 `" p" D2 s% N4 t. p* C        {/ E6 i! ~* t3 t9 e4 P
            // 写一个字节到 THR% a" L/ D+ O* u' L" V
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
3 l$ q) w( R, l/ G1 H            length--;
: x0 c. m2 B$ I5 {  z. ?+ B& |% ]7 R            count++;
6 ?1 D  e1 g" l& C3 ]. I# s& b        }& C5 x, N5 B6 O* M
        if(0 == length)' L$ ^5 Y: `! q' S6 a' F4 {9 v9 W
        {/ M  T2 R1 i0 e  B
            // 禁用发送中断
/ [3 k9 y* K3 N6 B3 g            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);, p/ Q. b. W( Q4 K3 ]& V
        }
  e9 h% n! s2 f; v6 `     }
5 S6 O2 _& v: B+ t. B& G    // 接收中断& q. W: `% k  V0 b" N7 F# ?8 v
    if(UART_INTID_RX_DATA == int_id). M. d, E2 r3 H8 U8 n
    {. I2 Y7 h8 I, ^) N$ C& o) s
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
( ]' [+ X4 F0 j        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);) b4 ^6 w( [( @  p5 v
    }
: q$ r; Y( F7 x7 _    // 接收错误  a; |# H& l) T9 L9 i
    if(UART_INTID_RX_LINE_STAT == int_id)
% T! W. u" ]2 R" H    {  ?' C3 E, [) D) z' M1 e5 K
        while(UARTRxErrorGet(SOC_UART_1_REGS))
4 I+ f# [) s9 ], {3 E8 a1 G        {/ c+ {' L5 o- N3 _2 \8 ]! Z  y! F! R
            // 从 RBR 读一个字节6 l/ H  g8 R9 l2 f- v9 ^/ i
            UARTCharGetNonBlocking(SOC_UART_1_REGS);  c% O2 `' [, x" B) t: Z& s
        }
: m  L; M+ h8 Q6 N" k" u. D: H7 A    }* {# D& E. m; D2 k) \2 u
    return;
8 |* c% n' K5 i}
; i- q- E6 D# N& _$ j7 BInt main()
8 l' b5 ?" P# T4 S  U0 Z{ 6 V/ `/ s! ~6 ]2 B$ P/ o! F
UARTconfig();//uart 配置: s5 A* {" L' U% U1 B  e
    Error_Block eb;2 O' u/ X7 c9 J, a
    System_printf("enter main()\n");
, o/ i: D4 E8 P4 A( j    Error_init(&eb);
3 u& j0 z1 M, U  i' x$ ^    // 动态创建硬件中断$ K. M! x- x4 `- u8 p8 F+ f
    Hwi_Handle hwi1;
, c! q  l0 M) [8 M$ g, O    Hwi_Params hwiParams;# s, Z  |  r4 p1 Y( s- i
    // 使用默认值初始化参数$ u) t+ Y8 e' Q) W* n  s6 T" g
    Hwi_Params_init(&hwiParams);% i  K. l0 R/ V4 L' O
    // 中断事件
: l: l8 B& a/ d+ h9 }& w) c    hwiParams.eventId = SYS_INT_UART1_INT;
' L) X- R) V. @4 J3 }1 ~    // 传递到中断服务函数的参数# }5 L( w2 I% r' o
    hwiParams.arg = 0;
8 a; x, \& u9 u' Q# }4 o    // 不允许该中断自身嵌套3 t* D. q- D5 X4 b6 r* R4 b$ F
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
* Y4 d' Z* y: X% R8 u    // 使能中断
% |/ R9 T3 g0 z4 @1 {1 q, _    hwiParams.enableInt = true;# ]5 ~& A+ I. g% S7 [  p4 u
    // 可屏蔽中断 4
( J/ Q- i; E9 ~0 w) z8 X2 q; C    // 中断服务函数 hwiMain- w2 g4 ~  y2 v6 d! i
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
  U/ T' f8 D" s1 z* b    if (hwi1 == NULL)
7 _+ i! {2 G# a9 J        System_abort("Hwi1 create failed");) X1 F0 p7 |7 Y# E5 a
    BIOS_start();    /* does not return */
, Z! c  Z3 U7 p. K- R& @' b    return(0);: e/ G. ^3 d; F0 H8 A
}8 h+ K( F/ i1 z  L2 D

0 D$ v$ u( Z$ l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
: q9 w* v# }( i6 ^. K
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
8 ]- T1 `8 R) |  x( B  ?
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
/ H) M3 {* `0 w+ r5 h# M" ^  C在中断服务函数里放置断点
+ O! x+ [) X; |! H' ]7 t
参考 GPIO_KEY8 s2 ?7 a: }$ _" g" ]
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 23:36 , Processed in 0.038387 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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