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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7971|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
& _7 M: B7 }' @6 g! U

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
" ~9 q" Y0 V, J0 v$ U6 f
7 _- ?& d2 ~% |! {; t, b/ j#include "TL138.h"                 // 创龙 TL138 开发板相关声明+ ^7 N$ n/ t& i" [- t

: H" |7 m$ Y' |8 P1 i2 K# `6 O#include "hw_types.h"               // 宏命令2 ]0 \* k0 p, y* g% ~; W
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
! d. N( i2 [4 E$ N. c#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器1 [0 z( v/ i/ K, Q1 {

) [- Y( D8 ?& ]1 Q#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
" N# W. A+ h7 p  V- v9 I#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明8 c: `: ~6 ]( Z1 H" @  `* Y( P  k
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
( T  K1 ^  L8 N' o' H' u#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
1 f7 W% }8 X" Q) j. R' J  R$ B/ x! |+ e; }+ V
/****************************************************************************/
/ {" E& p: ]+ O: Y3 W' j% y/*                                                                          */0 X" _& w4 y* E) Y0 ]
/*              宏定义                                                      */+ T2 b. i( b1 T  L6 B) ^
/*                                                                          */: a7 U& J- U2 I" v+ M, p( B
/****************************************************************************/
. R, o: M3 R, I/ p// 时钟5 d6 x% P- b  T  r/ g, z
#define SYSCLK_1_FREQ     (456000000)( f) x# p$ b' o' |8 l' t2 h
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
# ?9 d& y9 B1 l9 M2 m#define UART_2_FREQ       (SYSCLK_2_FREQ)( j$ k( l9 A! s# K5 i4 l

. c4 E; `3 G. G" y8 n& t/****************************************************************************/
# K1 ^. E$ N9 E  t  ]  w/*                                                                          */# v2 \3 J3 d2 ~, D2 X8 p
/*              全局变量                                                    */! S7 u: ?3 R0 x6 y1 L
/*                                                                          */( w1 q5 s& }" W: N$ P
/****************************************************************************/3 G! S' B7 Z) O
char txArray[] = "Tronlong UART2 Application......\n\r";& y) s$ C% n, y
$ Q! ?1 ~! f: ]9 f' w1 I. _$ ~
/****************************************************************************/
) y* e/ j9 t# c8 N& U/*                                                                          */& Z  l; D$ z2 ?0 U0 h4 o$ |6 I- `
/*              函数声明                                                    */0 s0 g# t' `7 {7 g) ^
/*                                                                          */$ m& c/ \! h! ^8 L7 m5 y
/****************************************************************************/
: E- y0 v2 J5 l8 Z/ Q// 外设使能配置. P* A/ T5 S1 v7 p9 ^/ m5 p* M0 I
void PSCInit(void);
: j& c* \& }2 \3 _: B! e6 _7 e0 ]; B5 Z7 e+ P) O$ {) a
// GPIO 管脚复用配置
( l8 L$ T& ?6 S. h: yvoid GPIOBankPinMuxSet();
6 D$ D1 O/ K$ p8 q+ T" _8 s; w4 `" N9 _' g: f
// UART 初始化9 k) ~+ j, h! ]" e
void UARTInit(void);
% G1 \/ j$ n* d, T2 I" X// ARM 中断初始化; g( U3 s  B  Q) R) Z- R
void InterruptInit(void);  s* n1 N+ I3 q7 _6 }
// UART 中断初始化
; c/ z. J: M8 }/ e; l" Qvoid UARTInterruptInit();
) N8 w4 p8 r. u/ [& h0 A// UART 中断服务函数
* p0 o: _2 V8 O1 J1 Z) S& M( p& evoid UARTIsr(void);
5 T/ Y- Z+ B+ p% y1 j
- d6 c2 w: e7 g1 E% B- Q/****************************************************************************/# i) }! i* R# [& l+ ]6 B
/*                                                                          */
# W1 g* s: |* j4 [' M+ Y" \$ d/*              主函数                                                      */
) s9 o, r& [7 I5 M9 J) @/*                                                                          */  e7 z2 k2 j9 i- N
/****************************************************************************/, F$ N) r8 Z% S5 s
int main(void)7 {% h( w: _; X6 y8 E
{
. F( s6 d+ o  p+ q& t        // 外设使能配置
: ?" o" v8 N4 w* H, D        PSCInit();+ M. v: q3 B% [& S- W) B
        ; {# j: g9 [1 J2 m
        // GPIO 管脚复用配置
/ C4 l' a- Z2 `        GPIOBankPinMuxSet();
' }9 o3 f7 D- y5 d( l$ m3 Z+ V( d$ R  @* P6 M
        // ARM 中断初始化
+ g# S) z9 g3 l( Z! t        InterruptInit();" ~) H2 O* r' S9 ~3 D2 ]9 C: h4 k2 O
* G! W0 Q' A* o1 L' f
        // UART 初始化) {% u+ Q& I/ E6 E3 L8 M; A
        UARTInit();, d) P, R) D0 _( g

9 K  g* ?) P5 m3 v; y        // UART 中断初始化
" c2 T8 {, l/ t6 P+ G& d( z0 g$ u        UARTInterruptInit();5 x8 U$ T& p- G. f  _

" o+ r0 r8 y" C( u0 E! L( C9 G        // 主循环' ~9 c8 o2 l) ]
        for(;;)
3 F! S/ M2 E/ O. C' D0 w        {
8 i+ C) [9 E& `9 N. z' a4 j$ C; }& \7 p" k
        }+ \4 l3 ?6 A( ]
}
4 T- ^* L* z) B
3 v' [6 C! O' u/ ~& C* E; {/****************************************************************************/3 W4 m  u7 l/ `) w4 V4 b2 h
/*                                                                          */
. B% `% L$ T" U% O! u( h' H4 Q9 r) R/*              PSC 初始化                                                  */
2 W8 C  j# h6 g/ E/ g/*                                                                          */; v9 Y. p  `7 D9 n6 m% a
/****************************************************************************/! d8 ~7 V( E8 O: ]5 `% E. M4 u1 P0 |
void PSCInit(void)8 c0 K: @. @+ Q4 B/ c) s4 b
{
( A4 R, _" `( A5 z9 [9 L/ g) P" ]        // 对相应外设模块的使能也可以在 BootLoader 中完成; o; m# [& \. K4 m1 r- o
    // 使能 UART2 模块
. \3 q. M+ |. T/ J! `    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);; x0 x, N( b5 p7 T7 {
}
- ^2 ?1 }. M: x
! X( J# X8 z8 K7 Z7 U; m2 c/****************************************************************************/
& j  f7 ?2 ?0 S2 ~! U% v/*                                                                          */
! b3 s' S$ U- p) n: r; V/*              GPIO 管脚复用配置                                           */6 @  s  {1 V$ b" C$ H
/*                                                                          */
( M; u( R1 v; p8 T9 a: r, W/****************************************************************************/0 d, i: r% s8 y  j* {* q
void GPIOBankPinMuxSet(void): B- W, s. F; o  ~+ z& o4 n
{
& M, ]+ W& k4 x6 D        // UART2 禁用流控; F2 t5 }& ]% m/ B
        UARTPinMuxSetup(2, FALSE);
  G6 t8 l6 s7 _5 C( H1 Y}5 n. r# V' Y; m. C& _# w# ^9 }
7 F5 H- M7 L" N9 m3 N0 r
/****************************************************************************/
9 F* Y$ U2 F  r6 I0 y4 T! u/*                                                                          */9 T; }/ Y- J! M% c: N% n
/*              ARM 中断初始化                                              *// Z: E1 {" U' z3 j% W
/*                                                                          */% D; V  Q1 c; g; M  c5 h& D
/****************************************************************************/3 p3 a( y$ Z  ?2 a0 ?5 [/ o; }
void InterruptInit(void)
7 b+ n' [7 y4 S# v8 Y{
0 F( `2 _$ H% K; q4 z    // 初始化 ARM 中断控制器: Z0 K7 l7 `9 |& a
    IntAINTCInit();
# b, E8 j2 v5 W
  _8 K9 R  _$ w3 @5 N( R  y    // 使能 IRQ(CPSR)
6 s' L, P! t2 u  O6 h4 p+ V! n    IntMasterIRQEnable();& a7 L, d- X( n7 N
! y" I/ S& @* `' K- k! C
    // 使能中断(AINTC GER)5 w) j0 B6 b) I$ F$ C
    IntGlobalEnable();
5 M2 ]# J' N$ [. e. v1 v1 q" I
% {8 ~5 J; [7 I* a    // 使能中断(AINTC HIER)
6 \' W- u2 O  e; E* B' M' V+ W9 _    IntIRQEnable();, t7 n# c4 \% C9 n+ ~5 n
}
1 x0 {6 Y& e+ i: m9 Q
+ {; G7 S* T0 e# E/****************************************************************************/
' Y) d! U8 T7 v8 a9 W/*                                                                          */
# Y0 l/ l. j6 }6 ~5 j. }/*              UART 初始化                                                 */
: ]/ l& P) f0 ~( V) J/*                                                                          */
4 e& Z# u" ~. K- n3 o/****************************************************************************/
, g. y* l2 [2 l( xvoid UARTInit(void)
: @& N( s* K( G" J+ }. J/ b{
* {; t% x+ s. n+ m- m" I: p        // 配置 UART2 参数  `) Z8 T9 E/ I; u0 K9 r
        // 波特率 115200 数据位 8 停止位 1 无校验位
4 S- F# _! L. e$ Y; j% d8 e5 d    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
) T; y. O% J) }+ E8 ~7 E0 O% s                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
8 f8 S) t  o3 c. G! `) Q' i        // 使能 UART27 M" ^5 F% M1 @0 r
        UARTEnable(SOC_UART_2_REGS);
, r7 f0 l7 ?  \. Y8 i0 |: C/ G* M! ~
( W# p; X$ c: l    // 使能接收 / 发送 FIFO
/ e  u& I" M6 o4 \, q) C    UARTFIFOEnable(SOC_UART_2_REGS);
& G, E0 r$ ^6 `+ ]5 \6 G% \/ W# A4 g. ^; S2 C
    // 设置 FIFO 级别* T2 s! I2 m8 p) _8 A4 y5 `( v2 c
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);* s2 [  H" |8 B1 D7 x  ]  v
}
1 i: R7 q: @& d4 w. T+ F
% T4 C1 F# D# v" N) C( a/****************************************************************************/
+ U8 x1 Z3 _8 A7 C, w) Q, `; c/*                                                                          */
  T5 Q. `0 U4 ?2 u3 C/*              UART 中断初始化                                             */
" b" `3 C! S' W" c! p+ d/*                                                                          */
( T! u; Q0 E$ L% F; w8 I/****************************************************************************/2 ?$ w, [% Z( _# h" R1 L/ F: ?8 p
void UARTInterruptInit(void)7 _+ F. l& q! h
{3 Z0 d* f1 u  R. J, M  h0 {2 A7 \
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
) F" E8 G! h( y: F        IntChannelSet(SYS_INT_UARTINT2, 2);
) A7 r& n7 Y' l+ U8 E5 G1 ^9 Q        IntSystemEnable(SYS_INT_UARTINT2);+ |( |9 A) ~4 `/ s: \, Q
3 c2 }6 U" d+ ?4 v) H9 i, K
        // 使能中断
- X4 Y& b9 }& p: s        unsigned int intFlags = 0;& G- u0 F1 I# @4 U5 n
    intFlags |= (UART_INT_LINE_STAT  |  \3 `  M4 W  ?# W+ b5 M: e3 a
                 UART_INT_TX_EMPTY |    \$ }/ Q3 r3 D4 G6 Q7 V" X' v; ~
                 UART_INT_RXDATA_CTI);" d. @8 h5 i- l1 h
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
# f: h7 C- R- p% Z+ ^  e+ l}
  ^% ?* c, G  q* t3 o1 s
" j9 ^2 u) X$ \5 h, R% M; W/****************************************************************************/
3 g4 {7 k2 k/ f& P7 ]8 ]- b/*                                                                          */& p* h4 _8 T% R: B- b# J
/*              UART 中断服务函数                                           */
4 j# }0 ~8 ~' L6 a2 A/*                                                                          */5 g8 Q8 ^! j3 k, `
/****************************************************************************/0 v( f2 X9 x. C4 A$ m) N
void UARTIsr()
/ e' v9 I3 D/ ?5 n{
2 X2 y6 }9 T  t4 Q; ^' Z! M4 o6 }    static unsigned int length = sizeof(txArray);
, c0 J9 l" B( ]2 r    static unsigned int count = 0;" M* E# A! [9 m0 M2 Z
    unsigned char rxData = 0;
5 D2 J) b+ \, s; q$ V( t    unsigned int int_id = 0;+ M4 |! v, ?; {  g* u$ F! A
$ a) s& w* O% S/ o0 l+ h. W
    // 确定中断源9 r/ z9 D5 |% C3 }
    int_id = UARTIntStatus(SOC_UART_2_REGS);
& a6 B8 [0 ]4 J# I2 d" s5 W* U9 p" q2 k( z8 h
    // 清除 UART2 系统中断/ ]4 o$ ?& H/ X% {" a* `
    IntSystemStatusClear(SYS_INT_UARTINT2);
4 x! z8 m- L1 |' ?, k5 j( C3 C+ V$ i9 x" X) _$ n* J  P7 v
    // 发送中断
. v: L# z3 ^1 K0 P# p/ O    if(UART_INTID_TX_EMPTY == int_id)9 b' j% X9 M  J) b, [8 N+ q2 q( a
    {
. q, {. Z" t/ X: E        if(0 < length)
- Q& G# x4 y$ I9 H1 p        {
0 r1 w; I1 C& ?1 ?7 ?' K! U            // 写一个字节到 THR7 p+ T. P; F9 J! i; S* p
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
; E$ r1 c, [: k) `7 w  }2 _; X            length--;
: z) ?# _# P' \2 H9 a* a0 g5 o            count++;0 N2 ~! l  R% v% n: ]+ W: K
        }
4 `8 X5 ?4 q/ b$ y5 r, o        if(0 == length)
7 d( ]. ], j. X" x9 O' V        {
8 N9 b+ k5 E( d0 T! u" ?& B            // 禁用发送中断
& @  A! I% p' s- s            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);) m# G  S' z9 o! P, @7 \
        }
- I6 L5 M1 ~+ S  p% F     }# F+ S7 y/ t( {6 R
: G3 L6 Z9 m0 I
    // 接收中断
: B5 Y( q2 g% n3 e' j+ n    if(UART_INTID_RX_DATA == int_id)
. u) U- s: M. s3 Z( f1 j    {( x2 V- G9 c& Q
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
8 s, ]2 Z! E# H$ s6 k; _* g# j" Y" ~  Q2 A4 _
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);, F5 e+ V0 v/ [/ i6 t$ l
    }
8 r7 {% l* |: z& I! A* z0 V* B* @; `! z8 s
    // 接收错误" l+ x6 m  N: J( F
    if(UART_INTID_RX_LINE_STAT == int_id)9 a( b  V+ t  k8 g' ]3 |
    {, B+ s7 Q9 j" m
        while(UARTRxErrorGet(SOC_UART_2_REGS))
9 c! y/ U- h# X" u3 I2 v        {
* J" H& h9 f4 T4 e5 N" o# W, w            // 从 RBR 读一个字节2 Z/ K9 w1 v* H$ x& Q
            UARTCharGetNonBlocking(SOC_UART_2_REGS);' _  f* S0 r- J. R5 ~2 ^% k% K
        }
1 k1 P' Y( M, y# v    }4 `( W, ^- a3 g4 R8 C6 Z
    0 X6 [: n% q' P% D) m$ ]9 n
    return;+ r# S# U# `  s% \9 t6 z
}& P4 Z1 E' @" u* ?* U: K1 ]
回复 支持 反对

使用道具 举报

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
+ R! V; Z* g6 _/ l: t9 T如果其它设备快速给你发送串口数据,你这边能正常通讯?

" L; T" b- X4 F2 z; ~7 e$ Q1 O谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-22 15:14 , Processed in 0.045334 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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