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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
& {  Q! P! O+ @: Z" W. F( h// 发送缓存- B8 c# g, z4 I& K0 I( O( q9 D, b
char Send[] = "UART1 test......\n\r";9 h0 A! c* J( F* y
- D* z3 a6 _9 u8 ?* s8 U3 W
extern void UARTconfig()
, O/ w% r( y2 o& Y{
1 C9 ~, t3 ^1 O! a1 F+ \) u& p //使能Uart1( Q* H& d6 V8 i0 F7 [
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);; p. p# c2 ]7 F! `; ^
% i: V/ l2 H2 S/ `
// 使能 UART1禁用流控
' E! z1 ^. N9 q1 g UARTPinMuxSetup(1, 0);
4 q& Z" B2 e6 v* F6 y! A/ ^, y2 t" D
$ a5 B5 ^; k3 Y, a // 波特率 115200 数据位 8 停止位 1 无校验位
$ A2 ]6 ~# Y& N! N" H  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);* g8 C! d' X4 n! Y  w
5 d8 q# u. q' o+ O8 O0 R+ T
  // 使能 UART1
9 t' z6 ^) j+ C* R& m' A' O UARTEnable(SOC_UART_1_REGS);
- e- i: T# Z# O  // 使能接收 / 发送 FIFO7 w/ ]/ T  d( E! S) f
  UARTFIFOEnable(SOC_UART_1_REGS);3 |% i( P/ j$ S
  // 设置 FIFO 级别6 O) D3 n! r, E. x1 a" r4 O# O' U- i
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);8 D1 V# K9 i2 u- H; Q3 n
  //Uart1中断使能
& k: s) s& ?# S$ e4 ]" y6 D5 t  unsigned int intFlags = 0;: z4 f4 i! `9 y4 {) z, |
  intFlags |= (UART_INT_LINE_STAT  |  \3 U' ~4 X: c6 j( I6 m4 o
            UART_INT_TX_EMPTY |    \7 ]% v& B! T! ^- v; I
            UART_INT_RXDATA_CTI);
2 w& J9 F6 I1 m- M            6 C( v/ N' `5 N$ }  t! @+ o' V, p
    UARTIntEnable(SOC_UART_1_REGS, intFlags);
  h0 G& X3 W1 D5 f  |  |0 n. \}
9 [% t. Z3 D: `6 f% j//UART 中断服务函数  d/ n: k- p* q$ o3 d0 d
void UARTIsr(UArg arg)
" r6 \  h5 l. \  A  ]8 @( g{
8 C3 P" h% a6 r    static unsigned int length = sizeof(Send);
6 S3 q9 E  S7 s    static unsigned int count = 0;/ h! C& N$ V) R- |
    unsigned char rxData = 0;
( e2 ^# L8 L! q4 [$ ^5 }: q6 o+ U    unsigned int int_id = 0;7 ^! C6 a. ^# h8 B
    // 确定中断源
& r  K8 B0 m% |$ N6 d" R! |5 Z    int_id = UARTIntStatus(SOC_UART_1_REGS);
" K" P/ y4 ^- E! O  a    // 清除 UART1 系统中断/ e+ X: H9 I+ v  r* @- a- h# A
    IntEventClear(SYS_INT_UART1_INT);' T. Q4 u4 B* G- F5 D
    // 发送中断
1 e+ ]2 L( H! y/ E+ E    if(UART_INTID_TX_EMPTY == int_id)
5 v% _1 r( f$ @: v" p8 t; @5 h    {
5 O- F9 e. t" b# B: y        if(0 < length)# h5 `' E( J5 Y" g! Z9 ^  T: Q2 u
        {
9 I4 F, ]2 p4 J1 r* h0 e6 }            // 写一个字节到 THR+ {9 w' f) A' n: M7 h
            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);/ d& A# ?6 {' n5 z& u6 w8 z! T- F
            length--;6 p  b4 }( T' ^* S. o, F
            count++;
" }0 E/ f2 p0 z: {9 x7 D        }
% J$ i# p" j8 F# {( }3 g  c        if(0 == length)
" S& \. J  W3 }        {
8 ]( e& h6 S7 h( P/ I            // 禁用发送中断
' ~$ P! r) P: |( C            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);; S3 ~# @+ x0 p4 g" u& D# q: Y# w
        }
; R# g# k5 ~. q     }! d% B- B2 s+ \+ G2 e& l3 j) u* {5 M
    // 接收中断
, w9 t) S! R  Z. k$ }. G    if(UART_INTID_RX_DATA == int_id)
/ `' W- _) C# Y/ Q    {
6 i' P! B3 }- I        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);  r* J/ w1 L8 u, E/ N+ k" {
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
0 z/ D$ a# C9 t" q# ?# z* E    }
! J. k& L6 E  M" x    // 接收错误
( F4 }+ S' z$ s9 s5 \5 L    if(UART_INTID_RX_LINE_STAT == int_id)
9 i1 T* I0 ?% Y0 U7 B/ @. K0 O    {  w+ z9 q. D* Z
        while(UARTRxErrorGet(SOC_UART_1_REGS))
; n3 G, \4 ?8 k1 M4 U3 S        {
0 u5 ^/ |# X9 E4 q' Z0 c+ a' \            // 从 RBR 读一个字节
5 |' A2 o6 c% o  n$ W0 j" b# ?            UARTCharGetNonBlocking(SOC_UART_1_REGS);
  `  z$ z  D8 g& ]! V        }$ E: J* z. ]5 J9 Y" a5 L
    }
: d$ O" L$ k# H* D    return;
# w+ G! J+ C0 B% p% X0 s7 E: e  N0 w}
9 [! r& i* ]. E* Z: v# j# kInt main()
/ K' \& v" O$ \& y1 `. J{ , y8 }1 D' D( B9 j0 g
UARTconfig();//uart 配置7 Q! h# u( a; v% g
    Error_Block eb;
; N; {5 C7 ]5 b    System_printf("enter main()\n");& [( C7 b0 ^' d+ F) z# o/ R
    Error_init(&eb);7 K7 G8 o) v! z) z( P, g; L/ p
    // 动态创建硬件中断
! z! n' w; V  ]8 a. a    Hwi_Handle hwi1;
- V; L4 W$ \- G5 b    Hwi_Params hwiParams;& ~" g/ @  s6 {" C# `- O4 m
    // 使用默认值初始化参数) Z& r0 s; s: E" d; t( n& J
    Hwi_Params_init(&hwiParams);
4 V! [5 b, Q! p( v1 d2 M    // 中断事件
& H9 j9 Y; [: m) t. D* `$ W    hwiParams.eventId = SYS_INT_UART1_INT;
8 P  \; f9 E, W2 \    // 传递到中断服务函数的参数
/ x4 ]4 J' R* F) x8 K3 C$ ?& f) Q    hwiParams.arg = 0;
7 L2 ^& T. N4 y, n    // 不允许该中断自身嵌套: L5 [9 f# q2 F3 l9 d
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
. ^8 X! o: N" {% R- i    // 使能中断5 H3 D% ~( O- M# b
    hwiParams.enableInt = true;& ?1 q- q' S- ]9 K' c
    // 可屏蔽中断 4% T) q5 C  c4 z; _. Q8 o1 b
    // 中断服务函数 hwiMain
, |2 o. I! c& S$ A8 q1 W% a    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);2 \1 y7 h; L2 _8 e' F4 s# z
    if (hwi1 == NULL)
6 u: ?+ R# n2 ]        System_abort("Hwi1 create failed");
! u, X) D( X5 ]8 U0 a    BIOS_start();    /* does not return */
) d: e( M# C/ m" K+ X    return(0);
* K$ ^$ n" i' ~' E4 Y2 ^! J7 S}, r1 ~, t% E: e8 d. O

1 f" N7 v: }, U0 C5 y2 U! U) o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?2 e" k9 q/ ~& _& m9 Q
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点) x- u9 k6 X9 w/ o& R( |
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
: I; s  G& I+ V: c在中断服务函数里放置断点
* l, i! W4 w3 U7 r
参考 GPIO_KEY) v' F( p  n6 d* e2 k
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-1 22:07 , Processed in 0.048305 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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