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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下6 {5 c0 X+ R0 o( b8 L$ l1 K
// 发送缓存7 Z- \- Y5 C3 R
char Send[] = "UART1 test......\n\r";
5 n" {5 Y0 u  `& s' j# {4 R1 X* b; M1 N
extern void UARTconfig()
8 O- T% Q5 B( y0 G{
$ r- I8 N) l7 l4 Z //使能Uart1- |) c. V! B, w7 l# w' e
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);+ |& r% R/ w* P1 \) A
6 ]7 s, C7 a: L: [- f# W
// 使能 UART1禁用流控3 x, d+ \% e9 e6 ~: w
UARTPinMuxSetup(1, 0);  \2 @: `( h3 j- }& q; w
  e/ i( @; ]& Y% C) z7 @. g% M& n
// 波特率 115200 数据位 8 停止位 1 无校验位
) F/ r5 }% C' F  E4 G/ Z  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
: n& t9 [+ v+ d0 i5 Z" t0 x   I5 S* T6 h! L: L- f3 h) ~
  // 使能 UART12 U( E! _7 |  x8 }0 P: P5 u
UARTEnable(SOC_UART_1_REGS);
2 t, U; B# \4 q, a1 f  // 使能接收 / 发送 FIFO
2 g+ I( i. E4 L, D  UARTFIFOEnable(SOC_UART_1_REGS);1 N) z8 J# C: g- J5 v
  // 设置 FIFO 级别* G, T& m; X" D% `# G. ~+ K
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
1 o. \$ ^% a% \% F0 Z  K  //Uart1中断使能
1 r) w, k! K4 L4 D  unsigned int intFlags = 0;
/ p- \( E  [: T: N* J7 I  intFlags |= (UART_INT_LINE_STAT  |  \9 {* J  X4 w( d2 x
            UART_INT_TX_EMPTY |    \! a( w% t! _# h! I) J
            UART_INT_RXDATA_CTI);
9 q) l8 ~# @, N# _' H7 g/ P$ t            
0 T8 b& U9 q; M7 B! F6 K3 E    UARTIntEnable(SOC_UART_1_REGS, intFlags);
4 m$ i- S% j2 E6 ~( J}
* F7 O; H6 _0 v; l//UART 中断服务函数
: I9 O3 R+ \, [void UARTIsr(UArg arg)
' g; D. a8 J# t; j" K{
' }& O- g' E( G' H    static unsigned int length = sizeof(Send);( P( E1 x. v% d" S3 x0 B1 k
    static unsigned int count = 0;
; B5 B( |( K( N# ~4 z2 h    unsigned char rxData = 0;
) F  c" B9 l1 X! `    unsigned int int_id = 0;$ ^* S3 ^# h9 g* h6 \3 M' V8 F
    // 确定中断源
" i& |3 e0 _( L) i- [    int_id = UARTIntStatus(SOC_UART_1_REGS);
' l2 p& U5 \: _    // 清除 UART1 系统中断
3 ?1 x0 ~. Z0 R    IntEventClear(SYS_INT_UART1_INT);
: @9 F9 Q" R' x+ C: v+ W8 ~2 i+ ?    // 发送中断2 L0 H3 ?' d1 y
    if(UART_INTID_TX_EMPTY == int_id)1 ^; C4 \; X; D# X+ T: a
    {1 j8 t2 B9 q' Y3 f  Q, [6 I5 i
        if(0 < length)4 P, S5 N  I& y4 c, Z1 @3 M
        {
* U0 P: J; r% M7 K( X- Q            // 写一个字节到 THR
7 w+ W# ^1 Z4 K( d6 I1 H            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);. L( I! O& t, C4 j8 d' U
            length--;
1 s" R- N# y& V+ l            count++;
8 i5 L8 l2 R/ L" Z; W" U. S5 t        }
8 Y! j- a( e9 X" V& q        if(0 == length). a1 K  \& P5 E
        {
! s+ [: t: u: ^! v6 F            // 禁用发送中断
8 V. e0 f. u) `. Z4 _6 q# E            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
% N8 u- x' A' ^/ z: t* `0 g: j        }
8 |  D3 x& y  X+ _" d5 v1 d     }
4 |0 r) C) D/ ^, L/ U    // 接收中断  k1 O, E0 g! m% l
    if(UART_INTID_RX_DATA == int_id)( Y: T$ K2 C0 L# D
    {
; t4 e3 u; g; r' E        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
  q9 F% T, p# p$ Y# D        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);) |- x, p( h" v" X* i
    }4 r: @7 {1 ]( F
    // 接收错误
6 I1 k% \( \! M; L1 I8 |    if(UART_INTID_RX_LINE_STAT == int_id)
) W) a! R% Y$ I" H7 x& |! g" P    {4 P& ]. |5 K! |& k4 O5 l1 z7 B( @
        while(UARTRxErrorGet(SOC_UART_1_REGS))6 l3 k! a$ o4 n. K- h6 |  L
        {1 k2 t' S; o6 J) |; n
            // 从 RBR 读一个字节1 F2 z* i7 g9 [9 T
            UARTCharGetNonBlocking(SOC_UART_1_REGS);4 V  f" l" Z$ j9 q* f
        }! h) Q% [0 \: q; d
    }
/ O1 t+ H6 S/ r  M0 \    return;
% s9 H& ?( Z9 e0 S0 [}
7 ?+ \3 u: T% Z- w) t( a1 s3 s( L$ mInt main()
1 r2 Q/ P# M- j' ~2 S% z* J8 n{
5 D* _4 y: f' ^. @ UARTconfig();//uart 配置
/ M$ e& s9 C, e5 p$ x    Error_Block eb;* l; E4 b0 g* g! W/ E  I
    System_printf("enter main()\n");
" A  a% j: @4 z  O. `    Error_init(&eb);
2 @; K8 y! n; L% @    // 动态创建硬件中断
6 A; k. v$ x+ ?! c; |, x$ g    Hwi_Handle hwi1;
, [* ~; E+ v0 m2 D    Hwi_Params hwiParams;6 h5 W, u3 u( i' h( C# z" c
    // 使用默认值初始化参数) p/ X+ B# n4 T( I: W
    Hwi_Params_init(&hwiParams);
. v7 B6 U; s; d* v    // 中断事件9 w$ j6 Z8 {, k6 a7 v' d7 {
    hwiParams.eventId = SYS_INT_UART1_INT;- \' ]+ L9 a, y# _+ O* F" g' Z
    // 传递到中断服务函数的参数
' T8 I& {* K" I2 w    hwiParams.arg = 0;
. {- u% n, r8 ~9 P7 K- l    // 不允许该中断自身嵌套# X: H7 z8 B) f+ C* d* W' K( K
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
' ~$ D7 q0 ^! c- R( A8 N# \+ x+ g) J* ~    // 使能中断
! z# f1 j2 f- I& D3 n( T! w) I    hwiParams.enableInt = true;5 h" ~: \5 d  X* B2 E/ H" t, w% Y
    // 可屏蔽中断 4- {1 h8 j' |% D* N
    // 中断服务函数 hwiMain: [6 J( Y* u8 u( y3 g4 c8 I
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
" K1 a& N) a+ C# k3 p    if (hwi1 == NULL)5 r8 q! `7 w! Z, @# g5 Y
        System_abort("Hwi1 create failed");
: F. y5 E- M' x# t8 A    BIOS_start();    /* does not return */
) m* r$ U$ }+ p- B  ?    return(0);' f- L0 ~& v. ^, @/ A; w
}9 P% u$ x" y# B; T7 L3 J+ T

. n" Z2 X0 u% E+ Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
+ ]  k$ s2 n! O( F5 T
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点; z( D" p; M4 \) J0 J9 l
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:494 T. @% I; S7 R# [# o7 |
在中断服务函数里放置断点

* q' i2 G" p1 m7 l5 L4 X7 ^参考 GPIO_KEY
& B) M# D& C2 d; l
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-30 14:13 , Processed in 0.042467 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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