串口发送中断触发条件 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7352|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。0 ?( M: C; l$ Q$ u' P: l9 p" X

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。) P+ |5 a* \7 K2 |; }7 e0 ~
$ e' I7 E% z/ H1 A8 q
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
! C& f% L3 {- ~
8 y* }3 R- _, R+ \* M4 I4 H#include "hw_types.h"               // 宏命令
5 A$ ~8 O3 q5 H5 U! p/ E#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
* V  Z" t$ k# ]; X# x0 u, d#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
6 x6 s& v/ `* _/ ]
9 a, R/ t1 z% }: v( ]#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
- ~/ K1 O2 K9 \, r( X#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明. u4 m3 ]$ h4 U2 K% N
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
, N; R7 X5 h4 t: d6 E#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义8 O: ?1 f5 N( _
6 X1 Q: Y2 f) A* ^& ^
/****************************************************************************/% h9 T& _3 y1 C' M" C  e6 Q
/*                                                                          */
* u' R) [  t7 W8 u/*              宏定义                                                      */. d1 j, d2 W* U- \5 X
/*                                                                          */# @" H' N9 D& Y% {2 o3 T! y* X6 W
/****************************************************************************/
2 Y& U0 e0 t5 _$ A0 V7 q// 时钟
8 ^; n! P! ?( h4 A#define SYSCLK_1_FREQ     (456000000)8 @% M0 y: t. X# B/ Q$ l% T
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
; J6 ^! U8 P' t+ ]2 i+ p#define UART_2_FREQ       (SYSCLK_2_FREQ)
" S9 T" @% r$ _0 Q( J- T; T+ O% t( \" x5 p6 ]3 o* v/ D
/****************************************************************************/, y' S9 D1 q; l: e6 Y$ z! D4 H/ D
/*                                                                          */8 `" `" }5 N( s( u  _2 _) t
/*              全局变量                                                    */9 {5 v; n8 b7 s  A! l0 J; n
/*                                                                          */
) _% {* |7 [" ^) z) `9 M! x: q/****************************************************************************/
" u( a8 `# h) K- X' cchar txArray[] = "Tronlong UART2 Application......\n\r";
& s2 T4 k" e1 A, u2 B( I
8 p4 h4 q1 w7 f5 R5 V- A% q/****************************************************************************/( P( L5 P: k4 ]; b8 G5 J0 ]! }, s
/*                                                                          */! Z5 \5 R" z% T: \; T8 U
/*              函数声明                                                    */
) F8 \+ l+ n  h& y3 R8 G/*                                                                          */
, n0 k8 {! T/ M! A' L/****************************************************************************/
' w4 |5 k- V0 d- _& i// 外设使能配置
7 O; b  r$ N8 I% r$ n' E2 Y4 c6 |" Fvoid PSCInit(void);  Z& l# _9 V* y3 I  a
0 x' e+ v& A0 Q: j0 S
// GPIO 管脚复用配置
  V8 O' B7 i4 m( k2 F  Lvoid GPIOBankPinMuxSet();
# [/ j" j* N4 o) t5 U3 j2 b
7 V, L6 S+ B, U. A$ Y# j// UART 初始化, N. n6 B& V* g- M4 V
void UARTInit(void);
( T5 p$ A3 y: M3 m& `9 O// ARM 中断初始化
) g1 W8 }7 L5 U' m) e- D7 Avoid InterruptInit(void);# g7 V  e; ^6 _, |+ c+ H
// UART 中断初始化0 t, F8 _0 ?8 M- P! {1 \' v! S
void UARTInterruptInit();. b0 j: W* N( g) L8 X' C; G) M3 z
// UART 中断服务函数+ G* n5 i2 k/ @9 k  }
void UARTIsr(void);9 m# g' a* G7 m

/ C4 E8 p9 L& R' F6 w/ I5 X/****************************************************************************/
1 U4 y3 L4 T0 R. r6 J' F8 E/*                                                                          */& w" K& x& B. z0 O) @% r1 l; ?4 \1 W
/*              主函数                                                      */
) n: A9 @: i! X- O/*                                                                          */) ^1 ]$ ?5 s$ B5 j
/****************************************************************************/
' Q, U" F5 _$ @' L/ p% rint main(void)
5 Q4 X5 G8 G' [6 e0 }* h+ i+ M{8 ]! k/ S0 W- G- Y0 ]( V* Y# b
        // 外设使能配置7 f- c* \' @  q7 f' t. ]
        PSCInit();
; ?# Q. Y8 M3 ~, q$ e) `) T) T        1 z" N) G7 }# b8 t3 E4 m
        // GPIO 管脚复用配置7 Z& E, D" p2 C2 ^: T" ]: M4 x2 ~
        GPIOBankPinMuxSet();
$ l7 `* w' R. Z% z7 G. K+ k6 Y
3 W" ~# Z1 O$ K. W) m8 J        // ARM 中断初始化$ B$ T% M. E" V; J+ Z, b4 [
        InterruptInit();
& q# j* a( H1 c* l. L0 l, [
4 I, C0 R. `6 G3 k  j# q  Z5 I. C4 b9 m        // UART 初始化9 V4 g6 l0 \8 @, p5 m+ E8 S
        UARTInit();% c: I: W& I' l6 ]

/ d6 i2 `3 q1 G7 Y0 P3 g, W        // UART 中断初始化
- \" H& Y; L' h5 a        UARTInterruptInit();
1 R/ J6 ?/ `; K8 |' K0 f. o
6 `) Y& V8 P" ~        // 主循环
, z% `8 f  l6 E) m+ S        for(;;)7 s, I7 a1 g* I  D+ F
        {" S6 J0 D1 `, K8 x* B
1 v& S- v7 R4 R( J" N
        }
! D7 v" ~+ t1 s9 l# T}2 ^: T& U+ O1 D! \; N/ }# o/ d

4 v% N( z* a; F* T/****************************************************************************/# F  p1 k- @. m3 B- B
/*                                                                          */
4 G- E/ b# m" l' Y4 d/*              PSC 初始化                                                  */
" Q4 V( E# c) E  g& v) \6 d/*                                                                          */
7 [, y1 U4 F: e7 W. p/****************************************************************************/
) R3 [' j+ i' u: X5 Kvoid PSCInit(void)6 J/ ?' i# f: k. ]
{
1 w3 q1 @8 N6 N) t% m7 Q- c+ w4 w        // 对相应外设模块的使能也可以在 BootLoader 中完成
+ K- |' O3 F& `7 b3 ~    // 使能 UART2 模块
( ?( e4 S5 s! z+ G$ U# p" r    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);0 B( l8 B* E8 p5 {
}
4 y9 u6 k$ Q4 A+ ~2 E8 J* L4 x6 I
6 _4 g1 p( U2 @" Y7 }/****************************************************************************/
0 B- R7 D& u% `6 o6 U/*                                                                          */( }, E. N) n- ?. k
/*              GPIO 管脚复用配置                                           */2 j, W% f4 I- Q7 v+ E/ }# T& y5 K
/*                                                                          */
; @" m7 D, S8 M6 P$ @/****************************************************************************/  a5 S/ t, A3 D9 ^" ^
void GPIOBankPinMuxSet(void)
) ?0 m( B+ B/ e% V% {{
: c9 Q& Q8 ^, ^6 e  f1 `8 M2 Z        // UART2 禁用流控! L# V1 f2 O0 r. t
        UARTPinMuxSetup(2, FALSE);
3 m! u0 C3 y! R}$ @/ m7 a7 M" y5 \* p; H3 m' k
% F0 s% @1 @; b- ?
/****************************************************************************/9 r6 @3 \) F0 M6 g( U" l
/*                                                                          */
& o# z& P6 y+ _9 Y/*              ARM 中断初始化                                              */7 y4 k0 a4 f; M! s5 U/ F
/*                                                                          */: r  F: j& I8 |7 z
/****************************************************************************/
6 \% @" P1 G  B7 Y7 pvoid InterruptInit(void)
- L) V( L; y6 j4 x. {4 a7 X- _) x/ B{- }9 k% L' U0 q# ^
    // 初始化 ARM 中断控制器; f' X& q. A; r" i
    IntAINTCInit();7 T# _$ |0 M7 t, B/ m% x
+ Y: }" o4 Q8 G' X2 ?& P
    // 使能 IRQ(CPSR)" R2 s1 ?+ W9 r* E* Y# L
    IntMasterIRQEnable();$ h; ?. s# |$ w8 G' ]1 R0 a. c
4 Z* L+ q% x! x( Q+ }' r8 ?
    // 使能中断(AINTC GER)0 B2 C9 v/ L9 ?: B% G
    IntGlobalEnable();$ t9 ~2 w2 C2 c+ Y% s9 o0 k

+ p5 c) n8 q7 U. f: c' O9 a5 f    // 使能中断(AINTC HIER)
* R$ d8 i- ]; C6 }) g    IntIRQEnable();
' n" P4 ?+ J: n5 Z; n& ]/ k9 l}
' f) a7 ?- t" [2 l; D: Q7 f; b; I, g% O  r
/****************************************************************************// O- _& }6 j) S9 m5 ?- F
/*                                                                          */9 j& k  v/ p9 v9 o% Z
/*              UART 初始化                                                 */
7 ^; G/ k- ^. f/*                                                                          */' @; ^' R1 \; x
/****************************************************************************/
2 s. J+ G* @3 rvoid UARTInit(void)8 a) A; h8 `/ T: f8 D
{, `9 {, d+ l) M: C/ Y
        // 配置 UART2 参数
, p6 q, Z/ e! |5 u( ?8 y; y        // 波特率 115200 数据位 8 停止位 1 无校验位4 m1 d5 A# G0 {/ N& u& L
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
! [7 W9 m8 v9 p7 g                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);1 m# x1 }; e; e; j7 Y% |
        // 使能 UART2
8 v; T1 W7 K  _0 R        UARTEnable(SOC_UART_2_REGS);
! ~' O. e& ?6 g1 t* A3 a' L. Z+ {5 d
    // 使能接收 / 发送 FIFO
% C; O% |" n* o9 r% g    UARTFIFOEnable(SOC_UART_2_REGS);" p5 T% Q% t. D( ?

5 n6 \8 ?5 X6 v! V    // 设置 FIFO 级别6 G- ?  C' H9 H, V& x- G% j6 p
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);" K5 W8 a0 }! u
}
- ~1 _# j# X, N0 Y/ ^: P  Q0 \* {. t: I6 B* [1 F* F
/****************************************************************************/
( p5 t* R6 S0 {% p2 o/*                                                                          */, S  w9 f) g7 h. M* w1 C
/*              UART 中断初始化                                             */  C* w4 b5 Q3 r( ^! m! Q2 ?9 b" g
/*                                                                          */  V3 b* {8 \- k. v9 s3 S6 d
/****************************************************************************/4 ^6 F( f: Y' P0 n9 H5 v, U
void UARTInterruptInit(void)
* ^: R8 }, R9 n$ f. f{
$ j* D" P2 f0 {& x4 R4 l4 @9 |- J6 ]) x        IntRegister(SYS_INT_UARTINT2, UARTIsr);) j' C9 t" `* O3 d; [* x- E
        IntChannelSet(SYS_INT_UARTINT2, 2);6 D. f0 v1 Z/ W" B
        IntSystemEnable(SYS_INT_UARTINT2);
& V. d. L! U, s7 d2 K9 f( ~9 w  \- ^) Q0 ~3 k
        // 使能中断
; I. [) Z; e" S9 ^        unsigned int intFlags = 0;) A3 C( a. M. U+ @, z" g  E
    intFlags |= (UART_INT_LINE_STAT  |  \8 t) T1 q7 C$ G# ^8 m: ?+ Y
                 UART_INT_TX_EMPTY |    \! u2 B' S$ N. j9 c& N+ ]3 F
                 UART_INT_RXDATA_CTI);9 r$ \3 v( }: I6 E1 t4 y, P8 ~
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
, N+ D1 Y/ [! I9 m* c, {7 B8 K}
, p6 b& @! Q4 z# T, H! P
+ p; f# O; Z/ _& t8 Y/****************************************************************************/
3 a; ?2 w0 v% r7 q( n0 `- R/ x/*                                                                          */$ J, L- s$ X0 S  n' o  k7 P, q
/*              UART 中断服务函数                                           */5 L  |2 x4 f$ R& C3 ^5 ]; D
/*                                                                          */# v9 L# f! K5 r" i( h
/****************************************************************************/
" @& r3 E1 N2 l! Zvoid UARTIsr()9 s8 p8 z0 d8 f5 I5 N+ i- {
{  w* X7 K, Y& B$ z) q4 I' l
    static unsigned int length = sizeof(txArray);
5 B6 B: X. u! u; p7 H! P    static unsigned int count = 0;
0 K1 L. H( W! x* \, y; U    unsigned char rxData = 0;
( v; |9 i8 z  N- i" b' M    unsigned int int_id = 0;. i$ J' [8 d  k6 Z! I4 H

/ B2 w* T/ R: S/ a6 g    // 确定中断源' ~: N8 [# @# @3 G0 N! I
    int_id = UARTIntStatus(SOC_UART_2_REGS);  y$ z; t4 U. T1 N- U7 E
4 m8 |0 X: l+ U, w  H. k, X
    // 清除 UART2 系统中断9 h* P/ o  i  T) Z1 f% R
    IntSystemStatusClear(SYS_INT_UARTINT2);
2 v8 a# t& t6 `- q4 {8 i* o2 E$ F5 o
    // 发送中断( ?7 e2 Q& {5 w, @9 u% o
    if(UART_INTID_TX_EMPTY == int_id)4 Q5 `1 G7 A# }) p' z$ y/ v
    {
4 ^! O% `! D$ I7 o7 i* s, S. \4 C1 w, l        if(0 < length)
- T1 y& I, ~0 c; [1 T        {
( z7 l$ h  z, r" G- \( b! _            // 写一个字节到 THR7 l; O" F9 D5 t1 q# N* y& x; U# \& K/ ~
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);2 ^' _4 P1 F% \8 b8 h
            length--;
4 L% r$ t5 K5 v            count++;$ v% Z' [4 C/ V* E' T# p
        }1 [7 }; u( g- g
        if(0 == length)
! b6 Y* Z1 K4 e# B5 o* H. `        {
  c* p% o9 G) I5 t( Q- h            // 禁用发送中断
1 Y' P# T0 d- M: m( Z# e6 ]            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
4 M( _* m0 I/ t, Q  ]5 ~        }/ i8 U; x9 |* }9 c# T6 p
     }% i) j) \# S8 l; }- F3 _- M! }

5 @+ \0 n& C" R. o- M2 V- P    // 接收中断. e7 A  |6 m$ |7 X$ U; d! W6 {
    if(UART_INTID_RX_DATA == int_id)$ Y$ i: f2 u! s
    {" \9 b* W9 B  o2 ?. Z
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
: A6 @8 M- u8 b  C$ Q; E( Z" s0 T# Y" v
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
) Z& |- E* \3 q0 L    }
2 P5 {7 ], b3 k4 z7 B& L. ?* U/ o, z! I' A+ Q8 r" x
    // 接收错误
3 t& {2 C: z+ c$ d: l+ l    if(UART_INTID_RX_LINE_STAT == int_id)$ g1 G+ A8 ~+ y! F. B
    {5 {& |3 l6 ~% [+ N6 v; L
        while(UARTRxErrorGet(SOC_UART_2_REGS))
2 v. R$ D8 x- c3 ]5 t1 B9 N        {
: }8 `' Z' F, [9 S3 \            // 从 RBR 读一个字节# f1 u5 r5 ~4 q) t, p6 V
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
5 p" W4 C0 e4 r; |        }
, A# n0 ?+ @  P! w( T; U. s    }
$ d2 [- s* V9 f9 q' v) |   
: l' d# g' R) \. U    return;
5 w9 ~) `! y8 a$ ?* p" H}# O) A0 I( N% P- v
回复 支持 反对

使用道具 举报

1

主题

5

帖子

1034

积分

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
地板
 楼主| 发表于 2019-5-5 22:36:34 | 只看该作者
785235014 发表于 2019-5-5 22:25  F) H  L( q$ i
如果其它设备快速给你发送串口数据,你这边能正常通讯?

! d: X8 m. A# G3 q+ k谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 13:33 , Processed in 0.057492 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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