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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
* K( U4 L3 u: ]* w( q// 发送缓存
" V/ T5 n1 x2 Q5 achar Send[] = "UART1 test......\n\r";% i9 Y1 h* H. G3 Z( h9 q

4 u4 _8 l% N: j8 oextern void UARTconfig()
( p8 C3 Q, ^9 H5 }8 _{
9 \6 a. y+ D3 m! @ //使能Uart1
, H. K7 H4 _2 ^1 B PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);# A: _7 k6 @% k

" F& c' Z6 H4 Y$ z# r+ r // 使能 UART1禁用流控) B; |0 C  O& J
UARTPinMuxSetup(1, 0);
/ I2 Y+ R# C, m2 P
5 X+ [' x9 p% b. w( N9 { // 波特率 115200 数据位 8 停止位 1 无校验位
& `7 w( a7 {$ }, ]  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
9 W; l* y( }; P/ b( r0 }6 ]8 ^ 7 m9 b+ Q# u8 L  L; p
  // 使能 UART1
9 G5 V; c; K. l9 o* |8 S UARTEnable(SOC_UART_1_REGS);. a  q- `  z; J- m: D1 W1 g
  // 使能接收 / 发送 FIFO
5 T0 \4 h& U3 q" r9 A% R  UARTFIFOEnable(SOC_UART_1_REGS);
/ B' j! o6 m/ j( H4 o  // 设置 FIFO 级别
1 j+ p% r) m& Z0 K8 ?: [& S9 t5 |    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
8 S6 J4 h- Y. v. `  D/ v' z  //Uart1中断使能; x3 p& h5 U6 m7 G; m4 ?5 I, [
  unsigned int intFlags = 0;- I* W6 N* y1 b
  intFlags |= (UART_INT_LINE_STAT  |  \
& M, ?: X9 k$ c- R; q  ?! ]9 ~            UART_INT_TX_EMPTY |    \
4 k. Z" S. ~  D8 y* X            UART_INT_RXDATA_CTI);
( ~" _1 X! K/ q) t            8 ]) `8 Q# [4 ~+ ]: D9 u# [. D& c
    UARTIntEnable(SOC_UART_1_REGS, intFlags);
  y! b7 l( s! e}. q) z' @7 i; [! P' E# D
//UART 中断服务函数
+ X; f0 }" \) t3 o/ |4 S1 s8 Vvoid UARTIsr(UArg arg)( U1 U" `" C7 J( ^+ y
{) a6 W( L$ b) v+ p
    static unsigned int length = sizeof(Send);& _9 r7 l2 x) y" \9 L9 ?3 J1 U
    static unsigned int count = 0;
0 }& {2 ]3 |+ |    unsigned char rxData = 0;5 p; L8 ]. q+ ?. ]4 v: T6 D
    unsigned int int_id = 0;
. Q: [$ B! H% l( g' A4 g0 T    // 确定中断源" s1 p1 m/ r" X9 a3 L0 n4 H2 H
    int_id = UARTIntStatus(SOC_UART_1_REGS);" D5 [+ s% w% q- n
    // 清除 UART1 系统中断0 c2 b% [; R/ |6 A' O
    IntEventClear(SYS_INT_UART1_INT);
' p& x5 h- m5 @! N6 r* O& a    // 发送中断
5 c* y6 ]9 H* J0 \, M% }3 n" t* p( g    if(UART_INTID_TX_EMPTY == int_id). m  P' l" V; a* p# d: A. f
    {1 F* X' @) d1 c4 B9 D# i
        if(0 < length)8 I0 t& P; U6 G
        {
% G/ o8 Z0 D1 ^' y7 O  a% x            // 写一个字节到 THR
& p% U+ ~1 P0 @2 u9 l            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
) M  o6 c" N6 |+ K" V            length--;: A2 a  v% V  N9 K# Q
            count++;
& h9 f! r: t' ]& o/ f        }
; j0 e. }+ I2 _& m8 Z. ]        if(0 == length)& |; r8 m) A9 ]9 |
        {
1 E% `+ |& E" K( F% t9 R% [1 L            // 禁用发送中断9 M* u3 [6 L+ c7 J8 U" ^! k( Y
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
, O" M4 r. y$ Y9 F        }
' B: U* q* R9 v     }
* g1 ^" ~3 @+ F9 g/ q* S( [    // 接收中断
4 Z' P" b+ h9 `3 L6 z  Y3 V% n    if(UART_INTID_RX_DATA == int_id)
1 x& T7 z/ I4 q( i# M" M    {
  |9 L. s0 p* U1 w, t  c        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
" Y. V) u8 ~& S% L( ~        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);* g  U5 W7 A8 s% T3 w8 T' `: P
    }
; f, ]) z9 P1 K& w    // 接收错误6 u- X- s8 e/ S4 l
    if(UART_INTID_RX_LINE_STAT == int_id)
; M8 Y+ @, e5 o! S; E! y    {! V( M+ a- q$ f$ v8 l; J
        while(UARTRxErrorGet(SOC_UART_1_REGS))
0 R- H0 S; B; }7 F9 J; T4 G. W        {. S4 t$ l8 a' o
            // 从 RBR 读一个字节6 _8 u8 g( W/ ]4 t# X5 `7 m
            UARTCharGetNonBlocking(SOC_UART_1_REGS);
( Q% E- W2 J# O        }* L3 D9 ^- p% u* j8 Y7 w
    }, j& m" h4 z% N$ t
    return;
# O0 Y  K, o) {8 `, {}5 \1 m+ R* H! r3 g# m9 x, M
Int main()
! D) F/ ~* {  `, v4 L{ ; R; ^! A( C" c2 @( D0 w
UARTconfig();//uart 配置+ ?6 N) s. b8 E! |, A* l) D
    Error_Block eb;
. O9 l  K/ l& i    System_printf("enter main()\n");3 }/ s) `- R$ R. R+ a
    Error_init(&eb);# }9 b- z+ l3 b9 K/ M
    // 动态创建硬件中断
/ N" c  b- U7 q) a! n    Hwi_Handle hwi1;
5 B% x# Q* s* P3 ?    Hwi_Params hwiParams;
8 f$ t4 i  ~- q3 H. h    // 使用默认值初始化参数+ Y  U+ |) b; z/ U
    Hwi_Params_init(&hwiParams);
9 A5 Y  ^! k# A2 u    // 中断事件
$ {7 J8 v" G# t' ~: N    hwiParams.eventId = SYS_INT_UART1_INT;( U" e9 x3 t' Z3 b6 _2 K; b1 M
    // 传递到中断服务函数的参数
. d5 L  L/ ]6 N9 Q1 H4 `    hwiParams.arg = 0;
! r& l$ }9 f; j; H+ p" m5 e    // 不允许该中断自身嵌套2 C- b' A, O. F" m- s
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
$ O2 o& O3 J5 c$ T$ ^! T    // 使能中断
. D( d% q# y9 }2 e, `    hwiParams.enableInt = true;
) b# r4 w8 m4 M# J    // 可屏蔽中断 4) f. K2 ~+ r$ k4 T( U8 P
    // 中断服务函数 hwiMain* e3 o+ @# {0 P. g6 L- x+ f" b
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
. G/ S1 P! {! F$ L6 Q. q; b    if (hwi1 == NULL)- \; S, j( Q, f5 Q! N! m
        System_abort("Hwi1 create failed");
/ S5 x9 n% i# z! T% q' j# u- f    BIOS_start();    /* does not return */( L: h4 c2 A# A
    return(0);
" A- \) ^- o$ y$ W( X}0 Z6 s+ r2 A" e! @; I! K/ Z4 a  _
, v, t6 ]! Q4 |0 ]0 G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?( K  A% t$ F1 X- F7 }) @! u  @9 h* X
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点% C1 S6 z# x( s* j$ o  x2 b- T
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
6 [: U5 z+ P0 B, N+ z9 D: b在中断服务函数里放置断点
# @  M+ F. w: Q) o; j1 N$ ^
参考 GPIO_KEY
$ S( e' _# r* O, ]- j& a
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-14 18:26 , Processed in 0.037632 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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