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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8323|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
# z, u3 q' ~" R3 x9 z; f5 z

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
, g+ j  }% \, X. F' F
9 S# J* y+ _8 B3 U' e/ f% a  z/ E3 k#include "TL138.h"                 // 创龙 TL138 开发板相关声明) K7 E9 {8 o  S: x) ^7 o% X, F  ?
% i1 |4 y1 Z( j$ ^: u' Z
#include "hw_types.h"               // 宏命令/ Y' l0 O8 y3 E
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
9 m  `/ S+ J% ^( }#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器8 G3 N# `. m2 E5 f! m8 o

! G- N6 K* t2 R& ~. y+ u#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明9 w. U$ T3 `  f4 V# D2 s
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
1 ?4 l, c5 z# v' p& E* A# S( i#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明; N" ^% f+ I# W4 H' l) h# e
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
+ i) U9 \  g5 r; S! p5 `  f$ X
$ O3 K/ |, ~# ^7 p1 S' @4 @$ E9 `4 O/****************************************************************************/# [  Q# \2 N6 ]0 r/ r& Q/ n7 H
/*                                                                          */
& @8 m& P  f" G1 k3 [1 G; a/*              宏定义                                                      */
2 e& _, Y. `% w) C) ]1 }$ ?4 h/*                                                                          */1 I$ _) ^+ N4 `" H$ I
/****************************************************************************/  l2 h$ x- ?6 [5 [
// 时钟0 [# x- C( }, I$ w
#define SYSCLK_1_FREQ     (456000000)2 Q; Y- @2 U1 e& C0 R; M  n: a
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)+ w* b4 W) M4 R3 ^8 @$ P1 \
#define UART_2_FREQ       (SYSCLK_2_FREQ)
% h# o$ Z% a, W+ Z, y3 _' Z  y. g) T* S1 ~1 h
/****************************************************************************/
+ J- H* S' t$ R& J( {/*                                                                          */
0 a8 _: g6 C- Q4 K7 [/*              全局变量                                                    */
, G* i0 S& l- ]9 |/*                                                                          */
( Y  Y4 J7 o  P& D! w! `/****************************************************************************/# ^% v9 Z+ I! z6 D- S
char txArray[] = "Tronlong UART2 Application......\n\r";) [! D5 l' R$ w/ W) a" m
! \  z( `4 C+ S$ M/ z
/****************************************************************************/" j6 ^3 d5 S% j8 A. f
/*                                                                          */# q" s- E- \4 }' q/ s7 V, r
/*              函数声明                                                    */
8 R  G/ o) i8 O/*                                                                          */
5 J; F; D. d) W, V6 T4 t/****************************************************************************/# x+ K9 x* r' l1 U
// 外设使能配置
! k8 |6 |0 S7 ~' r" ], Tvoid PSCInit(void);
& H& M2 k6 M! [: U2 N. P2 `7 q* q0 K! s( d
// GPIO 管脚复用配置
9 Y1 v% Y. a# ?3 A1 fvoid GPIOBankPinMuxSet();
, G2 S5 o& ?' E8 u3 F; `3 [. H7 C( @* Y0 D
// UART 初始化
2 w! v0 {" {; D2 fvoid UARTInit(void);
" n* w/ v8 o7 |( j// ARM 中断初始化
2 I% ~4 X4 E- m$ Svoid InterruptInit(void);
& N3 D( ~0 j! I7 J. `- t) W" _. n// UART 中断初始化
. V# D; {, w4 _* I' o6 W+ I& Yvoid UARTInterruptInit();2 L9 N) e. r9 n7 s6 S( e( ]
// UART 中断服务函数
# Z: |+ P3 T& Q) G) a2 qvoid UARTIsr(void);7 \1 ]5 r" C6 o; F

: D# s% C) q+ [% c/****************************************************************************/
/ Q0 x: d3 y- ~( X$ z8 ?# I) k' A) Z/*                                                                          */
0 l# |+ c1 c5 A8 w% X5 V, }/*              主函数                                                      */
$ T# ~  a7 W% b/ M7 |% Y3 d/*                                                                          */& a7 @! L3 E& s& e5 ]
/****************************************************************************/; w0 h; r4 U& @* X* p. ^
int main(void)3 p1 O" K8 x; r7 G
{  S8 u4 P& R1 ^. p, n/ c2 U
        // 外设使能配置
; A% j5 I4 W4 S$ G- b/ H( s# c& C        PSCInit();
' H! D+ b: x% m( {       
4 P; r) j  ]6 N6 I$ c: K1 R* z        // GPIO 管脚复用配置4 ^2 u! l3 \( [: t$ P( Z
        GPIOBankPinMuxSet();5 J5 L2 I) b) V
" A% n+ w# [3 t5 Q& o
        // ARM 中断初始化
& u' T9 s+ [$ L7 s        InterruptInit();
" L. E- `- r  N' @
3 V) t* a3 T- Y# M        // UART 初始化
, ?5 z% H) i. U- C/ @- Y        UARTInit();. H$ S; N& P. h6 s$ m
! d' D# {( m8 q  B: G0 a/ t- z
        // UART 中断初始化
# i2 E% J) ?& ]; i% b        UARTInterruptInit();
, \+ d- P' \' _! S; z
2 L# K7 o) u- V$ {% ^7 W5 D        // 主循环0 w, V* p9 ^7 y3 A/ q2 }* R6 i
        for(;;)
  C4 i; I. a! T/ h1 x1 v1 h        {
: I7 l- M* T7 e* t  R, @% e5 |2 q( F  r/ q
        }
$ j( m' k5 u) T/ `- {6 g* {) y# E}
' P& F" ]- f& l: w7 N/ x
/ }4 W# d! j& c* {6 [3 x+ i/****************************************************************************/0 G; N* }0 d& `$ Y2 Y% a. t# a- V$ ~
/*                                                                          */
, C* u& x; v4 x0 T! H/*              PSC 初始化                                                  */
; D; Y  E) e% {( X* d" @  {& A4 p" T/*                                                                          */  I! r8 I$ T4 s7 B3 f) P& f! e% Z
/****************************************************************************/" ~* z" M8 R4 e1 d' M
void PSCInit(void)
7 E* `! [+ d- \$ a  ?! w# a- O{' g# ]+ i9 {6 W* W% z
        // 对相应外设模块的使能也可以在 BootLoader 中完成5 c8 j- c3 f3 k% S
    // 使能 UART2 模块
0 H/ N% B& F# Y8 O: ?. U    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
  {* }1 q: T. \# W1 P}
& n# d# E( v+ s2 [; X
; X. i+ `5 @. y& W' L+ F9 w# k/****************************************************************************/
, n9 F- D) e! V5 Q/*                                                                          */1 s  Q7 M/ d( T. g( G
/*              GPIO 管脚复用配置                                           */  q" G) V$ V/ c/ K
/*                                                                          */
# C  N: O9 C7 q3 D- m/****************************************************************************/* l' U3 d  e' A+ m0 O
void GPIOBankPinMuxSet(void)6 Y& C9 Y2 H" \/ P" H
{  R. e9 J7 r" g' i3 \
        // UART2 禁用流控7 i% t* y* k8 S. k7 m
        UARTPinMuxSetup(2, FALSE);
. `9 J( @1 K2 q) l+ N2 A}
4 L' ^9 M$ E) e. t) U
  }: U; @6 A' }5 Q  T. |/****************************************************************************/
1 E/ ]- P0 r- D( w( C, X/*                                                                          */4 p1 \' I% F3 J" R/ @
/*              ARM 中断初始化                                              */
+ `9 M* v+ V. K* j( I9 s/ a8 y/*                                                                          */5 i- s) p+ e- \
/****************************************************************************/
7 e& E& ?: \7 A1 f% Q+ B. avoid InterruptInit(void)0 f( y' t; d+ ~8 A1 z8 \3 X
{
$ `. f; e  k% t& T/ E) x4 U1 s! Y# y    // 初始化 ARM 中断控制器  Q) k! \' I4 J2 g
    IntAINTCInit();; ], o: Y* _3 c- L
+ `, S# p' D2 m$ Z2 z5 n
    // 使能 IRQ(CPSR)
+ Z) i& t! |" Q# v  o" t5 t" l3 v' G    IntMasterIRQEnable();
/ e8 R0 A0 w- z# l5 D# P3 {+ T: c/ j5 C: o+ Q/ }
    // 使能中断(AINTC GER)- ]# B) q# ]" p2 }, T/ X
    IntGlobalEnable();# z# n5 a4 K9 `& [! Z- s3 w! B# m* g
5 b! G$ E' ]3 a: d
    // 使能中断(AINTC HIER)+ }5 a6 }' x' F& {
    IntIRQEnable();
, Y3 Y+ Z. ^: I) Z$ T+ `, h}4 Y( A, S# C: Z
9 C" c) d" E0 R0 A# |
/****************************************************************************// N8 n; D; a: O' G/ ]( n
/*                                                                          */
0 H0 r0 C9 D& C' u3 F/*              UART 初始化                                                 */
/ l; P  k# A, p: J! K: t6 r- r/*                                                                          */* {8 H( {2 l7 `1 e* A! J$ O5 l
/****************************************************************************/* `  w( M! J. a& w- y6 s
void UARTInit(void)
. d. e# G7 ]! K, B* N: u9 `{0 p2 r, M0 z3 T& A+ v" g" H: i- W9 h
        // 配置 UART2 参数
1 e; q, R- N  j: ]+ ?+ X1 u        // 波特率 115200 数据位 8 停止位 1 无校验位  |$ E4 @& b8 h( _! u+ i7 Q
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,3 b% ^6 c9 `& T& r( {: D
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
+ L% L8 L; ]9 B: A# b4 a        // 使能 UART23 Q: r, r9 E$ `) {
        UARTEnable(SOC_UART_2_REGS);
/ P0 D# x/ Z0 ~; A  d, b: b! B2 D" Z; ~4 S/ d
    // 使能接收 / 发送 FIFO
5 f9 U( r& \4 A6 [3 z$ Y    UARTFIFOEnable(SOC_UART_2_REGS);) I7 `# k3 O8 `: K
: a$ f6 C+ F" B* i2 @
    // 设置 FIFO 级别
8 G1 o+ ?" `9 ~. h* J- h! i    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);* Z2 ]1 y0 ^1 X( H2 B+ [
}( v- W# k2 z/ D2 S7 H

- I/ Y8 d) A1 o/****************************************************************************/! L% z8 W! }* K+ z  X# R. r2 _
/*                                                                          */
, e' P/ \' Q' Y+ W3 u5 E/*              UART 中断初始化                                             */. N+ c2 b( c& i8 c( H& f# i
/*                                                                          */# R4 [; U+ I1 g" H: Q/ x
/****************************************************************************/
- k' Z/ q5 J: Ivoid UARTInterruptInit(void)
+ d  {( g" b# j8 S1 _5 c3 H{
  V" K' T( w. P$ N        IntRegister(SYS_INT_UARTINT2, UARTIsr);5 l$ F. r3 @% W% m% e
        IntChannelSet(SYS_INT_UARTINT2, 2);
6 O  Z5 M5 d( X$ R7 y        IntSystemEnable(SYS_INT_UARTINT2);
+ c. P% q& @$ W1 @
/ W* D8 O  ?( }: A$ N( e        // 使能中断
3 a2 O  V; v3 p" u$ [1 S  P        unsigned int intFlags = 0;0 p# [! D& I+ s7 z9 N) F4 t
    intFlags |= (UART_INT_LINE_STAT  |  \
- r# c( ~6 a1 {5 u% V" i8 `                 UART_INT_TX_EMPTY |    \9 N5 Z) A* O' N* Y, T; W& V3 B5 N; m
                 UART_INT_RXDATA_CTI);
6 l0 N4 N# a$ I    UARTIntEnable(SOC_UART_2_REGS, intFlags);
1 I. n9 b, z# V+ j$ \}6 O( i% j9 [" U" s- O# P
% w. _3 M, D: n( Q
/****************************************************************************/
- M  K* k& \2 c6 |. k& ?/*                                                                          */6 M) L8 e# F( K# L. G& A' p
/*              UART 中断服务函数                                           *// q$ T" t$ B$ j& r; y4 c
/*                                                                          */
/ j; V. i1 t" g. t2 F# G/****************************************************************************/0 X4 G1 G  v3 V( a; ?' g6 [
void UARTIsr()2 ~7 q+ o0 T, x- `9 i, c9 j/ Y4 {
{
0 ?3 i$ D9 |: F/ h1 W9 l    static unsigned int length = sizeof(txArray);
$ _' {; K/ a" T, S! M9 r. I    static unsigned int count = 0;& S" V$ C9 z) b" v' u+ Q  \- R$ b
    unsigned char rxData = 0;: k, Q& H$ P, V' j% M* V
    unsigned int int_id = 0;2 H% a/ i! N( Z" i

# a5 N  o: N! n4 G6 c: R    // 确定中断源- ]0 q7 _' g: ?$ Z8 _0 u& @
    int_id = UARTIntStatus(SOC_UART_2_REGS);
& s) ~* H: n# {: V  e6 N+ T- F
& E, ?' R0 p5 }  Z% L* `    // 清除 UART2 系统中断
1 K: _+ u8 A) _# U9 V5 y    IntSystemStatusClear(SYS_INT_UARTINT2);
$ a' K# b7 w$ R
& \8 ?$ Z. n, G3 e" r6 q8 B# j- n2 e    // 发送中断2 B; }9 B8 ?4 D1 [
    if(UART_INTID_TX_EMPTY == int_id)
3 w" K! ~- e1 F) P. I3 Y$ B    {) n4 j( n! V7 @- U7 U5 q" w
        if(0 < length), T% w- w7 D8 v" O# D. W, @
        {+ m( m6 r3 G, q
            // 写一个字节到 THR
8 Y/ a, {0 @+ e% F4 g            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);5 j' F# O$ }6 E/ p2 P1 u% e% J
            length--;
3 B+ O* t; T6 r) I) J            count++;
! x' a- U4 c- _6 X7 l0 |        }: I1 g6 l4 ?! _% u! K
        if(0 == length)# C0 R7 Z/ O; p: @" f
        {
# U, e7 b- \- {! z            // 禁用发送中断/ [4 Q! f7 o% i- O4 S
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
. y" u! B  N; E3 s        }
; P, s1 }3 v4 X% ]( _* @0 a     }- c7 o) A# X8 D, z' k* |6 b4 q( J; }

% o" l& x3 U+ c# T  r) a2 ^/ I    // 接收中断
6 O+ O; {; y* j4 B0 O( J2 Y0 @    if(UART_INTID_RX_DATA == int_id)6 g( i7 b1 G& ~* S0 g& Y
    {
8 F/ G) N/ z5 |' \# s        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
" |- r" w2 F/ v9 T- y1 z) Y5 p5 p- ?  r2 X1 x$ D" |
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
# c' J* E+ U0 c    }
& r  n- ]% q/ d5 v* }3 Y( q8 a- J# f2 l
    // 接收错误
' R& J" o, H- a) R& s! f4 r* K    if(UART_INTID_RX_LINE_STAT == int_id)
0 R: P: K6 N. H  w    {
+ H! _" w) z# t% W8 {# P. B        while(UARTRxErrorGet(SOC_UART_2_REGS))/ ^( P; f6 J* c: ]( R* g% A+ q& h( E
        {
. ?5 x( A+ c* j- q* g9 n            // 从 RBR 读一个字节, j3 _9 }$ n4 r! ~$ ]
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
: q: A: s& r0 ~4 ]        }
' _# s: A. a8 g8 r    }  q5 D, F3 h! Y2 M8 }: u( f7 T
   
% x* B, @9 P* O, a1 Q+ ~  _5 M    return;0 R9 J  ?, u7 [' e, M
}4 X! J* t' i& D- z) S
回复 支持 反对

使用道具 举报

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
5 l) _/ T& Q  x' v( P0 H4 p. a如果其它设备快速给你发送串口数据,你这边能正常通讯?
# ^) {' v1 D! N0 N0 H- j7 ~
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-30 11:51 , Processed in 0.045141 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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