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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
2 g) k" ^0 p+ L// 发送缓存# F/ J% ^8 ]1 J/ J0 N8 q" \% ?
char Send[] = "UART1 test......\n\r";* K3 O- v& |; C! }: p' r$ w- v- z
# v3 W9 z9 B2 ?5 q4 G
extern void UARTconfig(). R3 `+ u8 z& [$ z  v/ W
{$ A( D6 K+ u) C' W
//使能Uart18 o3 K) p) O: p4 L3 t, e# ^
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);/ i" g( H2 V; m
9 E1 U" F0 c0 K
// 使能 UART1禁用流控9 K4 [) S8 v, B) B7 p* x
UARTPinMuxSetup(1, 0);4 `/ F: d/ ~  \& X
7 T! [5 t9 q  C: w* ?5 @) p
// 波特率 115200 数据位 8 停止位 1 无校验位
' K/ i% s3 l9 I8 {0 h% f9 I4 a  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);1 m; ]" i8 v- p; |

! q. d$ [, p4 |+ T  // 使能 UART1* x. B. W8 P: v
UARTEnable(SOC_UART_1_REGS);
7 p  z& q6 {/ P3 X3 v9 s: g' J  // 使能接收 / 发送 FIFO* K: B9 C+ c  h5 X. ]0 c
  UARTFIFOEnable(SOC_UART_1_REGS);
! S: n  X/ T* u6 J9 ]7 K% T# x  // 设置 FIFO 级别9 G& C' s4 J0 K. J  N
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);2 F1 p0 G& x, l, c% G$ M! R
  //Uart1中断使能
1 R' O* Y+ c' g* K+ K/ j  unsigned int intFlags = 0;+ h( t2 g7 b, v% A! V! s+ \4 L0 H$ D* {
  intFlags |= (UART_INT_LINE_STAT  |  \/ W# h% n; ~0 Z6 `0 J+ d
            UART_INT_TX_EMPTY |    \! X) U  G3 a! @  d$ N
            UART_INT_RXDATA_CTI);  r: U7 P3 D( d. ?$ S, q% j
            0 L9 u/ w- j$ n8 _; C+ _4 ~8 A
    UARTIntEnable(SOC_UART_1_REGS, intFlags);4 e0 q2 Z- y: h* c
}
5 {3 A" h& A1 T7 C% n, M& I//UART 中断服务函数
& f4 V' D% ~/ Qvoid UARTIsr(UArg arg)
9 K; v; Z8 n% t6 D$ V. s{
3 B. O1 R! F1 N2 J3 A9 [9 _5 P7 K; l    static unsigned int length = sizeof(Send);2 u; |2 f: T$ D8 E' q) v3 d
    static unsigned int count = 0;
7 i# J+ r# O. L    unsigned char rxData = 0;( D3 C1 G# K8 k
    unsigned int int_id = 0;
' H+ S* w& S9 H: c; T7 p1 j    // 确定中断源  e' o0 y. K- F" P( n9 \# l! L) _' b
    int_id = UARTIntStatus(SOC_UART_1_REGS);
* b8 e' Y/ V: Y. h    // 清除 UART1 系统中断
$ Z( {1 g( s, H) T; O$ k6 J    IntEventClear(SYS_INT_UART1_INT);2 W1 Q' B2 u/ q7 j' G/ X- l
    // 发送中断
& v( @) b" S  y- ^) ^* @; a9 j2 V8 e    if(UART_INTID_TX_EMPTY == int_id)
; z2 N( A6 q# z2 L( Q; c    {
" G$ D: `" L3 Z9 r        if(0 < length)
' C' U0 o0 F2 ~& T( u5 M        {
0 z' s8 b" Z" r# m            // 写一个字节到 THR
+ D( U; I' A) S" {; W            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
/ c3 A: R. T. A8 [6 ]            length--;
0 k6 K9 Y, I; t- B- w9 D            count++;
5 z* p) ^; v! N7 B        }
# j( O& F' _/ }# p+ E, \, t        if(0 == length): T% x! z. \% z2 f( |! i
        {
, j4 M8 w, m( i/ t' u3 f) d            // 禁用发送中断
1 f( \+ i: h; x$ o            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);; s6 n3 T' g! u! q* l; k
        }; c- m+ x8 U) L0 m, c  k
     }! w' V% L! a& u$ H7 `# J! @! z. j  E
    // 接收中断' {- g: a+ y; o8 `8 W
    if(UART_INTID_RX_DATA == int_id): g  f' q$ j' d' a5 O& y
    {$ M8 Y" ]5 W8 b: j
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
" a% g8 N- ^  [5 `% ~        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
2 k( K% N! u8 S0 u, m" J1 B$ f    }
  Y. l4 Z* V  a2 w! u    // 接收错误
% w& Z' G' d+ |    if(UART_INTID_RX_LINE_STAT == int_id)
. d3 x, E' ~1 b! P* l    {
' X9 c9 H; [; b! f! c6 a        while(UARTRxErrorGet(SOC_UART_1_REGS))) V; R' [% c. Z) H
        {
% i& F$ a# C8 {1 O            // 从 RBR 读一个字节. {" j! P+ H# l5 ~1 X0 M
            UARTCharGetNonBlocking(SOC_UART_1_REGS);6 W4 q% C0 r" s& i
        }
; k" ]% b9 r& H    }: D5 \7 v, g* Y9 y9 n9 [; b) _
    return;
' `; U3 r# Q" i/ S, M$ d4 o}
& ~. {* c" a) OInt main()) ~$ [: w& L, G* T% a' @
{ ) _. Y  A  l! f2 {* |# t
UARTconfig();//uart 配置: X4 H2 C+ v( d" V
    Error_Block eb;$ V8 ~% w$ I5 J9 k8 p; U  U
    System_printf("enter main()\n");: A- T& Y- P# Q7 K3 W
    Error_init(&eb);
+ K  u5 y( _; P# N  s/ o6 y    // 动态创建硬件中断* {& o. i- O3 G2 w0 r
    Hwi_Handle hwi1;0 C$ O" B  E  C# Q0 R5 y/ |
    Hwi_Params hwiParams;6 U' D; @9 u( Y+ r% d: V# B* _
    // 使用默认值初始化参数5 N5 O7 r4 E4 k
    Hwi_Params_init(&hwiParams);
# M- d' x. g( s8 D    // 中断事件
  m# Q5 \; M3 ]' s    hwiParams.eventId = SYS_INT_UART1_INT;
7 ~, g- L! X' b/ C    // 传递到中断服务函数的参数0 R; S% h. _/ {) ~2 e
    hwiParams.arg = 0;$ @1 b2 D- C# d8 h4 ^- v
    // 不允许该中断自身嵌套  o* W8 s' _/ p4 @
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
% |8 l9 g7 G- U    // 使能中断( a  \' \6 o6 R( N
    hwiParams.enableInt = true;/ x. S3 J* O- n9 p' k6 l
    // 可屏蔽中断 45 k& W4 i$ A8 \0 w% M
    // 中断服务函数 hwiMain$ f8 o, w* L  S, c7 I& q1 M
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);7 D9 F: g% P; C+ U" Z4 E
    if (hwi1 == NULL)4 q0 S8 _9 w( Q& g, z. t
        System_abort("Hwi1 create failed");
  D. L% b: h0 N: e3 B7 ~    BIOS_start();    /* does not return */
' ~; I$ D: y) a! F( [    return(0);
2 o( i" @  r7 X$ S}
; f, I  m# U9 R) T$ p% x) T7 o# g/ {& D' x
分享到:  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) H- J( B9 a0 i5 z( Q2 H  R
在中断服务函数里放置断点

4 \. ^. y0 W) W% {* d( f- Y% I6 {" W! V% x参考 GPIO_KEY
  P/ t$ w& D! p' Z0 E
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
6 W2 [, H  e) `8 {0 ]8 q& n
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
/ _0 p1 ^( N/ x$ C
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-8 03:56 , Processed in 0.041135 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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