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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
# y8 j/ n' v% _1 G1 w0 H// 发送缓存
4 @6 `  z7 v% [5 _) f9 l& g1 Nchar Send[] = "UART1 test......\n\r";" N: v. ?; w. L) v6 W3 {! p; o. F

9 W4 q. x3 D' h9 g% W: M* Hextern void UARTconfig()
, d4 b: G. n* _$ V* K. v0 K{
* N* O. ]- [4 I9 ? //使能Uart1
: ?5 A# \( B- o" H) g( N& M( z PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);1 p2 K3 g$ D1 u% r

( e) u; ]# @& g; X9 W- |% K // 使能 UART1禁用流控
+ _9 E$ S: K* o  i: z+ ` UARTPinMuxSetup(1, 0);; |6 P+ }" C0 A% E" V

( b, |4 y+ n2 @. T/ H) j0 h // 波特率 115200 数据位 8 停止位 1 无校验位2 U$ m) \6 R2 v" [$ ]# R! v/ N0 E
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);- V) D/ ^0 c) x
/ m% G$ E* g6 Q5 c# U% A& t
  // 使能 UART1
. a9 |8 \  `0 E' X" s! o UARTEnable(SOC_UART_1_REGS);  ~  [  Q# T+ M* \) P
  // 使能接收 / 发送 FIFO
; A) u" N2 ?* E+ j# h# [  UARTFIFOEnable(SOC_UART_1_REGS);* [- F, {5 r/ \( G. L
  // 设置 FIFO 级别3 ?& S  Q) N1 r
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);* l* G9 T* x' u4 d
  //Uart1中断使能
$ {  W+ L& E. K3 K# V* l, ?, g  unsigned int intFlags = 0;
$ ^* C; U: x4 _0 _& S) v" v8 l  intFlags |= (UART_INT_LINE_STAT  |  \
3 G. f9 R% l9 x* C" D7 ?2 @$ k9 l            UART_INT_TX_EMPTY |    \; c/ a9 [. d/ R( z' i* ^+ J6 S
            UART_INT_RXDATA_CTI);
: d. u) k" K4 D            
% [$ g3 t4 A- ?' z7 d' E    UARTIntEnable(SOC_UART_1_REGS, intFlags);
( T  W! |- A6 @+ G9 e}
6 P% f( S' Q1 i8 `) s: y2 V, [7 x( p//UART 中断服务函数
* x' s3 X: G6 u) dvoid UARTIsr(UArg arg)* x0 a/ R" J; ~& _+ J; }0 M
{4 l; G- _  B' o# K+ z; q1 P- c
    static unsigned int length = sizeof(Send);
# U2 n4 v: y$ I6 r9 F& \2 c    static unsigned int count = 0;
; I/ |$ B' J( w! Y% _    unsigned char rxData = 0;
, R8 v  h6 `, A2 n; A    unsigned int int_id = 0;
+ H) D: A0 n7 Y) y! M4 |* d    // 确定中断源; Q# R+ w7 ^$ A* |% n$ k% O0 H
    int_id = UARTIntStatus(SOC_UART_1_REGS);
* Y" A3 S) r5 L  t; l: S& \    // 清除 UART1 系统中断
+ n9 q; g/ H& Q, T2 Z    IntEventClear(SYS_INT_UART1_INT);  y1 B9 i2 x& t' l8 Y, [
    // 发送中断
. h7 B: \+ `6 w3 o    if(UART_INTID_TX_EMPTY == int_id)+ U8 a8 n' e9 X: j( ?
    {2 ?# C- W) Y, n, M$ ^% v5 B
        if(0 < length); b% i+ u0 m. n( C! J( J& `
        {
1 @$ f! d4 I. r2 B* d3 g1 I. Z9 Y            // 写一个字节到 THR/ ]) [/ A) E" n. L3 @) H/ _5 _) k+ x
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);% h* m8 u$ p, n1 g4 U
            length--;
/ U) Y/ P+ o* [2 ?) N            count++;( k/ D" s- G/ |! F6 V
        }: U& p0 N9 i$ V4 T* n1 o
        if(0 == length)
. i/ s0 r; `" z* j- }, M; g8 A9 Q6 W        {
, ]) @. a; d5 U7 a! b  t            // 禁用发送中断" H5 q  q$ k2 u3 f+ C. b6 G2 W5 P( P
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
9 i! X0 `% T4 Z% E+ k        }
# z- U. Q- B( J7 ]* _. ?     }
; m5 G! y+ G7 X7 {    // 接收中断6 g( h4 z3 D7 H! p% B: T+ E
    if(UART_INTID_RX_DATA == int_id)
) G4 I5 o" f4 K$ P! Q    {8 D( }9 j0 T/ ~: B6 F. u
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);/ X5 E# j, d6 l3 [" E3 f2 T4 \
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
) z: ?6 s/ i  U4 W; J- g4 r6 A    }
* X7 s2 w: d& I    // 接收错误
4 O3 R2 O+ j! f) c    if(UART_INTID_RX_LINE_STAT == int_id)
+ n: u3 F# Y. H    {
; R( _4 M2 f$ U1 a. W1 h8 [' [2 Z        while(UARTRxErrorGet(SOC_UART_1_REGS))
6 D3 A# U) P; n! k) T9 N        {
8 ^+ W. m; `2 Q0 X7 a            // 从 RBR 读一个字节3 Q5 Z3 x: P6 h" v
            UARTCharGetNonBlocking(SOC_UART_1_REGS);9 x& x* D8 n0 W" V; d! X1 Y
        }! N" Q) V. q$ _* r
    }
% l% F9 ~& |. w    return;7 ^( n. g1 M  T% T) j
}' M, R" k' R) T. B6 F
Int main()( H7 q% P, y( I) d0 K: I3 X1 T% @
{
: O( C3 c! W% p3 `  \# n: R UARTconfig();//uart 配置
8 H; x/ H( D5 b8 p    Error_Block eb;
3 t' k/ K, C0 W6 P$ I; _: h4 y    System_printf("enter main()\n");" S4 q/ {' H, i0 d
    Error_init(&eb);
9 d0 V6 Y& {# Y    // 动态创建硬件中断
! ]4 c2 l" ?& V    Hwi_Handle hwi1;* r' q/ k- m! T7 \$ M
    Hwi_Params hwiParams;  Q4 \  @' }2 z' M1 E
    // 使用默认值初始化参数
; ~; a  @& }* O- {4 l( ^- y* \    Hwi_Params_init(&hwiParams);
! I/ F1 a8 n2 a2 T    // 中断事件0 d0 ~1 l$ D+ d% C3 S* ~1 o
    hwiParams.eventId = SYS_INT_UART1_INT;1 x1 s, b. E" w# A' g
    // 传递到中断服务函数的参数  |9 ~8 f& O) j
    hwiParams.arg = 0;- O& M  E2 v0 y- k5 t: W
    // 不允许该中断自身嵌套
7 C' R4 t. G5 c5 A3 E& I1 C    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
& b" ~0 ^7 x5 s% |; Q5 Z* O    // 使能中断
5 _  |1 M& [1 o    hwiParams.enableInt = true;
$ l/ m0 J9 ^  N* @' v3 D    // 可屏蔽中断 4
3 d" u  R# B8 g" Q. S# x    // 中断服务函数 hwiMain1 B# `4 P" r& c  Y8 q* b1 O0 F$ A
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);2 X/ |0 \: g$ }
    if (hwi1 == NULL)
, a, o% S# Z7 c; |* d" Z        System_abort("Hwi1 create failed");
* P8 G% F+ ]1 f  E    BIOS_start();    /* does not return */
+ Y& t3 Y& d# ?    return(0);# q) l2 }( ~/ a7 E( ~- K" U
}
8 n/ }3 v( W) Y4 T0 B- `  z9 A0 s5 e  S, w  i% Z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?7 j4 C: V# K0 {! C
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
" i" t! N9 ~" d! z+ [
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49$ M8 Y7 D3 t5 b3 q% Q* E
在中断服务函数里放置断点

$ E% E1 f$ B- W8 a参考 GPIO_KEY1 T, o  [: V" j- K+ F3 n& r
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 20:37 , Processed in 0.037963 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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