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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
+ T3 @- K  K0 _1 r4 {// 发送缓存- \; H* t0 ?% e0 a
char Send[] = "UART1 test......\n\r";
* _( n. ]) C2 j3 d% O. e9 Y( F  h& m8 s1 ]+ M
extern void UARTconfig()4 [# }3 v! M, K- r8 Y
{
" ^. R' Q8 Y/ A0 u //使能Uart1
& O% I2 O- t" D- } PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
9 ?, m( D& I: Y
. `) ~0 X' [1 Q3 ~* j' x/ | // 使能 UART1禁用流控
% W4 |' ~9 U: W$ t) j: H UARTPinMuxSetup(1, 0);: V* T* S: d2 q
3 I3 f( b( M# S% R- X
// 波特率 115200 数据位 8 停止位 1 无校验位- a% e: l. Z0 q0 U" o4 p
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
& |0 _# E0 L5 }6 C" t6 v; F ; U4 Z: Y% X( c. T& Z, D1 {3 p- P
  // 使能 UART1
0 P: Z3 P$ w$ { UARTEnable(SOC_UART_1_REGS);0 w2 d' W7 @- r: N, r* \
  // 使能接收 / 发送 FIFO0 |7 ?. I2 z8 E& t3 I
  UARTFIFOEnable(SOC_UART_1_REGS);
; x8 r3 s$ e: O' V9 V  // 设置 FIFO 级别- P  t" F" o- l9 e/ e
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);  r1 V/ W- @6 V4 ^& _, C3 _
  //Uart1中断使能" _$ h: z$ g  J$ F% T0 I
  unsigned int intFlags = 0;7 Y0 S1 W9 t$ L
  intFlags |= (UART_INT_LINE_STAT  |  \
2 D1 E7 C5 S$ M/ `. m3 _            UART_INT_TX_EMPTY |    \: @8 [  x1 I2 C7 w1 C/ c& t
            UART_INT_RXDATA_CTI);+ t1 R( G) p) D. f. j  ^  M2 x4 W
            : S; P& G# O# R, ]0 j+ ?
    UARTIntEnable(SOC_UART_1_REGS, intFlags);
+ w( N3 g3 [  e. F! x: _2 A}: u# b4 c- t2 D5 E1 A# Y) ?5 b
//UART 中断服务函数8 m( Y8 B# J+ z& q+ D" A
void UARTIsr(UArg arg)
5 X! ]# w/ O# A/ r8 ?/ t0 A{7 }( @* m* h. \' s# d: G
    static unsigned int length = sizeof(Send);9 H( p" G- |+ T
    static unsigned int count = 0;% S( X; V/ v9 Y' `
    unsigned char rxData = 0;0 n% u8 q% b/ P# o
    unsigned int int_id = 0;
6 V5 P4 {* @, H) Q  D% K% F/ Q    // 确定中断源
+ o% ^0 Y5 J" ~" N$ J6 j7 c    int_id = UARTIntStatus(SOC_UART_1_REGS);: ^# Q. Q6 t; ^4 r# p, i" Q% d# J# y
    // 清除 UART1 系统中断
/ Z- b( F3 r1 i) f    IntEventClear(SYS_INT_UART1_INT);
% e0 m# T" p+ K    // 发送中断5 U# b4 H1 P% U1 e( r& l2 O' S
    if(UART_INTID_TX_EMPTY == int_id)
+ k9 n; D1 j6 ]2 s2 @    {
2 W, i* x( L3 j* g5 h* ?& |        if(0 < length)$ ~5 o* y! c* n0 Q
        {
0 ~& J" T/ s6 [2 H            // 写一个字节到 THR  l* J6 X  z, _: |% `9 w. f
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
! N9 n5 z) |# d: ]" O' t, }; y            length--;
- r8 L& `) [. i4 r# U  U6 O            count++;
, N( D+ H! D* q% [# }  j# h        }7 ~+ q/ ?$ v/ X
        if(0 == length): b9 Y- V/ I- @
        {. s1 K# ]6 K  u: R3 w
            // 禁用发送中断+ [4 w8 J+ _  z% k- C7 o
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
9 K! l7 D- v8 k$ J        }% f2 o+ A9 y* B: S2 i  S
     }
. M9 r4 N2 J: c( o  S) [    // 接收中断2 }. m+ s$ S8 V& M8 N! u. T# `
    if(UART_INTID_RX_DATA == int_id), M- F, s2 P& j3 a2 K: Q- V+ r
    {" n, L4 {' ~/ n. T- M  e% L
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);4 d/ u$ Y7 i, f, K1 Q
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
+ [# |: w  b1 J6 R5 s8 l/ X7 h$ B! v    }% p9 d0 L, h( l
    // 接收错误
  l  T( T/ f0 p! D    if(UART_INTID_RX_LINE_STAT == int_id)* \9 v: p! N* [1 V. g0 g
    {7 O- c# |* y6 h1 ^, x
        while(UARTRxErrorGet(SOC_UART_1_REGS))
  f2 V/ F% [3 n4 y. Q- m/ X. E        {
5 x; }# U5 R# K9 P. c) \            // 从 RBR 读一个字节
: c- h- l! {) ?' K            UARTCharGetNonBlocking(SOC_UART_1_REGS);9 w/ |) K6 T) K' e- b) ~& x
        }
5 O* N% @0 ~+ F    }
: Y  p/ x( C1 v. V- F' t    return;
+ q. Y9 \6 N9 k' E8 z  L0 V8 _8 M}# s% N4 a3 J( }7 e* O& x5 h
Int main()( S! `% U' w' I" g! ]$ C
{
+ [0 R, _& R! M! w% J UARTconfig();//uart 配置
3 E1 K3 T2 W! s    Error_Block eb;
- S* i7 c4 ^9 A    System_printf("enter main()\n");
/ G1 E' |2 L$ Y7 o' }    Error_init(&eb);: H9 A4 k0 P% J2 \! e
    // 动态创建硬件中断
+ S: d: x, m% W1 L# D- m& j! `% V    Hwi_Handle hwi1;
+ @8 Y4 M: ~( C% c2 ?' _1 t8 C    Hwi_Params hwiParams;3 E$ Q2 O0 w( F5 z
    // 使用默认值初始化参数
$ W/ _! @+ G2 U7 \6 q  E    Hwi_Params_init(&hwiParams);  O4 d0 r% {6 k  O$ _
    // 中断事件
. [+ j& U% t5 j# \+ w    hwiParams.eventId = SYS_INT_UART1_INT;2 q4 h. k1 d# n. Q) y+ I1 x
    // 传递到中断服务函数的参数
. }( M. g3 ?9 k8 r2 h    hwiParams.arg = 0;" g! L" ^3 X5 ?! f
    // 不允许该中断自身嵌套4 ]7 m+ k! q, t# q! i; O, _/ W
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;5 _; O0 w) \  u3 |4 B. j
    // 使能中断+ y) y; S5 g' r* ]: M6 e
    hwiParams.enableInt = true;" y: p. d, ?4 O
    // 可屏蔽中断 42 }2 f; B, a# J; z( c! i/ `7 \/ d
    // 中断服务函数 hwiMain5 r& E: h! O' K  f
    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
  o& K' k! w% h* H# o4 ~2 H$ C    if (hwi1 == NULL)
: ?1 n/ W7 n. o9 u" ^5 M3 r        System_abort("Hwi1 create failed");
! P/ U( o  I7 z* n. t% w* d* a    BIOS_start();    /* does not return */0 H2 }8 y0 B+ A, C3 A8 Q  S
    return(0);
5 y. ]. X4 f& v' I}
8 ?3 c* E7 j" D9 i3 R! V1 `) S3 T% j" `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
  Y3 ~7 k6 g9 c9 \8 M8 G
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
6 P  P8 P9 B: B: g9 r/ e' {( X
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
8 ^9 k6 J; n& m0 r7 d) y在中断服务函数里放置断点
9 g! }: k5 b9 ?9 a3 {
参考 GPIO_KEY* R! Z: l" }' `2 D
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-24 09:08 , Processed in 0.041305 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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