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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5583|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。) l% A+ s/ o0 N; s" L4 L# S

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 显示全部楼层
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。8 H( S, v& W# f
& Y3 B6 j4 x% W
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
$ Y/ d; O! Y  W7 Q" q7 r4 ~
  G  q& r; F' `/ \; _9 [#include "hw_types.h"               // 宏命令9 ]7 v( h" \% U. k2 U( }
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
, h8 i, X: V; i, `2 @' R' M#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器9 ?3 e) ?) k9 H2 o* I' w; h
2 e- K, u2 x4 X! ?/ l+ x$ \* B
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明3 a* l% ?) [0 S* R8 w1 B( T
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
* V3 G" {2 p. m; l$ [% b2 g' B#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明5 b9 X* {) b1 ?1 W2 v
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
$ y. w9 p, {7 n/ Z9 M$ P  f2 p
0 Y& c) P1 c/ \  c: K2 |! N/****************************************************************************/
/ x" a* x) V; u9 u8 r) S; z5 I/*                                                                          */
0 v7 x& x  u4 r" i0 }/*              宏定义                                                      */, ]1 c  {% g7 x; m
/*                                                                          */
3 N- e/ {% T6 z5 Q5 L1 E  t! e- @6 Z/****************************************************************************/, @+ F7 V' ~3 ]/ i+ p
// 时钟, n  U* O5 u. N/ _4 r
#define SYSCLK_1_FREQ     (456000000)
$ B3 K5 _1 v+ @& Z: A3 k# E4 [+ I#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
- \8 Z1 c9 A' `' ~7 }; X1 o1 W9 o#define UART_2_FREQ       (SYSCLK_2_FREQ)2 k) o9 ^  Z+ D# `
* L1 L3 ?/ A9 V* X
/****************************************************************************/
8 u+ r: {, S" F, n' h; i5 _/*                                                                          *// S: @7 i$ ]  |
/*              全局变量                                                    *// ~8 W9 C5 T+ K
/*                                                                          */
- a+ g2 u' R8 X1 C1 F/****************************************************************************/7 _4 v5 F9 b% `! m
char txArray[] = "Tronlong UART2 Application......\n\r";  ?# T+ h6 I. O7 W9 a

! N2 [; T* v, a: e$ P! j. N/****************************************************************************/7 n$ V) V- j' c3 `, X, z
/*                                                                          */$ k+ t2 J8 J! Y5 @
/*              函数声明                                                    *// w, {  H" f! H, G: N$ n
/*                                                                          */2 t  c: ^" m# i! p' M, g2 K
/****************************************************************************/3 z! M9 j3 K( e0 G
// 外设使能配置$ _% z' F! O6 n- w# q( G; \
void PSCInit(void);
& [+ _# y7 n+ ^; c; @- a/ j7 s/ ?; R2 C0 e
// GPIO 管脚复用配置
4 T7 [6 X0 d$ o9 g* I7 Cvoid GPIOBankPinMuxSet();/ ]& e4 f9 J) C$ N( J
, ?+ k1 I0 [6 O, W. P7 I/ l1 r
// UART 初始化7 L! t3 `4 w. I
void UARTInit(void);- ~. }" ]: ~' U) e6 c
// ARM 中断初始化9 H/ u% e2 H" r* f2 |( o3 v
void InterruptInit(void);
+ _2 ]* Y! L) H) A# x- E5 k. e// UART 中断初始化
  b" R, O5 t2 E" |" L; `" ?8 _void UARTInterruptInit();% ]1 }( ^% g% P5 `/ U# ~, m
// UART 中断服务函数
; m# l" `0 |7 b1 U& }% X" @void UARTIsr(void);
: x( K7 F! x* p! W2 A% R" `9 v! g2 c8 M4 j
/****************************************************************************/
1 E# b5 R: Z. s' ~/ M1 u/*                                                                          */
: {; v" W4 H# v6 v9 y3 P/ }/*              主函数                                                      */
5 U. h1 ?; x/ z% A" y/*                                                                          */
: P' ^2 p0 l0 z& O% a1 S/****************************************************************************/; H! e( {6 l& y9 i# d9 q: k
int main(void), a- V$ {7 q6 p" y
{
( o4 ~6 M" p1 Z" N1 A        // 外设使能配置
4 ?5 J- ~% u* e5 f/ l) f* @4 W        PSCInit();) C/ @8 x) B7 q5 j; e& {+ ^5 _6 H
        # c9 }1 R6 u$ t
        // GPIO 管脚复用配置1 ~! |* X& S0 S3 C0 ^0 Y
        GPIOBankPinMuxSet();8 d6 n9 i" P) S# V, C. U

+ Z5 n! F( V0 i% N3 n        // ARM 中断初始化1 X( H) b# f3 ^
        InterruptInit();
. k" D& q8 }7 V$ c2 m  S6 v3 ?! o/ W! a3 B& i0 n
        // UART 初始化
' Y2 ]9 ~% v4 v; }        UARTInit();
5 ]0 V' Y6 s) u% W" Q: ~+ {. q5 l) ~- t& ]
        // UART 中断初始化, _  ?4 H" E* X3 n  Q) M' i5 m, K% p0 V
        UARTInterruptInit();9 u5 N! W& t/ n7 [4 e
* Z" p- c3 k0 |4 f( D
        // 主循环' z$ a; ]4 S5 ?. D5 o* |
        for(;;)4 i* P7 T+ i! y5 C4 ^8 U
        {
& v8 `0 m9 o+ A7 Q2 T$ |. T8 N- }$ V6 K2 h1 c( m
        }
4 K4 U  D, P; F% N6 c4 a}% M- B  K/ L' ^8 W% s) Y

/ l- L6 x) n3 c/ \3 }; z$ ?/****************************************************************************/
. Q$ y# e9 n- t4 o. n/*                                                                          */2 I- u+ M: _1 k* W* o1 }
/*              PSC 初始化                                                  */
' M0 E8 {/ E, e# D2 N- g6 f/*                                                                          */
9 Z& d  m# ]% h4 }! X/ b1 x& X: y: Q/****************************************************************************// D( f  U" p) T, x. Z
void PSCInit(void)" l; E3 K, i$ y( W5 V1 Z' U
{% q/ T! X8 i9 o9 \3 c4 o" T# I
        // 对相应外设模块的使能也可以在 BootLoader 中完成# `7 I- ^; S  p+ P9 l0 u% `# p8 V& {  ~
    // 使能 UART2 模块
6 N' I: Y! O  f) w/ I    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);, B4 P+ e. r1 y8 C
}
( M1 D) d; X/ c7 i, ]
$ O# m7 \+ N/ D/****************************************************************************/
$ p- Y" t. k  V  j5 {1 \/*                                                                          */8 Z" y4 }5 }2 b& p
/*              GPIO 管脚复用配置                                           */3 u( H- H6 D0 t$ j4 c* h4 F
/*                                                                          *// D  \" U$ `- U, t5 ~! ]( v
/****************************************************************************/. J# i% ~, m" t7 Z) I) y3 m! v
void GPIOBankPinMuxSet(void)
4 ^8 I7 ^9 `3 P4 D' p6 k. {/ h{
- L7 H1 N5 n5 K7 Z! h, p        // UART2 禁用流控
$ h, j3 ?4 G' J9 A        UARTPinMuxSetup(2, FALSE);
3 a- s% R/ R3 J8 U. p}
! I% X- i: |( |) }: k3 ]# l- V0 _( _/ q; e: _8 |
/****************************************************************************/* K5 H2 H: Q* j8 y* b
/*                                                                          */1 K6 s+ b. y4 r/ O6 z
/*              ARM 中断初始化                                              */8 y" d1 j; l+ v+ k
/*                                                                          */
- z9 q0 n6 \! T# R5 W/****************************************************************************/2 _& A7 f1 b9 ?9 }( T
void InterruptInit(void)
0 h  S& j3 ~3 z' {{) g6 g, E3 l+ s2 i( }6 j0 |
    // 初始化 ARM 中断控制器
3 w- J7 b3 T1 B8 Z    IntAINTCInit();! }1 V' J+ X& I8 X0 Q- a2 [

4 s6 L& U' q" O    // 使能 IRQ(CPSR)
: G: y& A+ ?7 J7 h- P" h1 }5 g. f+ s" Z    IntMasterIRQEnable();
% D. Y; N' e' S1 X& g3 m3 q/ l2 g  Z: S
    // 使能中断(AINTC GER). ]) r% a# z1 @9 }% @
    IntGlobalEnable();! h% v" [  D  ]# J: V0 x

5 V, u% ]" _, P) N0 Z5 k" h* B    // 使能中断(AINTC HIER)
4 m0 ]1 h' ], [    IntIRQEnable();2 `7 h+ b  {  r7 p5 i$ B
}! }6 u$ \# X3 f: a: S4 Y+ S: |
- O/ u: m" I  D6 {) m5 ^5 y2 z- u
/****************************************************************************/3 B% k+ b2 {! ]# [. X, j) ]
/*                                                                          */
: g1 B4 n7 e8 i. [/*              UART 初始化                                                 */
- f0 g) R' X& S/*                                                                          */
) T- w- l) _4 j; p5 a; X* f- G/****************************************************************************/
: B+ E  Q% m( _) R6 Evoid UARTInit(void)
; P$ V/ H8 f5 F$ P# ?% l3 |7 ~+ X{. r0 J2 p" A  A/ D6 p
        // 配置 UART2 参数
# m0 E: ~7 G8 {        // 波特率 115200 数据位 8 停止位 1 无校验位4 ~% l, ^8 P3 X( R, Q( j/ g1 b/ T- U
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
( O1 u& ~# x  x! d7 T! [) C                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
$ |# l0 z- e# g; B        // 使能 UART2, f2 [8 i) r, h+ g$ V
        UARTEnable(SOC_UART_2_REGS);
, ]$ M0 s- V* d* R! ~
; B" w) M' U/ [    // 使能接收 / 发送 FIFO' N# z) Q2 f% {' P! @% }
    UARTFIFOEnable(SOC_UART_2_REGS);4 O+ i7 i- b: t* |  x

. V5 I4 [9 I* b- p    // 设置 FIFO 级别
( T3 j# k- ^( x/ u* ?2 ?- \    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);4 I0 h7 L; s! R5 g: b
}
" ^  X. {8 G0 k* N* L
2 C" X6 C# {" g1 F& Y8 A/****************************************************************************/
% [3 J2 M2 ?  A8 D+ y6 j" H/*                                                                          */* R# M$ h4 Q1 c% }
/*              UART 中断初始化                                             */+ L1 H6 x' L$ S4 P6 O' C
/*                                                                          */
. M4 E5 l' J* [3 |8 a4 d) A2 \6 L/****************************************************************************/- S5 Q4 x* \2 m$ p; g
void UARTInterruptInit(void)0 D( O9 `! X. h; I0 ^0 g
{
. b0 Y1 G1 y/ x; A2 f& k        IntRegister(SYS_INT_UARTINT2, UARTIsr);
) V, J% h- @* Z6 w' z, G2 [        IntChannelSet(SYS_INT_UARTINT2, 2);
' D: o% M& \2 m* F        IntSystemEnable(SYS_INT_UARTINT2);
/ P5 L# |+ j5 T! x! W) ~8 x5 K( A4 a$ ]3 U% E1 f! ^
        // 使能中断3 N! s0 h" T+ G( h5 Y" f1 ?
        unsigned int intFlags = 0;5 \- b4 F# J2 \+ h$ b6 i. N
    intFlags |= (UART_INT_LINE_STAT  |  \, z( f; N# G2 H  Y. M) w& |
                 UART_INT_TX_EMPTY |    \% Y( ?) s# p$ o- s9 r; f. }6 D4 V
                 UART_INT_RXDATA_CTI);
( G4 V/ W/ Y' o0 _    UARTIntEnable(SOC_UART_2_REGS, intFlags);
/ s( x9 C. Y; G. @2 }}
% X, b0 e9 z0 i) b, x3 p
% j) h8 R+ S6 T8 B0 C/****************************************************************************/
" F& _: D# t/ l6 I& L7 g. z/*                                                                          */
+ f! q6 H! U; h. g/*              UART 中断服务函数                                           */
& O, @1 i) s9 h: E% w/*                                                                          */; ^: S5 c3 ?& R/ V
/****************************************************************************/
( ]' A5 O, h( J  @void UARTIsr()5 y5 }; y; c" k* y% L  V! f2 ~# H
{  F1 N* G$ {; u0 V! s) s
    static unsigned int length = sizeof(txArray);
5 S8 T/ d! k) l( r# F    static unsigned int count = 0;
4 B) D* A; n9 B% R. C0 M    unsigned char rxData = 0;
7 [( b0 {4 b. [    unsigned int int_id = 0;' p, V, a4 a; T& ~; }4 o$ H' E

6 J( ~+ W) O) C) z9 s    // 确定中断源6 i6 R, J; P/ ]6 s
    int_id = UARTIntStatus(SOC_UART_2_REGS);
/ m, N1 L& \0 z* e: q' [
3 C- N5 \* @/ q# C3 o. x    // 清除 UART2 系统中断
* N) L+ [& N. a9 _4 s3 t: ]    IntSystemStatusClear(SYS_INT_UARTINT2);
% k' R5 l) x- l5 K6 G  Z) n
7 ^" a) ~1 V( w9 t6 |' F; z    // 发送中断
; ^* ~/ L! r; f3 T1 s' e    if(UART_INTID_TX_EMPTY == int_id)
& k& Z; s! ^7 D8 ?+ e' x- o9 l$ ]    {
9 e, N0 x% a- \1 h8 n5 A! f$ ]        if(0 < length)
# }' Y5 A$ ^; ?' w* l        {0 Z$ @% O: S4 o$ |$ z
            // 写一个字节到 THR
3 n3 D" o/ a& g  l            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
7 W. }5 a1 F8 I3 I- E+ U+ Y$ {, Y+ P            length--;
6 s" t. k5 o; }! n4 J  h* B            count++;
& E% w* H+ r9 d( p$ j6 U        }6 j; Z  b8 m* d0 H' ?8 J
        if(0 == length)
/ y1 S$ e* t7 ?+ ^        {: Z7 M/ v! {1 S: L/ L4 @
            // 禁用发送中断% Q' @. _5 D- ?* ^3 b" y7 g9 x
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
; E/ A4 t% D8 ~3 p        }$ H9 L/ h7 p* |- c0 D
     }4 N# X6 Z3 u' h" P0 Q0 g  `

: t; N" x* u+ Q3 o* [# j% c, E5 X1 y    // 接收中断/ w/ g! s# H& b, V9 y
    if(UART_INTID_RX_DATA == int_id)
  K9 l8 K+ p* D5 |7 e1 r/ D    {
% F7 g4 u5 `1 p9 K! O3 n- P2 X        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
" d9 m& M5 s4 b* p! D, D* a# X/ T) }: B7 n
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
9 T5 A$ \! ~8 `, S. Z4 J' F    }
) l5 {2 x1 ?3 n* j" y
2 U# @  K( f, y2 s# x    // 接收错误
, l2 e2 U: Q1 N" r4 }% B    if(UART_INTID_RX_LINE_STAT == int_id)
5 r; i  p5 }# i    {0 _: ], D( I" |  u3 W5 Z
        while(UARTRxErrorGet(SOC_UART_2_REGS))% X! p0 u! M! ?
        {
, G, D* b8 c; N) `' t* |- X( I0 s            // 从 RBR 读一个字节; R% O8 G* v$ Z& Z& Z5 [- h
            UARTCharGetNonBlocking(SOC_UART_2_REGS);2 a$ ~7 D$ u, m0 [# P
        }
( A6 e8 r7 g% T0 w* l4 Y0 M    }) s& v8 m% F5 ^' O9 i5 {+ V+ [
    " l, q% z1 f4 ?8 S* M; Z. T
    return;! N& o- W, o3 ?6 _; `
}
2 }! K& G8 y3 y+ i
回复 支持 反对

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
板凳
 楼主| 发表于 2019-5-5 22:36:34 | 显示全部楼层
785235014 发表于 2019-5-5 22:25
' I  f# `# p' }0 l4 M/ ?( L如果其它设备快速给你发送串口数据,你这边能正常通讯?
# a3 u! H3 ]1 z0 H) I
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 07:24 , Processed in 0.041336 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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