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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
5 d8 K! a" ?* T3 }+ ]; n, g# L3 p5 K// 发送缓存
% \7 ?0 E* \& |char Send[] = "UART1 test......\n\r";" N% K4 @" G, ?& _0 |# f. \# w
) n3 H* S3 m1 E4 x
extern void UARTconfig()
- s1 z% y9 {4 \  B* |{
! [/ R7 X) u. P- ^; f5 N6 U4 X //使能Uart1" E% n0 m% `; H9 f3 C6 S* u; w2 T
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
0 F, F% ]: R1 y . z0 ~% F& C2 K% d) ^
// 使能 UART1禁用流控
# [# q1 s- W4 z  C, T UARTPinMuxSetup(1, 0);) D. K' J1 _, ^4 {& P) \/ q8 j

6 ^0 V. J# i, \" }1 f' B // 波特率 115200 数据位 8 停止位 1 无校验位
0 P3 _" W5 i% f& c; Z1 M  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);0 D+ a+ l* B0 y- B! r* ]( `
' a# y( x2 t9 ?
  // 使能 UART1" a( v) n2 H! n% |
UARTEnable(SOC_UART_1_REGS);7 o" C1 U! i/ r0 M" {
  // 使能接收 / 发送 FIFO8 z* z" Q2 R4 y  @" z
  UARTFIFOEnable(SOC_UART_1_REGS);
! c. N  W  Y3 n4 r9 Z( |& p  // 设置 FIFO 级别: u! w# H3 ^- n  v
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);4 |2 H. d+ ?  X. h
  //Uart1中断使能
6 }$ _& D/ S4 P, m4 o/ y  c  unsigned int intFlags = 0;
9 F; I9 n! p& |) ~7 y  intFlags |= (UART_INT_LINE_STAT  |  \, u5 J$ t1 M  p5 R& G3 I& |
            UART_INT_TX_EMPTY |    \
- E) E/ M* }9 R: W            UART_INT_RXDATA_CTI);
6 M5 U7 D1 z& e8 X            
- ^. p. J4 c! l    UARTIntEnable(SOC_UART_1_REGS, intFlags);
* e; k- J: l, g1 i# n. C5 m% d}- m) |! p7 W+ e) [1 Y# x* ~! L
//UART 中断服务函数
# q0 _# d. x& O! Pvoid UARTIsr(UArg arg)5 q) y& ?! Y1 V; t
{
- l( `) t' w4 [    static unsigned int length = sizeof(Send);- h2 E# @1 D# [4 u3 Y
    static unsigned int count = 0;3 c9 j: E3 x4 n& H) H6 C
    unsigned char rxData = 0;% L3 h) }8 p* q( s8 Z  y
    unsigned int int_id = 0;
* d& v( \' G  q, C. U    // 确定中断源
2 T* K( @) X7 W. l; {2 z- Z. F* P6 H    int_id = UARTIntStatus(SOC_UART_1_REGS);4 O1 _. J5 _/ Z- O
    // 清除 UART1 系统中断
+ S# u/ z3 h' g+ B) b    IntEventClear(SYS_INT_UART1_INT);
) j& z$ n+ i+ g+ }    // 发送中断6 b* B  p4 Q) T8 d. [2 |+ ?' Z
    if(UART_INTID_TX_EMPTY == int_id)( ~2 A6 M6 R0 E/ U* u; x3 j. y. P
    {
8 g" B% i! B5 `3 m5 B' A        if(0 < length)
. U' I2 F; T% a* V        {+ K. \, |; h1 W# S8 c4 b
            // 写一个字节到 THR
0 }5 ?$ y# |1 o: r% O$ {, T$ }            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
+ ]4 m3 X. v  ~4 I( M$ ]            length--;
( `9 ~* f9 N7 u3 w0 D1 R2 z4 u/ t3 K            count++;
  j0 L" `* U0 L# [' K! ~; F        }6 b9 H# q8 q4 M# W( @1 S3 K
        if(0 == length)3 X  h) e' X" v/ U' {' c  G; H0 p
        {3 c  }3 Y5 a0 Q+ e6 [6 L% k
            // 禁用发送中断
2 j$ N: p% `* Z* r2 A# [# y# `! h            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);5 l( Z- [6 a8 I+ k5 p0 A. B
        }
3 s* F) @$ d* H- Z1 p1 Y     }: l2 G+ j3 E8 q7 @1 p3 z( o
    // 接收中断
5 g8 B8 {# w4 ^: V0 ?. F# @    if(UART_INTID_RX_DATA == int_id)0 D" q7 m. }: ~6 N: p
    {) @0 [9 D( v! n) r& N
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);, m9 ]& f6 D7 I( F
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
/ z1 h7 @- t) k% D! ^8 Y( \    }+ l3 L* N: T$ ?, p; L. ^, T
    // 接收错误3 m$ F- E/ e4 [+ X" D  q
    if(UART_INTID_RX_LINE_STAT == int_id)7 V' Y! ^7 B4 F
    {7 z1 a  A7 E; M
        while(UARTRxErrorGet(SOC_UART_1_REGS))' ^* A/ P1 P. z
        {$ b2 n, g; h" _6 F" M. l4 p
            // 从 RBR 读一个字节
9 A! M3 d" D8 C6 L; q+ G/ h% R! t            UARTCharGetNonBlocking(SOC_UART_1_REGS);7 C  F! i9 w3 j' L" F
        }
+ D  M9 L; v% ~    }
6 Q; A1 A/ O. N0 s/ q1 o% }1 J    return;
1 }% W7 h! ^5 o4 f/ g" U}
0 K! w0 ?& e. H- q3 fInt main()1 A; C+ R5 J4 O! H; C+ ?
{ 7 Q( ^8 ]! `% o6 \: ]5 k+ h( u& R* j
UARTconfig();//uart 配置
, u0 ]+ E+ M! G# d2 {/ n5 a5 K    Error_Block eb;
( ~- C. ?: ~8 {% M4 b    System_printf("enter main()\n");3 l8 C' U$ c2 z
    Error_init(&eb);; l7 F( i  q& Q) k7 F
    // 动态创建硬件中断; a8 Q& Y7 z" G1 E% F, N
    Hwi_Handle hwi1;
7 N1 m7 L# N  o% i& }    Hwi_Params hwiParams;& n- E- P3 f" [- X; ?" X& [
    // 使用默认值初始化参数. I9 i% E+ `4 |* \4 R0 H) Z
    Hwi_Params_init(&hwiParams);
  h& B& C7 B( P( @7 X* N3 @    // 中断事件
- l2 R% u2 u# {    hwiParams.eventId = SYS_INT_UART1_INT;
- T/ H8 ~5 h* w# Y8 i) \$ F" D; H    // 传递到中断服务函数的参数6 k1 C0 W9 _; z
    hwiParams.arg = 0;; j5 G% N  N) `5 m
    // 不允许该中断自身嵌套# o7 J& x, l5 a+ E! \- N
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
1 a# K. Z8 J) m/ {: J# w; r5 i    // 使能中断
1 e- w+ L! W! h3 b8 R- _7 u    hwiParams.enableInt = true;
& ^8 n0 r5 J; Y    // 可屏蔽中断 4
: A8 j* Z1 @) C8 a: D2 O    // 中断服务函数 hwiMain. o6 P5 a8 R, p+ N$ Y9 V; O
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);4 z: R( K, s' O4 j8 n+ Z# H; m
    if (hwi1 == NULL), C4 \9 y  I/ s' g
        System_abort("Hwi1 create failed");
8 N0 X) {% @) {: ^9 ~    BIOS_start();    /* does not return */0 L4 n# m$ q9 J5 X
    return(0);
4 E  O8 T0 d% R5 L, H}
3 k0 R4 |! B: V# k2 [6 I" u+ \
  V* h) V2 y( k5 O1 z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?1 Z' e1 V8 T) B9 W+ {
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
3 m( z1 L( p' V: a- l) s- a9 N4 E
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
3 `! N4 f# a& _' v, _/ ^在中断服务函数里放置断点

7 Z  z3 F: ~  ?8 {2 |4 L( ^参考 GPIO_KEY
: I1 S' N- X2 W, E0 d1 ~0 {
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-16 00:05 , Processed in 0.039880 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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