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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
/ z% D8 R( K; o- _* q  H2 n// 发送缓存! e7 u" s2 _7 h. {" B
char Send[] = "UART1 test......\n\r";
- e4 f! @3 A$ t, R8 c) C$ c) b# G! ~: w: K7 o8 p6 t7 Q9 A5 @: s
extern void UARTconfig()
) f1 q; M$ @  f6 P{4 x: V9 j3 X* m
//使能Uart1! p$ X6 w1 k! w# _% v; z- p
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
6 r' W7 f( H3 t( Y. _- r& o
& u9 H  u: p& i  i+ w* f/ r( }3 z" O // 使能 UART1禁用流控
/ h/ I) a3 h/ f" }0 U+ n5 } UARTPinMuxSetup(1, 0);
+ V8 Z0 ~5 ~9 A& r1 Q; q  |8 H' A
. Z3 T7 \; }; {* c# @& R // 波特率 115200 数据位 8 停止位 1 无校验位* L/ H+ D% {& R! z) q  T4 a9 C& s3 r
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
* l" ?% k+ w/ c3 z0 S* h
+ c3 ?0 I. c8 H  // 使能 UART1
) k$ q+ ]: l0 s UARTEnable(SOC_UART_1_REGS);2 w, R% Z- P8 Q2 [8 J( g7 m
  // 使能接收 / 发送 FIFO
4 F) E8 T4 [& Z  S  o. T5 @  UARTFIFOEnable(SOC_UART_1_REGS);
; r1 w$ ]3 h) F0 [: ~" ?0 O( q) g; g  // 设置 FIFO 级别( z) k$ a3 y0 Y% B" k
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
% @: N  B3 r" C! j  //Uart1中断使能
+ B" m7 X  f. \  unsigned int intFlags = 0;
" x8 ?& A) }: G# |: D  intFlags |= (UART_INT_LINE_STAT  |  \5 Y3 `8 e. X! j
            UART_INT_TX_EMPTY |    \
: a- ^. j/ r; `- y            UART_INT_RXDATA_CTI);
5 t, y9 I5 m4 V( R% J3 J* ]8 O' }            6 r$ X5 M4 n; ]
    UARTIntEnable(SOC_UART_1_REGS, intFlags);6 R, ~- n. o) z  e$ L
}  P* B# K$ x" X4 j: s
//UART 中断服务函数! z! f% l, j/ E
void UARTIsr(UArg arg)
  O8 r9 A5 I" c{
" C) ^5 p/ l0 K, p+ O    static unsigned int length = sizeof(Send);$ F6 c$ @2 I# `. L3 C
    static unsigned int count = 0;
/ E# w3 m/ ]& A$ Z, R    unsigned char rxData = 0;
% P: j5 c. f+ o+ M, A* m7 @    unsigned int int_id = 0;  Z4 ^* n9 ?; L9 m
    // 确定中断源0 n7 l- {" z8 ^; e6 }9 l  c7 z
    int_id = UARTIntStatus(SOC_UART_1_REGS);: Z1 e9 z4 g. ]  M  {# J
    // 清除 UART1 系统中断$ ~& J# T  D4 b9 v
    IntEventClear(SYS_INT_UART1_INT);" N5 a3 ~$ |5 N
    // 发送中断
5 a$ X: o+ B# P8 X    if(UART_INTID_TX_EMPTY == int_id)
' k8 n& g5 [( b    {; z, l$ w& n7 K+ W
        if(0 < length)
: b3 ~- j% Y2 ~5 X/ L& w        {6 T; R& ^$ k& P" o
            // 写一个字节到 THR1 [1 y4 y+ c3 S7 s: a( ?
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);! Q' Q9 g/ j- U* x  W4 m
            length--;, j' B8 @/ t" m& a
            count++;
2 Q6 v1 a6 G# T* g9 N1 [        }$ q6 x& K0 s' @+ I; s8 c& x
        if(0 == length)# Y, m4 A# F9 b1 s0 k. A
        {
/ I/ ^. a" W& o' z            // 禁用发送中断: t  o. S% f& W9 t0 G6 ]
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);! T. G9 B& w& E0 z8 O6 u1 h
        }. V2 a# I' A) B5 v. ^, Z
     }& A& F4 J9 Y' U" u
    // 接收中断
9 h! _2 S' `" v; P1 X0 p+ K: m2 E8 k    if(UART_INTID_RX_DATA == int_id)
: {1 q5 [7 S# u4 ^$ V    {$ C# n2 \# p2 L# j' d8 C5 g" q
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
$ @0 |; i* X% ?' J2 j- d        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);2 I9 w+ ~6 D, U) M( g1 ?
    }
3 m4 q9 C! C3 a% h7 B5 l    // 接收错误  q& @: `* U0 [7 v/ Y
    if(UART_INTID_RX_LINE_STAT == int_id)
* n% ~6 k# H+ z- U0 s- C    {: S9 H/ q$ f. c6 V) q# {6 I1 j3 b
        while(UARTRxErrorGet(SOC_UART_1_REGS))
0 i4 [3 z' I1 r' t; o        {
6 |( t6 }7 J  @1 U6 n6 \: [' ?            // 从 RBR 读一个字节
# V2 P3 {" L9 e# c) N$ x5 R9 ?4 N9 Q            UARTCharGetNonBlocking(SOC_UART_1_REGS);
/ E# w* i; ]% A! z/ Y, {& x% G) H        }  Y7 K" d, c! B2 j$ o4 g- ]: D
    }
( C: E9 j& k2 e+ C! B% f* W    return;. K' H0 Z0 }- C! f5 @
}' @' \% @, }7 H- k1 }# M! J/ \
Int main()
9 t' B  X% D6 r, r1 P! i+ X% G{
) I8 x; @7 V' M! y8 k, q" A UARTconfig();//uart 配置
5 A9 l- n1 K, n( n    Error_Block eb;
3 k: I6 `( U  J: \6 G/ K! O    System_printf("enter main()\n");# y$ h. p! K& J+ y- _
    Error_init(&eb);, M3 `( M4 s9 Q
    // 动态创建硬件中断5 D. v, }- q5 y4 d% H% q
    Hwi_Handle hwi1;7 j* r% s7 c9 X7 s8 B+ F3 |( `' Z
    Hwi_Params hwiParams;. _9 O6 k( ]* Z- d1 b
    // 使用默认值初始化参数) T* [6 a- W; `
    Hwi_Params_init(&hwiParams);: J- ^+ T) s3 O9 A8 c5 _7 F
    // 中断事件" l5 {( `( |  t  o$ O
    hwiParams.eventId = SYS_INT_UART1_INT;. O2 h6 Y  b% g
    // 传递到中断服务函数的参数
& ^, C3 p8 y0 u; o$ j+ q    hwiParams.arg = 0;: m1 m0 j9 P+ h
    // 不允许该中断自身嵌套
  e! T: i! V* w    hwiParams.maskSetting = Hwi_MaskingOption_SELF;3 f& a* l8 v* q4 X
    // 使能中断3 x. N) z. I, f' ~; I
    hwiParams.enableInt = true;
) O4 z- p' V( |; s4 ~    // 可屏蔽中断 4
! T% b+ `( a7 `5 X# W5 h    // 中断服务函数 hwiMain
- R9 _! ~1 ?% I4 ?5 n) `    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
; D+ M7 ?0 X; P/ N9 ^4 S    if (hwi1 == NULL)  G, m& m" k7 H( c& F" U- w; S% R
        System_abort("Hwi1 create failed");
# Q' ?$ h$ a+ `( z2 ^$ J, }    BIOS_start();    /* does not return */5 u  E+ \, m. a1 j8 _
    return(0);
# ~0 [. k' A$ C}5 [; P8 j' h. x; ?$ r- @8 V

) ^' L; t8 Q& f# O6 D, i7 C7 Z' s0 ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?  x' a; K% j# r5 g& o
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点/ Z5 v$ t$ ]) s
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49# w7 ]0 s+ y0 p( ^5 T- H
在中断服务函数里放置断点
9 [. k6 d6 [. ]3 L
参考 GPIO_KEY6 h4 l- V  P1 h, u6 P$ B
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-3 21:05 , Processed in 0.040828 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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