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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下1 H  p! y3 H  \' {- n
// 发送缓存
& y! j# Y8 ?- {" V" z. R* U* ]* Cchar Send[] = "UART1 test......\n\r";
  N9 }& ^- ^! Y% z  v7 g' F
1 P/ j$ M1 x; R% N& }extern void UARTconfig()/ I# l- o+ L- Z( Y7 W) x& T# a
{
; M3 s( p- g4 l/ K //使能Uart19 q: K- ?7 u# c  `( \! f5 k
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 ^) b6 ^& j4 X" D( }% K$ G & }+ j5 y0 j: }' u1 g6 K2 m, g
// 使能 UART1禁用流控
  D2 S, J. r! Y0 K" f9 o8 K UARTPinMuxSetup(1, 0);! W% h6 X' \* W6 b  q3 j

7 E  V5 J  q1 V; D+ A // 波特率 115200 数据位 8 停止位 1 无校验位
' Q9 h+ j5 G- o  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);$ x6 `3 f! e; i; \$ o) a

. _9 \9 T* ^* U- l5 H4 _  // 使能 UART1; W( n- d; N* O, c/ X
UARTEnable(SOC_UART_1_REGS);9 B8 `& T. W# n& t- n
  // 使能接收 / 发送 FIFO
9 q+ \: q; v# P2 }0 K# h  UARTFIFOEnable(SOC_UART_1_REGS);# U; e& Y- q6 b( d% k8 S* m  |" M$ F* L: \
  // 设置 FIFO 级别/ Y0 [+ g0 w; j8 `
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);4 N' v8 ?1 [! o8 E2 z
  //Uart1中断使能* l% G' S. s0 X( R9 K8 e: ^/ l% N
  unsigned int intFlags = 0;
; ~9 Z. C3 D; `1 g9 q' G5 o  intFlags |= (UART_INT_LINE_STAT  |  \- N) t/ `+ N+ N% R& n
            UART_INT_TX_EMPTY |    \
+ Q8 ^, q, f7 w9 @: q            UART_INT_RXDATA_CTI);5 w# Y$ d, p0 ], ]
            : x5 m, U* ^+ H1 j
    UARTIntEnable(SOC_UART_1_REGS, intFlags);7 F0 ^7 z0 I+ z, G: q
}$ z! x- q' K, `8 P5 \/ |/ X
//UART 中断服务函数! u! u4 N' M% ^/ z
void UARTIsr(UArg arg)8 V% f; K1 ]" Q6 A8 _8 k9 N9 P% \
{8 x) Q- }" G! B8 @
    static unsigned int length = sizeof(Send);
. ]7 _: {  s6 P9 z2 l( g    static unsigned int count = 0;
- l3 L6 l& }4 F  d% s7 L    unsigned char rxData = 0;
* R6 l, [$ H" R+ S+ U    unsigned int int_id = 0;
& k& k$ Z1 v* h" t    // 确定中断源& Z8 U1 o' B5 a# T( e
    int_id = UARTIntStatus(SOC_UART_1_REGS);2 D+ J" q. q4 l$ Y$ R5 h7 ]
    // 清除 UART1 系统中断
, v: `6 n& ?# Z/ E3 c1 j    IntEventClear(SYS_INT_UART1_INT);0 J0 i! l9 }6 _6 Y2 J) x
    // 发送中断
4 u& }) Q: h3 n9 _7 k* t    if(UART_INTID_TX_EMPTY == int_id)
! a3 `* S* S7 C4 i    {
, x  a9 Y9 z" y2 I! t4 |* E. Z5 r        if(0 < length)) D, E( T7 W6 C! M4 ~  v3 n
        {
) O4 L; l8 j% |8 E7 d/ \            // 写一个字节到 THR2 J1 s6 D/ e! ^* x" C+ p3 n
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);5 [0 D7 @1 U0 w1 G0 j2 _) ~# @* G
            length--;
& P2 g: V7 ^+ T  \8 x            count++;5 {3 y* s- P8 ]2 J6 a) f
        }3 X9 j7 L6 X) N+ f
        if(0 == length)
4 c7 s& n9 |4 U        {
0 O, H6 u% f0 K/ v            // 禁用发送中断: M! h# A# `" V" @% o
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
% b' Y# P. Y. f  V0 _& }        }
" w# K0 d) p! @0 L2 M* l/ U/ S     }4 i" |! }8 V( P& U- S* P* e
    // 接收中断' u1 P' J2 f3 q/ ^
    if(UART_INTID_RX_DATA == int_id): m1 n4 w3 h- a  n6 j" @" O! x
    {  ^1 f+ F3 Z9 P5 k3 j
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
* u$ `3 q( {# U        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);- O' o; p5 ]2 R9 m* H
    }' A9 }0 n' a0 d8 u
    // 接收错误2 A. ~1 V! q0 e5 b6 @+ X# f$ N
    if(UART_INTID_RX_LINE_STAT == int_id)( u' v4 h1 ~9 [# K0 ]
    {+ g& a0 B; v8 V: B2 k5 H) U
        while(UARTRxErrorGet(SOC_UART_1_REGS))
. I" R" K6 z$ g- |9 _. j        {$ y  {/ s: E2 }$ Z. r
            // 从 RBR 读一个字节3 z" \- n5 H  q3 j
            UARTCharGetNonBlocking(SOC_UART_1_REGS);
4 p7 O# V2 v' v7 D        }
" E5 Y! |3 i% ^* ^0 ^: M0 N    }
) H( e, g! ]! _% N0 {4 T, ?2 h$ N    return;6 [: m, r( h6 K+ Z2 Q2 A
}
2 a" l# q# r; j+ {) v6 \Int main()
/ j6 Z( g# a- H- U/ O* ^/ E{
& B0 u$ V8 T6 {: X UARTconfig();//uart 配置
3 x1 m6 e% S' z4 w    Error_Block eb;
% \1 U3 `( o. @' f' p8 I9 L9 I    System_printf("enter main()\n");7 B, b, G2 V2 i( R5 P3 Z
    Error_init(&eb);
* i6 T: W; x0 d1 l2 D    // 动态创建硬件中断
9 V: u9 H. F! W3 C! M& ?    Hwi_Handle hwi1;
0 q9 c$ q3 g5 d: {    Hwi_Params hwiParams;2 o0 w: m) p( R& r6 Y) t) L
    // 使用默认值初始化参数4 F4 a, Q: L% o8 U! P! q" \
    Hwi_Params_init(&hwiParams);
- U+ e5 [( r' n. s) i) T, K, Q    // 中断事件
( i- @# C. y* Z! y, W2 ^    hwiParams.eventId = SYS_INT_UART1_INT;
  v( h/ T- M5 P    // 传递到中断服务函数的参数5 K) a  Z1 ]7 N6 n+ ~$ O
    hwiParams.arg = 0;; H3 }1 K+ s  ]- e  V9 }
    // 不允许该中断自身嵌套( D! f/ Z& C2 A: q3 o
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;$ v" @4 j2 ]3 i0 J
    // 使能中断
: d# `& l7 J. s    hwiParams.enableInt = true;
) Y7 h, o  a( b, G1 r8 l) m    // 可屏蔽中断 4
/ A7 P+ q& G0 M$ E    // 中断服务函数 hwiMain
6 M7 B9 d7 K9 h- D1 a    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);0 K- y) [8 J5 B, L, n; d4 @
    if (hwi1 == NULL)
  ]- [& K$ h; n7 R4 w! q. _        System_abort("Hwi1 create failed");
( }" i8 z) Y( d( G3 a! w+ E    BIOS_start();    /* does not return */
; @6 `( p" |$ }# |' Y    return(0);/ E0 `: o9 f0 w  S
}
6 H# P$ l/ [0 ]. |" i2 I. I2 Z' {6 a. q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?0 O# K* v- c, _8 Z# w  b6 V: d
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
8 t5 L- r8 F! B' C9 Y+ J% b
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
8 G! p) J. m6 l) K* J3 B在中断服务函数里放置断点

/ _2 ~. u4 b4 _8 S参考 GPIO_KEY9 R/ B0 s! K5 O1 n  i# v* y- i" N
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-12 14:48 , Processed in 0.054924 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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