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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
+ `" U* Y- Z) l2 a2 |1 ~# H// 发送缓存
( y4 v) q: E& Ochar Send[] = "UART1 test......\n\r";
, ]( O# _- ?- i0 x7 R, u8 g/ a% \$ t/ h, S7 l$ L4 ~
extern void UARTconfig()8 U2 Y0 B2 C8 `
{/ x, t. n: h+ |- W- t, C7 [
//使能Uart1
" Y' m& z. D2 y. T- t' l- B PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
: o3 _. q& v5 t" d' B
; R# c$ I* g( L4 Q! I // 使能 UART1禁用流控9 E. U; B- @3 R9 h4 x+ E
UARTPinMuxSetup(1, 0);( e; m+ H' U7 u9 u6 c2 \; z% e
5 `! W6 e+ o7 F' C0 @$ [
// 波特率 115200 数据位 8 停止位 1 无校验位$ g/ ^4 n  w7 T) i  n8 K
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);0 v- {7 m8 O) K$ c$ v$ q! l

) b# i- m' V+ j5 l0 w' _  // 使能 UART1" r; t" w! j! ^$ N. M! ^
UARTEnable(SOC_UART_1_REGS);8 `5 a# G3 {' T1 d
  // 使能接收 / 发送 FIFO
9 E4 Z( c3 e* O4 d8 d  UARTFIFOEnable(SOC_UART_1_REGS);9 j& v6 P# b/ u1 E8 [' D. l. w
  // 设置 FIFO 级别7 ^" a& g! O6 A3 V" q
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);5 U& S5 P/ L4 j/ x) P, E
  //Uart1中断使能: F0 W  M* @7 V5 p/ O) e
  unsigned int intFlags = 0;1 |+ R3 n- X' U1 q( m; b" S
  intFlags |= (UART_INT_LINE_STAT  |  \0 }5 n/ k$ v* N$ R6 Z4 n
            UART_INT_TX_EMPTY |    \# _# i7 o9 U# o% x- z7 x! ^
            UART_INT_RXDATA_CTI);
( y. e- F; g! g+ P            * k; g' }; |  S- p
    UARTIntEnable(SOC_UART_1_REGS, intFlags);
, K. U1 `: n. e2 J9 f; ]9 u}
7 S4 t" b+ q& G6 {* u//UART 中断服务函数9 b" _: `$ V0 \# Q6 d/ m- v$ e
void UARTIsr(UArg arg): G0 M4 Z9 r4 u5 b
{% P( P4 K. m) [( |6 C
    static unsigned int length = sizeof(Send);# G4 y& w: E/ J% y7 O1 x
    static unsigned int count = 0;7 J5 j# ~; s0 V8 U
    unsigned char rxData = 0;$ b4 y5 ^9 }9 |& n  ~
    unsigned int int_id = 0;
* `; Y; Y( ?8 F! D    // 确定中断源
3 w6 L" z0 d! G    int_id = UARTIntStatus(SOC_UART_1_REGS);6 D+ Q1 s3 V/ p) k  w; e% p% F
    // 清除 UART1 系统中断0 N  ]. r/ ~4 J4 n7 W, ]7 T
    IntEventClear(SYS_INT_UART1_INT);
7 v) w8 C' {9 X/ b3 Q. A9 {/ ~    // 发送中断. L+ ^9 H( k& \2 n
    if(UART_INTID_TX_EMPTY == int_id)
+ Z( D! e5 [6 R- A0 w& b    {
9 G3 }8 F0 o" ^* s        if(0 < length)
2 s* _$ B# A1 ^  N/ h        {
" u! O4 Z: ^% D* G            // 写一个字节到 THR
- w* ^9 A6 [# K( W            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
" A" S& p/ D, g" y            length--;
3 U  Y+ v: p3 i, o            count++;
  I1 l: R& l# m: F        }) V" V: b) }, }1 T$ n
        if(0 == length)' x: q; ?$ F  v$ l9 d* L9 G
        {1 P; @# s3 F6 U- g' S
            // 禁用发送中断
5 D5 ?+ E- W( W& M            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
# I: P' Z8 Q: X' ?% t8 S# ?        }+ e% J* r* h- T5 V7 A
     }
% ?- g$ ?7 `: {6 O. P7 B# T    // 接收中断
; u6 d0 D3 m% ?    if(UART_INTID_RX_DATA == int_id)
& b* ~, |5 |! t+ W5 K  c/ d( T    {
4 ?3 a$ F, T" t6 i( b, y* G        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
! J' \3 M; @% Y        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);1 T0 o9 y! X3 @* ?3 {3 R7 h2 o
    }
: C1 p) J. J. p& D! I! E    // 接收错误5 Z3 a0 y+ H5 b+ ^, n  z+ e# @1 O
    if(UART_INTID_RX_LINE_STAT == int_id)
( e: X/ Z: M# a. y* l& Q    {; ~% }" Z/ W" m
        while(UARTRxErrorGet(SOC_UART_1_REGS))  o* C' s8 `2 B6 _; t3 G: L- |- L9 b; U
        {
0 j! Y$ P" e0 K& s8 f            // 从 RBR 读一个字节
; K0 d* A" }. @' `5 f8 a3 s            UARTCharGetNonBlocking(SOC_UART_1_REGS);
0 o6 N' M  G% S) ~3 T3 O) D! G        }
7 C* ]6 ?# T" h2 y    }# I: D4 h9 C8 M! p
    return;
/ _) [8 ]  a+ u; L/ p}
0 Z( k5 j9 s6 X! cInt main()2 ~$ [$ d+ ~) ~8 A& y" E3 U, ^( G9 c
{ 5 G- |  j% `7 N0 j1 z& B( L/ h
UARTconfig();//uart 配置
% m" v/ V" m+ |% d" i4 e8 e    Error_Block eb;
+ |% y. P( M2 Q5 Q) M# O    System_printf("enter main()\n");
+ ~4 h; B' c9 P2 U8 P% n2 z* F" w5 ]    Error_init(&eb);' @" a  h+ E5 y9 h  W
    // 动态创建硬件中断
, q, X5 E, E) }! F    Hwi_Handle hwi1;7 ?7 c6 b2 p* y% y# l: G
    Hwi_Params hwiParams;
1 y1 ]0 P& i+ M3 X    // 使用默认值初始化参数
' V& r. M7 O8 i* E. u    Hwi_Params_init(&hwiParams);
6 d1 K$ B4 v; ]- c- }6 S    // 中断事件3 V  E% h/ D* N$ y9 R
    hwiParams.eventId = SYS_INT_UART1_INT;
+ P* u1 j( o9 s0 i- C/ M    // 传递到中断服务函数的参数4 l4 U( Z/ J5 h# I6 g0 i
    hwiParams.arg = 0;6 _1 e" k2 D& e6 [3 S, C5 U
    // 不允许该中断自身嵌套
3 P2 x4 Q8 s3 K  j    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
3 U& T) J6 P, @/ k$ A3 a. q5 @' H    // 使能中断4 G& K7 U2 c$ P1 s
    hwiParams.enableInt = true;7 V9 p" G& @0 ]; o3 t6 R
    // 可屏蔽中断 4
, T& N! n/ q, {+ O3 R2 M' a    // 中断服务函数 hwiMain
- J# B& I, v+ }5 U: x    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
; A# b, P1 o/ R8 \    if (hwi1 == NULL)& ^4 j  C6 l8 x3 K8 v' t) w
        System_abort("Hwi1 create failed");
4 o' j# r. J0 C3 N0 G: P: @4 O    BIOS_start();    /* does not return */) L: M- z0 O, b: Q( n9 o
    return(0);
1 m4 X( r7 W6 p; }}
2 Z  c) T& V, I2 b! v9 t2 d2 i
* A2 a% F5 f8 v9 U8 W9 _% O$ O' C: M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
- O: ~/ f  D! h. Z! |
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
- v" Y8 J3 }# ~! e& A# E" f6 ?
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
2 i, p4 h6 R2 m8 B5 L在中断服务函数里放置断点
4 l7 _2 z, i, U; v
参考 GPIO_KEY- X9 r1 q9 l* u* l8 N" t+ l, c
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-16 11:40 , Processed in 0.039992 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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