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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下- y1 P! }5 h% T& E' M
// 发送缓存: R2 y0 X% g- P4 ]0 b
char Send[] = "UART1 test......\n\r";5 Y: n( S3 J1 ^: w
3 u" T* a4 U0 }2 E- N$ T
extern void UARTconfig()/ c5 M; f2 V5 s
{
+ `8 A5 O' g4 ]9 r" p //使能Uart1
, T" o$ i: Q- a  G! ~  w' B! B PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);6 L/ z3 q: A3 S6 [

1 l# n* n) M0 S // 使能 UART1禁用流控, R6 i0 T, @4 p' z5 Y4 @, n4 F
UARTPinMuxSetup(1, 0);# v& N1 K( ?  s* ?+ c9 _
+ e% d  _/ d$ ~. u" u9 C
// 波特率 115200 数据位 8 停止位 1 无校验位- g4 r) `. S& H' C8 r
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
) ?" K1 z9 Q, T3 k5 s+ u
8 E/ X4 \, E2 ?+ c: d' h8 \  // 使能 UART1) `; ?1 |' X+ j" E1 i* L+ @% `
UARTEnable(SOC_UART_1_REGS);+ x3 a/ ^& M7 [7 E% J
  // 使能接收 / 发送 FIFO
) r# |4 M/ p1 E$ Y* Z  UARTFIFOEnable(SOC_UART_1_REGS);8 D# ^( V7 P% h% Q" \! |* j
  // 设置 FIFO 级别
% b4 l" T% D5 n0 ]% v5 d6 B# w" [& N    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
. Q% M( d' X3 S$ L  //Uart1中断使能3 O, y# ^. T% Y0 B
  unsigned int intFlags = 0;( B( C- J$ q& A6 I- d$ f/ a& m
  intFlags |= (UART_INT_LINE_STAT  |  \
1 k1 ?# J; P7 P            UART_INT_TX_EMPTY |    \2 q8 S3 G/ M2 O/ c5 N! J; j
            UART_INT_RXDATA_CTI);( ^" o! J7 L$ u$ N3 z5 f
            
" a  a' P" D6 x    UARTIntEnable(SOC_UART_1_REGS, intFlags);
. ?' b! v1 u( u. s- k$ a}
3 n7 E$ U+ k  c6 s- M//UART 中断服务函数9 R5 h! x6 B, ^9 t
void UARTIsr(UArg arg)
0 s) m' v' p4 r% z6 ]/ I{4 _0 v. }  R( a7 q
    static unsigned int length = sizeof(Send);
+ M: k# d. n$ o5 T2 K$ f    static unsigned int count = 0;
: M6 X% f8 f2 `1 p" h    unsigned char rxData = 0;; Z( x0 U4 I2 w1 A2 F- `
    unsigned int int_id = 0;" [7 ^& `. V0 U# B
    // 确定中断源* p/ u( ^! _( X) j! D8 B
    int_id = UARTIntStatus(SOC_UART_1_REGS);
4 h2 P& L% D3 A; T& u4 V    // 清除 UART1 系统中断8 ~. b3 y. }& Q. L: U
    IntEventClear(SYS_INT_UART1_INT);  D/ X+ r$ f& L
    // 发送中断9 R: E+ J  u* |$ f' }
    if(UART_INTID_TX_EMPTY == int_id)
5 q7 u$ D, {7 q% X4 M6 V    {
6 l0 [5 T4 o: Q9 M  J' b2 q) h: ~$ ?        if(0 < length)% O9 \+ _  F1 ~: j
        {
4 e5 X0 X& Y9 _7 r: X$ M            // 写一个字节到 THR
3 S  e  c" g# ^# ]/ e9 l            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);) G$ B* L, Q2 o  R8 L+ s( u1 h, U
            length--;
1 n4 l$ h3 O5 w7 J            count++;
  ]' D% v6 p9 I! f        }4 y& g$ |& m$ X6 y
        if(0 == length)
1 t# O/ l$ m6 |! o$ Z5 F        {( t+ B& L7 L. G, Q( y' v; W6 f
            // 禁用发送中断
" A. g* D; n, W            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
% M0 u% W3 E) @! a        }5 P" o- D2 [8 @6 T( K- a& J) Y
     }8 _1 `- Z* {. m+ }
    // 接收中断8 l  ~0 h' h4 s. \# m
    if(UART_INTID_RX_DATA == int_id)
  W, W3 }( F' V- z) v    {/ H) F  e" ?& {! Z& u9 h% ~5 T
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
! W: h, ]" Y" A: y6 H4 p        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
3 x) v+ S* e& n) \( B, A5 y! f    }- d& F$ I3 x0 P. x
    // 接收错误, P5 p+ B) O/ D" J' U
    if(UART_INTID_RX_LINE_STAT == int_id)
4 S; H1 X5 M& |# M8 O$ y. P    {& B# p4 G4 \& ?& i/ Z& m( F
        while(UARTRxErrorGet(SOC_UART_1_REGS))8 Z! _$ [. \% N" B' f3 c$ S( V# ^4 ~
        {
& m# {) c& v- Y9 g* l, B2 |8 s            // 从 RBR 读一个字节9 r  B7 b. s; A6 v
            UARTCharGetNonBlocking(SOC_UART_1_REGS);
2 v! c! W+ Z! |. _        }" y' C" Z+ f3 y9 V  `0 N
    }
% X, X) V2 {- a9 d5 N    return;
9 n2 j- e2 T; U! f& n: g0 E8 M}2 r6 B6 L: c! s8 I4 Z* [
Int main(), A( `% S/ F6 ]: E6 z% _# A& Z. D
{ , X5 J- I  O* J" ?# ^! T8 p2 S# i' t& W
UARTconfig();//uart 配置9 v& S, U+ Y. x7 `
    Error_Block eb;- T7 J6 z) f0 _  R$ t0 n
    System_printf("enter main()\n");
  @8 Q& U. ^! K/ r, D- W2 Z    Error_init(&eb);
- D" z" w5 F1 z/ K& U4 j. Y    // 动态创建硬件中断
: i1 j. F5 C# w( \, l# @7 d8 n    Hwi_Handle hwi1;
# \, V  q( _7 e3 G    Hwi_Params hwiParams;3 [* A' t# Z7 N, J- p3 d( E1 _& s
    // 使用默认值初始化参数
* J2 p" E" X; O& V" b; }! V    Hwi_Params_init(&hwiParams);
* U! M: L8 I) C/ M7 o6 o, ?    // 中断事件2 C, C5 D8 k0 K' ]  Y$ l  g
    hwiParams.eventId = SYS_INT_UART1_INT;, s, Y9 V( z0 I4 E6 I/ Z3 N
    // 传递到中断服务函数的参数2 R6 c, O8 a. D9 f7 M7 l
    hwiParams.arg = 0;% l! {4 F3 F: p" T; w8 d
    // 不允许该中断自身嵌套
: l" l1 O9 e' h7 S3 ^( w5 a    hwiParams.maskSetting = Hwi_MaskingOption_SELF;8 f, Q1 M$ ^/ ^" B7 E
    // 使能中断# \* ^0 G3 x7 u/ Z  {; E0 w! y
    hwiParams.enableInt = true;: N$ z5 Z1 f( ~9 `
    // 可屏蔽中断 4( C# X; F# y% {* Z" o6 ?
    // 中断服务函数 hwiMain
% x/ D0 e) e1 v( j3 y    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
' E+ ?: b( _7 r+ p' \    if (hwi1 == NULL)
' B4 F. b* \/ {, P4 z0 Q! d        System_abort("Hwi1 create failed");
' K' I" R" a8 n# W" M$ ?    BIOS_start();    /* does not return */
: Q7 V3 j# h* r    return(0);3 q. N- M4 E4 V  a
}* [& e$ i; ^" W$ c3 e8 H' |" }& n

9 A4 o. w& [/ z/ |4 q7 D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?6 O; Z5 n3 Z  k7 b3 V
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
0 d- G0 z" p! ^. X9 Z& G
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49  l: t  S6 `6 }/ O
在中断服务函数里放置断点

7 H% B+ U& {6 L  r$ k# m. y参考 GPIO_KEY8 ~) }$ F! W# |7 A
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-1 10:38 , Processed in 0.039388 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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