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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下! Z6 n7 e. X  @8 Q2 g$ Q* @
// 发送缓存
% w1 w5 G9 G9 i- Echar Send[] = "UART1 test......\n\r";
6 `" v# |4 r( [
& n/ E6 [  v+ }1 u+ n+ Kextern void UARTconfig(), N) H; V6 J7 c! w' Q5 [" m  [
{
& a7 {$ E0 d3 _1 J) E4 X //使能Uart1
5 n! t6 w, f1 O% f  w, b( D PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);* z$ m& y& ~& X  Q9 d+ W
/ u! {8 W6 ^3 j8 @9 x
// 使能 UART1禁用流控
/ M& D, n" i$ U' v) p7 S! R UARTPinMuxSetup(1, 0);% t- u0 R3 l6 H
" ~! }. S5 [" U% }3 O; d+ V+ h! p
// 波特率 115200 数据位 8 停止位 1 无校验位; f, g% d/ n7 R# _5 I7 @3 }; t# l) J
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
. u' V% t0 \) W" c 1 h1 y4 A; b& `6 |
  // 使能 UART1+ C0 Q& R% }0 C
UARTEnable(SOC_UART_1_REGS);
2 u7 ]" `8 ?1 E, J& V  // 使能接收 / 发送 FIFO" k0 [) c& l( [* k2 v0 r: c
  UARTFIFOEnable(SOC_UART_1_REGS);
. y& ]' L. K- Y1 C$ v  // 设置 FIFO 级别5 Y# Q5 ^# ]3 \/ a$ L
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
# L: L# ^/ D8 L- m/ O& E3 Y  //Uart1中断使能5 Q* D8 e* N, V/ [
  unsigned int intFlags = 0;
6 @. h' o* u9 b5 _  intFlags |= (UART_INT_LINE_STAT  |  \5 L, k, q% o6 M5 C% j! q) G% O$ I) T
            UART_INT_TX_EMPTY |    \& n' V1 C) ^; s; W+ y
            UART_INT_RXDATA_CTI);
5 n7 H& N) @' J2 J, `            ' l/ d5 Y- P# c+ `
    UARTIntEnable(SOC_UART_1_REGS, intFlags);
% s6 p, s* s4 U5 q& {}
+ ~+ X2 f- h7 {: ^$ m+ z7 y//UART 中断服务函数1 `6 o4 ~; F7 \( w' c
void UARTIsr(UArg arg)' b  X' R6 Q* H  g2 J
{
8 `8 F+ |4 A) p# N2 _    static unsigned int length = sizeof(Send);
0 h- ~( P2 z, J. o    static unsigned int count = 0;
" B5 j4 G, Y7 U- p    unsigned char rxData = 0;
  \$ g3 H& i% l0 b, L" `    unsigned int int_id = 0;
, p' z3 ]. ]# k4 }4 P3 }2 u' z4 ^    // 确定中断源
1 ]/ A, W0 Q7 r2 @0 l    int_id = UARTIntStatus(SOC_UART_1_REGS);1 A7 j+ S7 q+ c$ W% P( \
    // 清除 UART1 系统中断2 i' b7 U7 S- `) d+ U
    IntEventClear(SYS_INT_UART1_INT);
+ ~! z/ {3 ^/ C9 W. q* s# j    // 发送中断+ R6 D; {$ d4 Y$ v1 C
    if(UART_INTID_TX_EMPTY == int_id)
! _7 b6 V0 r: G$ y* D    {
) t; A: W5 g& x        if(0 < length)3 B( ^7 y6 u1 B/ E
        {. s+ h! N$ P7 ^2 p4 s
            // 写一个字节到 THR
7 G! P+ V& F- |7 {8 t* Z+ m            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);$ ~+ x+ t) [- x4 G
            length--;
1 V4 I6 D% Y; l: B            count++;& G$ q% n. u3 @, ~, P' ?
        }# f: d3 S7 ^  [1 i
        if(0 == length)
0 H8 U. _$ E0 U5 B        {
, c+ A, [1 U( c: J! p            // 禁用发送中断* u3 |8 C5 Y5 i$ L+ S
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);' L) e! d3 l. m% Z+ Z7 H0 \
        }" ^. K+ U+ ^& S/ }
     }
0 N7 q! f7 G" G    // 接收中断9 r7 A5 T+ p9 m% N  `/ Y
    if(UART_INTID_RX_DATA == int_id)+ H7 h" W) h' {1 N. k
    {5 x, U) t1 N# k" S' D& K8 Y
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);- S9 h7 m( m# G+ W) Q+ u2 O
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
* u2 @  D9 N5 O2 x, `    }
+ K" b+ }0 D; O( N% x/ z" H; Z: \2 H    // 接收错误
1 ]! {: E- v6 f" e    if(UART_INTID_RX_LINE_STAT == int_id)( w8 R5 T& i# j, v$ G
    {! ]) M) y4 r! d5 u/ F: x
        while(UARTRxErrorGet(SOC_UART_1_REGS))) r, t, Z. m  m1 S, \
        {
) i, F  r' ]! B7 l0 R( a            // 从 RBR 读一个字节
5 k$ f! Z; a  @' \7 x% Q( W            UARTCharGetNonBlocking(SOC_UART_1_REGS);/ k. j, a' H. @3 V: S
        }4 E- f$ j2 \7 E# C. z9 j
    }
1 k9 J9 ^9 \. R2 P, Z    return;
2 [4 G! e; E" W% T6 P}& q) k8 [" |9 D7 O7 {5 e; U$ |
Int main()% F" v' t3 Q  }' l5 y* s
{
) S2 W. o. ^$ y+ O) J UARTconfig();//uart 配置
7 Y- o& c9 L9 {: x+ ~; N    Error_Block eb;! d) w7 M3 o% @6 Z  z
    System_printf("enter main()\n");  L6 X* o2 e5 N# _6 ?
    Error_init(&eb);6 m  I( Q: y2 t( ~
    // 动态创建硬件中断2 x$ K/ }. f1 u& U( o4 ]2 Y7 H
    Hwi_Handle hwi1;
9 O% a* K/ x, k4 \* t6 S    Hwi_Params hwiParams;2 p- b8 I: F5 b+ \3 B
    // 使用默认值初始化参数0 b* K) T7 c* w) i
    Hwi_Params_init(&hwiParams);8 _9 ?- V% {  B  k+ e
    // 中断事件
* v6 m( W# ]0 I' I    hwiParams.eventId = SYS_INT_UART1_INT;, G: a! r4 o9 p* E
    // 传递到中断服务函数的参数: r# F" x& \: ]- Z. q9 k
    hwiParams.arg = 0;
. X& g0 l$ B" H8 B    // 不允许该中断自身嵌套
, Z; ~  H% Z' D7 u% ~) h, Z, R# E    hwiParams.maskSetting = Hwi_MaskingOption_SELF;5 H, n5 F& Y* A- I. n
    // 使能中断
- k) z5 q6 T4 h6 m. O$ f; H    hwiParams.enableInt = true;8 _' M7 o4 G5 o' W( s
    // 可屏蔽中断 4
9 {6 x2 Q& N3 ]8 z    // 中断服务函数 hwiMain
0 o9 X3 J- A" d) I  Z* e    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
5 M- N& U, B3 k5 x    if (hwi1 == NULL)  {* ~( X! W% ]! o1 C. S; |
        System_abort("Hwi1 create failed");) m3 E( k1 `" |9 Q: H5 V+ [3 [
    BIOS_start();    /* does not return */
- v+ j0 ^( @& `. ?. n* Q    return(0);
' H/ ?5 G- d. M! i}
8 S& S+ `1 t/ z3 C
0 E7 f* l# ]6 r! E, B5 Y& I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
% l& s' v- Y5 j5 ]* R
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点6 G* c5 i+ ]) B3 s4 v
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
2 D. e/ u: t! H: C! n在中断服务函数里放置断点
+ f& w2 R8 Z; r, t0 S9 l
参考 GPIO_KEY
. {, j7 S6 }4 e1 ]; B% a8 d
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-17 16:18 , Processed in 0.045681 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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