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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
4 S' `, r( ~5 p// 发送缓存3 p/ p: I. x8 e+ \% N5 \
char Send[] = "UART1 test......\n\r";9 B' l& ?. d) h& s2 m% Q
/ H& |3 _" s1 o" N
extern void UARTconfig()9 @6 G. v" r$ r: u: u7 \
{
1 T( ]6 g6 u) q. a, W( _) B //使能Uart1
+ n5 a$ K' r: B0 y7 P$ t6 z' ?" M PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
: L" n  T# o  x( M4 M! @
' _& G9 M9 }/ n( w  K- D // 使能 UART1禁用流控
! {/ h+ e' f: L" V7 h9 p UARTPinMuxSetup(1, 0);( w; Z7 v# x: G: h, u

( X! _3 l+ M' B( e. H, V- `$ O // 波特率 115200 数据位 8 停止位 1 无校验位
0 p) a. v- s# O  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
* N  T8 H$ w7 i3 h7 R! a1 j% [
& P6 _- o; t; w0 [9 S% _  // 使能 UART1
! L8 X4 v- I- K! R UARTEnable(SOC_UART_1_REGS);- L0 L" y. e" n! e+ v
  // 使能接收 / 发送 FIFO
8 [/ Y0 c/ o, }: B  UARTFIFOEnable(SOC_UART_1_REGS);
2 G7 L3 I9 ^( F6 c$ x5 p  // 设置 FIFO 级别
# b6 E; h' e. e    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);' D. n8 O7 g- F8 i. Q' |8 e
  //Uart1中断使能/ P% a' n, ~# R/ O
  unsigned int intFlags = 0;
  Q9 X. i% J5 o  intFlags |= (UART_INT_LINE_STAT  |  \9 |$ s- x# w; `, y
            UART_INT_TX_EMPTY |    \
( W% q0 A: s# k) V& \0 I            UART_INT_RXDATA_CTI);6 p% @$ Z; g) ^3 @
            
8 p! N& [+ Z# D/ x# p8 t    UARTIntEnable(SOC_UART_1_REGS, intFlags);
' x7 D6 I3 @; z. W1 w}9 {- ~1 \6 P; ?- \* [+ b9 E
//UART 中断服务函数/ T8 }8 a% ?+ E) l. w+ \
void UARTIsr(UArg arg)
. x- _  D4 j9 t" R0 [: }: ~2 B8 Z{
* O7 g. z% S- Q2 X9 b9 _    static unsigned int length = sizeof(Send);
* Y- n1 \% e7 q    static unsigned int count = 0;- P9 ~( c; j, c: [1 E; U
    unsigned char rxData = 0;
2 j$ R& I  N; j) I! @; n0 s    unsigned int int_id = 0;+ e1 a5 v$ R3 j/ B2 P% U
    // 确定中断源4 c: u- R2 ?3 v5 t
    int_id = UARTIntStatus(SOC_UART_1_REGS);
8 X1 |: y- c8 h9 }( w8 W; n4 C    // 清除 UART1 系统中断, @3 i  _% Q' b! b* d
    IntEventClear(SYS_INT_UART1_INT);) n& T- o7 H9 u3 |  ~
    // 发送中断8 s: |# ?0 y" N5 X3 w
    if(UART_INTID_TX_EMPTY == int_id)
8 ?0 t, E, H% Q3 s+ _4 Q5 V9 u    {' S, t3 S" O) V/ j0 E, V
        if(0 < length)& u: E7 @: Y2 s9 Y/ b' z+ i1 p
        {
  i# a6 M1 I7 y+ S            // 写一个字节到 THR+ h+ b, j4 \3 L7 n
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
2 N( }  ?- ?6 K- I: x" v. C8 o            length--;9 f: Z$ F) Q  |3 {" p# \
            count++;
% q  D0 Y1 i4 ?/ s! g+ Z9 j, E* }        }
/ }3 x5 F8 r. C% _        if(0 == length), `6 T8 U& f. H, Z5 e
        {$ H3 v( P/ n* J/ \" c
            // 禁用发送中断
% l: i$ f# E5 B! _/ z' s( r            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
! s/ p# {( m8 h( \9 M9 D) C        }
0 n) b8 }6 E  ?, A$ ^: b     }
! }2 J1 O6 ^* i$ Z. Q: b    // 接收中断
) T3 f; V# v9 x- A& D    if(UART_INTID_RX_DATA == int_id)' c7 V6 a; \2 L
    {+ k1 W% m8 r" Z, P( f' C
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
4 w7 `$ w. k' e1 J        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);( e6 f1 q' [6 k# k( s# u) {
    }
0 B3 Z/ K% R7 N    // 接收错误
8 S, R1 y: R, S5 E    if(UART_INTID_RX_LINE_STAT == int_id)
. V/ _2 k4 v' ^# N7 ]0 \    {8 q4 M) H" h7 A
        while(UARTRxErrorGet(SOC_UART_1_REGS))
9 v. L& n0 {* W. l4 o# g        {: ]8 X* Y# k$ g9 z* m2 K, M$ M
            // 从 RBR 读一个字节" v7 a2 b) B$ l; g( @' J
            UARTCharGetNonBlocking(SOC_UART_1_REGS);
: o7 J* y& q3 K# x: G        }
' G4 l  p3 Z; ?( l' x! F* N    }
# T, c8 y2 l/ m( _6 y    return;
6 x0 s( X) x2 _4 h: e5 @& a. f}
8 l" Y& ^) J; s, L% Y% GInt main()
' ^; y6 ~5 `9 u6 @) r" J/ q3 @% a{ ; s  v% O7 S+ ~# }6 M& C' D  i8 n
UARTconfig();//uart 配置
& a4 E. ~9 H6 l& ~4 d    Error_Block eb;
8 c0 n6 w& @5 ^4 S8 T: D    System_printf("enter main()\n");' y; r1 s/ v8 [( F- z
    Error_init(&eb);0 u  O3 f! r" e
    // 动态创建硬件中断
& r- l3 E! k* x( T1 X8 o/ Y$ X    Hwi_Handle hwi1;
0 `& F# d8 J) H) l& h% f  m    Hwi_Params hwiParams;  j3 P$ ~; I6 N* z. M
    // 使用默认值初始化参数
; e0 ?3 z! j! |7 ?1 }0 E    Hwi_Params_init(&hwiParams);
$ d* V: x3 ]* q" j6 P4 z    // 中断事件
1 z# N. u. m" z. \2 B# R    hwiParams.eventId = SYS_INT_UART1_INT;) f# p3 J. k- L% X8 {
    // 传递到中断服务函数的参数! }& n: X6 A+ P5 N3 T
    hwiParams.arg = 0;: }" J0 Y4 n7 p+ Y5 T) |# p
    // 不允许该中断自身嵌套8 K: v9 C7 m5 ?$ M5 w' a: |: v
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
9 l( H6 s0 G  Y6 t8 [5 ^, J# i; G    // 使能中断
% M" Q; `0 L2 x' I  v    hwiParams.enableInt = true;
. ?! U) b5 O  d! ^& ?    // 可屏蔽中断 4
# F) m" J  |* U* g1 n    // 中断服务函数 hwiMain
' w% J* C# W$ k' V( s0 B6 X- k* j    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
/ J6 \* ?# s* I: M$ A    if (hwi1 == NULL)* T3 R7 k  ]& U6 Q3 |
        System_abort("Hwi1 create failed");7 B, O3 z7 R: w; V
    BIOS_start();    /* does not return */
1 Q/ R# Z/ ?2 b2 G% S2 e    return(0);
' ~7 j- \1 B5 v1 Z}
7 \1 P% `1 j, E
5 S5 ]* T$ H9 |3 S- ?: K5 O- o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
' }) [6 s8 b2 P* R4 b* e' ]5 q
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点% I# F3 F& t% U6 `5 q6 N. I
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
4 N5 b8 e( V* g/ ~* R# A在中断服务函数里放置断点
* m" }, h. S" [5 c- ?6 Y
参考 GPIO_KEY
6 j: m* {# }, Z" ]  m
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-17 08:33 , Processed in 0.040514 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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