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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下: t9 }! o' z( H) c
// 发送缓存/ H0 F  {$ ^7 q, ~, r7 {: e
char Send[] = "UART1 test......\n\r";4 p; O5 G1 ~9 y) ^

% L4 \2 v& D* y- W2 J2 k- z0 V1 W. V. uextern void UARTconfig()
) P. V: b) S, @: O{
4 ~: i! W7 e0 p //使能Uart1( n' }6 v8 h$ k, q& I' D0 Q1 y  Z
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
3 N' b& |9 V# b0 W6 J1 U4 E4 ` 4 U5 [( x/ Q  D) F# Z
// 使能 UART1禁用流控% ?& L% a7 r% H& y7 N3 F1 h
UARTPinMuxSetup(1, 0);# z/ y! u( v8 |: J. b* R. X8 V! N) [
, R3 d5 c- B" P1 a! l5 y, I
// 波特率 115200 数据位 8 停止位 1 无校验位
4 f7 v! g0 p6 e& S* P3 X. ~  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);1 _5 V4 w) K' X8 K4 V4 `0 B$ ~" T
& x6 q8 w& Z0 m% ?4 I
  // 使能 UART1% u* f% M4 j# {* ^3 {
UARTEnable(SOC_UART_1_REGS);0 s9 W6 G& j; U; c* a
  // 使能接收 / 发送 FIFO3 V. T1 b7 f2 h, f" c7 |; D2 r( M- h
  UARTFIFOEnable(SOC_UART_1_REGS);
  D8 @. I  L3 |# x' b( O7 i/ _  // 设置 FIFO 级别" g* D& A; [& n  @. Q% h
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);  ?. i5 {8 Y9 H! }6 m% `# `0 F
  //Uart1中断使能9 Z; h  j$ {1 W- ?" y& R. n' J
  unsigned int intFlags = 0;8 _" N2 L4 L/ M9 Y- n: t
  intFlags |= (UART_INT_LINE_STAT  |  \
: C6 E5 ?( E* |' @            UART_INT_TX_EMPTY |    \
- I7 `  t. T0 J6 a! b% L            UART_INT_RXDATA_CTI);
1 B3 F) H' s* v" k) c. O( u            : \' @1 O! q7 X2 q( s$ W
    UARTIntEnable(SOC_UART_1_REGS, intFlags);
/ d6 T8 S# {5 ]* T5 |5 K}
% W5 Q0 t. I+ X! l1 Q* B//UART 中断服务函数6 f9 R  T, i" C/ a+ Z6 {
void UARTIsr(UArg arg)
; B0 q$ Z: {3 m: x/ E' s2 Y{
6 \. U. V2 {; Q( a; u8 b    static unsigned int length = sizeof(Send);
2 ?. S8 K, q9 {! x' P4 ]8 B3 {! @    static unsigned int count = 0;
* p% P" C6 @2 K1 ?    unsigned char rxData = 0;
, ], n# ~: {: Y    unsigned int int_id = 0;
3 w: B8 n2 g* Z" R5 u    // 确定中断源3 ], W$ ?0 R* g. K9 B. K3 @
    int_id = UARTIntStatus(SOC_UART_1_REGS);
% ^6 e6 A: ]/ _- }6 u; n, v    // 清除 UART1 系统中断
! ]2 @6 d9 L) T, ]! u    IntEventClear(SYS_INT_UART1_INT);
5 [0 {2 m- x' C( ~    // 发送中断+ m9 W/ G2 _% |
    if(UART_INTID_TX_EMPTY == int_id)2 p6 T4 z; q; V
    {: K& j4 f1 H3 T3 @" ^$ i, ]7 l: X
        if(0 < length)
3 @7 ~: i. {$ U        {
3 g: m  z; ]6 {6 u  ^9 Q, K8 i  V            // 写一个字节到 THR( [7 j" }6 k+ q- q
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);% v, k2 N1 J+ k% a. c
            length--;( d! z5 V* F! B
            count++;4 m, V" {  V: z8 Y) y( Z1 S' R
        }' d2 }7 j" E* G3 J2 v
        if(0 == length)) X. u/ i1 T, U/ Y
        {) z" n- U( o! S# T
            // 禁用发送中断, m3 s+ c) B0 H
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
# V+ K" @* I6 w        }
2 J* w: y/ O2 _5 E! d     }, F' K& G1 c" y7 |
    // 接收中断, m! J5 V$ B' b: H
    if(UART_INTID_RX_DATA == int_id)
9 b3 P1 I* v3 }    {1 r4 u" ~) b& @1 k% C* Y. c9 _: \9 ^
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);5 m( K7 c1 q2 {7 f/ P! e8 I; |
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);+ U- E& X% m; ?2 K" ~
    }: _, q7 Q; z# L
    // 接收错误( H6 h3 z1 m( k& F' N
    if(UART_INTID_RX_LINE_STAT == int_id)
6 A8 s0 ?# V8 k' Z    {
- L( R& ~9 u8 L/ b        while(UARTRxErrorGet(SOC_UART_1_REGS))* F+ c0 n9 y  q6 n& n8 E
        {
9 @1 f# A' T. w4 x            // 从 RBR 读一个字节! Z2 ]3 n$ |0 ]- {( V3 F2 b1 s' a
            UARTCharGetNonBlocking(SOC_UART_1_REGS);9 X1 d! q& K: y! `% M9 L
        }+ d* a3 q3 M6 ~7 b
    }
0 k1 Z4 L$ T8 Q# Z* F    return;% y5 m4 Z' `, P  G- B' b
}
2 D5 M$ {5 {; J0 J6 O  j, XInt main(): U3 Z7 k: S: i; l7 |. m" X
{ + D2 ]" g/ W" k: |
UARTconfig();//uart 配置
1 F6 L9 `* p( J6 {5 i! o4 B    Error_Block eb;" W* J6 i. }- A1 W8 E# t2 u
    System_printf("enter main()\n");: A' _1 Q2 s  o: y; k% K
    Error_init(&eb);2 Q0 R3 ~" Y. [# F( z1 g
    // 动态创建硬件中断
' u( V( @) u) [8 U    Hwi_Handle hwi1;
  O0 ]+ r% ]# U    Hwi_Params hwiParams;
4 |% D( `& S* l& f( @    // 使用默认值初始化参数, l& E  t! \$ K3 ^
    Hwi_Params_init(&hwiParams);( ]. Y) X! J8 Q; [: L3 R, F
    // 中断事件
# a8 J" Z1 ^# Y" N3 y+ E7 {' ^& c    hwiParams.eventId = SYS_INT_UART1_INT;7 s3 M2 \+ c# G, b7 m( r
    // 传递到中断服务函数的参数- s3 k4 M$ v  k, E. |
    hwiParams.arg = 0;
  G: [- k! v, k0 w/ ]/ D    // 不允许该中断自身嵌套
  ~# |/ n: W8 ^& D    hwiParams.maskSetting = Hwi_MaskingOption_SELF;. T5 y" Z8 o0 }, e& {9 D0 ^6 y
    // 使能中断! g' z" B+ j' _1 t! l7 g8 t' E
    hwiParams.enableInt = true;! d6 K' u* l, g
    // 可屏蔽中断 4
) H' A5 m  E5 V; d/ Z    // 中断服务函数 hwiMain
- p& {$ @! p0 q6 T6 j- K    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);' T) U& [5 R% D% ^' e% V
    if (hwi1 == NULL)
# t# M5 @) V9 H" Z( i& w4 q        System_abort("Hwi1 create failed");' V0 Q  S( }8 n% t4 J3 Y
    BIOS_start();    /* does not return */) z5 ?$ d; `8 J+ D8 b5 t) ?1 z
    return(0);
+ n7 Q2 v, c. Y2 B, e; S}) e' e; K9 o6 O, z7 `
* b6 @2 w) A7 }" Z7 Q" @, K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?: T: P' D9 g/ ]1 h  L
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点; t! M4 w, U1 P3 z3 s9 l
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
; z; p. h; o4 n( D/ g  T在中断服务函数里放置断点
3 t+ Q7 Z  D, l2 ~3 v
参考 GPIO_KEY5 h! E- j% l5 X/ l/ e, `/ }
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 10:21 , Processed in 0.051188 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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