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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
' {: D  Y( J& ]5 P3 X: Z8 ?4 i// 发送缓存
+ d& Z# [' c5 F( m+ V5 @7 {char Send[] = "UART1 test......\n\r";
6 k8 z" n! ]8 Y% @* y1 e
: o7 f# m5 Z& ~% Kextern void UARTconfig()0 A9 J9 D6 A& B/ y' h8 N1 V+ ]
{& P% H9 o/ U& Z( {, G1 ~
//使能Uart1% }0 D+ P% _5 O0 k4 F" ~
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; h2 r! Z5 A& y& }" o 2 Q8 u* @5 u! n5 p$ V
// 使能 UART1禁用流控
& Q- r7 E. y2 u1 W UARTPinMuxSetup(1, 0);! q' ]; I% t3 M& A) s2 @9 v

$ ?& [  O4 J/ F* y- A% }( U/ \9 V // 波特率 115200 数据位 8 停止位 1 无校验位
( [; Q( s2 ^$ h# k1 X  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
" N& h, k! I( P  b1 @& P
0 ^8 l' l# a- P; I4 G  // 使能 UART1. g, }3 l2 L! B+ ~
UARTEnable(SOC_UART_1_REGS);
8 b# j4 Y3 u0 `  // 使能接收 / 发送 FIFO/ d/ L; m& X4 R) }6 r, z* G
  UARTFIFOEnable(SOC_UART_1_REGS);
; V2 y1 c. J" b0 W, y  // 设置 FIFO 级别
' z* ^" Y( ^% h# I    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
8 g. ]4 `8 o' g6 V9 l/ f) y6 o  //Uart1中断使能' Q  r+ @: g' b3 Z
  unsigned int intFlags = 0;
9 w) f& K3 H6 }2 s5 H' z0 |. [8 E  intFlags |= (UART_INT_LINE_STAT  |  \/ A$ ?) r0 L. h* p6 x, I/ m' K
            UART_INT_TX_EMPTY |    \% f2 W. |- e- V" r7 H* D
            UART_INT_RXDATA_CTI);7 n! c6 C4 c7 L  ~, e. u
            : ?4 N2 F9 _0 u% t0 O- R
    UARTIntEnable(SOC_UART_1_REGS, intFlags);
: B& U( ~; }/ `; K9 U9 @  A6 w}
- r$ N4 d+ H; d3 E1 K8 V" }//UART 中断服务函数( v6 X- p  T/ {# C$ d$ c
void UARTIsr(UArg arg)3 `+ w' n2 c- \8 m1 r, K3 a* l
{
1 q* j. g7 o: h% p    static unsigned int length = sizeof(Send);% {! S3 U0 c% z" m/ N9 H2 g
    static unsigned int count = 0;- H' L3 V! Z# M" z  G1 g
    unsigned char rxData = 0;
( K* o' k* A: E' Y/ h9 p$ t0 Z7 A    unsigned int int_id = 0;
5 B7 B" m5 ^3 S  u* w2 P7 d    // 确定中断源
) ~" u' j9 P7 Q: i+ I4 t    int_id = UARTIntStatus(SOC_UART_1_REGS);4 P1 `: H' r6 H* M1 Z  @. |
    // 清除 UART1 系统中断; e% f: ~5 V  e/ H6 |, Y7 s" G- W
    IntEventClear(SYS_INT_UART1_INT);
0 b& i8 z; H0 D$ \    // 发送中断
2 G8 l8 U7 U2 @, r    if(UART_INTID_TX_EMPTY == int_id)
; w& [8 X$ ?4 R6 ]7 g) w9 ]    {! h: Q: ~  V4 v" T
        if(0 < length)
& v1 g" p& l& O: w% g  q        {6 S# l0 y9 _. r! X& P0 e6 Y" A( c
            // 写一个字节到 THR8 p5 L# L* s- B1 c
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
; v) j6 Z) n) |0 H9 m' C9 S. G            length--;
& ~4 M! k/ N5 R            count++;: _8 D8 V( {1 {, x; z, u
        }$ n" @+ V$ v8 P' h! [  T) I
        if(0 == length)
' P! I1 \$ N; s7 _3 t" V        {. ~8 T, `6 ^( ], D
            // 禁用发送中断
- L  j7 V: ^2 C. ]; P( I1 Y- S            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
( [* S3 @$ c7 j1 k* G% ^' r0 ^        }% W5 M" ^: |& y$ u
     }3 H2 g: ?- ?' N. x
    // 接收中断/ N& y  m# h; a3 g8 P1 m+ x; q6 n
    if(UART_INTID_RX_DATA == int_id)
% n. y8 g, W$ U$ O    {
  _3 D# q2 O2 I9 A+ ^0 R5 ~        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
. x0 z$ G/ k! k# Z/ V! D        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);% n( x- Q/ w; }' B2 z
    }! z$ L+ ~& \- K( a
    // 接收错误
7 y7 [( u( c% s% V. e* K/ u    if(UART_INTID_RX_LINE_STAT == int_id)
* Z7 C2 _. {0 K, z3 x+ Z/ J    {
! K* [/ V0 a1 Z& v( h" P5 m7 }! n        while(UARTRxErrorGet(SOC_UART_1_REGS))( R: Z" e/ m/ S
        {
% N4 P, e) U3 t            // 从 RBR 读一个字节
4 B7 X( ^7 s" O3 j            UARTCharGetNonBlocking(SOC_UART_1_REGS);7 Q2 b3 ?# f  u8 a
        }
$ i" C# ]* D! C5 a% P    }8 F/ w6 K( _5 M1 W% ~8 Y( E( J- p
    return;
! a7 H- f+ @, P$ v! |. H6 L}% X- f  E. {& A1 O% P. y2 n
Int main()$ s4 W+ L; J6 |" x: l- y
{
5 k) @% F+ ]0 d. u4 S" |8 V, H2 | UARTconfig();//uart 配置
5 B( W" _5 T6 a    Error_Block eb;
) u  k/ F4 p+ g: S# X: ^' b- q, e    System_printf("enter main()\n");
  B/ Y1 K  a7 H2 @" g    Error_init(&eb);) X9 l) f. u, @/ o) z
    // 动态创建硬件中断
3 Y! `2 L5 s1 m. j$ r* T4 F    Hwi_Handle hwi1;
( x4 ~* u( q& h/ i) Q    Hwi_Params hwiParams;& n4 T  j, Q6 z( \
    // 使用默认值初始化参数, }; s& N2 O7 H9 Z7 E
    Hwi_Params_init(&hwiParams);% O9 b, f" R$ E9 c3 E; _9 u8 j
    // 中断事件
& s5 ^5 Y  [* K  k2 I6 Z8 U& r0 u5 o    hwiParams.eventId = SYS_INT_UART1_INT;: ?3 J! u& K/ N3 f' I
    // 传递到中断服务函数的参数  f5 ~& F* h: M
    hwiParams.arg = 0;1 z5 I: A& P$ F0 b3 W/ y% [- A
    // 不允许该中断自身嵌套
& Y; z  J3 o1 j, J  S9 o    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
: v0 }5 K& t# W! q6 {. V    // 使能中断
3 H1 B/ L- V9 c6 R; Z    hwiParams.enableInt = true;% h0 C8 y5 b5 M) V
    // 可屏蔽中断 4
) Q' m- X% @$ D  x    // 中断服务函数 hwiMain
, b+ x. u; w- z, A; @6 p    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
  _& O/ Z, l% z5 n% f    if (hwi1 == NULL)* k7 _- ]! P+ b
        System_abort("Hwi1 create failed");
6 P; ], J) m, B5 v    BIOS_start();    /* does not return */
! q! b0 I. F# B, Z/ i* X    return(0);7 x0 }" y" B7 J, P
}
1 l# r! R4 `9 r8 T5 q; A1 ~& m' ?% N! I: ~1 N( U7 R- S+ O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
+ F/ Q. W% E" U
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点: c6 q( S- c5 B. S: W! I# q. }
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
8 K5 v' Q9 M! {; t) I  s) K在中断服务函数里放置断点

9 {6 g" Y: x& H参考 GPIO_KEY
5 E- u& F" P" S# H8 x% V7 a
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-18 16:37 , Processed in 0.040494 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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