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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下. I: [! z* c: h$ ^8 N! M$ |. p
// 发送缓存
0 @  [5 g2 ^3 e8 I  w0 ]. _  }char Send[] = "UART1 test......\n\r";/ Z4 W7 F$ Y# O* j* m
* F! G- c: P. i$ F+ U% d; e7 d
extern void UARTconfig()$ B! m& s+ g5 O2 ]. M# n
{
& J, W) G  `& A! M. R0 g) R& _ //使能Uart14 R$ k( X3 }1 B( ~/ l/ ?( m/ V
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ ?' S9 D. L: [0 I0 S2 F ( Y1 i6 {/ @* B$ y
// 使能 UART1禁用流控
( M4 M3 l2 w4 f0 m+ U) P, G UARTPinMuxSetup(1, 0);
3 r. }6 Y8 ?8 V1 y$ K2 C
1 r8 a2 t3 A% [# ], e7 y4 K$ f // 波特率 115200 数据位 8 停止位 1 无校验位
* C7 O9 m4 N6 k! m- {) G  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
  N9 s4 r' E* z
2 k, q& j6 B# _  // 使能 UART16 g6 G6 V, p' T1 B9 n" L
UARTEnable(SOC_UART_1_REGS);
& E: r0 V0 E9 C2 W" ~  // 使能接收 / 发送 FIFO1 ~1 Z. `3 i* ]& \8 I+ W
  UARTFIFOEnable(SOC_UART_1_REGS);! ^/ Y  Q$ g! T$ n
  // 设置 FIFO 级别
7 O+ k: R% \9 Y. J    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);$ ]& R4 |8 N( O  ]) b4 d! d! x6 M
  //Uart1中断使能
# C0 q! g. K; |" s  unsigned int intFlags = 0;6 [( ?1 _' F. N/ F+ N0 x5 _
  intFlags |= (UART_INT_LINE_STAT  |  \
$ s/ j# z. a+ F! i! [, D6 b            UART_INT_TX_EMPTY |    \
$ P( f! Y* {  o2 o1 C: a2 ?            UART_INT_RXDATA_CTI);: C4 i7 U$ Y" x, O5 V) p. G
            
. O# x) _" X$ `  n! p) Y/ I/ g. b, x    UARTIntEnable(SOC_UART_1_REGS, intFlags);+ _3 N. w0 o/ G6 M! L$ i
}
9 b! p( f5 y  k//UART 中断服务函数
% m7 \" {9 f5 g& ~7 lvoid UARTIsr(UArg arg)
! }3 j7 J2 e! D: Q9 |{
  t- _8 `: I: u    static unsigned int length = sizeof(Send);& |0 S' n5 g: N* i4 F9 c
    static unsigned int count = 0;# a* }+ {' r: ?; A( h- d
    unsigned char rxData = 0;8 v) k% a# V6 Z2 F7 \
    unsigned int int_id = 0;
  h" q% a' N2 T    // 确定中断源6 j4 _* c; H" w+ V
    int_id = UARTIntStatus(SOC_UART_1_REGS);
! Q9 G5 B9 c5 P0 O; [+ [    // 清除 UART1 系统中断# C" G: \. u7 @; G5 n# R9 v
    IntEventClear(SYS_INT_UART1_INT);4 {* Q+ E. N+ g( k) d
    // 发送中断
5 I2 b5 f3 L' e$ Q8 d7 ~4 }    if(UART_INTID_TX_EMPTY == int_id)) ~: G3 E4 f3 }# A4 m3 W
    {) j4 J% }% N# P% G
        if(0 < length)( X8 I5 z' X& G6 L/ F: U& p( ?
        {8 h1 g7 m# _! R, P3 {# x* g) {: e
            // 写一个字节到 THR
$ W# H3 [6 Q8 `" A6 b; |2 o) T            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);) B7 T1 {9 t2 L4 e5 Z' h! B
            length--;
8 C* H, s: ^; ^% Q2 ?            count++;, X4 p0 j3 s$ V5 d' s
        }) h% h! N! A; m- g' e& i
        if(0 == length)( a  ?- N. a6 V' C+ j- I
        {
& m) e/ v( }1 E# x* J. K            // 禁用发送中断
( K3 M; S# Q% G/ K! n            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
1 \2 I! L( l% a- a        }+ z. }% Z) e6 B  x( p. J4 E
     }
4 e. {# l' ]4 K% A/ H6 j    // 接收中断6 u" s( v& U6 d# b% D
    if(UART_INTID_RX_DATA == int_id)
* \: R; v/ \& ?1 \    {+ V6 [! _, [0 K* ~, a
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
& E9 Z& b3 _! Z0 P% Y        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
1 d7 |) l5 B% \6 W4 ?4 e& B# R    }
2 f; u$ y' N# Y2 e0 k    // 接收错误: E# r7 t8 l6 u, a1 |) e
    if(UART_INTID_RX_LINE_STAT == int_id)0 _# R: x/ X6 ^: j
    {
; ~: Z8 W+ y" p: g# |# d$ f. k        while(UARTRxErrorGet(SOC_UART_1_REGS))" ], L7 d* M/ b: n& S# `" B$ Q
        {
# Q5 w- l) U$ t9 L1 c* ~* {            // 从 RBR 读一个字节3 D' k5 @0 I1 O3 f9 t4 v  r4 L
            UARTCharGetNonBlocking(SOC_UART_1_REGS);
; L$ J7 B4 t' Y% q        }
- G7 u  |+ E" Q& D. @7 y' }    }: W: Q' b- I9 \9 I2 v
    return;
, ]+ v% p' I, d: T1 F}
% P  R  `/ h/ u8 }4 {Int main(): L7 |+ t8 z; r4 Z) E% |0 C
{
  r% S. f( [% p& U UARTconfig();//uart 配置
& E2 F1 a! Z' R3 C7 ?) j# M# x    Error_Block eb;% n. j* [' Z! B
    System_printf("enter main()\n");
1 u: I& ?4 ?- ?3 [    Error_init(&eb);
3 ~7 ?* O3 m. ^5 w4 c7 I3 O    // 动态创建硬件中断
. P2 j( [/ u9 n    Hwi_Handle hwi1;/ r, M! N( i, `; K; `9 H3 T
    Hwi_Params hwiParams;* ]: `; U: z. C+ p
    // 使用默认值初始化参数  f% s1 R$ Z3 J- F; I
    Hwi_Params_init(&hwiParams);
  O1 A9 A& {, Z6 p. Q    // 中断事件- g  o/ A  R; o1 P
    hwiParams.eventId = SYS_INT_UART1_INT;" a/ n; `( y/ P
    // 传递到中断服务函数的参数
# d2 |4 c9 I% |: w& R    hwiParams.arg = 0;
6 |7 |: t+ c3 ^- F    // 不允许该中断自身嵌套  `; {0 I- U6 r" q
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;) @3 N: q1 T( C) z; F
    // 使能中断' T$ W* R% }! w# u0 D
    hwiParams.enableInt = true;# Q7 j* C. b0 e
    // 可屏蔽中断 4
1 F  X8 @: W; [& y% ?) h$ i* _    // 中断服务函数 hwiMain- W6 r3 C$ _8 r4 R
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);4 y" A+ ~: S  \( z% p
    if (hwi1 == NULL)9 h9 }4 h7 ^5 @: m" [
        System_abort("Hwi1 create failed");
1 X/ j( s# i4 _7 M" H( }4 s    BIOS_start();    /* does not return */
* n  X* w9 d& @2 X- Y; h- ?: x1 N    return(0);
. J1 s% V! Q/ ?' s( m! u: p}
# u9 D# M/ O+ i7 E5 p. f: b% X) j, `# m6 ^& l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
沙发
 楼主| 发表于 2014-12-1 21:49:33 | 显示全部楼层
在中断服务函数里放置断点
4 L% _$ m$ M" K  S: f
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 19:07 , Processed in 0.037546 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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