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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
+ B6 u. C% k: ]( e9 d/ q// 发送缓存
, ~+ f) g" h* \+ {  q. dchar Send[] = "UART1 test......\n\r";7 ?! ?2 m% y5 L  U

8 S/ L: X/ F$ T7 Eextern void UARTconfig()/ W* h$ O! U2 ]0 }: K5 G. W# a
{5 F9 R/ d. a' N! q' [. r( z0 r
//使能Uart17 p6 z+ k6 {0 m. y% l: M# K
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
* Y) Y# m5 D' F & u9 u7 M( ^( u6 q$ }) K) t
// 使能 UART1禁用流控$ _, `. z- y0 w- O* n. X' `
UARTPinMuxSetup(1, 0);. |1 D4 [, P& ?- w/ }/ S
2 m1 V6 m: a+ O0 x: t  r4 z
// 波特率 115200 数据位 8 停止位 1 无校验位
$ j' E) R3 o, F, x) L, x' u  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
9 e3 h# c+ P0 l- L* k   |: }0 F: H# V) m# U
  // 使能 UART1
* T. l* x) Q3 z UARTEnable(SOC_UART_1_REGS);/ F6 g1 v9 b3 A& q3 D2 B
  // 使能接收 / 发送 FIFO3 @: H0 j8 \7 E  R
  UARTFIFOEnable(SOC_UART_1_REGS);8 N% [" {9 i$ F0 ~$ o  G8 q
  // 设置 FIFO 级别
+ k& c  e* U1 l% V# X2 a+ G; [    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);9 x% n3 N1 \( m$ l
  //Uart1中断使能. X, q0 K5 i+ I, g, u1 ]6 i, p
  unsigned int intFlags = 0;% {  V' A, J% ?$ o# x
  intFlags |= (UART_INT_LINE_STAT  |  \
! _# A1 s& h7 S# B8 Y5 S, o+ N            UART_INT_TX_EMPTY |    \
# n! O! L/ h6 @7 e. z% K            UART_INT_RXDATA_CTI);
/ H6 z! a1 b  J7 J            ; b) E+ H  F4 s* |, ^
    UARTIntEnable(SOC_UART_1_REGS, intFlags);6 n$ ^& H# s. V
}; ?# }# C; D( G" T" q, L# ^  ~
//UART 中断服务函数
- _; \: |* Z+ O/ `! s4 x2 pvoid UARTIsr(UArg arg)! `$ j# j5 r! O* [4 O
{
. S3 w) o1 ]0 a1 P    static unsigned int length = sizeof(Send);
) L2 b, c9 j2 S  b# \% C    static unsigned int count = 0;' k8 i* n4 A& Q. k, o' B( V
    unsigned char rxData = 0;
) f9 M- s8 W" k1 @/ ?" {. [1 n3 r    unsigned int int_id = 0;  C: a+ H- ?+ l3 h' H, F2 K
    // 确定中断源9 @- c; u! R$ b
    int_id = UARTIntStatus(SOC_UART_1_REGS);
$ M+ X6 H8 h8 j) n0 y    // 清除 UART1 系统中断7 r* _: E" H! d
    IntEventClear(SYS_INT_UART1_INT);, T" n0 c4 E; T+ m  [$ d  M9 B! T$ T
    // 发送中断
' |  t, w4 n" V1 d! ]    if(UART_INTID_TX_EMPTY == int_id)- b: |: g6 j* t3 z# a
    {
" n* Y: H3 o( s% h: c3 _7 t        if(0 < length)
9 v. z$ m# O; e: D        {
* q5 ~' J  S" {- f/ j$ |* N            // 写一个字节到 THR7 {% D) V2 r2 J0 K" L2 C
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
' C, f: B% z5 u3 H% A8 R5 x            length--;
) [+ M5 m* h8 P2 G            count++;* [! b' E) _3 g& h( n, ]! K; D
        }0 q9 U+ f0 {! T' q
        if(0 == length)0 S) C+ h2 t" X+ f3 p
        {5 O1 x. }/ e( d# K
            // 禁用发送中断4 a- k5 ]/ c' Q+ \. F$ `
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
8 b7 ^3 Y: `5 F; t* ^- r        }8 Z+ W# p+ R' W; M) F! p* `
     }
% c5 H5 ]+ M( w9 \    // 接收中断# h3 f, j9 [# e$ v4 c0 u  O
    if(UART_INTID_RX_DATA == int_id)
3 p& H8 M- w4 u2 \    {2 g% s- h5 a) G2 z* ?4 h( i
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);* H7 `& f/ ?  V' p
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);7 P; d; N4 W# m$ e# O3 ~8 F
    }$ X* C; s4 }6 {/ ^1 }2 ?3 H- ?
    // 接收错误
% }. J8 G* b0 Q0 Q' T' U1 q+ @    if(UART_INTID_RX_LINE_STAT == int_id)
$ ?8 d/ [+ j, z% B7 n; d0 d" B+ W; V    {
( f: Y8 Z( P) }+ m! z        while(UARTRxErrorGet(SOC_UART_1_REGS))5 f# Z8 }2 |6 t) N4 @* e' O
        {
' _$ O) }$ y) ^3 z, ^- f6 w( H( i  y2 Q            // 从 RBR 读一个字节
: [+ p. ~5 j5 r7 Z: @            UARTCharGetNonBlocking(SOC_UART_1_REGS);
4 A: _- a0 g8 Y: k2 _        }
4 r# T' x: T% h' d7 {8 {    }$ J. {9 ]- T- P0 C# g. M
    return;. b/ X$ M# b5 {3 x& U3 K1 [
}
* {" L& E; C. n/ `5 BInt main()& Q+ s1 ]3 c1 r
{
7 y* h* }9 C7 A& {$ \0 i; Z UARTconfig();//uart 配置% [- _" B& M" w- v. Z  @: ]; o
    Error_Block eb;
6 j8 O: j. E4 j+ @4 ~+ M    System_printf("enter main()\n");% z5 t4 \+ }/ V0 e8 E, t
    Error_init(&eb);
* @' t' w- S  k4 q6 K    // 动态创建硬件中断$ o# p5 y; E. r4 C5 C
    Hwi_Handle hwi1;  j1 O; t/ @, Z4 C- y* T: L3 u# {  o
    Hwi_Params hwiParams;
2 r8 h0 v/ A+ E, a! J" B- d* r    // 使用默认值初始化参数
! o$ Y: ~4 T; u7 h    Hwi_Params_init(&hwiParams);7 l+ r+ _. D1 ?9 O" c+ ~+ ?
    // 中断事件* k$ z  @: b7 H" |3 V
    hwiParams.eventId = SYS_INT_UART1_INT;
% E. E$ D# P3 [& o% y    // 传递到中断服务函数的参数
0 o, {" a2 k* r    hwiParams.arg = 0;
: m* K! j' R' c' X0 F    // 不允许该中断自身嵌套' q; c* b. c7 h  \, j
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;; n/ y* N( y: j7 l8 a; G5 T# n8 G
    // 使能中断
$ f1 c. A4 f1 j1 o- F    hwiParams.enableInt = true;
( \  e5 O0 R" i    // 可屏蔽中断 4* P) ]! ?) ]5 Y( a( X
    // 中断服务函数 hwiMain
3 |" ~4 w/ N3 i: Y4 h2 ]    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
% B3 e. _" V. F* r4 R    if (hwi1 == NULL)$ o6 E$ p  ^4 R# A3 N( G, v
        System_abort("Hwi1 create failed");
8 C6 ^) S8 A% w& ]# U) T$ f5 X    BIOS_start();    /* does not return */( E6 V* B0 K) ~; L6 L
    return(0);( n2 E2 a- u% u4 L/ J7 W7 w1 d
}
1 q% M% w  P6 ^! N8 C$ C+ e, g* t( Y2 {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
9 S/ ?$ ~) P1 i2 n9 e, C在中断服务函数里放置断点

* g# Y5 z. B) O" I- @7 ~参考 GPIO_KEY  c- J. h+ p) ~$ L) N
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
) S) ^& G& O$ ^6 ~2 A! ^' |
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?% S  H; f/ R" X! V
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 00:29 , Processed in 0.041178 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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