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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5421|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。/ ^+ _% B* ^/ g' e4 G

本帖子中包含更多资源

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

x
回复

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
 楼主| 发表于 2019-4-30 19:45:08 | 显示全部楼层
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。; O, A; L- U7 c: Y

: N4 H" A9 b* O$ }& J#include "TL138.h"                 // 创龙 TL138 开发板相关声明' h( i% h7 {: N3 {& x
3 k' T' ]+ h; y. T! x
#include "hw_types.h"               // 宏命令* n2 V8 |. y: Q2 s9 Z
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器$ [2 A) e9 Q/ |( |! m
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器# T  g$ n+ F5 R& d

$ s" Y& Z1 U' _; J5 Q* z#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明( V, D; ?, u5 i' f+ s. J, i. ]) k
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明3 C9 k, t6 E3 w/ J# K
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明7 ]+ b' `+ g/ q0 l
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
% {- _& `6 C* y1 |4 H  o, |* e- o3 v  G  O$ A# Q4 Z1 t
/****************************************************************************/& V2 v' q( ]$ J
/*                                                                          */: Q" j- m' O* E0 f, m1 P
/*              宏定义                                                      */
# z" n0 G7 S- u% w% h$ q9 F/*                                                                          */
" c8 _- J- ]( R4 a2 |* L8 t; m/ h2 `/****************************************************************************/4 O0 A# g3 w+ N& ~2 z
// 时钟
5 F; n2 `% k6 B( w$ l) |#define SYSCLK_1_FREQ     (456000000)6 g, p2 _/ V9 ~  A4 ~
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)% V! }5 t4 q, R7 T) k6 C
#define UART_2_FREQ       (SYSCLK_2_FREQ)) s2 y. [$ _' x4 m0 G

# P( z/ Y% X( c/****************************************************************************/
7 R9 K. y+ N5 w0 J/ `4 e: X6 R/*                                                                          */+ {% P1 x7 A6 V8 }9 I) _
/*              全局变量                                                    *// q& W: x1 {" R- ^6 j4 i6 v2 e
/*                                                                          */
- i  h: D! M. `# H$ Q- m) G/****************************************************************************/
, c' E- J; `! n# Z8 jchar txArray[] = "Tronlong UART2 Application......\n\r";4 ?- F3 o2 E. O+ m& F/ [1 i" V

4 I- @9 v6 W  D/****************************************************************************/
% ?( w6 ^4 Q/ D0 r! W/*                                                                          */
# W: n, D* f& B/*              函数声明                                                    */
7 ^/ `5 x$ w. P- |0 f/*                                                                          */: o7 S3 H  {( t0 y! I* ]# Z
/****************************************************************************/
; F* g5 X- C( F1 Y// 外设使能配置
& M4 @) T3 [" e* D- H: u5 m3 `void PSCInit(void);
. T8 w+ K  C: w7 ]1 P% v; M# y
8 c1 G' ~* l/ J// GPIO 管脚复用配置  ]7 A4 Z2 g7 h) c& @. z3 K3 |+ b" i
void GPIOBankPinMuxSet();
" {6 k' C1 _$ |0 ?! P$ r, `+ q; s+ G$ O+ \, y6 @3 A# ?1 G
// UART 初始化) u1 |( ]% ~5 \% I: Z/ \& r
void UARTInit(void);/ n3 L/ f; w5 Z9 t+ C
// ARM 中断初始化' r9 j$ m5 M! ]6 L
void InterruptInit(void);! b  D0 l6 P3 D
// UART 中断初始化' G( h5 N+ Z% c$ S( e" ]
void UARTInterruptInit();
9 `; i) C& l# S* j// UART 中断服务函数
- |1 G+ ?  o* e: o7 p! ivoid UARTIsr(void);
. [/ Z/ W) h, z$ S5 U
/ [. b6 u  ?: l- ]7 @/****************************************************************************/
! w+ e5 W9 b9 c! x# o0 c4 x/*                                                                          */
/ o' X! h( C' L. ~6 i- c* U/*              主函数                                                      */
$ i6 B6 k* _. v3 A/*                                                                          */
: L' o5 r+ f2 X! ^* Y/****************************************************************************/9 w) D, O& F* k* {% t! O
int main(void)8 }& G$ R- G5 N& [( M# B. O
{
6 j$ V& k( v% b) G6 N- K        // 外设使能配置+ S; A2 I1 {6 m1 j& ]- |
        PSCInit();. @3 ~$ R' @6 S3 e5 w
        8 Z( s* ]* A* \+ n# w
        // GPIO 管脚复用配置5 f4 \3 E/ b. W1 r4 {
        GPIOBankPinMuxSet();0 W" K. ^/ z$ R; j6 }5 _, x, V! r0 e
" A# `2 i" [- h6 A: r& N" V
        // ARM 中断初始化
1 S& y" d* y$ g, Z; U2 G5 f        InterruptInit();
/ v" P  X% m5 `9 ^5 i2 F0 n* a! L9 z/ `
        // UART 初始化2 |5 R3 q% c5 j8 c$ |
        UARTInit();
  W$ |% ]2 o# C" ?  L2 w% g& ^: H' P/ ]- P
        // UART 中断初始化3 h( p/ b" b% I* i) B1 ]5 J) _
        UARTInterruptInit();
9 d% [2 x5 N# [- ?  S) s0 U4 g" }1 g) {/ J
        // 主循环
0 N5 K/ Z5 Q) L$ j2 G5 c% i+ x        for(;;)3 J1 S1 |. f! u- k
        {' }& a/ p* c' D  |; L

3 x# X# ]( a" b! T# d        }, X; q. @8 {. A1 x
}
) l% c  I' t- Z! [& o1 W
' M) f9 k* B4 x0 H4 s/****************************************************************************/
# U7 b  I/ K4 }! n2 a8 t! y/*                                                                          */
6 M( V6 r7 @4 J" t6 S6 u, A/*              PSC 初始化                                                  */' {; |6 f" C: I! U
/*                                                                          */& M. P9 k/ h, N* j
/****************************************************************************/
5 G7 a5 |) s8 P2 jvoid PSCInit(void)
% o  V6 e5 w& `3 ~' W* Y! K; H{" c. o5 h: s3 L: Z  ]+ [; u$ i
        // 对相应外设模块的使能也可以在 BootLoader 中完成; F7 J& ~* K7 s$ p, ^6 \
    // 使能 UART2 模块* \2 F% R9 q8 |- I; q
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
: F9 \4 H2 G# L: f. [: Z/ ^}
' D, W* d" E% ~  ~* B
1 |* `- R6 [4 T" ~$ z6 P/****************************************************************************/' x6 z) G6 R' t  Z
/*                                                                          */
' |5 h' R) \4 v7 U/*              GPIO 管脚复用配置                                           */; _" ?. J: \7 \
/*                                                                          */% \$ E. J& u2 r4 A0 [7 d
/****************************************************************************/7 j' n7 ?+ s, _" {
void GPIOBankPinMuxSet(void)
1 h/ b( T6 V2 n$ s& r$ g" |6 g{
: B& m4 V8 \" ~9 K        // UART2 禁用流控- @5 a( S, J6 W1 j3 e# s
        UARTPinMuxSetup(2, FALSE);, k7 v$ N# A5 W* i3 L0 U* q
}
- d3 @% ], l; ^; N* _. o8 T! e) K( z
/****************************************************************************/. W) ?% L  z- G* r- @, X- q: L
/*                                                                          */4 {! G9 k% c) s# {
/*              ARM 中断初始化                                              */
+ c5 a7 p) f* t" B/*                                                                          */
% h/ a* ^: {! b2 g* P. s3 M/****************************************************************************/
$ I6 [8 x7 }: `4 \, ovoid InterruptInit(void)& h# o2 I6 L" Q) H3 |5 }6 Y
{3 ]5 ?0 c) T/ o+ P3 y+ V% y. _
    // 初始化 ARM 中断控制器
& s: ^1 i  v; p+ u" i1 a7 R    IntAINTCInit();
" ~, i1 p0 e3 n, Y- ^( ?( l9 s# |+ `3 l" e! o
    // 使能 IRQ(CPSR)! f+ A+ h5 a( j$ q/ [
    IntMasterIRQEnable();
( _0 s/ ]" K; x/ I( r
9 n- |- i. a: `7 ^# x& |" k    // 使能中断(AINTC GER)  j( U+ n- s7 h, i) F& a
    IntGlobalEnable();/ ^  ?/ ]) ?- C
7 P5 S. o& L& V, a1 z
    // 使能中断(AINTC HIER)5 l0 S8 C* g9 Y1 G" ]
    IntIRQEnable();0 q, v; W& P3 y
}1 D& P. k. a3 b: E( f$ W
* _1 f/ P/ @' b& k/ G
/****************************************************************************/
. n, B! |8 W- z0 G  G/*                                                                          */" K; x1 p& L- ~/ m
/*              UART 初始化                                                 */. E  R/ d( e, O- y- V
/*                                                                          */
: m; Q+ ?; C! ^/****************************************************************************/. F0 E  N1 A' X1 v7 S
void UARTInit(void)
/ S1 f3 C* s7 {$ N$ B{& ?' s3 b+ k# F: x, W* G  L) h; m
        // 配置 UART2 参数+ \3 w" a. x8 c# D) {# d! M
        // 波特率 115200 数据位 8 停止位 1 无校验位- K& V! i, `. x7 G, ?& X- V
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,. ~' I8 ^" h% Y  M/ I
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);7 r, I8 g9 t. P' u/ B9 Z, A
        // 使能 UART23 r, g% x9 k! n  E) d" u" C
        UARTEnable(SOC_UART_2_REGS);
* C+ N* U( U, x% v/ w1 m/ U4 v
    // 使能接收 / 发送 FIFO
) \$ l9 ~! b% z8 w. T& H    UARTFIFOEnable(SOC_UART_2_REGS);
( B8 ^  [+ V" N4 f, H$ o( ~
5 a* }3 ?# I! u/ V. ~+ a# g    // 设置 FIFO 级别
# B" P1 A# a1 t    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
6 n% H: ?# E& m% ^}
$ l  X4 @1 x, I# H& X9 ^" G& s0 h# m: I( y" k
/****************************************************************************/
+ L9 D! x4 J. W4 Z/*                                                                          */
$ X) E" Y8 F9 v; s  f/*              UART 中断初始化                                             */
  z4 o! C3 D' N% H0 @/*                                                                          */
0 J+ A: m! C. N3 q. O- y. M: F/****************************************************************************/
* a8 v& b- f  }/ c. g/ [, H% ivoid UARTInterruptInit(void)6 @+ e$ M- d: ~% n  O
{, e- R( a1 \: |( `+ [/ U, z
        IntRegister(SYS_INT_UARTINT2, UARTIsr);; P$ C, t& H8 p! h* u$ z
        IntChannelSet(SYS_INT_UARTINT2, 2);
' |! c# u! L$ H5 ?9 _% v        IntSystemEnable(SYS_INT_UARTINT2);
" y) g4 l. H! g9 e! c  \2 y
7 D6 y0 ~+ H* W5 l. f% k0 k9 G        // 使能中断, ]6 H- x2 ?+ g2 Q8 j6 m
        unsigned int intFlags = 0;/ [$ b( Z5 Q) \* t: S8 l: w1 X
    intFlags |= (UART_INT_LINE_STAT  |  \! x5 z7 t, R0 a# H" ~( Q$ Y% |
                 UART_INT_TX_EMPTY |    \3 A' B+ k- L" T" @
                 UART_INT_RXDATA_CTI);& V* l2 i/ V$ ~
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
! S! L7 I5 Y+ Q& B" ]) H6 Q% F) l}
( n& U1 V8 C, b- M: ^& @4 \0 W! T7 {. }8 [$ i/ y, I, _
/****************************************************************************/
9 r6 `. o7 _2 W' @8 q/*                                                                          */
7 Z# S4 G) d9 ?9 _4 Q/*              UART 中断服务函数                                           */
  K* K' s4 v* ?% P1 G/*                                                                          */
- f9 c2 F$ K& _! ^/****************************************************************************/
7 C( E- P1 B; {6 S2 yvoid UARTIsr()) L- A% j  r3 ~
{$ E( I: E+ g# ?- i; j8 C% {" C$ l
    static unsigned int length = sizeof(txArray);! _( J0 K! b" f
    static unsigned int count = 0;3 N, d8 k- C. Q/ g7 E. T
    unsigned char rxData = 0;, r/ `, k& K2 g+ j/ B/ _
    unsigned int int_id = 0;
' ~8 W: K3 t1 q: b* c: Z$ R& W9 N6 M7 P3 \- i8 P8 r& G  `1 r
    // 确定中断源4 `3 s7 T; K/ T5 P" Z8 J
    int_id = UARTIntStatus(SOC_UART_2_REGS);3 U' d+ p; |* Y8 u* F" t/ J0 A
+ Q2 \1 J/ p5 C# i, v! j
    // 清除 UART2 系统中断
, [5 n8 M: f1 f    IntSystemStatusClear(SYS_INT_UARTINT2);% q! {! g( A. }

+ f. y4 `& h' E" \+ q, r6 n    // 发送中断
5 }  O4 g0 |) \- L) U3 X    if(UART_INTID_TX_EMPTY == int_id)3 L" z9 Q( B, t
    {
( z! ^, A$ W* N1 l- e$ S        if(0 < length)
/ q& Y. ~' {5 E/ c. R* s% m        {+ @) u% q9 e* x4 @1 T" o1 {8 m
            // 写一个字节到 THR7 {$ F7 L5 L* M! ~7 I
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);8 a8 b$ T& B- N& Y
            length--;
) B* H3 P3 \! d0 P6 J. @2 u0 Z            count++;
* d; \9 ?# M- v' |$ {1 Z( ^1 b        }
% q! e3 n! \, D        if(0 == length)
0 b( f& o, K% D$ Z( F  U        {
& T0 A. m( L" t            // 禁用发送中断7 e' v3 o2 ]- s% r. K, R) e$ M
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
) E, u3 ?; D; B1 W        }
8 t, r- p4 {8 g. g: v1 U     }
9 w& ^( l- o3 J/ B+ F7 ]" g+ g! M9 |( }+ d' E$ ^$ g1 g- ]. s
    // 接收中断6 m( J! [0 o" ?
    if(UART_INTID_RX_DATA == int_id)
1 `- D7 ^; X8 A2 P. c9 g    {
* t" j; m5 P: C        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);* a' N' G% d3 H/ e6 c" w2 _! Y
) x. m3 Z: x9 l+ M8 l
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
/ [" h- a% B4 s1 O5 Y/ ]    }
$ @7 w, P# ]: h; ^6 ]/ p" K8 n; u* M7 k, b
    // 接收错误0 f. t0 \2 H9 M( @: ?, N: R" d2 [
    if(UART_INTID_RX_LINE_STAT == int_id)
: c* A3 \# t2 r! |- r    {
4 c) l- n0 U! G) |; T8 r3 s        while(UARTRxErrorGet(SOC_UART_2_REGS))4 D( U+ F; v! e
        {
* |! P% ^6 g5 j            // 从 RBR 读一个字节  u/ A! Y# [1 ]
            UARTCharGetNonBlocking(SOC_UART_2_REGS);4 P1 {, X( {5 T1 y; _5 n
        }
- A- B7 O% u9 l' m    }+ _' A4 S# i# M+ A! ?- J6 _
   
8 R4 G1 q( [! E    return;
$ F* A, G3 O7 l0 z, Q7 s}
. _8 y3 k2 R( 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
: n3 N/ K0 s1 v) f- `9 b+ W9 O如果其它设备快速给你发送串口数据,你这边能正常通讯?
0 f/ p; r; X, g& Q& \
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 18:34 , Processed in 0.043970 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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