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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
1 u. U/ X( ^- R7 _// 发送缓存
$ c1 t. g2 v2 t" nchar Send[] = "UART1 test......\n\r";- X# Y3 H/ z1 \' E) Z& t
: ?- R5 c; _$ G* D1 Q( R
extern void UARTconfig()
" x6 g$ _9 a5 H7 [0 M! p$ }. N! _{
, {$ I2 H8 L& ]7 S. l //使能Uart1: t( m( t5 D; @$ p
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);# b4 `" `% F7 [$ p" c/ N* x' k
: m2 B% E. m; Q1 e1 H* u
// 使能 UART1禁用流控4 E- J- B2 c( K6 u( o
UARTPinMuxSetup(1, 0);8 j0 F. c, \! A# `

" O# |3 `8 U5 ?# e3 z% R) U! V* f- [ // 波特率 115200 数据位 8 停止位 1 无校验位
6 d  b0 Q- E' T) I2 v  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
* r; O0 Y+ U. e- [8 q; W# W: I 2 h! }; M1 z; t* z5 [7 d5 U0 k* f/ E
  // 使能 UART1" a7 A; O& V1 Y8 D+ |, K: Z( ^
UARTEnable(SOC_UART_1_REGS);& X* L9 b" `3 p
  // 使能接收 / 发送 FIFO( V4 O6 Z# e- Y7 s0 y
  UARTFIFOEnable(SOC_UART_1_REGS);1 H9 A. c+ y0 b. P; Z
  // 设置 FIFO 级别
" b: F2 K1 `- M% \9 G8 V0 I    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
- y* @$ f; j  ]- O' e  //Uart1中断使能
% x" X# f  d3 b  unsigned int intFlags = 0;
- v# y1 V, |9 b9 p9 @" s6 F  intFlags |= (UART_INT_LINE_STAT  |  \* m9 L7 Z9 Q' T+ n$ V# H3 m
            UART_INT_TX_EMPTY |    \9 Y: r* q; i/ X
            UART_INT_RXDATA_CTI);8 N# l0 M" S  p3 ~2 G: J8 V: y
            
: j4 g& A" @- ~" Y% K" l    UARTIntEnable(SOC_UART_1_REGS, intFlags);
0 D1 R+ V( [. j}
3 W1 p2 z/ V7 I6 |//UART 中断服务函数
# b5 n. d, g# |: Y& Evoid UARTIsr(UArg arg)
2 B7 q4 l0 j6 o. ^$ j8 A$ c{
2 y; W% ?+ q1 M3 f, T! f" `0 }    static unsigned int length = sizeof(Send);
3 F+ Z% d- R( Z' R6 M) _    static unsigned int count = 0;* ?+ `+ g% s/ a& G2 }  K
    unsigned char rxData = 0;4 a; F1 \: r, p1 {2 l% \9 C
    unsigned int int_id = 0;
* K6 b" T7 i: ?9 A    // 确定中断源# v0 i3 ]! i1 W$ }* c6 X4 f
    int_id = UARTIntStatus(SOC_UART_1_REGS);
' A9 ?$ N# F% m8 f  w! l' \    // 清除 UART1 系统中断. E# P) [' X+ b2 E' s0 B: |3 Q% C% d
    IntEventClear(SYS_INT_UART1_INT);
2 V* u" s& {% |4 [    // 发送中断$ F# w+ x/ {% c6 ^) }7 w2 T. b
    if(UART_INTID_TX_EMPTY == int_id)
# E+ K: f: }* d# O5 Y* _: j# {! G    {
3 \9 n( Z2 e0 x. ^; _        if(0 < length)
1 W) Z: j( o# t! W. X& P: e1 w        {
0 `8 M9 V# e) A. T  ]            // 写一个字节到 THR
* u* Q1 O9 t3 p            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);9 S$ i$ j4 B$ R
            length--;
" |& H0 @9 S8 k  t" W2 g5 k' f            count++;
' F' Z+ O! n+ R        }
( X6 t% R; u1 z  V        if(0 == length)8 R. w6 C4 s- T& o
        {
; [0 g& d3 n8 V( N; |( K# v            // 禁用发送中断
8 {3 Y% m7 A0 q" K! R- T0 J/ z            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);" P3 S1 p* E2 F3 P2 |+ V
        }1 K$ f7 |" F+ R# N9 h
     }
$ }8 U2 O' w! ]  ]# f9 ?% r    // 接收中断
1 y6 ^3 A/ _7 ]0 ?6 o/ m4 w    if(UART_INTID_RX_DATA == int_id)
! n/ `+ Q, C/ c# ^+ W$ I    {
& G7 Y. o  B$ _        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);; i; x; U% i' \3 T' l1 O# U) N
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);" d' {& T9 l. X1 ?2 Q: \
    }
. p# n4 m+ r8 X$ k- b    // 接收错误
; V. x  U; S8 L; g0 x% O% c7 s    if(UART_INTID_RX_LINE_STAT == int_id)6 w. K* v9 h% e9 E9 N* i
    {
& `8 X& w: S# ~6 {+ j$ m# p& U        while(UARTRxErrorGet(SOC_UART_1_REGS))7 G% z1 R" P" W; I) \
        {. q: p* N, ^" q
            // 从 RBR 读一个字节
  L! k  k6 ~" [6 M1 b$ R% Y            UARTCharGetNonBlocking(SOC_UART_1_REGS);/ X* F" {9 j4 g' c( s; M
        }* ]6 Y& T5 X- n
    }
. G$ q- D6 P3 I: x/ n8 u    return;
& g$ m' {) d3 P}
* Z& d) x) ^5 W" bInt main()# R" g; d8 T' V9 E  S2 m' b
{ 6 e6 l" y% X! y. e; b4 q
UARTconfig();//uart 配置* a6 k; k, M8 h5 ^1 r+ h
    Error_Block eb;* n! T1 t1 o: e+ ?, D5 `, `
    System_printf("enter main()\n");0 Y; e7 p: r9 b
    Error_init(&eb);) @3 K: m3 x  P& ]$ ^7 l
    // 动态创建硬件中断
1 Y* H8 F) F2 r4 M$ d. U    Hwi_Handle hwi1;
* K$ @# E4 V, C5 j8 r    Hwi_Params hwiParams;3 }# L( p6 Q  N
    // 使用默认值初始化参数
) o4 f3 Y) f& l1 H$ Q0 B; i    Hwi_Params_init(&hwiParams);3 s; f8 D+ G: D1 C
    // 中断事件) B5 H! w* I! N2 N
    hwiParams.eventId = SYS_INT_UART1_INT;# j6 T/ f5 e3 D; l7 D  h8 [: Z
    // 传递到中断服务函数的参数
3 t7 M" t% `- {3 u. n% U    hwiParams.arg = 0;, C1 G5 X8 k4 B& Y+ c
    // 不允许该中断自身嵌套: [- z+ Y. t4 q8 |2 q2 }+ T
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;$ a) I( M- s; e& V) W2 |
    // 使能中断
" ]" `5 d# u1 ?" f! s; T( v    hwiParams.enableInt = true;
4 n% C: V; d- ^- O3 p* x" u& g    // 可屏蔽中断 45 ~6 A& K+ O  j" d: ~
    // 中断服务函数 hwiMain
* U% {% \, m4 x1 y% M    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);) t, W% @  w" S5 S1 k
    if (hwi1 == NULL)
1 V9 q) a3 W( y1 Z2 k        System_abort("Hwi1 create failed");  d+ z& j* \1 U  [- B
    BIOS_start();    /* does not return */
, g) e! o3 W0 o! g    return(0);
/ E4 M' o) e( `; R+ X}  ~$ O5 q* X$ P* c1 T

4 u  G* y$ y, q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

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

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
" \- K. @- I7 X0 T在中断服务函数里放置断点

8 j2 g. C; p% v& L$ z0 f参考 GPIO_KEY9 n: R% f# F' n1 B3 w
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点
0 ], r6 P1 y0 ~, i1 ]
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?( s7 O& L! H1 B/ S
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 19:39 , Processed in 0.039486 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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