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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7342|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
" P. X/ Z( l! Y' s9 ~# I% q

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
6 M$ s; g6 V- O- N* ]  r8 t; C  U' s9 D
#include "TL138.h"                 // 创龙 TL138 开发板相关声明% E1 q7 [: G1 O  h
# g9 T6 i- _- U* q/ K7 N
#include "hw_types.h"               // 宏命令& n8 l  s# w1 G- j
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
" ?! W7 `$ [6 a$ Z' @#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
- W/ d( D4 P1 Q) H/ _
" ]% {- A4 f5 ^( y7 j$ N# }#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明% ?' [. F6 J: d
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
/ I* u% m5 X1 i0 f#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明9 h. S- T% d4 d2 T7 [
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义3 u( L7 j9 T$ ^  i8 J% J5 I  p

* W1 k' V) U1 t- h: D/****************************************************************************/! Z" z3 R4 c5 P+ ?
/*                                                                          */  h2 w8 W7 b9 i; ?. }
/*              宏定义                                                      */9 `7 A; _, J4 ~) g0 B; L& r; D
/*                                                                          */
& x* g0 k$ l4 p* D8 e; D/ B/****************************************************************************/
; L" w' @6 ?5 W2 v. E// 时钟3 Q+ Z% ^" m7 F* m
#define SYSCLK_1_FREQ     (456000000)
# n. c# s$ k8 S7 w7 U#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
6 \# J7 x( s' {0 e#define UART_2_FREQ       (SYSCLK_2_FREQ)3 Q7 @/ s2 q. W/ p' }
( T5 {, {) J& S3 R
/****************************************************************************/* h' `. C0 Q2 v. k/ h" ]# F
/*                                                                          *// N- A& j0 d( v0 Z5 _
/*              全局变量                                                    */: t6 C2 v& U" \6 ?9 S1 j
/*                                                                          */
& @  h" a$ Z" T3 U# J: f/****************************************************************************/
& k& O4 N4 F; ]% [char txArray[] = "Tronlong UART2 Application......\n\r";  W+ c% u0 {0 U1 {2 o

% s/ ^3 P+ C, f( b- l* E1 E' o2 H2 y/****************************************************************************/2 z  D8 ^& U% A! y% w0 T$ E
/*                                                                          */9 s8 J) c5 |# u4 A- [# j1 I
/*              函数声明                                                    */
* j& v2 c+ G/ l0 k* {/*                                                                          */# R; a! S4 J7 Q
/****************************************************************************/1 H7 @8 t0 @1 w. w4 G3 q2 M
// 外设使能配置8 d2 \% {) ^. e
void PSCInit(void);
6 e3 _9 V/ X/ ~4 A, ?
, [  H+ f. [2 U& z  v// GPIO 管脚复用配置* s. d3 G2 w+ u$ ]
void GPIOBankPinMuxSet();
3 ]+ e1 q- M6 i5 [
2 F& [; @* `5 b6 z3 k5 t7 c  V  a* Q/ S// UART 初始化
. e! U( c0 p9 n& q& y/ svoid UARTInit(void);- a# e: M4 _6 W/ p7 |9 b. y
// ARM 中断初始化
0 W' R4 f! m3 s4 I# X' S$ Mvoid InterruptInit(void);# Z: p3 |/ N$ o; M; k% G
// UART 中断初始化6 U$ m/ h  M$ C4 _
void UARTInterruptInit();
9 Z% e0 z, a! [3 D1 i2 O: R2 t// UART 中断服务函数6 b; L; R: U9 [8 |6 d. t% |
void UARTIsr(void);8 w# q9 A) \7 d

; X" e# |+ x& O+ m/****************************************************************************/5 _( q! R1 {$ r) e+ k
/*                                                                          */, X3 i7 z2 g4 F* m. n  z6 l1 |
/*              主函数                                                      */% ?0 w. x5 r. Z1 l
/*                                                                          */
5 K2 y1 r9 p* w# ^+ o/****************************************************************************/4 H4 |0 q. Z0 m8 I4 t
int main(void)
% ?' k* z6 n8 x9 C3 Y$ ?8 ?{9 s) u5 t9 s5 S
        // 外设使能配置) e% ?$ m4 ~$ j
        PSCInit();
4 |! w9 D  W3 S; x  u5 J, L        8 b7 B8 x8 B4 C) o
        // GPIO 管脚复用配置, f/ a' I" I+ t2 Q4 I3 E
        GPIOBankPinMuxSet();
7 C) D- ^7 ?- T- A# B
$ v" N2 [( T3 [% G) I) d% {" O        // ARM 中断初始化
, u- H, b1 M7 `7 w1 d        InterruptInit();+ {+ W+ |0 s/ ]( V: E8 G8 d

. C% h7 u( U% [$ g8 |& G! Z        // UART 初始化8 S& g. B# v; ~( X4 h
        UARTInit();
' d0 x$ }; x) w7 B4 u! n0 B! O& K3 ~# W  F" V! g
        // UART 中断初始化
5 a2 ]: n& Q* A0 S: |( X        UARTInterruptInit();
# H8 u# @  q+ W: q* l8 g% Q/ Z0 j
  B( O( h+ H: v. D" a. k  x        // 主循环, b2 F+ P. u& x" Y9 P( e. f
        for(;;)
& |8 F( u! \* U$ x* F; B        {8 k" W2 O$ u" S5 D8 ]' }. J

: A% w% a* ^3 ^- z        }% U) P8 o1 w" h
}
4 r2 ]' X! E  c- D1 Y6 ^$ |2 \: N3 ^+ [" p
/****************************************************************************/2 C! D! d1 m+ \; R2 K
/*                                                                          */
4 x' Z/ M* r& N; [' |& i/*              PSC 初始化                                                  */
6 e! o+ L9 V- `( Z6 b5 K' k6 ~/*                                                                          */
; k6 Q: A0 f4 ~6 |3 S. I/****************************************************************************/
2 p% q) h- e7 Q( Z, v/ mvoid PSCInit(void)
( b5 x8 ~3 t2 N{
5 V* n1 `9 \- G) J        // 对相应外设模块的使能也可以在 BootLoader 中完成
3 q5 x" t3 G2 ^    // 使能 UART2 模块( C& }% Q& B: ]) U  H) Y
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);, Q3 p% Y1 A* G& q) n
}1 r4 b/ h0 V, D: v* v; e
& G. z" e' d8 g, P/ P9 A  j
/****************************************************************************/& p& a) H( m/ t
/*                                                                          */5 N5 A/ q8 _2 R) F* W% A/ _" c
/*              GPIO 管脚复用配置                                           */  c' b7 Z! ~7 T. R  {0 o
/*                                                                          */" B$ O; t* g) }
/****************************************************************************/
/ M5 H/ t# X9 ^! n. Qvoid GPIOBankPinMuxSet(void)' M( ?/ U/ S* D- p& O; u
{
* g3 T: G6 H0 K. {' B# O( ^* ^        // UART2 禁用流控/ t8 }0 W9 s& ^+ T# s
        UARTPinMuxSetup(2, FALSE);2 Q2 \) u. X* Q3 w! y
}, l: s  G4 K+ g3 Z6 }: V
: {/ `$ V, f$ J8 v. A
/****************************************************************************/# a9 A9 D; I- _# s) o# K: `
/*                                                                          */1 H* v. k4 u2 B% G) d
/*              ARM 中断初始化                                              */9 z' H! e, N/ \' u9 \* J
/*                                                                          */0 T8 g; j! L! O0 m% D# x- W  Z
/****************************************************************************/& M. P$ H% F& E6 Q/ I4 m2 w
void InterruptInit(void)& C: w. ?2 k0 [
{: Z( `3 a- J+ T
    // 初始化 ARM 中断控制器
7 F3 o6 z) t  }1 p$ J    IntAINTCInit();" ^/ v/ E7 C- H/ V( b, H1 d! v
* Y" s  R* q+ K4 O
    // 使能 IRQ(CPSR)
9 n! @' n& G& o7 w7 n    IntMasterIRQEnable();
* ^0 j; t* \3 p/ {: X
0 b9 \" h1 @7 s/ T. B# q4 C4 N    // 使能中断(AINTC GER)
$ |/ ]3 u5 c: ~7 T$ }# e, u% _/ ^    IntGlobalEnable();
7 l! Y: d- X/ {# D: J+ T0 H6 ?& i0 v* M3 |
    // 使能中断(AINTC HIER)
+ X. |) U. I% C  k- Q    IntIRQEnable();
2 }! Z1 P& ?8 @) w0 f$ a}3 `+ ^# O9 ^2 y0 Y! R. C) f: |: _

7 G7 ]" B$ B- D/****************************************************************************/
8 W3 _7 }# n) {4 N* P/*                                                                          */
5 m! M1 s" ^8 g9 i/*              UART 初始化                                                 */; o1 z; O! V$ u8 `
/*                                                                          */
- `) v% Z- b. L0 h, e+ x+ ?/****************************************************************************/# Q) {8 x1 F4 X8 J' E
void UARTInit(void)
- o) ^0 F0 Z1 q/ Z$ p- }/ |/ G- x/ A{
5 W* j5 s6 Q3 O- L        // 配置 UART2 参数+ Q& k- z0 D2 R. w
        // 波特率 115200 数据位 8 停止位 1 无校验位- F# q8 d8 a9 X' Y2 ?
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,  {7 a) T% ]( b+ L
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
: ]7 W- v  Z2 B0 f1 w2 I, \        // 使能 UART29 O5 j+ P3 Z& o2 T, P" }! m% F* H
        UARTEnable(SOC_UART_2_REGS);% r% d  T! x8 Y( ]) f1 }

1 A, w4 ^6 ?3 E9 H! @! p8 {7 X    // 使能接收 / 发送 FIFO
1 P( L. c$ g1 E, X. b    UARTFIFOEnable(SOC_UART_2_REGS);4 D6 @- g9 m" k* j2 z5 m
: C- Q( e7 @8 Q% ]- |# e% S* M7 S
    // 设置 FIFO 级别
6 y$ p  i# L$ N: d2 V2 D/ c& z0 F    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);* d' S7 o6 {0 a9 J0 k. X
}
/ C0 a0 r! C1 c; h6 U/ c) j# R+ H" N3 V
/****************************************************************************/; u8 \9 [- l' h) D
/*                                                                          */
7 m/ P2 H7 `6 t" p% M/*              UART 中断初始化                                             */
4 J5 I/ |( f. t" p/*                                                                          */; Y. O4 p/ p' ]$ Z6 h
/****************************************************************************/
: q& D4 c# `. ~3 q" y5 w& M8 e& J& Pvoid UARTInterruptInit(void)% |. S- A0 o+ Q0 [
{# E: |; k' T* S9 ]" n1 W
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
6 T; u: W* n8 C8 p' h* [3 K& s- d        IntChannelSet(SYS_INT_UARTINT2, 2);* k5 E$ t% b& V  o9 W
        IntSystemEnable(SYS_INT_UARTINT2);
, d) g$ n  @# |/ E
# U- N# [8 h& s( {* m4 i        // 使能中断0 F) o( ?7 c3 C
        unsigned int intFlags = 0;' p! z) i  p( D
    intFlags |= (UART_INT_LINE_STAT  |  \
! l' k, {+ N, e) ?8 X                 UART_INT_TX_EMPTY |    \* ?+ p! c! A0 ]2 U2 f2 n! l
                 UART_INT_RXDATA_CTI);
( F) K4 |8 t0 c+ Y    UARTIntEnable(SOC_UART_2_REGS, intFlags);: E$ d" z/ `6 e8 J& X" {$ K
}: s5 W! J. x4 p5 Q6 O% h. z

4 f# n1 G9 b9 ]$ @8 m. i3 {/****************************************************************************/+ E% c: b  c; `: G9 U& r4 K
/*                                                                          */
) D: E# M. Q' g% a# g/*              UART 中断服务函数                                           */" f% N+ Q8 U( N, }6 k
/*                                                                          */; w3 H$ n/ A0 }( h9 L- S* n
/****************************************************************************/5 D: V* o0 V5 L* _% u+ y; T
void UARTIsr()
9 t8 j( L+ W- a0 N0 @! O6 u{
# ~5 D3 ~& }& M/ \    static unsigned int length = sizeof(txArray);1 I3 K7 z, ]; e
    static unsigned int count = 0;5 s# T: u. n: \$ ]- \' z- q2 Z
    unsigned char rxData = 0;
. f' q4 L* J0 q" p' s+ \    unsigned int int_id = 0;# K& A4 n* r0 B6 [' K
7 Y' a( F. Q/ p- f7 I- P
    // 确定中断源
# i1 W; _, \! ?( |9 Y3 j' N    int_id = UARTIntStatus(SOC_UART_2_REGS);
: {4 M4 n* O  W* e# J9 k
$ K8 I# M+ H& `) q2 ^    // 清除 UART2 系统中断, f6 Y# d' F" K7 Q/ x4 ?1 D
    IntSystemStatusClear(SYS_INT_UARTINT2);7 Z* D$ p. W9 f* d) q

) e% c7 V: y( ?3 E7 b    // 发送中断6 }* g3 P+ }9 p6 Q8 Z+ P
    if(UART_INTID_TX_EMPTY == int_id): h4 R' F7 s0 o, p& m" c( X" g( i
    {
+ B2 E+ ]" }7 B        if(0 < length)# Q9 n: {# O. e1 S" B  g% k
        {1 e0 x7 ?% R, y8 g
            // 写一个字节到 THR/ @* g& Z. T& n8 z# u. C( q& b* k* i
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
0 c3 O4 @! d. u2 j) A            length--;" u. i- f5 y% N% A# G7 D3 V% m4 _. u
            count++;1 C6 \) G) _& ~$ [' z# H
        }0 v3 _) W0 v# p3 P; o
        if(0 == length)
1 S. K$ ]8 R9 n  |        {# M/ G1 y! F  F
            // 禁用发送中断
) O" q0 o" [3 a% @            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
  Y, r2 R/ e6 t/ v& P; W- K        }
% a# \6 R$ O& _) i" I+ n* Y$ l$ f     }' v3 ?# g% [8 m: t2 n$ R# W
9 n# L  d+ V1 j6 n2 ?* f0 S6 @
    // 接收中断1 r0 f: K3 \4 Y' [/ O" p9 U! {# P
    if(UART_INTID_RX_DATA == int_id)
: M2 k/ F1 g0 ^  m    {
9 ~) u0 X3 E* {# D* ], A/ p        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
6 t8 A7 n# O' o. O+ z
3 v0 Z  m! R# [# z: [7 T        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
/ L; c( X! O& Z* [( C1 G" H    }3 l" ]' i7 U+ i8 Q, q" R8 P
5 [2 p. q' f* l& V$ ~  {
    // 接收错误
& B' O' E5 x! S6 e; g    if(UART_INTID_RX_LINE_STAT == int_id)
1 ]& L! u! j, f& \- r9 l" b# e    {, v; R2 u/ O2 |1 }+ \# Z4 r9 y; W
        while(UARTRxErrorGet(SOC_UART_2_REGS))
* W$ I: H0 @9 n        {
" w& {! Y4 f+ a3 ~  d; t9 s. _7 Q: a            // 从 RBR 读一个字节" i9 L7 B# r4 C6 K6 j1 m" `
            UARTCharGetNonBlocking(SOC_UART_2_REGS);9 P/ e, \: D3 G+ O: x3 i
        }
8 R! V+ k# \! \3 I0 Y    }
1 q- {4 \) b' l& S0 Z   
; Q8 T1 a4 e/ ?+ A7 B    return;# d* k% f7 r! g. P, O7 Z: }* D
}
' I/ ~' [) g- U$ k0 t% b
回复 支持 反对

使用道具 举报

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
0 Q0 d3 {6 i  t. M- B$ L如果其它设备快速给你发送串口数据,你这边能正常通讯?
$ n5 \4 _& _0 ]3 K2 V
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-2 08:22 , Processed in 0.042948 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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