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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下" x. O! n" P$ ~, ^+ [" O6 T( b
// 发送缓存8 L  u2 r" k, `- U
char Send[] = "UART1 test......\n\r";
9 D4 x# c( b) |  ~3 a2 y4 c, _" ?& ?' @: ~1 f$ }& c
extern void UARTconfig()
% ^4 W3 I8 Y. {$ C. h1 G  D{
% Q5 g: B9 E9 R% o* P. b0 n //使能Uart1
" e# V0 L" s. u+ K6 s) i0 O" H PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);+ o% u5 k1 o0 ~* o( q9 A; |" w
1 r" h7 O) Q9 m. P2 W- `: e% r
// 使能 UART1禁用流控
0 m9 b4 U# e! x. n# j UARTPinMuxSetup(1, 0);7 y( L# @* e2 R7 Z, I

; ^7 o/ q! d6 ? // 波特率 115200 数据位 8 停止位 1 无校验位
# f$ k3 j: h" q& Z  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
6 L; Z: {. M' {* r # Z  g$ k6 j$ Q5 a* D8 d$ i
  // 使能 UART1
1 j2 e& v: Z* {' N) K/ @) D) o- N UARTEnable(SOC_UART_1_REGS);
, c) d4 a$ _% j+ X. W  // 使能接收 / 发送 FIFO
/ r5 y) I  t, s! @' K: E  UARTFIFOEnable(SOC_UART_1_REGS);
9 [* K- J; V8 @9 j4 g  // 设置 FIFO 级别
8 v3 v" M0 `, x$ A    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
: i4 q4 g1 ]8 T& D1 ]% \: x- y  //Uart1中断使能
3 |: S+ C, U9 @: S6 ]  unsigned int intFlags = 0;/ c0 K) Q/ ]. [8 ^0 O
  intFlags |= (UART_INT_LINE_STAT  |  \# L& d; u2 u6 k
            UART_INT_TX_EMPTY |    \2 |4 O, B* e4 H7 W6 x1 s" z0 h
            UART_INT_RXDATA_CTI);
, H$ X; \1 y8 a8 d2 w- v) G            . Z3 X. M$ l! v0 p4 B
    UARTIntEnable(SOC_UART_1_REGS, intFlags);- c+ W4 o; G2 Z  n9 o8 s
}
+ c# \; K  I/ R4 i, M, ^//UART 中断服务函数
, u1 K/ u0 B; `" U7 |void UARTIsr(UArg arg)
6 h1 K4 w3 B9 u4 S/ z6 d/ h{" Z$ B& ~3 c1 W3 P/ J( g  D
    static unsigned int length = sizeof(Send);7 e; S8 A* v8 K6 J
    static unsigned int count = 0;
2 ~" B' j3 C9 A    unsigned char rxData = 0;
6 U7 E. J' w- N; H    unsigned int int_id = 0;
+ m' C( x1 F. `, \    // 确定中断源
& `* u$ Z4 M5 z  b    int_id = UARTIntStatus(SOC_UART_1_REGS);* R7 D' o% W/ I( Z* {! f
    // 清除 UART1 系统中断& m- R( f& y( X. h7 R
    IntEventClear(SYS_INT_UART1_INT);% o$ L( t$ `7 A( P% R
    // 发送中断
  z) I' N! U; l3 v+ _6 B2 G! m    if(UART_INTID_TX_EMPTY == int_id)- Z) c/ ]  {4 [& i; Z0 Z
    {
& `4 i" R6 j1 h# J4 R" h( L5 N        if(0 < length)
8 _! ?" O3 S" {3 B        {
4 Z$ ]  m/ m) c' T2 Y            // 写一个字节到 THR8 S% ~' B8 W! z- J2 H. q
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);! j  }, m$ o7 l! a5 H) j, N! g
            length--;* b" _% t0 X& F! h
            count++;
% q6 {& M0 T0 q( z! W  |# _5 i        }, J1 C6 E! K# {' w; w
        if(0 == length)
+ v$ W7 C8 Q: M7 k        {
( G0 Q2 k3 P8 M+ \            // 禁用发送中断5 H) `( W5 a( [9 I) R' P; _
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);  a/ V1 p& z+ r( b
        }; W) O' e6 X1 b0 J) P" z
     }
; R7 o3 x( p8 K" L* v; ?9 L    // 接收中断
1 b% ~' E2 X2 S6 w; \. w( `    if(UART_INTID_RX_DATA == int_id)( H6 C$ X8 L3 P8 y% }  h
    {; ~" ]" G6 r8 V! E9 C
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
: M, P$ m# S. \" |        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
' L% x8 r9 Y) N  q    }, v5 Z- ?& Q/ R; X# j9 ?  u
    // 接收错误2 W! X. k# ~2 _
    if(UART_INTID_RX_LINE_STAT == int_id)
( R. L7 U; R( m  M1 \0 h    {$ M& e) N+ h! w+ A( W
        while(UARTRxErrorGet(SOC_UART_1_REGS))1 k- k. L( j6 }# L) [
        {
' Y/ h) Y" d3 j$ J3 \6 @* g8 _. c+ D* ~            // 从 RBR 读一个字节0 b* o1 m3 Q5 \9 n0 z. n
            UARTCharGetNonBlocking(SOC_UART_1_REGS);2 s2 y! y1 B& ^% E0 u8 E/ i- s
        }
% c8 L: U0 b% w- h2 _    }) [# X  i7 A* b* x4 Q$ d; H! ~3 I
    return;" }0 X( m1 F+ w' Z- x% R
}' Q  {8 d. I: q# d) }; H# k" s8 z
Int main()
9 f% T# Q+ x/ F7 s1 o% |5 f' E& ^+ Q' W{
0 m+ l4 B# d# x6 S7 v; E' w% \ UARTconfig();//uart 配置
3 U4 n# \! T8 ?" J: v    Error_Block eb;  W0 h& l& C5 X. q3 x4 K$ P/ ]
    System_printf("enter main()\n");
  M7 u  o1 s  ~+ v% L' ~" s    Error_init(&eb);8 K! L# b  B6 f0 T) k1 c/ ^
    // 动态创建硬件中断
( i; E6 i- Q- J: [# [6 f3 c    Hwi_Handle hwi1;& q0 ^- l& v( t7 d3 F
    Hwi_Params hwiParams;
* F8 Z, m# v. F    // 使用默认值初始化参数! A& ?3 X2 R: M, L' W1 _) M/ Q/ Y
    Hwi_Params_init(&hwiParams);* ]. ~1 P0 U+ ], C5 {* j
    // 中断事件
6 ~4 ~6 |7 m  T6 C2 q    hwiParams.eventId = SYS_INT_UART1_INT;& O) M; {$ [  b6 }7 T
    // 传递到中断服务函数的参数
, h6 o+ n: |6 q8 Y8 ^    hwiParams.arg = 0;
0 ^$ G& t; {! X, o5 _. o2 R    // 不允许该中断自身嵌套3 j; l* b4 V/ _- ?4 G
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;1 q  K; i& R8 b# d# ^2 V0 J
    // 使能中断
/ f3 ~" F$ O' }) c4 X; c" {' H, f    hwiParams.enableInt = true;
- ?  g5 Q5 H5 b$ o8 _0 u; |0 v4 y3 ^! |" H    // 可屏蔽中断 43 U* o! ]* }. a" o- ]8 X. U
    // 中断服务函数 hwiMain
# C3 t" r  h( G    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
1 N3 W: J. h9 q" S: H    if (hwi1 == NULL)1 j& C( S; R  K8 c
        System_abort("Hwi1 create failed");0 Y! @, f0 m3 A
    BIOS_start();    /* does not return */! z! f5 p8 w7 U* q. W! B2 z
    return(0);
( k' D! g8 B& f}
5 E4 j0 O3 E" Y2 @# o/ m, D% D, S! a: {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
  A2 g" u3 z  [3 ]
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
2 O$ E; B/ `1 a7 `
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:495 C/ Z7 }" _3 J' \
在中断服务函数里放置断点
  U4 m# P+ p! c  u" L. N
参考 GPIO_KEY6 g0 d$ v) W; q' f0 B
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 22:22 , Processed in 0.044739 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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