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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5589|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。# c( \3 f/ j7 |+ @+ G

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。5 T2 k- w$ T: s6 P

2 k" ^( \$ o7 ?+ i9 `1 j6 x0 q#include "TL138.h"                 // 创龙 TL138 开发板相关声明
/ ?8 Y+ [' F( @5 ?( W
# g2 d$ e. I) n% y6 }1 i#include "hw_types.h"               // 宏命令
4 \, b; ^9 `) K+ f#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
. g6 J- m; g/ K#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
" t8 Q' ^, x% U3 [& Y( U, `8 N2 y5 g& H8 Z5 c1 P1 ^8 y
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
# \( Y9 p' v/ Y#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
. f+ m# [' o+ N#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
$ a4 y- K' e( K, _' v7 L. s# W, h#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义/ a5 E/ t1 F' |

2 [; f7 J& i9 {9 \( \+ b( E/****************************************************************************/  O/ A" ]3 U& {& x% y: b0 S
/*                                                                          */
- ]+ ~+ F  l0 _/*              宏定义                                                      */
9 [7 v7 |) i& O, a9 q4 E( E9 Z- R/*                                                                          */( R0 `+ R) n) p( S& }3 ~8 [( q2 f
/****************************************************************************/5 c2 B" `3 N( W( B) Z- b  a; m
// 时钟  ^; T4 i/ |/ Z* ~, t7 r
#define SYSCLK_1_FREQ     (456000000)1 f3 o6 _: P% i1 J: z3 d' N
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)# L% V+ _% _8 A7 G" }4 @
#define UART_2_FREQ       (SYSCLK_2_FREQ)
6 [2 I7 N3 Q( W" r% u% p7 K- s0 n8 H% V
/****************************************************************************/+ S, x5 ^1 o) P% _! D( z
/*                                                                          */
  a3 W- o& ?6 N1 t/ `5 \( D/*              全局变量                                                    */
( G2 R/ K6 ~2 A" ^/ q9 M/*                                                                          */
0 N" `3 V+ b4 U! R# o* G! ~0 s6 W/****************************************************************************/
* R* }3 k  w7 O# L- `! \# }' mchar txArray[] = "Tronlong UART2 Application......\n\r";
% g3 f: h5 }2 Y$ D& A: D
0 G( \4 V0 u4 {; C* G4 X/****************************************************************************/
: X9 O  g- _4 D! U8 m; C" n6 u8 M  n* |/*                                                                          */3 B  R! l6 Z% \0 {+ o9 }
/*              函数声明                                                    */
2 A2 `# T7 Q+ v. ~+ |/*                                                                          */
; q# }" s. e  F" r$ A! \) D/****************************************************************************/
' A" h, }' p- U, t  \// 外设使能配置- Z4 U% _7 d0 W: g* a( j+ D! j
void PSCInit(void);
) C, F6 g1 y# s  b+ M/ H! f. a3 b; M$ U0 X) o
// GPIO 管脚复用配置& |% K8 I. I1 ], P) l
void GPIOBankPinMuxSet();
# ^; F* Y( o/ J* A4 I$ n$ K9 r. g4 ]3 N8 D& p% D5 k& ]) x
// UART 初始化+ ^- I# j6 V4 `) X& n2 C4 }( T1 H5 g" k
void UARTInit(void);
# }) h) }0 d2 |& s// ARM 中断初始化+ x2 F! r; j! P' [( Q# Z9 J4 {+ {
void InterruptInit(void);: ^; U( ^' t+ [, j
// UART 中断初始化/ Y! M( T/ d8 q4 _4 |' ], s
void UARTInterruptInit();
& R) Q! J8 @# q- r3 d( G. v// UART 中断服务函数! h* K& l) D+ m/ V8 a
void UARTIsr(void);
* e7 f  b. t$ o; i( V
9 N2 `  E" a" }: P/****************************************************************************/
9 i( |1 n9 K5 O4 w3 G, ~; O: n1 r/*                                                                          */
! I) y0 r# P' ^, T+ b/*              主函数                                                      */- E. F. F$ q* Q6 j4 T1 W8 F+ }; T
/*                                                                          */# n: r% Y, R( _* Z
/****************************************************************************/
  \: [5 e  u" g) L- P- w& zint main(void)
+ z) e( b% S0 t  O' @8 ^{
! \0 E& K& r3 U# h        // 外设使能配置
( g& B  J' P4 z% n7 |& G3 Y        PSCInit();+ v; E" m: D9 N: t/ }, q
       
' ?: D0 \, H2 ~$ O, |        // GPIO 管脚复用配置+ Y) B0 K2 m" v: y3 A* }6 Y
        GPIOBankPinMuxSet();
! b0 T3 n7 s8 c5 [5 {) q7 y4 g) ~% G, `8 c# J$ c2 T" y
        // ARM 中断初始化8 z) R$ ?. s1 X6 T9 t2 Z
        InterruptInit();
8 n5 t% R8 Q9 T: k; K# E0 a& ]  f0 c
        // UART 初始化
- U3 S9 f: a& h        UARTInit();
5 p) s# X8 o2 f# O. ]/ u$ r! c  ~" C- o# I, k( r
        // UART 中断初始化6 A# ^) V& r7 A& W2 X" d
        UARTInterruptInit();
' A  w# h6 g' y5 L4 O3 `. G% t# K( u8 ^5 V: u& M
        // 主循环
" d; z, y: ?6 B# O        for(;;)
, L' ^# C; w$ A: _! f        {/ Y4 ^" E" z6 x
5 Y& V+ x% N% [6 |) _- F
        }# G3 p  m: u4 c. i( }, b
}6 _. Q" Q) {$ _' ~! Q, W
8 `2 }5 I0 ]$ ~0 V0 x0 I0 l2 p% `2 a
/****************************************************************************/
6 r: i8 S5 l1 I0 L! c; j/*                                                                          */
3 T2 D+ t. `4 x/*              PSC 初始化                                                  */
( U& ?9 q6 R7 ]* R$ i4 @  w* z) r/*                                                                          */
" {" ~, B6 h* {8 P/****************************************************************************/
/ a5 N8 B+ Q! n2 F4 c9 v9 Evoid PSCInit(void)9 A4 X  Z5 J+ D/ p- ]% `8 j
{- ]5 o5 ?/ Q( R: C! a
        // 对相应外设模块的使能也可以在 BootLoader 中完成
3 Z5 w  ]7 \3 G1 a" w8 P. r" Z- Q    // 使能 UART2 模块3 }. [: x, y: Y, |' [5 q1 {+ u
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);( c. i2 w$ z6 t. ^
}% R, @# Y$ v0 a8 C8 s# p/ W. v

" K) }+ N% _1 T$ R8 _8 q: x/****************************************************************************/; q7 Q, S& C  t: i8 k+ S
/*                                                                          */
: c4 T! q( L+ b) B5 a6 y: O/*              GPIO 管脚复用配置                                           */$ S# X& [# O; i
/*                                                                          */1 V( h4 T4 q: X5 D5 k8 m' {
/****************************************************************************/
& f2 _( v/ A3 |% m, T7 Uvoid GPIOBankPinMuxSet(void)8 A2 f1 P5 l" i, X& E6 w# f% f4 `5 P8 J
{
, i3 w) \+ [/ h! c- h% A" G3 O        // UART2 禁用流控
' Q, ~; _; n1 e9 M% a: U/ f. A- w        UARTPinMuxSetup(2, FALSE);
; ?" z$ ?) O3 l2 ?: i}4 O# c, f1 c- L5 H# Q% C

) h: t, V. u+ ~/****************************************************************************/
/ v# I& ~5 P- S# j1 K, [$ J/*                                                                          */
: q5 R. ~/ B+ Q' B& d0 f( j. G  `/*              ARM 中断初始化                                              */7 X+ R( N( Z$ [; t! ]4 m
/*                                                                          */$ p9 a! C: h" B* l  Q) V
/****************************************************************************/; \( f, @' w" ?' \; [! F6 R0 W
void InterruptInit(void)* K6 E, ^5 ~9 Y: i( B7 I5 P! f8 e
{
: k7 V) T/ n1 U1 ~% b% X  n' `' z    // 初始化 ARM 中断控制器
+ O9 j, i/ Q# d) J& D3 U4 E/ R  w    IntAINTCInit();
* V* c3 C/ L% j- j3 j* b- i1 J) ^, x' {; P, e1 Y
    // 使能 IRQ(CPSR)2 h8 P, A9 O& N0 W5 h# y
    IntMasterIRQEnable();* x  K0 f! i: n7 ~1 s9 O/ y% a
) T9 Z6 y. y4 H) a
    // 使能中断(AINTC GER)1 [2 G* f5 z5 }1 c; z' y4 ?; O
    IntGlobalEnable();
/ C' P" j+ M2 e
- i7 F, m& T* C    // 使能中断(AINTC HIER)
  A9 R" Z5 L  y' b5 m    IntIRQEnable();
% P8 i; q5 v! i}
) e0 e# Y! X9 z  @/ }! _
* l" ^7 {" e% B' `+ s/****************************************************************************// H; [4 ?( d% e. g8 k
/*                                                                          */
" d# g0 c) M( W4 p- ?/*              UART 初始化                                                 */# y/ h0 v; ]9 f+ ]! l2 n5 e
/*                                                                          */
+ n* B1 Y1 @: P, R' n/****************************************************************************/& g  d' V4 R$ y9 P2 o1 F, W! c2 N
void UARTInit(void)
  M) {1 h. W, \0 C+ t" X{. W5 O8 M  J  i. _4 ^' ^! h1 [8 D
        // 配置 UART2 参数
& K+ Z& U, i6 c# i2 p# d        // 波特率 115200 数据位 8 停止位 1 无校验位
; S4 @: h6 u& B4 a    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,/ B3 ~0 ^' S  i3 Q! d; |
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);2 T. g$ U) I4 L' {+ n
        // 使能 UART2
% z/ U) a, g7 {+ a& d7 y        UARTEnable(SOC_UART_2_REGS);
+ k/ n  ~3 e! U" W# m, |0 `' C1 S
2 F/ T# r6 Y) B; b+ @$ M2 J    // 使能接收 / 发送 FIFO- S7 u/ l) T6 s* Q
    UARTFIFOEnable(SOC_UART_2_REGS);; ~8 x( j- Y) r5 b7 I& R) w, o9 }

, ~, l' T, z1 l: ~6 ?5 {; W    // 设置 FIFO 级别
1 p3 W" Z2 b: u: F; h    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);" e/ ^- N! T4 z; @4 y' N! \
}
" q3 e4 X7 ?, V7 v  n
/ ~" t2 f1 C. F/****************************************************************************/
1 H7 k& L7 y7 @/ o/*                                                                          */
8 V. C( a& }+ I4 e/*              UART 中断初始化                                             */
% s7 |" N, g6 M' E9 B% o/*                                                                          */
5 e- c6 _) t+ E6 S. G/****************************************************************************/6 U! T- S4 F4 y5 R' c: y3 J
void UARTInterruptInit(void)* P/ A: _3 N) |. q. g) Q; B8 D
{+ U% w& {. R' ^/ t5 O
        IntRegister(SYS_INT_UARTINT2, UARTIsr);* Y& P  U  |# N' R0 }
        IntChannelSet(SYS_INT_UARTINT2, 2);5 F8 I* p* W6 {( c, i% q- U  y
        IntSystemEnable(SYS_INT_UARTINT2);
1 C, y+ e9 E: l2 j4 h6 r, z5 p. r  j* I5 g0 G) Y; J: o3 I0 d2 B5 r$ R! }8 ]
        // 使能中断
4 X' O0 k/ [7 w! \6 v6 }        unsigned int intFlags = 0;
! B* C; P- E$ a9 d" P: p) @    intFlags |= (UART_INT_LINE_STAT  |  \
1 x+ J8 Q9 \/ v; C7 g! A                 UART_INT_TX_EMPTY |    \
3 }! d& k: m3 t7 L# Q                 UART_INT_RXDATA_CTI);$ j4 l5 M! j- q1 w) O# p8 g: P$ p6 W
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
6 @/ f1 x: u4 g; d1 G% Y$ ]6 Q# `}) x, w, `. o* L
7 g; I+ c6 w2 j* S
/****************************************************************************/
( w! ~/ B' }5 q/*                                                                          */
. Q( t8 J6 D+ ?, W4 S- u/*              UART 中断服务函数                                           */
- T. O. w# D3 u& V/*                                                                          */5 Y' g1 N5 a1 _4 h4 ~5 s' v
/****************************************************************************/
1 T3 q5 o, @3 u: R. r5 F: ^9 F( mvoid UARTIsr()
- `" M* h( \3 X) }! ]{7 z# p: n; Z2 h0 w$ k. P( w$ w
    static unsigned int length = sizeof(txArray);
( Z% A0 Z+ h2 u! F6 S# E    static unsigned int count = 0;+ Y) H! `5 m, r: o/ @6 z
    unsigned char rxData = 0;
  \2 F' q( B4 U: r* _    unsigned int int_id = 0;  p# F0 a0 j5 \8 f2 o7 C5 c

( l5 Z4 b& u# }    // 确定中断源
$ q! F( ?* c: [# ]0 s5 a' G    int_id = UARTIntStatus(SOC_UART_2_REGS);
, U" U* y3 X# c! o# K4 M
3 u2 e4 J7 x0 s) M  |0 O; s    // 清除 UART2 系统中断. {/ m, `0 p& z% J  F7 ^' I
    IntSystemStatusClear(SYS_INT_UARTINT2);
) C7 D- a6 F3 R' X. ~# \) g6 v
" H$ K% h$ r: s$ h5 t( a    // 发送中断
9 K9 P8 S$ f: H: ]' |  s3 n! b    if(UART_INTID_TX_EMPTY == int_id)
& g. j2 @/ Z- y! ~0 a7 t0 h    {# \: c4 T; z, d
        if(0 < length)
0 J" [- n3 b& }" z0 U        {
4 J# G: k. D  x5 L            // 写一个字节到 THR. A- U  u: q+ q; h8 y5 j! C3 M
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
. C! u, F9 w, B6 A* h) q            length--;" Q, X8 }) s3 g% u& s* ]
            count++;
% C6 e- e4 j( Z2 l1 c) L        }
5 X% D5 e* j0 W. R4 x, w+ S        if(0 == length)9 E$ b  Y9 P/ X
        {1 N- v% L  T2 H: z; l
            // 禁用发送中断( L9 o! G) e' {4 |" Z8 W
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
$ X6 I3 f/ e& N# F2 y6 F& G        }
, ?! h- {& |( I3 Z     }
( p( m; I$ ~! U, l0 Z, q* ]$ \
- f/ h. S7 \2 e8 j( D& U    // 接收中断5 x* x& B; N* ^! |7 _. [  [
    if(UART_INTID_RX_DATA == int_id)5 \- p4 |5 N8 R
    {
" b8 S* q2 o5 {        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
( L% g/ g( q* z8 }1 m* x6 K4 J; I* Q; Y" [  O7 \
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);+ q4 p8 q5 }) {$ {
    }
6 E8 @7 }3 i0 m- F8 _# o9 q. A4 p5 A! x
    // 接收错误
" D2 L: M! O1 ?' L  Y    if(UART_INTID_RX_LINE_STAT == int_id)
0 A- N9 N4 m" ^6 A$ ]* \: r, z    {
+ W. l. B% ~" r( r0 {        while(UARTRxErrorGet(SOC_UART_2_REGS))
5 x  V* h" M( K4 o) g8 ?6 _- ~        {
: x5 l, T; O$ N9 G! R            // 从 RBR 读一个字节
* I0 S( k/ {7 F" v            UARTCharGetNonBlocking(SOC_UART_2_REGS);
" J6 _- W* d3 J* J6 E        }
4 q/ F4 n; i0 \7 s    }
4 Z+ a2 S# k. ?2 \  X9 B    1 V! Z# k  Y. Q% J; N
    return;
) F3 |' c) B9 `' ?}1 w; T! ?: l" 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
9 I( O% \0 ]* J1 u  L; x" \* b+ N如果其它设备快速给你发送串口数据,你这边能正常通讯?

' H  R$ e8 J) e1 ^4 m) M谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 04:10 , Processed in 0.059577 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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