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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5649|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
5 {8 e- I/ w; v( l

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
, w. N6 a6 C  F: k4 O+ ?% o/ y$ B
% P0 h( t, o0 \8 R) g! s" z#include "TL138.h"                 // 创龙 TL138 开发板相关声明; m; Y. M: t* r
$ a; c' ]: F5 x& Y$ k
#include "hw_types.h"               // 宏命令9 o& z3 p2 ]. A7 y/ O( }# O
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器: R" q  r+ M3 `8 N0 W& z) z
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器' k" a3 V( M0 i3 |' P: F
0 I; @1 G: ]3 \1 ]" B4 q) Y/ f# u
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明9 O' p1 z+ q$ ~0 R6 [8 @" F* F
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明4 O) h1 j0 C& h, K- j
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
! ?# \4 G1 H) I+ l: }8 Z8 J#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
8 C- j' }& V3 I3 B- C1 p& Z" o9 v0 ?1 L% x
/****************************************************************************/. o4 m8 x7 A, E
/*                                                                          */
  q  T- n5 T" W+ i/*              宏定义                                                      */8 |! z1 Q3 d* Y: z1 ?7 h2 v
/*                                                                          */
2 s1 q3 E/ ~* J  C/****************************************************************************/
& J8 S6 K; w" L5 N7 p// 时钟
! C/ n9 O- C9 P8 F#define SYSCLK_1_FREQ     (456000000)& d; ], W" z& G
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)! B& B/ R# I. ]; I% `& K' X
#define UART_2_FREQ       (SYSCLK_2_FREQ)5 s) `  W+ R( A# c# ^: u

3 P& c  ?" Y! c/ I7 X: G/****************************************************************************/
: l2 ^' Q/ n4 ~* ~* O7 L( u: @/*                                                                          */- S! K( D. Q  ]7 o5 Y7 G! `& o
/*              全局变量                                                    */9 p: Y% |  e+ X
/*                                                                          */
( ^9 f% c6 T, J+ V9 h/****************************************************************************/
2 ?( E: C* b, V2 [1 Dchar txArray[] = "Tronlong UART2 Application......\n\r";
$ W0 y, v% f5 [" Z
/ @5 S- N8 j3 z, x+ m/****************************************************************************/9 s2 n3 o/ l+ l" T8 [
/*                                                                          */
6 z8 |4 r  O8 u* \8 B4 x' Z+ S/*              函数声明                                                    */$ Y3 h  X/ f7 x/ E
/*                                                                          */
! e' m0 q, r0 V+ g/****************************************************************************/
6 L! F" U; ?' {// 外设使能配置
  c5 |2 U4 L- [2 Wvoid PSCInit(void);0 C! u  {/ M+ V) e+ ^" a3 Y3 g7 F
% H6 S3 H" A* H+ X4 ~, v0 X$ W4 C
// GPIO 管脚复用配置
! J4 D6 r% t7 l0 a6 N, _void GPIOBankPinMuxSet();& B- o9 e* f) ]: G3 V7 B
( ^) E( d7 z+ I. q6 v0 @
// UART 初始化
: z: a% V$ [5 X; {: D' G. avoid UARTInit(void);' s% T! d: k; q* J% D* L" O
// ARM 中断初始化+ L4 ^3 Z2 A9 d' F
void InterruptInit(void);5 y, `7 I* I/ k9 u, e. h
// UART 中断初始化
3 T' d. ]5 S$ A) Y" Svoid UARTInterruptInit();! {. q' k) Y8 W! f# I' W
// UART 中断服务函数( [7 g# x3 o  G/ I6 Q0 f
void UARTIsr(void);/ Q/ U  C# Q$ O4 {6 K6 X: y

* O+ [% P4 J  B+ l6 Z. e; K/****************************************************************************/* t- c: S& ^2 h5 k1 V
/*                                                                          */' N+ A8 d& r9 F/ n) A/ t
/*              主函数                                                      */5 m) H5 Q4 K6 m$ D% t
/*                                                                          */- \2 T5 W5 _1 e! M$ u/ e, x
/****************************************************************************/1 [7 Y, W" W! V5 i8 H! M6 y
int main(void): D+ o+ c: u# W6 \
{3 A$ }! F! N7 c& T* t5 }) S
        // 外设使能配置
9 b$ m. ?3 L: h  ~! b& ?: |4 X        PSCInit();
* \: L) j1 l: |- Q* J       
; k, T: b: A2 w; J+ t, b        // GPIO 管脚复用配置, g! m% a% q) g4 ~( j4 y
        GPIOBankPinMuxSet();
) x$ U2 Q& i8 W3 X9 R2 k
' y3 e% l0 R1 W6 o" n: z        // ARM 中断初始化' T5 S  h3 [/ Y3 N( }
        InterruptInit();' i( d$ t  h6 m
( Q8 q$ F+ N) z3 y8 J
        // UART 初始化
$ q$ M& h. L9 _7 l" ^        UARTInit();
3 y) {% R* f" P2 Y
- Q: T% U6 B) `6 J        // UART 中断初始化3 q8 Z9 X$ I" }" Y1 w7 i9 s
        UARTInterruptInit();' Q, I" J- }* y3 ^% D, k1 ?

8 O5 _; ~& Z2 C        // 主循环
, ~+ O9 @- Y0 e7 b        for(;;)
  n; x* [& }. e5 m1 u1 l, r        {; T: d( l* V2 Y2 n0 C) r# _1 s# f
0 O* M9 \. W1 n/ Y+ L9 E( z
        }
8 Z. ~6 H6 n$ b8 d}
- s3 r* s7 f& V8 S  O& r+ z' E$ Z& d& h. ]0 ]4 o+ R
/****************************************************************************/$ ~/ @) d+ J% @
/*                                                                          */$ ^% x! L& H+ n+ S. F
/*              PSC 初始化                                                  */
$ n: |) ^8 p" ^& A  ~" {& W( D/*                                                                          */
# Y% `  ^6 a' J3 P. y/****************************************************************************/
# ~) |; s# ^/ q- R* M, P6 Avoid PSCInit(void)2 o) z( u1 X8 h' M, ^8 J
{
$ h5 U6 y+ K# z% n7 R( x* G0 v1 ^: v        // 对相应外设模块的使能也可以在 BootLoader 中完成
1 R/ G+ H6 k8 x1 f9 y6 a    // 使能 UART2 模块6 i8 a0 `6 I/ Q% C) z8 @; N
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);; e: ^/ [& r- F- ?9 [) A% Q
}
- W* M9 V3 k) t, Q3 L
$ M: b- h$ _" c' t* V6 y! g/****************************************************************************/! H! Q; V, j  |% j+ D+ z" B" J! ^
/*                                                                          */
; V* ^$ s1 l; h/*              GPIO 管脚复用配置                                           */( {7 j6 R( o: J* {5 V
/*                                                                          */, j: T3 a( p, g" @$ o* X
/****************************************************************************/
# }3 T4 r+ b5 T' Q4 y/ ovoid GPIOBankPinMuxSet(void)9 X8 |5 C& @) \
{4 f! c1 X2 N0 v. g+ q  W) e
        // UART2 禁用流控* A1 V4 @9 q* h8 ~  h; K) S" i
        UARTPinMuxSetup(2, FALSE);7 H+ ]8 h/ j( ], j0 J( Y: \
}
8 l1 v1 V" V1 E* W
4 i( ]+ m2 |; w; B2 |/****************************************************************************/5 i- n5 t5 x$ y* h7 f. E8 C: {! E
/*                                                                          */
6 I: O2 \5 X" D* ?" J9 i* p! Z# V/*              ARM 中断初始化                                              */# j( ?+ @& d  g4 t7 q- }& b
/*                                                                          */" t8 b. m# }, D: f3 R0 ^" ^
/****************************************************************************/
0 O( |8 P. G% Z1 f* O4 Avoid InterruptInit(void)5 H+ X5 b. _5 W2 U' X+ x
{3 K3 ?6 t. E, K+ M4 t' T4 j9 V
    // 初始化 ARM 中断控制器
  s2 Y9 l8 f5 {& Z  |& `    IntAINTCInit();6 G2 J1 ~* C3 G, F

: z) c' l( i# w% M6 ^$ i    // 使能 IRQ(CPSR)
  S1 _5 e/ B2 C0 V9 ^/ g    IntMasterIRQEnable();
( ]+ J* c: ]/ V# h; z0 p5 Y) u. t- H9 Z& T: P2 v% Q
    // 使能中断(AINTC GER)
1 X4 P- g# O9 k0 b$ K. U; H/ ~0 u    IntGlobalEnable();
; e1 k& N- ^7 L
! Z( K4 c9 `  w: R( z1 O    // 使能中断(AINTC HIER)' }* C/ L2 k$ ~/ M; X
    IntIRQEnable();
' U7 q$ V# n' z3 h; |5 ^}& f0 s0 {, Q& P+ _$ g2 ]2 b

3 V, A0 v+ C, I* Q/ G, F0 c/****************************************************************************/
: l; p5 N9 [( |0 D/*                                                                          */
; V: t9 E( }& `* D/*              UART 初始化                                                 */+ l8 U. u  b' ^9 o
/*                                                                          */
6 e  x- [( h% y2 Z, t& y/****************************************************************************/
. [" ~9 a$ D! s) Z  Xvoid UARTInit(void)* }: r# E4 Q" n! y( f$ i7 r) y5 V, U
{# Z+ Q# q' K- p6 Y2 q( J' s
        // 配置 UART2 参数
7 N, O: m) B+ Z9 T0 {  e        // 波特率 115200 数据位 8 停止位 1 无校验位5 W1 `1 Z% B# B# e, W3 l$ [
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
9 l8 e6 j) m( z0 X                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);$ {* c5 R# J1 V
        // 使能 UART2
1 A6 k" z& M, L) g* ]3 x' d7 d8 G        UARTEnable(SOC_UART_2_REGS);
/ J% [* t/ W/ z$ R: o  q7 _$ F8 h5 |" c# Y0 x) }! I: X$ V
    // 使能接收 / 发送 FIFO
& }, `0 R0 U* o5 G, S6 ^/ G* W    UARTFIFOEnable(SOC_UART_2_REGS);! _9 s/ q7 c! @: f( S- b' R5 |  W

2 s* G% f6 T" V4 |$ |* w" K9 k) q    // 设置 FIFO 级别, ?0 a/ i. y$ {8 D$ m
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);) a) m4 C' R6 Q
}
5 t% O; C$ \; s: r3 w% ?6 C4 I
! b8 j# @) U" h( _/****************************************************************************/5 s# @$ U5 K: v3 t' b0 g
/*                                                                          */8 h$ P, l7 F- k8 P' L
/*              UART 中断初始化                                             */
9 X* D) S, o* S& w5 S/*                                                                          */
) a" Y+ j: w4 ~; u9 ]! m# B/****************************************************************************/
9 V- g5 q' ~' j/ P4 Vvoid UARTInterruptInit(void)9 m- `0 n; j( w3 @
{9 `" d- |$ B' M9 [2 z' {- J
        IntRegister(SYS_INT_UARTINT2, UARTIsr);0 }! @+ V2 A5 u0 X
        IntChannelSet(SYS_INT_UARTINT2, 2);# y( m! n1 `( H: X5 @
        IntSystemEnable(SYS_INT_UARTINT2);
; x/ j& w/ O$ `, B4 c, a  L' K) W' z( ~* Y# m, V9 H
        // 使能中断
1 d, @4 k% L( f& f: p9 h        unsigned int intFlags = 0;
5 z" [8 z; W" P9 w    intFlags |= (UART_INT_LINE_STAT  |  \1 ]1 j6 o" k9 }  o! f
                 UART_INT_TX_EMPTY |    \: ~9 F* C" _# n/ l
                 UART_INT_RXDATA_CTI);
4 k4 k" l4 y4 G, Z( Z6 f    UARTIntEnable(SOC_UART_2_REGS, intFlags);! o) u$ t0 P- h
}& [( d. i6 c5 o3 {. @

5 a) [  B% V% ^" R5 s7 a- y/****************************************************************************/+ D1 n: x; U& f7 g8 _5 S
/*                                                                          */
9 a, g+ k# l5 f7 h) O+ p/*              UART 中断服务函数                                           */
  U! [5 l. e2 r( B9 b7 C6 f/*                                                                          */) n7 Y, l8 S4 o$ I4 o6 ]/ Y: c/ T
/****************************************************************************/
. @$ I- z. m% D+ }6 H( ivoid UARTIsr()
0 C) m& n& y1 [( E+ R{
0 x1 \8 N0 O: H3 s    static unsigned int length = sizeof(txArray);3 R- `  P+ L" R& l, F8 P
    static unsigned int count = 0;
8 X6 i# q2 I) g) V    unsigned char rxData = 0;9 }; ]) \& j. k' p  \+ C3 H
    unsigned int int_id = 0;
0 f- D6 }* Y$ X- D1 K7 {
! J6 e; [% N5 \    // 确定中断源
; _5 J1 i; @% e8 b$ f    int_id = UARTIntStatus(SOC_UART_2_REGS);# {: `" }4 G: I( ~4 k1 T6 S6 u

& S7 o+ P0 m9 [1 U2 X0 _' r/ n    // 清除 UART2 系统中断
& O7 T$ f- S7 E, I    IntSystemStatusClear(SYS_INT_UARTINT2);+ S9 j3 E* O, P* E: j
- y' Y0 w" u+ D6 I
    // 发送中断
% y3 q0 @& M6 _) E( I, l( A    if(UART_INTID_TX_EMPTY == int_id)
( n- J* K: k8 a- X( C6 F  N    {
% f( ^/ O9 ^% x8 H        if(0 < length)! Z7 h1 D8 o" ]$ O! r
        {
. C# D' q% C  ]" {            // 写一个字节到 THR) q" w( H. Y: A3 H+ ?+ J" e, i
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);1 _, D. l, j2 @5 \: h
            length--;
9 e! }; `" L% w, m+ w1 H            count++;
& L3 N' f2 T$ _" Q9 j        }
2 Z3 k: D( o; ]7 B5 Z: [        if(0 == length)
* {, K" C. j5 D5 j, T% ~        {4 z9 Z9 F1 G' R- X, E
            // 禁用发送中断
/ Q' L0 @$ I  D3 M) B. E* O            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);3 |; B7 m+ ]+ ?' A+ |9 c
        }
8 o1 U' s! \, |7 x7 _2 @( q     }" m% u( o% A% r4 a
0 I8 Z% X4 O# i2 p9 s5 b. x# M6 y
    // 接收中断! G" i, l$ w5 m/ j8 T
    if(UART_INTID_RX_DATA == int_id)
$ L, e- G: s  @' P+ r- j3 f    {
8 v7 p, z+ Z, E/ q& R1 N( ]9 R        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);* `7 X8 s2 \2 b, t  h- b- L
  H- Z5 O+ S: w5 t2 j& R# O4 T4 h  ]
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
2 v5 l4 h+ c% y( [) T    }
: r2 O6 |! T+ l" x0 Q- P0 Y0 K" |/ y8 l7 L
    // 接收错误
: A- C3 d$ D+ C* ]8 M# @: ?    if(UART_INTID_RX_LINE_STAT == int_id): ]8 p  p% {7 a
    {$ d, j$ H* y/ f/ j: t0 m! w
        while(UARTRxErrorGet(SOC_UART_2_REGS))
/ k- F% V: }- G8 r4 d        {1 r8 X3 @5 D" g
            // 从 RBR 读一个字节9 R- P/ x2 x' I# i* w
            UARTCharGetNonBlocking(SOC_UART_2_REGS);& s# d9 w$ F% O
        }
. ?2 k* \( b8 r, c# J, {3 P  X    }3 b, j. T6 ]8 J, p) F) L  A
    & R% g4 l5 S! B
    return;
  f: X) N3 A7 q0 B}, R3 j+ V. g. b( N6 h1 l+ k: R0 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:25
, Y0 {' U; r& N/ A6 y- [) a如果其它设备快速给你发送串口数据,你这边能正常通讯?
( B4 P6 Z3 d& {3 u( I& D5 Q
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 00:56 , Processed in 0.049807 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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