在sysbios下,uart中断收发数据,程序无法进入中断 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
, f2 d$ M1 u# w8 J5 O0 g: I// 发送缓存2 ?  e5 E& e- S. v' P
char Send[] = "UART1 test......\n\r";. s3 C4 _  w- d4 |. b. ~; C' z* N

' Y( u' r0 C* u5 E1 B/ yextern void UARTconfig()1 x' S5 o) M! a7 p! ]# ~/ g  K
{
7 ?3 {, R- C# ]( o //使能Uart1' d! ~  r: z  |* U' E
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);/ V6 [* {) e# R5 z$ y4 W

+ O: }3 @' F  B' r6 T // 使能 UART1禁用流控
: H- ~0 j0 `- F1 ?# g  k0 a UARTPinMuxSetup(1, 0);5 y: u5 h( l$ v
: _7 v8 T: c2 R8 B! L1 [
// 波特率 115200 数据位 8 停止位 1 无校验位1 V5 j5 q7 Y7 B6 U) S
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);! p2 u) q+ B8 l; S; W) x
5 {0 |/ P  R0 Q. S, f
  // 使能 UART1
( B# F( U- x( ~  k UARTEnable(SOC_UART_1_REGS);- g! k( Z, N4 }
  // 使能接收 / 发送 FIFO+ J& ~6 e$ v% ^( k
  UARTFIFOEnable(SOC_UART_1_REGS);' ]* X9 f: f& k7 o! x" h
  // 设置 FIFO 级别
/ M  h* {- G( Q7 D0 M    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);2 L" u8 K2 L  a/ G
  //Uart1中断使能
! Y2 c7 j: K( ]  U  c. n& x  unsigned int intFlags = 0;. A4 y) G4 p0 \1 q0 Z+ x
  intFlags |= (UART_INT_LINE_STAT  |  \+ s& f4 s- H" X6 R- c
            UART_INT_TX_EMPTY |    \' d! B8 @% V$ Z' N5 u
            UART_INT_RXDATA_CTI);
8 H8 b. K& G/ @+ |+ u            
( k! C1 G3 l7 ~4 v5 ^    UARTIntEnable(SOC_UART_1_REGS, intFlags);
5 H3 e5 Y" o$ \}) F* v% K+ O6 A6 i6 z
//UART 中断服务函数
2 }" I5 z9 S, c& pvoid UARTIsr(UArg arg)
$ r" H' e4 L7 ~' `1 J{
# k7 ^# Q8 u1 D: Y* k4 N1 c    static unsigned int length = sizeof(Send);& x- K7 j$ T- Y7 B; l+ q
    static unsigned int count = 0;
: C  n; g- i  c    unsigned char rxData = 0;
+ i( _7 e4 Q( J    unsigned int int_id = 0;
1 D. j; t. G1 h  l2 K6 ~    // 确定中断源/ @4 V0 C& u! C% j
    int_id = UARTIntStatus(SOC_UART_1_REGS);/ E, O  D/ t. z  K/ e1 ^6 r
    // 清除 UART1 系统中断
) [; P# j1 G5 F) E    IntEventClear(SYS_INT_UART1_INT);5 W' G; c4 \8 ~; `( X) i
    // 发送中断
& s/ o7 u  [# L* a* [/ Y    if(UART_INTID_TX_EMPTY == int_id)
# y3 g% x  ~& G3 C    {3 r% a/ X: e$ o& y$ E' m& m" ]
        if(0 < length)
7 g# ?  w2 B. K/ W' T: P/ L" s        {
" v, D1 ~3 A8 v  v( G            // 写一个字节到 THR
% d5 C" G) o& E. H0 h0 Z            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);% c& a/ L5 K7 B  h& l" S6 ^
            length--;
, ^4 U' j: Y$ C- F5 r8 }/ C            count++;
" W6 u1 a9 j3 t: l6 A1 Z# t        }
% {  t; ^  V9 ]3 \        if(0 == length)
( ]( o" c8 N1 x) k  d        {
; Y2 h4 V" v4 V& l/ B            // 禁用发送中断
: W, k, C* f6 y8 B* _7 E* F            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);9 G" C  g) E" Z2 x: Q! n
        }
. u9 G7 ~; c. f, o3 k. C# p6 c/ i& P     }; \# G- u, @* P- S4 Z* t) _
    // 接收中断
  R, R! p* G& K; g5 k" @    if(UART_INTID_RX_DATA == int_id)/ F  U- }+ v1 D0 f- M* R# }
    {
' O" F  u- R( M$ f+ }# O        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
. ^! ?' o& G5 @$ B! M% i6 a        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);. D6 D% A9 F& Y. K$ O
    }
- p4 w2 w3 _! T6 V& T    // 接收错误( p* U1 h$ i8 w/ _" d3 ^7 ~( V/ u* u- J" f
    if(UART_INTID_RX_LINE_STAT == int_id)0 k, j) Z* U7 T" R
    {( }4 P+ k3 p0 {2 y/ W4 o2 w
        while(UARTRxErrorGet(SOC_UART_1_REGS))
% x) i) L1 y9 q& i1 r( e9 {. j! j  m        {
! h- P' G3 j/ @- V% D5 v            // 从 RBR 读一个字节
" Y' ]7 r' H4 U) ^& r/ q# y            UARTCharGetNonBlocking(SOC_UART_1_REGS);/ m# g6 |% W+ r
        }
, |& d0 |; m6 ~    }6 l8 \: Q$ f& u5 g
    return;8 u) m. m% w/ k6 B. x  U
}$ P- W  N7 y- r& w* k( V6 Q
Int main()
: h* Z+ U4 F5 D# N8 U% R+ i{
2 P3 L5 J) g' r7 m# x2 l UARTconfig();//uart 配置
$ X$ B, v; Y- ]$ |' \6 ]2 N4 p    Error_Block eb;
& Y& C4 y' r2 A; x. N9 k    System_printf("enter main()\n");1 O/ M  W0 `9 r$ [
    Error_init(&eb);  F& q& K5 r& K
    // 动态创建硬件中断. i% p3 j7 ~$ m8 J
    Hwi_Handle hwi1;
, U) }& i, U) ]) A0 u6 M    Hwi_Params hwiParams;1 j0 p& O% d( ]) w& C. A7 T, X
    // 使用默认值初始化参数
! z# V3 w  J3 b    Hwi_Params_init(&hwiParams);( x- N+ m3 [0 f2 x' R, _" f
    // 中断事件9 L  r3 K7 I+ V
    hwiParams.eventId = SYS_INT_UART1_INT;  }9 k0 M* n, E, M( |
    // 传递到中断服务函数的参数
+ q+ V! F4 w1 o* v, f. C    hwiParams.arg = 0;
6 e: Y+ o7 Q4 K7 r+ ?9 V+ B" b    // 不允许该中断自身嵌套
* ^) e& ~* m, d& g3 }1 y+ g    hwiParams.maskSetting = Hwi_MaskingOption_SELF;) C+ I  r/ F) K9 s" @1 `- _; X
    // 使能中断
8 z' j  W% }: A: p4 ~9 W    hwiParams.enableInt = true;
2 a( ~8 t/ F7 [& L8 U- q8 h    // 可屏蔽中断 4" R. k8 V& n1 M8 g" F) m
    // 中断服务函数 hwiMain
5 U% h& F0 A7 N8 m    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
+ F( M) D! D1 m% l    if (hwi1 == NULL)
, ]+ C0 d% R9 \/ E: E& [4 Y' |9 B        System_abort("Hwi1 create failed");8 c8 w8 z4 p+ g% ~
    BIOS_start();    /* does not return */
: G5 x9 D0 C" ?8 ~+ i  t    return(0);
; ?5 W; H# @+ E" |4 _, I}" Z0 G& X- r$ G6 `0 ]3 T+ ]

& x, V1 ~" J' q) }% ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?+ A+ t8 Z, R2 l7 x: S. c+ I: j0 b
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
2 d1 ?8 O: n, K
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49- ]% I1 v; d7 h  j7 ~& j* Z
在中断服务函数里放置断点
  U/ Q" ^/ X% J0 a/ g3 n# _/ I
参考 GPIO_KEY4 [& N; |2 |8 |4 M2 k; n5 m
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-1-28 14:04 , Processed in 0.043220 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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