在sysbios下,uart中断收发数据,程序无法进入中断 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下9 E% S1 O! h! V: \1 c
// 发送缓存. W; n  Y! `  [. q8 U4 D( B
char Send[] = "UART1 test......\n\r";  M& D2 w' U+ H

8 ^  b' e" _8 R( T8 i3 Bextern void UARTconfig()( D7 C+ z& A2 O$ O9 ]" \
{" u" ?3 u- g$ Q3 n% S
//使能Uart1( a# U: M* ^% A( n; i7 h* i
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
! x, q1 A/ d: L, j. P# ~& d2 _
0 `0 b# D/ S  X. s; O; r // 使能 UART1禁用流控
4 W. C0 y; F, c3 j( j UARTPinMuxSetup(1, 0);
4 a8 u* Q* A) O+ u* f' u' @ : b9 _/ R! r0 ]  R" B9 H
// 波特率 115200 数据位 8 停止位 1 无校验位% v5 W- |1 x) `4 w
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);+ s, e* @& t4 c

& L" M( l" u% l  // 使能 UART1' v! K  \2 w, _3 S8 [9 K% |
UARTEnable(SOC_UART_1_REGS);) a5 B6 h  `. W: R3 M' d( q
  // 使能接收 / 发送 FIFO( p! e2 ]0 b) k9 v' `9 ^0 e
  UARTFIFOEnable(SOC_UART_1_REGS);
( U' C2 _6 A, N) A( d  // 设置 FIFO 级别! q; u. T, _9 G
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);& f, x( z! j8 U3 `1 v3 y
  //Uart1中断使能+ b- ^  j' I: c
  unsigned int intFlags = 0;) G( x9 r0 L2 r8 C
  intFlags |= (UART_INT_LINE_STAT  |  \) T- ~, v" m5 P  y% X
            UART_INT_TX_EMPTY |    \
; j2 O/ [6 l0 m# n            UART_INT_RXDATA_CTI);" h/ I' n2 R2 O" \/ m4 O) c5 M
            + H8 C) ^0 ^0 A% O4 q7 S
    UARTIntEnable(SOC_UART_1_REGS, intFlags);! g- @* Z% U* x+ \
}
2 o8 n2 h! Z4 @, |6 a- e8 u  ~: c//UART 中断服务函数
3 ^6 u! P7 i5 E1 K( F" Fvoid UARTIsr(UArg arg): ]# [8 X, v! s  ?0 a0 o! D* g
{: y4 J6 ]9 k+ q( G, U& e. x
    static unsigned int length = sizeof(Send);
& k) s7 ]) a6 X. f7 h    static unsigned int count = 0;
9 q% x$ l% V3 Z    unsigned char rxData = 0;
/ B2 Z& `( q& U9 O    unsigned int int_id = 0;
5 U; J, S! D2 p8 B" t& X; o    // 确定中断源: J$ m# X+ @0 h, m4 i
    int_id = UARTIntStatus(SOC_UART_1_REGS);
: M7 U5 Q: `$ f: Z    // 清除 UART1 系统中断
1 k7 v3 c" _$ f8 }  |    IntEventClear(SYS_INT_UART1_INT);
+ G" X& a8 S6 W  Q1 x8 @    // 发送中断4 B4 o  O+ r' K" R; d( c  S& f. E
    if(UART_INTID_TX_EMPTY == int_id)
. O; r, k+ w0 j6 H2 q    {& ]* E0 c( ]/ [9 b, O  q
        if(0 < length)
& b# i6 H8 N$ M9 Y1 u0 G/ R: G, l4 L        {4 q# ~+ Q5 ?2 h+ E9 q/ k+ O
            // 写一个字节到 THR+ n1 y( E3 M6 Z+ T' X
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
) P9 A7 x/ C( W( f# F2 Y            length--;
8 \6 }5 z, {1 m            count++;
& w+ H- {" w8 B! a( y        }
, x5 h4 ~- z8 z0 v0 }/ U        if(0 == length)( [- \8 l, c/ b# ^3 q' [2 [
        {
8 ?6 o  e( U- ?            // 禁用发送中断5 q# J' q) U' I8 }( U
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
" a3 p* m4 X3 P        }
0 ^: w6 Q. M/ l' N" k% C8 i4 Z     }. o  z) W: e# n" t
    // 接收中断9 i+ Z/ v) b% ^# c) y
    if(UART_INTID_RX_DATA == int_id)) _8 }" L9 A8 Y# {9 K! E3 T
    {% M9 R0 a% R2 p& ^
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
, a. k. P; ]! a' A        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);/ t1 U2 [% }- F4 H% l6 m: v2 G
    }
5 H! w  F) l6 T. m6 |% k    // 接收错误6 O# r: g! {8 e7 Y
    if(UART_INTID_RX_LINE_STAT == int_id)
1 R) d: t$ D' R' q+ s/ X  }    {, K* a  f4 j; I. B& V2 |
        while(UARTRxErrorGet(SOC_UART_1_REGS))8 v* B& f- P% K" r7 `: i
        {
# ]( y* e3 i7 \2 S( K: Q8 W            // 从 RBR 读一个字节* b& R5 J2 d. e5 q
            UARTCharGetNonBlocking(SOC_UART_1_REGS);
' v# l0 e" L. w# T( B3 c        }9 H2 i  q- Q% N7 O9 B6 N3 d
    }
; t  H* X- e1 R. D7 ~7 a    return;
( e% c1 \- k+ N& A. ~9 B. S. E; W}
% P; [" Z/ k& U6 NInt main(), N0 k, F! z! ^/ e& }1 h$ f
{
) L% {0 [. e2 f3 v4 s/ H9 I. i3 A UARTconfig();//uart 配置
1 x4 J# Q0 m& l' G8 f/ L! E- r  X3 S    Error_Block eb;$ U0 Q3 e0 ~. C& Z8 E1 S
    System_printf("enter main()\n");
6 A$ T2 q  l5 i6 P2 u0 Q4 A9 }$ K    Error_init(&eb);. H) z* R) O- _. a  `8 i( @4 `! f
    // 动态创建硬件中断
1 H0 x0 \9 s$ u6 n. G    Hwi_Handle hwi1;' S4 `" m7 c6 t' g- |7 `7 C
    Hwi_Params hwiParams;; g) V$ I. a3 X3 k+ e
    // 使用默认值初始化参数' Q- [, \9 Q! \$ x' S
    Hwi_Params_init(&hwiParams);
4 w/ |1 l, ^0 U: e! y+ k, G    // 中断事件
( u  M) s' e9 y- T! s7 [    hwiParams.eventId = SYS_INT_UART1_INT;
# r; W0 v/ h$ S& q4 s    // 传递到中断服务函数的参数( Y6 [7 ^" X! _) O
    hwiParams.arg = 0;9 g* h( y7 J/ q+ z( z$ l
    // 不允许该中断自身嵌套2 j" P' O5 H4 s0 ^( i7 H) Z8 f
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;+ L8 v) ]9 `! U3 i  F7 o: r
    // 使能中断0 A- ]5 ^  {& l$ Y! k. i, @" w
    hwiParams.enableInt = true;5 G9 b6 \$ D4 l# p  @+ Z' M
    // 可屏蔽中断 4) U7 ^" v. K4 R, }1 n
    // 中断服务函数 hwiMain
9 Q# u0 c% j4 Q; l$ Y7 O5 [    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
5 a3 f- _# e7 }4 j0 I0 G/ h" `    if (hwi1 == NULL)2 b* c* g- B1 U9 c1 i
        System_abort("Hwi1 create failed");
( \+ \) |; F, p' |$ U# Z- ^    BIOS_start();    /* does not return */  n4 M+ M$ `3 P9 n  D5 A
    return(0);
9 G# m5 ~, o- Q# M& \0 b, d& c: N}
! j: |4 E' N9 R. X6 b
* x5 m, a# v' X' X
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
; n* I. b4 Y7 j% _6 J
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点, e4 W; U8 b- Y  {
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
- P7 y" |3 W  [在中断服务函数里放置断点
. z: ]  {& J+ \+ k) Y
参考 GPIO_KEY) `2 `3 l! V, n0 r  t
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-3-17 02:39 , Processed in 0.047950 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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