串口发送中断触发条件 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8458|回复: 3
打印 上一主题 下一主题

[未解决] 串口发送中断触发条件

[复制链接]

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
跳转到指定楼层
楼主
发表于 2019-4-30 18:00:44 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。: P# w- s; s: T' _$ Z5 G# r

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
地板
 楼主| 发表于 2019-5-5 22:36:34 | 只看该作者
785235014 发表于 2019-5-5 22:25
5 ]4 E6 @5 H& u% `; q* L) k如果其它设备快速给你发送串口数据,你这边能正常通讯?

$ l8 a  L0 V" @% `谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

1

主题

5

帖子

1034

积分

金牌会员

Rank: 6Rank: 6

积分
1034
板凳
发表于 2019-5-5 22:25:37 | 只看该作者
如果其它设备快速给你发送串口数据,你这边能正常通讯?
回复 支持 反对

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。& q- o0 N" _6 t: C6 e
+ x0 l0 x! q" d
#include "TL138.h"                 // 创龙 TL138 开发板相关声明8 t/ C8 {2 B8 E$ E6 k6 l

# H( a3 Y- m' a0 Y/ ~* E#include "hw_types.h"               // 宏命令
; U: y0 L  \+ V. S#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器# T) T& z6 Q3 E  u! j! x
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
1 M: |3 R/ L; J9 }, P* q$ x8 y" F
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明" e: w) q5 z% X7 _! p4 U
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
; ^, F- X5 {! W; _, I2 O#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
' }2 s, |/ K6 P#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
1 X+ l2 R6 K0 m8 T0 U& K6 w' Z! O* ]! \$ c, j8 q
/****************************************************************************/) H% L7 K% H: f$ l
/*                                                                          */
9 o$ c2 p1 p1 d. [+ |7 T) V1 w/*              宏定义                                                      */
- W, @4 R- \: ?6 y/*                                                                          */
6 S5 m9 w0 o( {" M0 l5 o/****************************************************************************/  L7 ]4 p, n0 U  ]; c- u$ D0 T
// 时钟* e1 ]0 {4 K' y, z: H; g, o6 Z
#define SYSCLK_1_FREQ     (456000000)2 r* K1 T/ ~, h8 W; t5 k
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
& D" a; H+ n/ J6 G  O- ]4 a! G* O#define UART_2_FREQ       (SYSCLK_2_FREQ)
; r5 W" k9 ^- f9 E
  P% i; D; l, P5 c" w8 a: E2 T- j* m/****************************************************************************/0 u, V( K- Y$ i+ w" B( s
/*                                                                          */
% p) q$ s" u) Y/*              全局变量                                                    */! ^0 K. _+ C! _8 m( s
/*                                                                          */
# T9 i/ a/ q2 l/ R! n9 y0 F/****************************************************************************/) {, c$ K$ C9 z' x% f9 Z' K
char txArray[] = "Tronlong UART2 Application......\n\r";
- G3 R% r1 Z' |) o, H% N: G# b
  x1 B+ {% S$ Z( _/****************************************************************************/" Q) D) F7 X$ p/ e$ ~+ o  c$ y0 i
/*                                                                          */
: t0 f3 p. @. P. v+ z5 n6 x2 g, R3 V/*              函数声明                                                    */
% O  W8 s! I- c5 \, r# G/*                                                                          */6 [2 F: W& P; u% [4 M4 R
/****************************************************************************/
3 j  h$ x  U1 G1 M" ?) S2 _// 外设使能配置0 @; L4 W% \" C! A9 z
void PSCInit(void);
4 U" p2 y, J8 D3 c& ]# F4 f$ w1 E+ _+ Q
// GPIO 管脚复用配置
% ~# v5 n) }# g8 M. {2 D0 U5 e6 Cvoid GPIOBankPinMuxSet();  j; B  m6 w0 e/ g7 p8 t8 u

5 L; h- ^$ S1 e3 O+ G  ^// UART 初始化. O9 U0 F* M) v. y
void UARTInit(void);
$ b  R3 d8 H0 P// ARM 中断初始化
( O" [) R3 A1 C8 z: F+ y4 X4 ~0 p; Evoid InterruptInit(void);
- V2 ~5 W) l8 d0 T2 R: C  R. |) F// UART 中断初始化
6 J5 w8 l4 }4 ]1 g8 uvoid UARTInterruptInit();
$ A2 [4 b5 l* l. t  Q// UART 中断服务函数
- H2 `; G- u- s& X! G  Dvoid UARTIsr(void);8 F0 }' p# |4 J# z7 V  }
. ^* M. V1 h  o: u6 m
/****************************************************************************/
5 j( ^) }! T# x/*                                                                          */
3 O& V3 E/ E9 U9 F/*              主函数                                                      */
" o2 z4 e' X, j3 T/*                                                                          */
: e5 ^4 y" _5 H2 H/****************************************************************************/
4 S0 J# B) O  ?/ D# U, g) p  h0 vint main(void)
/ v# [2 m( h/ d" P. D{$ ~1 A: s* S7 n: |9 w) A
        // 外设使能配置
: o' Z" E0 L0 @6 |4 d$ }( i        PSCInit();
& n! o/ W: W  q9 |; K( j        ( `) y5 X* W  p* F. p
        // GPIO 管脚复用配置" X/ h% v& `2 h+ }, m: Z: F6 x
        GPIOBankPinMuxSet();
- r5 B  B) a; F1 q8 d7 R8 F, x. o: n: Q* ?: n( k7 \
        // ARM 中断初始化
: h' q- d" u: W/ Q) d        InterruptInit();
  x% F: U$ ~' [4 k. o4 w& E1 u# X9 a; b3 i7 R7 d# ~+ r! e* I1 k
        // UART 初始化/ |+ _9 E) T, E: X: |3 p
        UARTInit();/ M& u1 q; y: e/ I8 G4 Z" P' e
4 M. O$ u) E: k4 @( q, F5 W
        // UART 中断初始化
8 O2 _4 a2 {  `        UARTInterruptInit();
& V( ]) t2 _1 S1 F/ x9 j7 ?! A5 x! E: I
        // 主循环
* @% X! p( u' B( r/ D' u% G/ O        for(;;)3 |. J& g' o& G7 }+ @
        {
0 [' t# \4 s6 \1 [  S' ~, |; d7 K5 V0 j+ S" e
        }
4 t. x6 o# Z, F' G1 C. g}& d; S; ]3 N) A% ^

, H  B* W& U2 b# L5 ~/****************************************************************************/
* z! t# U0 X) @+ w. X! A: g6 N/*                                                                          */
" I6 E0 u& l$ w, P3 O% E+ E4 V/*              PSC 初始化                                                  */$ ~+ ~/ b" k0 F9 |% a
/*                                                                          */
+ Y* J+ h6 m0 m' A# o- v/****************************************************************************/% Q& b% a5 Z4 c' Q! i- C% Z, x
void PSCInit(void)$ b8 T' V/ `& t4 _5 T$ W
{% Y4 d$ i. }! ^; p* b
        // 对相应外设模块的使能也可以在 BootLoader 中完成. L! r! |! M! O0 n! a0 G
    // 使能 UART2 模块$ q' g4 k+ k" ~1 o* u$ ^2 J5 K
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
& l6 y. S% Q/ O7 O3 n$ j}3 b3 \0 D1 g9 U' X5 y7 C

1 m$ D2 j! f0 m* l0 Z/ }& T/****************************************************************************/0 t' P$ S8 x' E- j6 s! e. p
/*                                                                          */6 M; C! r% |4 a) E) C
/*              GPIO 管脚复用配置                                           */2 T! ~/ z. }7 O; o
/*                                                                          */
7 k! d% t% l2 I" {+ M) f$ N& J/****************************************************************************/% b/ _" E% H4 m  W, D* D
void GPIOBankPinMuxSet(void)
5 F% I1 |1 O' ]/ w, N2 Q0 c, Y{
0 a: d. w+ [3 Y% y* u! i        // UART2 禁用流控: t1 @6 \& u4 ~0 O5 g' r% o
        UARTPinMuxSetup(2, FALSE);3 G2 Y! ]5 A5 `( i5 H8 ]; K
}+ ]! l+ B8 p3 {1 e
5 u2 X# Y$ h2 n. A: d
/****************************************************************************/
8 }6 j& U1 ?8 M3 h0 f$ O2 b' n/*                                                                          */
, j& F. N) p8 e/*              ARM 中断初始化                                              */
% i+ X- S, C+ B8 z; N9 \6 N/*                                                                          */
* Y# A( n6 |& [! \4 W7 c/****************************************************************************/
# L& R  ^2 U9 a, o4 N/ Avoid InterruptInit(void)& q: B: S1 F" V. h6 F) G
{
4 n6 l! u, y! r0 e    // 初始化 ARM 中断控制器- S* g' A! I* J; |8 B
    IntAINTCInit();
8 v( M1 E" k5 p5 V4 l. L0 a* R
2 Y6 Z- C. T# c. x: y    // 使能 IRQ(CPSR)( S  t8 P! P0 j7 y, Q7 }6 `
    IntMasterIRQEnable();/ O4 G2 V) v0 p& L7 C# A- E: ?& A

- V& \0 U0 v/ B& l) |  g, w0 p9 b    // 使能中断(AINTC GER)
) p) P/ n6 A" w3 }( {/ ]  j3 ]    IntGlobalEnable();. p9 M" E$ j9 a$ n, L

. d3 V% P4 O6 Q' f& [0 Z! }% ?    // 使能中断(AINTC HIER)
2 {( L# Z) R& }, o6 n$ W    IntIRQEnable();$ e5 L  p. v" z$ ?- z+ s+ J' [7 @
}
* F3 s( D9 C# a) Q. h* B# r
% H( O  K( w4 H- }/ }/****************************************************************************/
* {" F9 w6 ~3 o2 l/*                                                                          */" `+ M  o0 L) W! c
/*              UART 初始化                                                 */
+ t# L+ u  |5 {: C0 }/*                                                                          */8 {, D6 F: R- R2 X) {4 Q. b. U
/****************************************************************************/
! m0 m- |' F4 s! v; i. hvoid UARTInit(void)
4 t1 l- c9 Q, o+ O. U- y! P2 ]{; x! U% E1 Q- m8 _+ s6 N
        // 配置 UART2 参数
8 R8 k& @6 y0 C) t( A7 ~        // 波特率 115200 数据位 8 停止位 1 无校验位8 B! ^1 E2 c' }
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,) u, \5 s% V5 R' g' f' ?
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
8 [# @" a- p. B& o2 a- _7 B        // 使能 UART2
- e4 m* ^2 T% t; O& R! a8 J# q3 C        UARTEnable(SOC_UART_2_REGS);3 S4 j& ^5 C" K* i0 z
/ F* ?: M- n) x2 u0 t* J
    // 使能接收 / 发送 FIFO& ~/ H8 }$ k% a( F4 Q! t
    UARTFIFOEnable(SOC_UART_2_REGS);1 S  R* B* j0 M' t

0 \. U: ]( X( y# a5 `    // 设置 FIFO 级别
% @. ~4 W$ n! a) S% L    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);' d, y" z6 X' [$ i
}: t  Z6 r/ X% b5 H2 c* C0 h
2 g, l5 B  m! L  {3 ]; y6 C; c7 Q
/****************************************************************************/
( J7 u. f" c6 L% P/*                                                                          */  N) Z; d, m# C6 Y& Y0 }
/*              UART 中断初始化                                             */
& K% _1 \2 |6 O$ ?2 J) J/*                                                                          */2 V% M9 Q- ]9 z* u2 Q( e5 N
/****************************************************************************/2 h9 T; s  i0 ~1 t( _, ^+ g
void UARTInterruptInit(void), v/ Q& S! U; o
{
, J& ~9 _" m4 E: F        IntRegister(SYS_INT_UARTINT2, UARTIsr);/ \5 N' U+ Q* E7 i8 S4 W6 C
        IntChannelSet(SYS_INT_UARTINT2, 2);3 ^, ]' a7 W( W' F1 `. n# ?
        IntSystemEnable(SYS_INT_UARTINT2);, |& _7 O( w! L, G
6 X3 A# ?; @: k, ~, J
        // 使能中断7 v$ q! z1 }! z+ g6 P/ V
        unsigned int intFlags = 0;
+ r. c, l6 _) R" o    intFlags |= (UART_INT_LINE_STAT  |  \
# ]5 n4 w. t) d1 L) b                 UART_INT_TX_EMPTY |    \
$ X1 S. R: F1 ]; N% u/ Y                 UART_INT_RXDATA_CTI);
4 w- S) T/ `4 f- L3 ^1 g    UARTIntEnable(SOC_UART_2_REGS, intFlags);- R8 p8 |* N2 G( s# R+ |: O
}
2 h- A( e2 P1 ?4 D/ ~; A) E) D- ~. w$ n" q! ^# s# C
/****************************************************************************/) Y- H* J9 j5 h4 A  y1 L& T
/*                                                                          */# r% T! m" v( ?  l  F# n: U- Q$ ^: O
/*              UART 中断服务函数                                           */
8 {) r* h  O6 O$ D/*                                                                          */  k! B) t( @, K, G( O, U/ W6 X
/****************************************************************************/. t# ^1 T8 e+ ?+ V* y! Q8 _  n' I
void UARTIsr()
" f1 z3 E# k2 o  A) R6 v5 v, {{  L& {/ k5 i- P% v4 b0 d+ F
    static unsigned int length = sizeof(txArray);
. l* W6 W9 n& S5 X  U    static unsigned int count = 0;
* G: K+ Q$ A2 y) ?2 S    unsigned char rxData = 0;! P8 r0 P- w$ f( s3 ]4 V; m+ w
    unsigned int int_id = 0;
$ {, z# e4 L: Y" u1 U: b( p
) U* i5 u+ C+ j( z! s+ P, q/ P6 S    // 确定中断源, Q) B; i* d+ w3 o) m8 }2 e
    int_id = UARTIntStatus(SOC_UART_2_REGS);
( I) p* D: T  j  w+ g" C# o9 e# j  Y& d( i( L( _
    // 清除 UART2 系统中断5 S. a8 W; q+ O2 L% I
    IntSystemStatusClear(SYS_INT_UARTINT2);
8 ?! `7 ^3 T1 d) B/ Q
+ M( [% i% i* {* O7 r& z& ?    // 发送中断
! c2 ^  e5 Y8 c7 _& V; T* L, R    if(UART_INTID_TX_EMPTY == int_id)
' x; f+ z3 g: T& k' I    {
2 _& b1 v$ b+ `6 K* A7 |        if(0 < length)
9 G. s8 @2 b9 k        {
# j: P9 Y& F: K2 l            // 写一个字节到 THR
8 d" a/ L: o* x' P            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);% H2 p$ n1 ~" {6 q# O. z' m1 e
            length--;; x3 D: P6 e: s: Q8 ^7 L
            count++;7 I: h1 S: S/ n& ^- ]
        }
5 @9 o, b- a9 {: L7 `- n3 g4 j2 }        if(0 == length), e" K1 w/ v" |0 X0 C& U3 h/ Y
        {
8 Z; e+ L! x9 z) h( E            // 禁用发送中断/ I% R+ g: V6 t' R. r9 b& D
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
+ R3 f, ]6 I) i3 o        }; d& g  f: U# J' O" d2 N5 O7 F
     }! ]! T% N/ w% V) l3 W( k8 Z

; d5 b( l8 J) r    // 接收中断, j$ @# ^& s* ~! I; J
    if(UART_INTID_RX_DATA == int_id)
% I9 ?. X( p" H. }# ~9 K9 T5 o    {
" p1 }" `( _4 v/ T0 _        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);* \: T- J& u5 ^* [7 J5 ~$ B

; D) \4 H; ~1 s8 m2 \        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);) M3 j9 p* C1 f+ `. R9 K! D; k
    }' C) H4 ^- C/ ~) ]8 e& O

) l: D3 B; x" H    // 接收错误% a3 c* c6 v( C# N! h, p" j
    if(UART_INTID_RX_LINE_STAT == int_id). R, m; N3 e6 T& g3 [
    {0 T$ Y" Z7 A& j6 H% y# e; q% w$ \: A; H: j
        while(UARTRxErrorGet(SOC_UART_2_REGS))
) c4 a( m& D" h! f9 H( v  G* |        {
, l; V( ^* t3 b: q            // 从 RBR 读一个字节* f  b2 f6 O/ l% p- _, i3 ]! h
            UARTCharGetNonBlocking(SOC_UART_2_REGS);7 d6 w8 h; q, ]0 I+ `" r
        }, F1 t8 V' Z! X6 o2 Y
    }
$ a' }; E- j5 @. n: c8 x( C    5 V3 L; P+ Z/ F: {3 ~& T$ Q: x
    return;
' [/ V! G) l8 \1 \! X}
( F  z4 \+ ]  r4 ^+ W
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-7 17:15 , Processed in 0.045869 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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