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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5578|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。  I9 |& Z' m6 {" T# F5 i/ g5 }

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
" _) ?1 `% H& S8 g( D6 E. ?$ E
# R5 t9 f0 \4 ]  c#include "TL138.h"                 // 创龙 TL138 开发板相关声明4 L5 H2 ~/ d0 U% ]! h: V, P" C$ |- G0 G

4 x* Q0 A/ `, Z, ]$ N& w. o#include "hw_types.h"               // 宏命令/ @/ G& ^9 Y1 O1 q
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
% y7 R9 r) `* C#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
9 p' T0 ?0 B- t8 b9 [3 b& E7 M# |( O, b1 c6 X9 k
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明' F6 y" o9 {  X# ]
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明  V8 p$ v5 A3 t9 t: M9 A
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明( S% ]' s! S, Z! V- g
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
' y7 ]8 c, T- [) _4 c1 k* }& P  w( |/ I1 A! W, t  R
/****************************************************************************/; X$ ^2 e3 g* p8 I2 o+ ?3 P' I, S4 f
/*                                                                          */8 P' k4 c6 A- O5 q7 t' v( f1 R5 w
/*              宏定义                                                      */
8 d2 F% M( i: q$ t) V/*                                                                          */
7 k4 |/ [/ f  s" w/****************************************************************************// x  @$ t- Q! V- U+ w" E/ ?
// 时钟1 W* m/ C6 B; h5 Z+ A0 S( j" N5 X
#define SYSCLK_1_FREQ     (456000000)  V3 g- I; Z5 |% x" K& b
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2): d, ^. @' F4 T# ^- I; O9 V; s
#define UART_2_FREQ       (SYSCLK_2_FREQ)) o! l2 [1 z8 `9 X& m
" R4 }3 r; D  w8 X7 @5 ~& \
/****************************************************************************/
8 ?( x  `( @6 }- G* H: A/*                                                                          */* p8 S4 _/ D% K0 z4 M
/*              全局变量                                                    */
! h# O$ n( t6 n8 ]3 G8 m- J3 @/*                                                                          */; N5 t! h% `- v# V9 \! q, V2 i
/****************************************************************************/0 }% j) z  w4 q2 |# A: _
char txArray[] = "Tronlong UART2 Application......\n\r";
1 @+ R6 G$ O5 a7 e/ L: r" p( {: n, _% ?# }  `/ e3 b1 `
/****************************************************************************/( q6 @5 H3 {/ B$ s, g5 h
/*                                                                          */5 x( E/ b& J2 p) z0 e8 [% Q3 s; k
/*              函数声明                                                    */4 T) h$ c2 X  q- v
/*                                                                          */
4 n- }" l+ R( M/ Y9 b/ i1 h; O$ c/****************************************************************************/
+ S  r8 ^9 ]* U( Z: m// 外设使能配置- G2 T; ~! U6 j0 F
void PSCInit(void);
  y3 {% m2 S. o- L/ ~% Y) q! x% e  u3 I3 L* P$ o2 u
// GPIO 管脚复用配置1 K, U1 q9 C6 E1 S1 ^# h
void GPIOBankPinMuxSet();0 _% Q! z* p0 J/ c% W

$ I9 y6 D* ~& w3 o4 b' m// UART 初始化% l5 `6 X. K2 f/ |% _
void UARTInit(void);
  r, K& g" ?+ g- J// ARM 中断初始化  {* v) P2 X- D4 s1 I
void InterruptInit(void);2 n2 t+ E  u: J4 @+ [2 L( [
// UART 中断初始化. Q: `& l# e9 O- I9 u: v; h
void UARTInterruptInit();
& M8 m' |' m9 s: {! m// UART 中断服务函数; _1 R1 n; ?& ?% O
void UARTIsr(void);
, k% f& v# E$ k% m# Z! x7 t) q5 ~/ G! I& ^" |6 m
/****************************************************************************/
9 F. w$ T7 o  }1 y/*                                                                          */) A  G5 O2 H5 h/ ], {! Z
/*              主函数                                                      */
3 _$ L4 e! n) D3 G6 m! z) A! I/*                                                                          */6 o: H9 a: F) V. j; _7 \3 B( s
/****************************************************************************/8 ^+ s! I. v* b2 G: C: h
int main(void)1 S# P( y, c; Y' C! @2 \
{  M/ k0 Q0 v6 O$ c. A  }
        // 外设使能配置
3 t' a& _% t: J# A- c/ |9 S6 p        PSCInit();
' h: F6 b# `' a8 C1 F- `. K/ k        5 C$ U7 q: Q( |  C# Z
        // GPIO 管脚复用配置
9 m6 _( L' W$ L        GPIOBankPinMuxSet();
& p; k4 K6 B3 F$ `$ X; G
4 F* U8 ?8 o: v9 q: E        // ARM 中断初始化
! j8 ]8 {4 R% y2 P; I        InterruptInit();5 s4 |0 B5 c/ p. V( @

$ _. F% r/ F' j) v        // UART 初始化6 A- U, c* q1 C: z6 z4 [# h
        UARTInit();6 V9 ]) L5 e  s* ?- v* T

$ ?0 o$ t6 y' Z5 E7 S6 s        // UART 中断初始化- C/ u6 U5 [- q% Y
        UARTInterruptInit();* d) r; i+ h. d! M

0 ?5 i" F8 f+ V+ H# O3 e3 ?; m        // 主循环# U. I% r; E- j$ W
        for(;;)
0 ?, i6 s- v  R4 ~* a        {
4 M- H! q* g4 `, W( V* V7 [" Z$ x' Y. |
; }% D) |1 }, \/ j% t: e: `        }
0 A3 k/ G3 C' D+ N: `8 Q7 o0 W4 i& p3 S}
; i+ {2 n0 O) o6 y. |% T, D# i
. A" o7 t: b+ F6 I8 D% |4 w* ?  x/****************************************************************************/" W' G! P% b0 F6 b. o5 J/ c
/*                                                                          */
% S! n9 j, E6 x/*              PSC 初始化                                                  */( r4 b" J+ h0 k. _/ {
/*                                                                          */! ^3 |! L4 i3 X# M/ E
/****************************************************************************/
% ^1 q1 d; M- \- @% M2 Ovoid PSCInit(void); w5 S5 A" |+ _+ ?
{
( v6 h# Q! N: T        // 对相应外设模块的使能也可以在 BootLoader 中完成6 H7 ?; @5 s/ ?% F: e' D: }8 \3 p+ S
    // 使能 UART2 模块
$ I0 ?  a1 Q2 Z: K) ?: k    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
9 }$ Q8 k3 v* V}
4 f, C; _5 \; u% {9 X( |+ X) U* h: t( e% i8 s& w
/****************************************************************************/
1 Y" Z, F1 z6 E" T8 F/*                                                                          */4 }) L$ `( E. f1 U  R
/*              GPIO 管脚复用配置                                           */0 I; c. |9 W' s& [
/*                                                                          */7 |6 Y; u/ ]& x" I, ~
/****************************************************************************/
. N& M2 k+ W1 Y: m" mvoid GPIOBankPinMuxSet(void)
8 T) K0 S/ _$ x! b{
" f: h6 t- Q4 V8 ?6 m        // UART2 禁用流控
. b/ F/ j5 o' ^/ U  J        UARTPinMuxSetup(2, FALSE);
, Y& a8 L8 `8 V+ a}+ v# {7 W, \6 U# t: h

! b9 M6 j9 g" _5 Z8 y: {/****************************************************************************/
$ l# {. E7 a! D7 C! o+ z9 |/*                                                                          */6 z2 l( o# C4 V3 S' C/ f" d# [
/*              ARM 中断初始化                                              */3 H) z! `/ B- o; v: R  l' W
/*                                                                          */2 Y! P, p, P9 ~: [- f% _. I1 P
/****************************************************************************/
6 o5 }; m) H+ Ivoid InterruptInit(void)
/ `: e2 A2 x3 c$ b2 Y5 H4 f( c{
  {" r9 D6 N9 }' s8 r  `, H  M    // 初始化 ARM 中断控制器& |1 L6 E) v' i% ]/ X) ]2 R
    IntAINTCInit();& u0 C, w4 \, S1 w7 q
5 J2 l" B8 l' i* [9 S- s6 x
    // 使能 IRQ(CPSR)
; F# P6 h% j  a  o1 W+ t3 F    IntMasterIRQEnable();( n" w/ `- Y  B7 k/ k# `
& {5 v0 Y/ u% Z" {) z- e
    // 使能中断(AINTC GER)! ?7 I' z) H# \: A5 ]. U
    IntGlobalEnable();
( y$ N1 L7 g) Y% a$ T. L7 l( p4 B: i/ _
) l) C7 a# s9 w( j    // 使能中断(AINTC HIER)
1 Z% y! O) ^  H! \% W) d    IntIRQEnable();* _% s# l0 c5 j: g2 h; P! e8 W$ R
}
% u. a7 y# D0 }! L' V- L
0 K6 z0 Z9 K! o$ F, v, {6 ]/****************************************************************************/
( W! r$ e6 X9 t. d& G/*                                                                          */
1 W% }0 l! Z5 {: C4 G4 w0 u6 o/*              UART 初始化                                                 */  G4 U/ I# w, I: U$ {# Y; w
/*                                                                          */
2 j; Q( H3 A" n9 _  ]4 B# r! j( b/****************************************************************************/
9 t1 e7 J; s5 B/ f0 u$ u9 Vvoid UARTInit(void)
. Q/ e9 Z3 p+ X{9 ?. R' f' O9 @' \3 ?& M
        // 配置 UART2 参数4 ^& m; c7 j8 H+ O& n
        // 波特率 115200 数据位 8 停止位 1 无校验位
% [  _4 w, b- X    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
; d- V! j; A6 e' I7 \# c                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);- O( ~, i: _1 X; p1 C2 P
        // 使能 UART2
. R$ ~& ^, G! @7 Z1 I* N* s        UARTEnable(SOC_UART_2_REGS);
0 ^. T, c$ R5 S" C7 L9 e3 k9 E0 J
7 w& _4 l  u. j$ ^* [, q# u; [- X. S  [. M    // 使能接收 / 发送 FIFO
0 P4 n; ?, Y, X3 p" e% U8 _    UARTFIFOEnable(SOC_UART_2_REGS);; ?/ X8 P- Z* Z4 ~: X

4 f: t, L$ Z$ d9 Q4 |- w7 f3 d- G2 r7 R    // 设置 FIFO 级别
* G. n8 k: s3 L  O    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
) b" f% ~5 o5 k- I' b( @) @+ p}
, Z2 u7 [, d; {- u" y3 {% z" B( i, V& [2 E$ K: L
/****************************************************************************/% g( x1 H- L% K
/*                                                                          */+ ~$ P3 i& X( U& X/ r; S% c
/*              UART 中断初始化                                             */) ^5 }0 H+ K# W- F( h# b4 q
/*                                                                          */( ]3 K% i6 R! N$ d. z( E
/****************************************************************************/
; o% P/ }/ \  R& |/ Lvoid UARTInterruptInit(void)
4 c+ J7 Q* @4 x1 m: c{
4 {% a6 t4 t" K! Q0 {. D: B        IntRegister(SYS_INT_UARTINT2, UARTIsr);
: g1 z$ \: h0 q" q5 ~        IntChannelSet(SYS_INT_UARTINT2, 2);4 p" K6 s, @# V* |  y# Y
        IntSystemEnable(SYS_INT_UARTINT2);1 e) t+ d4 }5 m
% U: L5 N, C. R+ b% J  S  ?
        // 使能中断
8 ]: e: j1 I# u; t; _        unsigned int intFlags = 0;: I* V7 J# n2 m" L
    intFlags |= (UART_INT_LINE_STAT  |  \
1 P3 j1 [# [3 x6 s3 s: ^) `                 UART_INT_TX_EMPTY |    \
" }0 Y1 h% m* k# ~                 UART_INT_RXDATA_CTI);" N0 V+ U0 h0 u* G
    UARTIntEnable(SOC_UART_2_REGS, intFlags);3 k5 |! A1 j* f4 \! h
}
$ ?! F) _6 E- S" k9 N
, L. V+ |2 O, }9 m/****************************************************************************/7 t$ I8 n. _% O2 H* i  U
/*                                                                          */
; W2 }% _# H  J- [( ~/*              UART 中断服务函数                                           */
6 R6 Y1 N3 f% k. C, s3 t/*                                                                          */' j2 k' C  i- {2 H9 l
/****************************************************************************/
" _: e/ \0 l4 y; e; ^, K5 O2 A# ]1 Fvoid UARTIsr()2 V) D, ^- K2 B: i: x0 ?- F0 U
{
! U6 x& y8 Q7 Z) T6 y* k    static unsigned int length = sizeof(txArray);
, i7 C; P) z/ ]$ S( ~6 r, P. \    static unsigned int count = 0;
4 S. n; e2 j3 G& ]    unsigned char rxData = 0;; b# [. o/ c3 P- d
    unsigned int int_id = 0;
# |  s: f/ K- A' g: I! Y' \2 V  ?+ \# }" q8 i% h
    // 确定中断源
1 c* l8 j) n/ |- M    int_id = UARTIntStatus(SOC_UART_2_REGS);2 y  J: ~+ y4 u! c# o

' v% |" Q, A% F" ^; s8 `1 J    // 清除 UART2 系统中断  Q2 V2 j: ~) U2 x* y! o$ ^
    IntSystemStatusClear(SYS_INT_UARTINT2);
+ N- U. G  @7 ?  O/ Z- K
  h9 G* N* w8 P. i' V. I    // 发送中断
" G- U. [5 y6 t( h9 l# D) Q    if(UART_INTID_TX_EMPTY == int_id)% r) A" L% L' F& u1 M& d& h+ J
    {
) J( ?# B7 G- I* g        if(0 < length)
9 N/ M9 ?' O. f& n% D- U        {  C+ L: [8 R, M" Z' f% i7 }4 R7 A
            // 写一个字节到 THR) z1 C- p$ T3 }' V
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
3 h7 W6 p2 U8 M& E2 d: r9 r5 P            length--;7 O* V& O& S: L9 Q5 f
            count++;
3 l) t5 d, ?1 r9 m" ]$ x        }$ G5 v2 `! d4 I% H$ Y+ z
        if(0 == length)
( l! H) l/ ?. S' c( H        {  O0 Z" w8 f& X) E% A& C( X) _
            // 禁用发送中断
1 P8 l( O3 s- U. T3 l2 R% U5 d% |            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
' W; w) h2 w8 U8 @        }
. ~5 p! K% w. `" f0 u# H& t     }) b0 d$ m& {6 E2 [
' K6 s2 L$ g) |$ n& X$ |
    // 接收中断
' R7 R" k" Z; B; k    if(UART_INTID_RX_DATA == int_id)
+ h8 o6 b, D! R5 z2 @( L4 N& g    {4 f* c: t; w0 F8 w5 @; N6 O& S
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);; G' ^  u- G2 P; U/ W# G

9 e* u3 S* K% y4 v        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
  {" [/ ]/ J& ]- G    }! P# d) d$ _# X7 G* j0 k4 n: f# a1 [
4 [# d6 O. p7 |9 V& R: Y
    // 接收错误
  ^2 k! L3 m( k5 h) [! b8 |    if(UART_INTID_RX_LINE_STAT == int_id)
9 q# [5 z6 A- r0 }4 L8 V! i$ q    {
/ d  s: N1 ?1 l" }9 d2 U2 [        while(UARTRxErrorGet(SOC_UART_2_REGS))
4 j1 n0 {7 p. y! W        {
( w6 Z# P$ z  L) S) D" B  W            // 从 RBR 读一个字节- U  Q0 H3 y8 b3 |
            UARTCharGetNonBlocking(SOC_UART_2_REGS);% ~% B4 L/ v, G0 a% w" O
        }
* i( d# q- ^) e3 K# T    }
2 n; E, Y$ N2 h* A# I8 }   
8 Q( q( Z) v% ?" ]% W' y    return;
) a/ K  i3 H# N, g+ Q}$ ~$ p' b& y! b/ I6 O3 @# L% t! x
回复 支持 反对

使用道具 举报

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:255 Z3 s( W& A9 ~4 n2 I1 E* T9 [
如果其它设备快速给你发送串口数据,你这边能正常通讯?
3 a. Z* B1 B3 k; s
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 23:06 , Processed in 0.041154 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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