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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下+ P! ~( d* D+ Z' Q' D
// 发送缓存4 w& f1 T. {* A* G
char Send[] = "UART1 test......\n\r";+ _, S& }9 `! B; h5 s1 f6 U6 C

! ^3 b" L+ R% T8 @7 Zextern void UARTconfig()
  S0 s/ a. I4 p{
3 J7 C. V. o9 { //使能Uart1% a# q1 F# A1 k: ^3 S$ ~
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);' B1 c2 |$ G# r( c

% ~% T- U9 h9 p" g; l; \8 K; Y // 使能 UART1禁用流控. P: p0 C4 a  e  x5 R) T
UARTPinMuxSetup(1, 0);4 V2 D) j) a# {

! t9 n. G0 u2 r3 S/ W+ L // 波特率 115200 数据位 8 停止位 1 无校验位: ]! |  V9 e6 S9 |% F  a
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);8 |/ C  R6 C0 K9 V. m

7 N0 A' g9 ^& i  // 使能 UART1
( t) p# S: r) ~2 Y7 \, x UARTEnable(SOC_UART_1_REGS);
$ f* r# _) Z: s( n3 V  // 使能接收 / 发送 FIFO: Y7 O$ j- ~) M; k/ ^) r3 m
  UARTFIFOEnable(SOC_UART_1_REGS);
5 T8 j" e/ g/ U" u, L: T  // 设置 FIFO 级别* E0 w7 O+ V8 X7 ~9 c1 V$ ~- O5 k
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);9 S# v  S; G8 R9 h4 O
  //Uart1中断使能
) V2 z5 ^2 E4 \7 B* K  unsigned int intFlags = 0;
8 M: e# b/ T( a8 d& z9 z4 y: O  intFlags |= (UART_INT_LINE_STAT  |  \: G* p6 F  t3 y% W; o7 x
            UART_INT_TX_EMPTY |    \; |0 K) t$ V$ `- ~7 W3 s  q; l- P
            UART_INT_RXDATA_CTI);8 e( [( C$ W) m% u: d
            
6 g7 c2 ]# t2 u    UARTIntEnable(SOC_UART_1_REGS, intFlags);+ F) M; I9 G, I8 v# ~6 G
}
( X- |! m: }9 p//UART 中断服务函数
2 X! d$ q5 b0 w  \void UARTIsr(UArg arg)- [5 @' k; k# x7 w
{( J2 U3 T# B2 e5 y  y( X8 e. ?1 M3 r
    static unsigned int length = sizeof(Send);
9 Y8 J0 {& h+ T- H+ N1 |* Q    static unsigned int count = 0;* I: N7 B0 t: J$ z
    unsigned char rxData = 0;/ u, `) }# D4 J0 [
    unsigned int int_id = 0;9 \) w$ N; K$ p5 _6 O
    // 确定中断源3 x2 C9 b. C! X
    int_id = UARTIntStatus(SOC_UART_1_REGS);
% U* S( \( w( Y. @, y    // 清除 UART1 系统中断! n  Q% X8 i* a# f
    IntEventClear(SYS_INT_UART1_INT);
- f: X# ^9 U5 f* B$ r    // 发送中断
4 g: F2 p/ u: a2 K    if(UART_INTID_TX_EMPTY == int_id)
+ ]' ^! w: r6 [& V    {6 S: C( F5 q8 c; _! ^
        if(0 < length)9 v( ]2 `) F5 |) ?' C
        {: c0 W2 h2 N8 a# L# d, A
            // 写一个字节到 THR
% v4 Z, l2 ?9 e" k            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);/ t) F9 n9 ~, D" d
            length--;! _9 L% U+ z, W% F# F& n
            count++;2 ~; M2 }4 K6 G$ x. c
        }0 l' G7 m% ]2 X$ z; b
        if(0 == length)0 B) [7 J* w5 W* Z5 X6 A" b
        {
$ p8 _+ N$ j2 V- X% r( b' N0 t            // 禁用发送中断
0 m; R$ k: D0 I3 G# E5 f: H            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
! s7 J* ^3 \" W" j' q        }
" n- l8 i, S) i: x: y" W     }
( ^! k/ A( C$ G    // 接收中断
: T% y) d. `4 E* d" ~    if(UART_INTID_RX_DATA == int_id)% \* m) t; N: |; w0 V3 }; y& W/ @
    {
( g. `! k) J0 r( Y  w  M        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
8 _& a7 j7 M' |8 Y+ b        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);- l- q! A# ^8 V; T' w9 C! R3 |
    }
) L- N4 h* M; O$ g- w8 ]; p    // 接收错误
6 a0 m& D2 x( Y7 u    if(UART_INTID_RX_LINE_STAT == int_id)9 B1 v1 c) r6 r3 K
    {
% v! O- f3 X( Q0 [$ A        while(UARTRxErrorGet(SOC_UART_1_REGS))5 z9 f$ W/ {) a) @1 D4 K
        {+ C( }5 c% w7 l5 f$ E! U
            // 从 RBR 读一个字节4 {) t+ G9 O% P& Y& c/ v
            UARTCharGetNonBlocking(SOC_UART_1_REGS);
( @  x: a" o0 ~3 g        }0 |3 l6 \+ r4 b
    }4 g# i7 M/ F) D  k* B. A
    return;
' e" k( |) t7 R5 g}0 I# K0 Q+ h$ B
Int main()
4 U" [' L9 _# k7 `9 }) E{
/ }0 O( I' ?" a8 y UARTconfig();//uart 配置
$ E3 g1 C- U5 k0 L: a6 y) Z( s    Error_Block eb;. \: W# ?! `* x5 y8 i
    System_printf("enter main()\n");. o# z6 ?. N4 K$ Q5 K: u. A, O- S+ P( _
    Error_init(&eb);
7 `; l& L9 `4 d4 l- S    // 动态创建硬件中断' q2 |1 G: \0 [1 P; m
    Hwi_Handle hwi1;$ C( `' E" J( U4 n, r# W) l7 X
    Hwi_Params hwiParams;
8 q* _! W; G8 u; y8 a. @1 e- `0 ]    // 使用默认值初始化参数! ?( ^+ W# K5 y  F1 U  g+ ]- D
    Hwi_Params_init(&hwiParams);* Y& M2 @& V4 i# [- X3 g! @
    // 中断事件
3 E) f2 R$ L. }$ D    hwiParams.eventId = SYS_INT_UART1_INT;# ?" t* d- p- @0 ]) d" v: Z
    // 传递到中断服务函数的参数
- V+ s6 H0 c. K# @( L    hwiParams.arg = 0;$ q+ h! l! L. N& x% Z+ N' k, }
    // 不允许该中断自身嵌套
9 u* z5 {* v7 A: z- D    hwiParams.maskSetting = Hwi_MaskingOption_SELF;, W! Q/ l4 k1 g+ |* N. W2 [
    // 使能中断) ?; @/ D- O; p6 v) t& L" y7 q
    hwiParams.enableInt = true;  [6 F) ^, w2 r/ ]* M+ _
    // 可屏蔽中断 4
& H2 ^7 V, g& \: a    // 中断服务函数 hwiMain
1 @, |' z0 w; U7 s    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
6 ?1 `/ p& Y; m! N. ~5 t    if (hwi1 == NULL). F% m* G( l. I6 i
        System_abort("Hwi1 create failed");
7 Y$ V' D% T$ Z( a    BIOS_start();    /* does not return */
& Y0 U' O% K1 L: A$ N    return(0);% O: M, F: \6 L$ W
}# v/ ?+ K! F; U5 b9 ]

5 ]3 n. C$ I3 r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?- H7 \! ^4 U! }* y- N
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点0 ?, a3 b2 Y9 v
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
1 J3 a$ x* G; |1 `0 e/ {在中断服务函数里放置断点
% t7 b1 p: ~% t+ K8 o
参考 GPIO_KEY8 D+ T; Q8 [+ |6 P$ H& p3 i
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-4 05:26 , Processed in 0.039694 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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