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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
" u) f$ S4 d- i" x. K2 |' r// 发送缓存
5 G$ a  M$ x+ c4 M6 e" T0 hchar Send[] = "UART1 test......\n\r";
, }4 ]0 _) Y: G3 p; r1 T
. Z2 y7 U; s; ?8 J9 \extern void UARTconfig()
# P: u! n$ f, }+ q{( ?9 z. L+ [. p. |
//使能Uart1
& g/ k/ X1 S7 a# {- i PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
& i4 H3 y' w% z: h# { * N9 L, P; R2 [6 S3 i2 T! K
// 使能 UART1禁用流控9 I( U$ W$ a! n0 w" [( t
UARTPinMuxSetup(1, 0);
9 U7 G8 \: Z+ y; y* X7 E- ?4 h- S; n
0 Q: i  o6 `9 ^( q7 h% d$ r$ h // 波特率 115200 数据位 8 停止位 1 无校验位: }4 f0 H8 d9 V) ^
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
/ r2 O" P( x: U* }
: M* \' R% y+ o9 Y. f/ h  // 使能 UART1
1 p# x5 Y7 R% b) P, D- d: J  r UARTEnable(SOC_UART_1_REGS);" p3 `: L. n' M1 V1 P7 P1 m
  // 使能接收 / 发送 FIFO$ M# v4 g( k3 Q/ X  M. `
  UARTFIFOEnable(SOC_UART_1_REGS);
. L( x/ n; S+ \  J2 D  // 设置 FIFO 级别, ~4 n3 B/ h; R* q
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);0 h1 |! Q( k7 p3 [2 f
  //Uart1中断使能4 o3 |- j$ |% H
  unsigned int intFlags = 0;6 |6 e' p8 o3 a) a
  intFlags |= (UART_INT_LINE_STAT  |  \
9 o  v: p, x/ U$ M            UART_INT_TX_EMPTY |    \8 q+ _, V# u7 P' f' t. N* S, b
            UART_INT_RXDATA_CTI);
2 V% y6 F$ {, {# u2 Z9 M            7 Z9 u$ Q; L" p6 ?5 r9 M2 Z' {' o
    UARTIntEnable(SOC_UART_1_REGS, intFlags);' K+ Y. R. r4 e& Z+ P4 Y" G
}4 C  _' @5 z' B
//UART 中断服务函数
; d3 M) [8 a. m% Tvoid UARTIsr(UArg arg)& u- q5 f+ B1 X) e' O$ l
{+ D3 }3 ~2 d" e. Z$ k- e
    static unsigned int length = sizeof(Send);
  i# U9 K/ s2 s/ b/ E  q    static unsigned int count = 0;& v* S. c( t' I% l& V$ W
    unsigned char rxData = 0;
4 ~# l5 {( ^6 |    unsigned int int_id = 0;' W" T0 n4 B, z/ U& v: ~) _
    // 确定中断源- ^  v) S& ]9 K# |' J7 ^5 O* V$ Y
    int_id = UARTIntStatus(SOC_UART_1_REGS);
# b( q  a% b6 ]/ W- M; ^' `9 b    // 清除 UART1 系统中断" S' T+ f  y& `; p
    IntEventClear(SYS_INT_UART1_INT);# {( G* M( c7 V7 h1 w+ r, D" r
    // 发送中断
- @4 `! ^5 r; \* e# \    if(UART_INTID_TX_EMPTY == int_id)# z- g' W, p& r, v* P2 R/ x) y
    {
$ B8 n- C/ i5 _        if(0 < length): ~/ Z( N6 |# e8 H0 I# U+ U+ x
        {! W8 n' C' `9 s' G
            // 写一个字节到 THR# ?1 m! i- b3 R4 g7 q: R" g
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);1 V8 j2 Q: X/ w$ a5 X; q; q$ X
            length--;
7 h; m% S7 M. y* j  p- Y, j0 k            count++;5 A5 l9 ?& w4 A' J3 m) d: d* h
        }
* L$ T. K0 E/ H) `, U2 N        if(0 == length)" I  [; v9 j# S3 W+ G3 X
        {2 L. T1 G3 ]' O! r0 h# f7 j
            // 禁用发送中断
; w5 q. O6 i3 |0 E* m; ?+ k9 i            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
% Q4 W3 C# H7 D/ ]; @        }
9 d2 h5 x/ Y- O! v     }
( P8 U- p5 w) ]! z' |6 `6 a    // 接收中断0 q8 N5 o: Z* Z/ A6 F/ |5 f
    if(UART_INTID_RX_DATA == int_id)
7 T* ?; i! \1 G0 R: k" ^2 n$ _    {$ K5 M  J* p& {
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
/ R2 U/ x  H3 {( v( b9 x. i& c        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);$ U$ h: i; N$ E
    }/ i, [0 d: G" e7 q" z5 O1 d& i
    // 接收错误
5 q9 e% ^- M2 w& [, g& x* j    if(UART_INTID_RX_LINE_STAT == int_id)
" T! D6 h, |$ t/ Z8 o" r( Z8 n4 e    {
' j, t7 X1 e/ Z9 N0 p: Z3 L8 \        while(UARTRxErrorGet(SOC_UART_1_REGS))
  `8 E+ M5 {* ?9 w+ g- {        {
; J4 }: F- m3 z5 E- q2 X            // 从 RBR 读一个字节0 ^6 l5 b9 S" u; a" a# F/ m
            UARTCharGetNonBlocking(SOC_UART_1_REGS);
0 J; ]- _; g6 |. K        }1 n& F+ g5 W- [" u1 |, T
    }
# v8 M$ H) r; k% X9 B    return;( ~% E/ L4 R+ a
}
  @% [. l; z" q; FInt main()
0 |; k1 [9 ?1 ~6 D{
0 G% D2 d; w. U3 ?& v UARTconfig();//uart 配置
  c. X# M+ R" l/ }' R' d; W    Error_Block eb;
+ u) y$ ~0 w$ N- r/ v    System_printf("enter main()\n");% H. |/ o4 l. Y9 ~! F
    Error_init(&eb);
3 c7 P- g. ?" j, \    // 动态创建硬件中断- N' Q1 w" G, @5 L7 g$ y( V
    Hwi_Handle hwi1;
8 J0 u2 S0 _7 K    Hwi_Params hwiParams;
, P, }. d$ b# ]1 ]: u& V    // 使用默认值初始化参数( [$ f$ I+ @; I/ B. E  z
    Hwi_Params_init(&hwiParams);, x5 q" w# n! i' @  N
    // 中断事件0 M" Q( Y) p- O$ w9 z; m7 G
    hwiParams.eventId = SYS_INT_UART1_INT;, W3 `0 m- q3 c: H4 ^0 M
    // 传递到中断服务函数的参数2 }2 `, z' T$ Z* {7 L( S) Y
    hwiParams.arg = 0;
4 i# q  Y/ o; @% O- Y: |    // 不允许该中断自身嵌套; m3 x$ K' g  w; M' z
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;6 {, {2 O6 P$ _7 n3 O* Q$ c
    // 使能中断8 T; M: N* u3 `. r. x
    hwiParams.enableInt = true;2 _5 B$ @$ i& L- O$ u) B- r& `
    // 可屏蔽中断 4
" v* }: P9 K7 p5 l$ s    // 中断服务函数 hwiMain9 f. |( v" U# {
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
  _& y: x" s' r' ~# e    if (hwi1 == NULL), G  @' e, y  e! Z% |
        System_abort("Hwi1 create failed");
$ `. E% s; s' p$ j) U: {/ t' T+ b    BIOS_start();    /* does not return */; c' G1 g* h! I4 \" e5 ?$ C
    return(0);
0 g8 A  N0 m. I) q( }}- l6 ^& h/ H0 \4 N: l

0 X% X: ^6 ]$ {# ?' c( D# `2 Q+ A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49+ ~9 c/ h+ ~) @+ g( T6 e3 S
在中断服务函数里放置断点
4 a) z# `2 J+ S
参考 GPIO_KEY
2 t5 G3 D! Y; I  Z
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
( a( q% F3 l: {8 W  t! P. W% z
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
1 e7 z7 Z/ I  |
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-29 07:36 , Processed in 0.040085 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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