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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下6 c& h6 s7 d! [. o8 `
// 发送缓存' t& g) f+ s4 w1 N$ [% N
char Send[] = "UART1 test......\n\r";
2 S! b; Q6 d$ e
( J4 o8 J# c. w; W' p* X. _2 A  sextern void UARTconfig()
* D5 T* f$ d2 C$ W. J{
& Y( t2 p. \4 ], { //使能Uart1
# |& c3 \4 D) `2 k# { PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
0 m. p9 a8 S9 _* ?& y$ v( ]( C- N ! w) e3 O; z6 \$ D& i" T( K9 C
// 使能 UART1禁用流控* e  [8 p5 L2 @; _* c2 x
UARTPinMuxSetup(1, 0);
( C, z3 j7 F* M
) `# B7 e* d1 `8 X // 波特率 115200 数据位 8 停止位 1 无校验位, s# r6 C' v# f1 O/ B% J  N$ L8 E
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
$ N3 i. w- g; S$ [
( R8 A) k4 f9 W3 A  // 使能 UART1! A7 s2 T- G/ _, i/ f" ]7 {, M  Q
UARTEnable(SOC_UART_1_REGS);
" C0 R" U0 V+ V4 Y* O' X  // 使能接收 / 发送 FIFO8 T  V5 f9 N6 W' h) d
  UARTFIFOEnable(SOC_UART_1_REGS);+ U% A, a% Q3 l. i, L" l: t
  // 设置 FIFO 级别6 W+ p1 R; e: s, \9 r! V
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
# r) R" D7 ]# s) m- i# T  //Uart1中断使能  I$ B& k. e# y
  unsigned int intFlags = 0;
& {0 K8 f7 a5 @0 s$ M  intFlags |= (UART_INT_LINE_STAT  |  \
+ q8 A* ?+ q0 ^- G: t            UART_INT_TX_EMPTY |    \2 `; b" s5 {0 H' r: r) F
            UART_INT_RXDATA_CTI);
7 \/ c$ J1 b; r! w            
0 {' R. e4 d1 o% F* E    UARTIntEnable(SOC_UART_1_REGS, intFlags);& e1 B5 {; f- L+ P$ S; p$ o
}
1 R$ V% C" Q4 [//UART 中断服务函数
& r7 F: c- B: M# T9 e6 tvoid UARTIsr(UArg arg), h  ^4 `- P# w8 O1 ~) p
{: J: N3 f+ s2 G
    static unsigned int length = sizeof(Send);' `+ M! `0 Z5 [- e0 M6 y
    static unsigned int count = 0;/ s5 ], c2 q' y1 S$ q
    unsigned char rxData = 0;& G4 E6 d; r5 L: P( y8 G" y
    unsigned int int_id = 0;$ H- T, @- t  l0 O# n7 L
    // 确定中断源$ v+ d4 o9 ]. L' F( \
    int_id = UARTIntStatus(SOC_UART_1_REGS);0 g) c! {) J0 A1 `! m
    // 清除 UART1 系统中断
1 X/ J6 Y0 j( Y# P& l% j9 M+ i    IntEventClear(SYS_INT_UART1_INT);
# l3 |: {8 C. ^8 w- f, b) R    // 发送中断
& Q6 S5 G2 j  I    if(UART_INTID_TX_EMPTY == int_id)
9 k- l3 o* ], K" B( V# j- D    {. T) c: z7 Z2 S' P0 s( K
        if(0 < length)
3 X& s+ P0 T1 B        {5 j: O$ W8 a. `) \/ @3 |! r7 g
            // 写一个字节到 THR
4 \6 F2 R- N: X) ?% Z9 l9 S            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);' f- W8 c: H2 B! I" D& U+ ?! B1 D
            length--;  h4 b: z8 ^4 U* i
            count++;
2 K  M  L& O+ a. ^6 {7 \        }3 c/ i6 }! o9 t; s
        if(0 == length)% V3 W( k, F5 }4 j+ T% g* y5 w
        {, O1 _, u  v3 ]8 W$ X
            // 禁用发送中断7 q1 E- L9 L' g; \4 _
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
$ L# r* |0 X0 t. v) |/ V, i& b, I3 f1 W        }
3 M! `8 r3 k1 ^8 l9 H+ m  V     }
! ^; H( S( z# m, }% b4 @( V    // 接收中断
4 `8 L6 B8 B- @: h$ O6 [    if(UART_INTID_RX_DATA == int_id)
: g) `6 ~9 C+ C9 j0 l    {+ w  y1 |5 u! y/ _$ p: T
        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);/ G- I) ^) g/ H" [
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);" f( h9 V+ t/ S7 C" P" F
    }
8 W/ D# l4 b, G    // 接收错误1 s4 }) j! W2 {  [( k
    if(UART_INTID_RX_LINE_STAT == int_id): |" r1 L. v: i/ L2 P
    {3 I9 s& c" F$ S
        while(UARTRxErrorGet(SOC_UART_1_REGS))5 q2 ^! u9 |+ h+ G% Q  V/ z
        {3 X! O' J  ]3 A
            // 从 RBR 读一个字节/ T' ?0 Y8 I  F6 f$ H
            UARTCharGetNonBlocking(SOC_UART_1_REGS);4 G) W2 C" L; @  |5 s* ^
        }' p: W. `7 W& e0 F8 d6 C3 |
    }
; C( ~8 d; c5 F    return;; M; W5 Q3 e0 D6 K
}. x+ c4 Q7 M8 I; ]
Int main()
5 T, H4 g" r2 N  y4 U' u{ 3 Y0 D# Y7 s2 e1 F2 G
UARTconfig();//uart 配置
4 [3 [! O% v. e    Error_Block eb;
" m: g+ V5 C- m9 P2 f9 o7 l    System_printf("enter main()\n");' C  ^( X5 C8 w  o
    Error_init(&eb);; @7 s* Z2 d, z- O/ n) U' j
    // 动态创建硬件中断: n6 H5 ~, Y0 l7 _, ?/ e
    Hwi_Handle hwi1;
* L2 g: O1 n4 C  r4 i7 i) W/ ^    Hwi_Params hwiParams;9 S+ z5 m4 ?( N# o% \
    // 使用默认值初始化参数) R" a* z' m, \, S, i$ L5 q5 n
    Hwi_Params_init(&hwiParams);" {+ J  I  K# p# ?9 c
    // 中断事件
6 f5 x% Z! [- i  e* Q1 I! m    hwiParams.eventId = SYS_INT_UART1_INT;3 `7 D1 F# H# a) U5 [4 C% V) b3 }
    // 传递到中断服务函数的参数: v  g% F- w" Z
    hwiParams.arg = 0;# Q; \% B: w+ B9 W1 w/ ^
    // 不允许该中断自身嵌套4 |6 Z& Y1 Y: H
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;0 }$ g1 Y$ i; H9 x
    // 使能中断) f* F4 H5 g* B- }
    hwiParams.enableInt = true;, v. A" e  O& [, p% d
    // 可屏蔽中断 4* A  o$ D+ o& J, k& r
    // 中断服务函数 hwiMain
+ O( p/ o# n, n0 I# K    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
( r) }" e2 C* A- O) \5 n    if (hwi1 == NULL)+ |# t( I3 o+ h8 v# ~+ e
        System_abort("Hwi1 create failed");
6 G4 S# F7 y/ H! l) P8 p4 y    BIOS_start();    /* does not return */
$ Y5 k: Y5 R0 v8 }% J. g    return(0);
4 }  I5 y, l% M' A! n8 f}
8 {" p; v& `/ W/ g# X
5 y# N7 T% J& z& H+ ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
5 a9 J! V( F% R, B, t) ~5 ~
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点& ]" d) c: z& C  s) y6 K4 A* S6 |" c
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:492 Y" J) e- }7 J* [
在中断服务函数里放置断点

) y. w: j0 Y+ M9 k参考 GPIO_KEY
8 c$ ^( l/ u9 ^* c
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 00:13 , Processed in 0.037472 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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