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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下$ x& F$ {; x9 a0 Q7 }
// 发送缓存0 M. F8 c+ O; w1 o
char Send[] = "UART1 test......\n\r";  ]9 T' s7 m+ }0 l: g, M+ W* ?
  _2 a% G# G2 P( w
extern void UARTconfig()
4 N% ^- I' d, [{
+ F4 }, p6 d! d0 k( ]" f //使能Uart1
) A6 |& s* K8 V% K9 z PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);0 n# n) G' B9 l1 Y" p$ R% M

% G9 W0 [- X1 V1 \. U+ g // 使能 UART1禁用流控/ w2 I# x  B0 `$ f
UARTPinMuxSetup(1, 0);' h2 ]* z  p( {7 j
: u+ b# }4 a3 y& K7 O
// 波特率 115200 数据位 8 停止位 1 无校验位
9 d5 ~/ T) ~/ ]4 ?, M3 c  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);; Z" [9 C9 F% t! F4 l1 f
- @. t: k6 |% D1 n# t/ V( q1 P0 @
  // 使能 UART1
, p1 a7 M( n6 R+ I UARTEnable(SOC_UART_1_REGS);
) R% h9 [% ~! b) j. s+ C3 _  // 使能接收 / 发送 FIFO
/ y5 t& t. S. T: a) ?  UARTFIFOEnable(SOC_UART_1_REGS);
) `: w$ o( }! u6 W% _! |  // 设置 FIFO 级别( y# u/ B  |; ~1 R7 t- R
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);0 S2 p) |" E, g" f4 {
  //Uart1中断使能
) n; X0 q  V. x$ n) e  unsigned int intFlags = 0;
3 T: M) L# s8 L1 q& e! Q2 U  intFlags |= (UART_INT_LINE_STAT  |  \
& N! t& l1 R  g; m            UART_INT_TX_EMPTY |    \* j1 ?- A4 K+ N
            UART_INT_RXDATA_CTI);
* L- E7 B( I: v3 ?, r            
6 d* U$ y; s  O! O: t4 K6 R    UARTIntEnable(SOC_UART_1_REGS, intFlags);* n# {2 k; _9 a: n1 c
}
( m; n& G* j0 q: `6 c. S; ?  e//UART 中断服务函数' U8 b) m8 M- z; P2 q/ Y# w8 f
void UARTIsr(UArg arg)
; G9 E3 ^6 W, X{
, |9 f  G! A  W6 u( A7 d8 J; j    static unsigned int length = sizeof(Send);( G& q* p* J! U
    static unsigned int count = 0;
7 V% Y3 g" n2 o' h" k    unsigned char rxData = 0;
+ ]' K; X. d+ T/ ]/ n( }3 P0 C    unsigned int int_id = 0;
& s9 u# \$ n& h' m  U/ p    // 确定中断源; a+ E/ O1 y2 s- n5 c2 Y
    int_id = UARTIntStatus(SOC_UART_1_REGS);
  |$ q' {! B0 @) H0 J. G    // 清除 UART1 系统中断
* U. \1 s* e$ y( c7 q$ y, l# Q    IntEventClear(SYS_INT_UART1_INT);" J9 V$ }% ~* i# b, J
    // 发送中断+ N* D1 J% }; E+ `9 m9 i
    if(UART_INTID_TX_EMPTY == int_id)
% x! X; H: U& T! @    {
( x& w( R; f& i        if(0 < length)
1 I% K1 I; M* K  o        {
. {" q- {* j+ e& w. D" p            // 写一个字节到 THR
) e- T- T; ]- X& Y; G+ g            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
- X: C% n* W5 h& `6 }$ }" O2 O            length--;
0 q( a) l* j# n& ]; q+ f            count++;$ u  G  P& U7 a
        }0 }0 N# }) }( i/ @2 ], ]3 h
        if(0 == length)
. {$ r* P. B; G8 F4 }4 k! ^4 @        {4 a7 R6 I. T$ c- r5 u4 d9 M
            // 禁用发送中断9 x6 i+ {1 B5 ]& R
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);# w, j" q% J% x5 c* C5 ^- ]
        }: a7 O+ c0 @) z- e$ o3 W
     }
  l' j* u' z5 v    // 接收中断$ _1 u3 g2 ]! Y+ d( I& x: k
    if(UART_INTID_RX_DATA == int_id)" S. P: d8 n" X+ R: f$ m; m6 f
    {
3 y+ K3 C. [' t* D        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);+ w! W7 ~# T9 Q# \" w4 j2 e2 {
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
6 E) y; i+ d: D    }
  W# Y' ?1 {1 K  ], b    // 接收错误! {2 v. P( }) y( E5 {
    if(UART_INTID_RX_LINE_STAT == int_id)
' d( i: L5 t) E( j  S7 m    {: _: k8 M. S. S
        while(UARTRxErrorGet(SOC_UART_1_REGS))5 ~  ]3 y! b& P6 M
        {" o9 q1 k- L8 @9 M; }
            // 从 RBR 读一个字节
, x% |1 `7 D, d( }. q* s            UARTCharGetNonBlocking(SOC_UART_1_REGS);
2 w/ k/ {$ x/ z' N/ q/ U) K        }4 o- ?8 g3 _3 ~) k- z
    }: L- x% K% c: B9 d' [
    return;/ N; [2 \, G6 I' g% T
}
- P# L+ j6 I% t% p4 BInt main()
5 Y8 Y. M" A" j* H{
3 k3 f/ U9 K& E UARTconfig();//uart 配置+ M* R) p# J7 S( w
    Error_Block eb;
6 F0 i' z! D5 h. P% c% y) R$ G    System_printf("enter main()\n");
6 R7 u# l) f  |: D2 T' o* H    Error_init(&eb);$ p% u7 y: V" F
    // 动态创建硬件中断  v' E6 W1 x! Q- R0 T6 }
    Hwi_Handle hwi1;1 c2 G- p; t9 B! y9 Z% j
    Hwi_Params hwiParams;* C6 U' u; v: K% u& i
    // 使用默认值初始化参数; W' y, u9 P& z8 g
    Hwi_Params_init(&hwiParams);2 N2 k6 ^0 P; S6 p( u5 Z+ \
    // 中断事件# S5 O% V% Y* T
    hwiParams.eventId = SYS_INT_UART1_INT;
) n1 z5 |  ?3 z" ?0 P+ ~% O: P    // 传递到中断服务函数的参数
5 m6 i0 u) |: L7 g$ y    hwiParams.arg = 0;$ P" h8 f" z* s7 V
    // 不允许该中断自身嵌套
$ l* W8 @9 r# O0 n& J6 i    hwiParams.maskSetting = Hwi_MaskingOption_SELF;4 j+ D5 P& {1 p
    // 使能中断
0 P8 S$ ]% e7 D! t    hwiParams.enableInt = true;
+ f  |6 N3 G6 Z- \    // 可屏蔽中断 4/ t0 b/ \/ I$ _* u8 w- t0 ~' `8 @
    // 中断服务函数 hwiMain
' x9 ~" A) q, Z3 b$ c# Z+ M4 x+ P    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
2 {9 f& t7 H. p! I$ W( d  w    if (hwi1 == NULL)
5 h1 ?' O1 O+ s$ L        System_abort("Hwi1 create failed");- P2 O7 E; a: b( m0 }! S
    BIOS_start();    /* does not return */
1 |: [3 _9 ?+ T' x* u    return(0);
2 b1 r! s& k5 q4 D0 |; F}* V0 ?8 b' ~$ Y) j
: h1 a. ?4 u- {7 O7 u, j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?* b( Z! `. y. ^+ R- D5 l% b
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点" a  C" j( Z, ]5 M8 ^. H
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
3 ?: j/ O7 M. o( U' B0 |9 |在中断服务函数里放置断点

6 h( `) U' v  x; Q' d, e参考 GPIO_KEY( l$ G- ]" o' |; ]
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-16 03:18 , Processed in 0.040246 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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