串口发送中断触发条件 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8566|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
* v( j+ z2 W9 P' W, ^4 o

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。9 I' Y% @1 X! S: H  R% W

$ f+ F7 J6 y( ^5 w#include "TL138.h"                 // 创龙 TL138 开发板相关声明, C3 E" i* d2 i

" B6 u/ `5 j! s+ r# q6 M#include "hw_types.h"               // 宏命令# o& A9 R* b- s+ m: A+ N  I' g# v
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器4 ^# |1 {4 h' F; \0 d3 n6 D
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器0 E& Z+ `# |, E/ S7 F; G
, t" Y; N; n! L& K1 D3 s& _5 [5 f
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
3 F" Q- h) o4 }" R  Q#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
& E6 N8 l5 e3 `# y+ P2 J$ w#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
/ |7 p) N% v: P. _$ x7 Y, m  e#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
# x; t. m, g2 @$ ^2 ^) S5 n: U3 _% t% M$ g! [
/****************************************************************************/1 L( y' u1 `: p1 y* d3 ^3 J
/*                                                                          */
+ w8 Y" @! s( v( u6 `/*              宏定义                                                      */& u! f2 B1 U% ^* Z, z+ q$ {
/*                                                                          */+ H# p4 H' U2 P- R8 f
/****************************************************************************/1 `; E$ Q2 m7 m! x  A4 j1 [  w) \
// 时钟
7 F4 D, m1 Y3 j" Y4 t/ P#define SYSCLK_1_FREQ     (456000000)1 c) I1 e" }* s
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2). v8 J7 a: |3 \" D/ x, ^
#define UART_2_FREQ       (SYSCLK_2_FREQ). L! V5 o6 s: S) ]8 I

# _1 L4 L' }: e6 ^+ e3 E/****************************************************************************/; n6 ]" K3 O, {
/*                                                                          */+ E  m+ B8 m4 w: x; Y: C- g
/*              全局变量                                                    */
9 V: {" z7 s  ?+ ?2 v8 @+ A: z/*                                                                          */
) U  b) K9 ^6 |& y3 G% @2 W/****************************************************************************/
2 q7 ?: a  T0 w" X- ~/ Dchar txArray[] = "Tronlong UART2 Application......\n\r";9 k% w' |8 x: l: U: P$ n3 m

( B: g: l6 D0 T. _" L/****************************************************************************/( R# A( U. R; a6 i
/*                                                                          */
8 P4 @6 t0 s9 p2 ?% D4 k4 c% n/*              函数声明                                                    */) m4 j4 U1 e1 Q6 \3 d3 l
/*                                                                          */; y5 K0 |. a4 u8 c7 H9 p$ X( n
/****************************************************************************/
6 B; U; w# G' X/ a( g// 外设使能配置
* Y/ V, T) W; fvoid PSCInit(void);6 |) L# t, q* M: z
5 j. o+ d) E) H8 u# v) e( K
// GPIO 管脚复用配置% m& i' h# C' j+ @8 Q
void GPIOBankPinMuxSet();
6 F: ^: Z) T7 o- Z1 J% W& m  U% o& D+ T7 }8 f
// UART 初始化
* k- y8 G3 O" u7 vvoid UARTInit(void);
: x2 S# ~4 I5 Z5 @// ARM 中断初始化
, Q, a: y& G) a: W! m6 [: C; Nvoid InterruptInit(void);  J6 Q( b! Q( h% `
// UART 中断初始化
( A! S+ B0 p7 O+ ivoid UARTInterruptInit();
$ O. f4 l, L8 I5 n4 r$ C// UART 中断服务函数  Z. N! e! D- z, R. X' p
void UARTIsr(void);
, F3 Z2 a9 V. h, D- I9 d' J- S& e2 A! V; g) {
/****************************************************************************/3 [' V7 _3 q! D3 v+ m
/*                                                                          */& c7 [6 D% Y; c: k
/*              主函数                                                      */# c9 e) f6 S* z% J6 I! k
/*                                                                          */9 k7 }" {8 ]( y- X4 ~3 j7 ?
/****************************************************************************/
5 h6 i$ M$ Q! S7 ]. N/ ^" i5 @int main(void)  N$ X$ i& ]5 ?! y) b$ V# Q
{' a, x$ [1 m# F1 l/ ~1 p! F2 Q
        // 外设使能配置
: a  Y  A' A3 ~5 D$ P        PSCInit();7 u5 P: H) b- ^4 X, w* F: `! |1 z
        & V4 W! Z1 u5 g
        // GPIO 管脚复用配置
- K' |+ P: w% R8 \, K4 Y. i        GPIOBankPinMuxSet();
  U) }) Z# {& u1 @! p( C3 g( F9 c. y+ \
        // ARM 中断初始化
$ S, S$ v! ~4 @3 C        InterruptInit();: i7 D: |9 z7 F: A0 H& c
$ ]  `' p; \0 a! N2 u) r) N4 W4 K
        // UART 初始化
+ U) C) p$ \! c" x6 R7 C$ ?        UARTInit();
- p) \" v8 U4 B9 f' M- i4 H2 V0 q6 ]; g8 x
        // UART 中断初始化
5 s3 v  E& o% D8 K6 U        UARTInterruptInit();
$ p3 \* p& Q  y; ^% Q* {4 b; S" }' t4 I% b
        // 主循环
& }8 \: D, B. n! w% t        for(;;)
* X1 [! I# G6 @2 o7 j        {( @5 f8 B3 y- p% i" l
$ {* e9 I3 |  ]" I
        }
7 s9 F; E: z. F/ w) h}
' y6 H) V% G6 v6 l- E& M  o1 P* q$ X% F# e$ k
/****************************************************************************/
- w3 J* U+ ?4 }- v2 M/*                                                                          */
1 O) t+ r) U+ @( j& }0 R+ }/*              PSC 初始化                                                  */* g: @! W; b. {" {+ p8 U
/*                                                                          */
. Y% K& e- F; q* o# |/****************************************************************************/
% G# t  m# l1 k7 Yvoid PSCInit(void). B( {; ~" C( M
{. ?  P, D! w% [, [) @  @$ o! y0 f
        // 对相应外设模块的使能也可以在 BootLoader 中完成+ q0 d* b# M8 V) r. x/ M" ]* z
    // 使能 UART2 模块
4 _+ \; t6 m7 P+ |3 b6 [1 Q    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);3 [3 b$ N; \  l7 V
}+ w. `6 n0 ~1 z- S. j2 k/ m

9 A. q+ V, Q9 b1 m1 F  \! A( s/****************************************************************************/$ _/ A: F2 p9 Z3 l
/*                                                                          */: ^5 P/ ?' c; \2 N6 n9 d
/*              GPIO 管脚复用配置                                           */( ?6 g' l3 t" r: h6 x, h
/*                                                                          */, ~# I. w1 ~$ S$ l. Z/ Y) R- p. E+ T
/****************************************************************************/
9 C4 Q- p6 \5 b2 uvoid GPIOBankPinMuxSet(void)
6 e0 ^: ]% C7 E- A{3 d1 @: `# h; j: k0 O, [
        // UART2 禁用流控
+ f9 r# \$ n; c! Y9 i. d        UARTPinMuxSetup(2, FALSE);2 A; ]  @! e2 T
}+ E" Y9 w0 k9 r3 e& O9 p
% p' h7 h' ]0 y, \; @
/****************************************************************************/
, C% n  L9 y/ Q/*                                                                          */
9 N' r. F6 a1 E, u& y/*              ARM 中断初始化                                              */  }, X; U2 n, R& `- |% M
/*                                                                          */
2 t/ v5 [. n2 y/ q4 [9 N1 s/****************************************************************************/6 I) m% S1 [  Z# U
void InterruptInit(void). e8 s7 V9 ?5 x
{
# s% Q, P5 o; N" b$ q    // 初始化 ARM 中断控制器
/ ?3 b/ e6 K4 r/ U8 ]    IntAINTCInit();; A& H: ^+ w1 |8 R/ S) Z
4 x& L& C/ x  Z" h, u: w3 \( @, j
    // 使能 IRQ(CPSR)
0 K% ~3 e3 m$ O) }. u$ ?' Q- Q    IntMasterIRQEnable();1 b' D: N; H, [8 B* ^! P. X" Q

8 d! z( |3 E4 y) R3 {+ @    // 使能中断(AINTC GER)
, K5 h) v/ A# A0 U: @    IntGlobalEnable();5 y0 x8 i7 L* x$ F
0 ?: S2 e8 g# C9 C/ W+ L# ~3 K4 e
    // 使能中断(AINTC HIER)
' S  M' a+ V8 X7 I7 Q9 }6 w    IntIRQEnable();
' d) q, Z7 X' }/ b1 I}
4 |, `% s+ u2 w( a3 W. G1 ^" I9 S4 j
/****************************************************************************/
0 q9 J  L! d, B$ H) P0 q! J7 i! q/*                                                                          */! L+ I. Y( _' [0 S  n& `
/*              UART 初始化                                                 */
% \2 i4 I9 v% v$ [. w- z" w! a/*                                                                          */
+ t" o) d; _% w% y& z/****************************************************************************/) w* ^) h2 a  [9 X5 u& r. S% L
void UARTInit(void)
/ `1 F0 Y  k% A0 G{
0 w* B# b* f2 H2 K3 w) X+ A        // 配置 UART2 参数) L6 a6 n: I' O3 A% E* ]
        // 波特率 115200 数据位 8 停止位 1 无校验位* _5 \- L# ^$ J* E+ T
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
" [. A* e% H' a0 ^" w. X6 q  J                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);. X) W1 P8 U6 |1 e2 N) d0 A
        // 使能 UART26 D) ^7 A0 z% i5 D7 Q& V, a3 K4 y) U
        UARTEnable(SOC_UART_2_REGS);
6 l( {  G+ p, y! F, N" ^
- g) c2 E! [/ z2 T7 [! }    // 使能接收 / 发送 FIFO
  j1 v) r' H" h- K    UARTFIFOEnable(SOC_UART_2_REGS);
0 a% b( ]9 O$ v! O2 G8 F( j8 l  d- Q; p" k+ q6 ]. t
    // 设置 FIFO 级别3 ]9 c8 A$ k; W
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
, P" D, c0 X$ ], }}
' ^5 k' G$ F& I/ K
6 U/ C0 U3 o8 D: W/****************************************************************************/
% g' W! y" S$ E3 f/*                                                                          */
  H! }  e$ m' n0 [0 T/*              UART 中断初始化                                             */
* o! b, k" V- F% ]6 S7 {/*                                                                          */% B8 o9 w  o; F
/****************************************************************************/
% G5 o' l: d! x( Qvoid UARTInterruptInit(void)2 `+ F3 J+ a$ m! C" s) q+ t2 U
{
: g* Q. c5 r+ U+ Q/ C        IntRegister(SYS_INT_UARTINT2, UARTIsr);! X$ x' d+ K' K' `' L: c
        IntChannelSet(SYS_INT_UARTINT2, 2);% ~. L7 q& m$ v- r; @  W
        IntSystemEnable(SYS_INT_UARTINT2);8 T# e. G' A% G0 u! b
& R4 h9 V( z$ ]- Q  D  U1 }
        // 使能中断
& y2 [7 o+ j$ j* W. `9 k        unsigned int intFlags = 0;
. l* k/ H2 D2 p' V    intFlags |= (UART_INT_LINE_STAT  |  \
8 U8 w: V3 Z+ E* n' F; V# o                 UART_INT_TX_EMPTY |    \
7 t' Y4 `6 D% {. |0 R. |% E6 L                 UART_INT_RXDATA_CTI);
; Z' T+ {% ?$ z7 ~* O6 R    UARTIntEnable(SOC_UART_2_REGS, intFlags);2 t: E! J% p: }6 v
}
/ n, s1 O, R: o8 G* b, C* k$ \. ]6 p* _: J( x
/****************************************************************************/
! K9 D  h0 `( N/*                                                                          */
; u% h) @2 m0 i) @/*              UART 中断服务函数                                           */! t4 u. A9 H5 G0 `
/*                                                                          */
$ t  l% r" ^* j, b/****************************************************************************/
7 K+ Y/ ]) n+ e/ Y* H0 Gvoid UARTIsr()1 [# S' a  r* i0 j
{7 k4 n' r) j0 l. l
    static unsigned int length = sizeof(txArray);
& W1 @) k  [( I    static unsigned int count = 0;
1 P: C$ W7 P2 l    unsigned char rxData = 0;
& F4 A2 `3 S* ~3 B) \1 b  j% G* R    unsigned int int_id = 0;' e. r6 I5 \3 s4 R/ X5 V

# `4 |! N) b# V* U9 q( i    // 确定中断源6 O5 }; t+ l+ k) C1 ?
    int_id = UARTIntStatus(SOC_UART_2_REGS);
9 f  L- v. B- a0 \2 ~! h/ u9 n5 h; A( R5 c5 ~# t/ i6 Q
    // 清除 UART2 系统中断3 @. d( @0 i% m2 W
    IntSystemStatusClear(SYS_INT_UARTINT2);
- I* r% Q7 l1 R$ W6 d& ^' O( G
" j8 d6 J6 r" l& u7 ~3 ^. h) j/ M    // 发送中断
% K& K+ }) T6 x! f  n6 p    if(UART_INTID_TX_EMPTY == int_id)
0 M6 I& Q% }0 D! T2 `    {
% w0 l5 S' k: D" [        if(0 < length), Z. C) y2 @& W% ^' A* g* Q
        {4 I/ e7 |, N1 g4 {$ `
            // 写一个字节到 THR) ^  l4 X. F* Z. l/ g& {5 E0 x2 f
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);5 |  b+ N2 X+ X% n" K
            length--;
+ b6 V) V- B! b            count++;% ~$ I. J- U: z5 Z" w' m
        }
' E2 o) E1 k) e        if(0 == length)
8 H) b8 u" \. a) {+ Y        {, A4 B0 s' Y5 r" z8 m* O2 r
            // 禁用发送中断
5 ?/ I3 G3 m3 l& z6 H3 p  T            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);/ y; x  C; v/ ]7 Y* L5 a5 A2 l- y" t
        }
1 C* J, @' G# L9 A! f1 A/ j8 c% u     }, c8 @, I" ?( I; _6 B; f
! W& q" i9 W7 `) t0 i4 S8 U8 @3 S
    // 接收中断$ |  b! I7 V% Z6 u2 u4 A: E' v
    if(UART_INTID_RX_DATA == int_id)
: v  O4 Z& O4 d  M7 W5 p6 C' p0 P    {
4 K) o( d" r4 `& M        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
& A) Y# {: V: l7 S1 s/ [# z. ~; D. z  V" T* t
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);" d" j$ s1 R$ M# |$ u2 B$ L4 y! r, R9 S
    }
  ^0 ]% l, p$ \! n
) J/ K2 D4 N( _" e- B, ]" H' N) p- U    // 接收错误
( @. \. ?  q/ x  n( N  d2 n    if(UART_INTID_RX_LINE_STAT == int_id)6 C# y$ Z8 e& D" f: G
    {
( X- [/ d% Q+ C  L( W+ Z        while(UARTRxErrorGet(SOC_UART_2_REGS))- b3 [! Q/ ~, u1 q& C6 \# k
        {6 q. s9 J6 Y% }9 q
            // 从 RBR 读一个字节
1 I+ w& }+ d2 ]6 x            UARTCharGetNonBlocking(SOC_UART_2_REGS);
- C1 X5 `, D% P0 v9 Z        }
1 S! W( y! H0 b# d" T# }    }& s. g2 U5 N% ^8 n. {
    4 |! W* o' b7 Q% |" `7 j
    return;
1 y. s5 R1 b5 g- W0 W: P}
; Y( P4 P; e6 T4 m1 O3 J
回复 支持 反对

使用道具 举报

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
- }1 z0 B. r) g1 w) D如果其它设备快速给你发送串口数据,你这边能正常通讯?
  ?! t% e8 ]1 R. k( b+ |9 C
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-2-28 19:15 , Processed in 0.043648 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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