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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7587|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。$ z3 L' s& d% q1 }

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

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

% O3 B. I; D* X) m0 A1 i4 e% J; A* f#include "TL138.h"                 // 创龙 TL138 开发板相关声明; b. [1 D0 @8 @7 h+ q: O( S

7 f" A' y+ I0 i- b1 y, C$ ~1 L) p#include "hw_types.h"               // 宏命令$ I+ R/ Z9 d, j+ J
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
2 C2 f2 P' C  K- c#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器# y. }/ K; {- P7 D# t  W! o1 B9 l( Q
7 f* X6 P9 L+ d: A1 q
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明. a$ w* Y8 k5 S* u
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明0 W5 M6 {# |7 h8 A2 }1 C; q- ]
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
( k& Z( o4 j, U# v) a#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义9 Z9 E0 o  X9 ~  A( I8 E

) L# m, Z9 @! ~% R/ x$ T/****************************************************************************/
; E9 ?. ~# P/ V7 i' I/*                                                                          */. F. ~$ c0 M) m, l. K  e' r( T& e7 l
/*              宏定义                                                      */: e( V, ]: ?* n/ {
/*                                                                          */8 m/ A1 j( h. B
/****************************************************************************/
1 Y. W6 k' v% f% f2 J) o// 时钟! [" H- O2 Q& G+ v! f
#define SYSCLK_1_FREQ     (456000000)
# o: p. R, f3 _6 a8 y0 e#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)# B7 p0 C7 `: \. x1 ?0 M6 N5 E
#define UART_2_FREQ       (SYSCLK_2_FREQ)) B+ a3 a+ j: V& p; ?2 m+ H
  P/ G  h4 C7 w+ X3 s: m+ [: U
/****************************************************************************/
0 o7 [  c( t& ~0 g  F9 Q/*                                                                          */& `5 b7 k) M" m8 e
/*              全局变量                                                    */
8 m3 }, b, u' c" e! T) p: v8 F/*                                                                          */, E. X( d. G2 Z, f4 a% S
/****************************************************************************/
4 a* o* e3 j3 u0 K9 i3 Fchar txArray[] = "Tronlong UART2 Application......\n\r";
2 r# m6 p- X0 e  w8 G2 ]1 G
. G. d- Q3 [1 y* ?1 r/****************************************************************************/
0 [+ n/ U8 N, P- r2 ]* `/*                                                                          */
$ ~% x4 c# A! ?, g6 P5 {/*              函数声明                                                    */, q! \& l+ N, ~
/*                                                                          */$ S/ I7 `) _- B% ~* E
/****************************************************************************/
/ g$ o' h9 ~6 R+ |% y4 }$ o// 外设使能配置
3 `, x+ D, @% H3 F) m, V# s# ivoid PSCInit(void);
# v4 Z' p  {- l5 n  B- j
1 D, r; Y7 d8 q4 K- \5 ^6 e1 p9 `// GPIO 管脚复用配置
4 h3 D. E/ ?6 p* `6 k) [void GPIOBankPinMuxSet();' r# z: D( h, z% o2 d
" Q* d/ _9 ^7 U+ X% p) ?8 `
// UART 初始化
9 c7 q5 q/ ?) t% t( m# pvoid UARTInit(void);
' j+ F. t- ^8 ^  W6 K# D! j// ARM 中断初始化
1 b* _& a* H" [3 V0 j) Y, k) nvoid InterruptInit(void);
% d5 Q; {- C3 a1 P// UART 中断初始化: i0 V; j2 e! G' ^% F: i7 X
void UARTInterruptInit();
6 H) ^1 L. a* H1 i6 n! Z// UART 中断服务函数
: E  k6 |5 k$ Z5 ^/ L+ l  Bvoid UARTIsr(void);
1 x, M& f) F* X1 z6 U$ t. t0 R2 f/ J( F" Z, ~6 Z
/****************************************************************************/- \- d% V7 ~$ x
/*                                                                          */
9 M5 V+ _5 X4 [# `/*              主函数                                                      */! |# R+ u* \7 {  T
/*                                                                          */! n1 U3 U1 j0 ?' J9 R* C
/****************************************************************************/
# u% P) w6 ]" o( hint main(void)
; Z* G7 |+ l% q{% M8 o! z2 m' P9 c! `# O; |
        // 外设使能配置
) ]9 i5 }, a( }! f        PSCInit();
) C, l4 e# E  {: ^- i/ X        - U: I+ E- `( e; `* c
        // GPIO 管脚复用配置
# d/ W3 V3 ?' [' t        GPIOBankPinMuxSet();
7 V: L7 d% I3 a* x( P6 C
1 U$ ^+ F! E0 f! K        // ARM 中断初始化) H4 M2 E! E/ q9 O8 D
        InterruptInit();
! Q3 y; ^5 N7 `" K2 K
3 H# s" E9 `/ B! o        // UART 初始化0 y  v) e6 g' y$ b* Z
        UARTInit();
, ~8 T. G9 X0 @' l% ?
8 k* {0 C+ R2 a0 h& }5 S, \        // UART 中断初始化7 O: e/ T7 ], u9 j0 |) w4 C& @
        UARTInterruptInit();
" Z& ~  [9 Z3 @. r% w( ]% N
: E0 p  g$ I0 P4 q4 n, ^' E% \        // 主循环
% j4 D* W/ Q9 p; P/ ?5 L        for(;;)% `& ?3 L8 ^' [" k  G$ |' @7 V
        {
# T+ \+ t/ j8 ?. R  n1 A1 Z3 o; X9 f1 `( `+ E
        }
7 y5 _: }) ^/ r+ J0 s}, l7 g3 k' s: z9 S% ^

1 c  a0 R# I. x+ n4 ?/****************************************************************************/) l, V" I+ ^' i
/*                                                                          */( Y6 \' b5 x( @9 W: l# P
/*              PSC 初始化                                                  */: Y/ K. [3 K+ c/ X! H8 _
/*                                                                          */0 G5 ]6 s! e/ j
/****************************************************************************/
$ ]% V4 _. d6 Y) `  a' C" C$ Bvoid PSCInit(void)
% E% ^5 e7 M7 ^  a! ?- d; k: I{5 ]9 U# |% f( w! D' {0 k. x* G. F/ s
        // 对相应外设模块的使能也可以在 BootLoader 中完成
& J; P, _" C7 e+ s    // 使能 UART2 模块
: w3 R" z& D* _8 s7 }6 x6 k2 Z$ C- p    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);$ z9 S: D  b' S, j* d
}- E, D# S: n* a* l+ X) V

9 m4 u0 h0 T  Q. }( c/****************************************************************************/0 a* b  I! H+ z8 H& r: m
/*                                                                          */
$ T3 `0 I. B% r9 ?/ h  K/*              GPIO 管脚复用配置                                           */  {' x0 ^  z) q. `% g- P, Z* }
/*                                                                          */
  |6 g6 T% M8 T4 B( }- q/****************************************************************************/
& R/ _5 k& W" w5 j& i! N& {void GPIOBankPinMuxSet(void)# Z% y" g5 A! H2 u
{
, C; i" U4 o% j4 A5 D1 R        // UART2 禁用流控
2 j8 S: j9 j' s3 f) d: G        UARTPinMuxSetup(2, FALSE);
( v% J4 |1 l8 S) F$ H5 |}
2 u" y- A: R& q9 B
) B# O1 ^0 @' E/****************************************************************************/  t! w5 p2 |+ L8 n' q
/*                                                                          */
; `7 o8 Y5 s: K6 I" {/*              ARM 中断初始化                                              */
. y# r% d7 T9 W# K/*                                                                          */% P" N5 M% D+ E9 r. v
/****************************************************************************/
- K7 b% {, j' C5 G/ C1 V- Evoid InterruptInit(void)
* D) N* ]- T5 ^* B# A{- @9 O7 m) A$ B" |8 Y
    // 初始化 ARM 中断控制器
0 w5 `, j' v3 {: P& t    IntAINTCInit();; ]: U4 o0 |6 I$ c  v1 N+ a
/ z1 R% p' R' `6 l
    // 使能 IRQ(CPSR)
% C" J+ ^+ `  |7 ?    IntMasterIRQEnable();  B3 [& \  r  C
% B+ w$ c. f, _( l" K! s( i
    // 使能中断(AINTC GER)
3 x+ L  ~" G5 x: H    IntGlobalEnable();
. V4 o) L  @0 {4 e6 V
! J9 w* T4 @/ m2 t    // 使能中断(AINTC HIER)
5 a/ c( _' Q0 M7 f' t; Q0 A4 m    IntIRQEnable();" D, w+ M5 B- a& _0 U5 y/ K4 i
}
! L1 v1 r* @& f( x5 S1 |3 C
3 D  v# r  ~: t, G2 a/ h# e! j" \) O/****************************************************************************/, b) G- t$ b. Z* y
/*                                                                          */; G8 X+ w6 s% @1 q0 E
/*              UART 初始化                                                 */; K/ v( _5 I: |' F  F
/*                                                                          */9 k7 ~5 ]& l" R5 ]. x9 P
/****************************************************************************/
/ U4 z. N! [3 I4 u  M: Mvoid UARTInit(void)( f; x1 M7 j7 _; A' q" s1 B
{. v' F1 y; X' ?6 @  N) w
        // 配置 UART2 参数& x3 k! W; ]" r2 t
        // 波特率 115200 数据位 8 停止位 1 无校验位
" Q5 J; ~5 k  Y$ x1 ~0 n2 A# S! P    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
4 K: u& W. j- ]6 w                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
4 Q; M  ?' `$ H* u# }2 U, W* Z        // 使能 UART2
+ K5 g' W4 u& c% F, |( D6 k        UARTEnable(SOC_UART_2_REGS);
, b& V+ U6 u! L
3 |$ F0 w! U1 I* Y' v& k- `    // 使能接收 / 发送 FIFO' H. s1 R6 W& L# W; u; J
    UARTFIFOEnable(SOC_UART_2_REGS);9 o$ q# G& c0 y0 q9 h" m9 _

* y9 X+ _: k& s  t. j, k# L    // 设置 FIFO 级别
( N+ K$ A# e1 b$ G9 w$ G$ L    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);" I' m5 D& H3 {# I( M9 `
}0 }3 O1 t6 n* ]) ?

3 e  }2 Z) h" p( m0 ?& W/****************************************************************************/
' w' g, [* o3 B/ f' x/*                                                                          */$ _+ ^& e- H' v6 G$ s! |
/*              UART 中断初始化                                             */
( z7 M3 z& e+ J9 _/*                                                                          */
! X+ y2 z! W8 K7 g7 j+ Z/****************************************************************************/5 `) t! U9 }0 h
void UARTInterruptInit(void)% w1 C  ?  `: l$ S
{; m6 [$ E4 C1 ?" ~% K3 Q( b0 M
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
4 a/ u  Z% K- L* R6 C( z8 p        IntChannelSet(SYS_INT_UARTINT2, 2);1 z8 P: s' A1 x0 E
        IntSystemEnable(SYS_INT_UARTINT2);% s8 v+ `! P+ T: w- F! ?; a0 g* A

( Z! h9 B8 e8 E# e' v        // 使能中断
0 l7 O' T0 |8 Y        unsigned int intFlags = 0;% h! i: E; z: `6 Y$ W8 p
    intFlags |= (UART_INT_LINE_STAT  |  \. s% s6 ]6 u- ^! z
                 UART_INT_TX_EMPTY |    \
) I4 Z5 r# z. N3 a; F3 U                 UART_INT_RXDATA_CTI);! P6 V/ [9 d+ N4 v
    UARTIntEnable(SOC_UART_2_REGS, intFlags);+ t  Y7 b! Z2 S) _0 j9 v/ A
}
. t1 B8 @! {" t6 x
! N, [# y: t1 m/ t: ]/****************************************************************************/  f# y2 |0 n" O& G2 D0 O
/*                                                                          */
$ }0 a! P2 b- p8 K. t/*              UART 中断服务函数                                           */
2 i; M# J: \( Z& y/*                                                                          */' D! D0 k( y6 v3 \- ]9 I" |* |
/****************************************************************************/3 d) J. J9 M( X9 Q; W5 E3 y7 H/ V
void UARTIsr()0 a9 G6 C0 r$ u! k5 C9 M
{
% A2 G" B$ n' u5 Y    static unsigned int length = sizeof(txArray);$ S) t, t3 q! W" I
    static unsigned int count = 0;" o8 o* L. j3 i. D+ a8 `
    unsigned char rxData = 0;
$ T' [0 ]4 [$ }; |9 T" G+ k    unsigned int int_id = 0;
* s  u8 x3 E4 G  z$ o5 R; `( V  S- G2 G# j
    // 确定中断源
6 {+ J9 t& H8 i& o4 e    int_id = UARTIntStatus(SOC_UART_2_REGS);4 N, C, W. W& _. M* n0 x0 c

7 i' Q3 i6 j& }4 m# c5 q    // 清除 UART2 系统中断
8 T5 m* ?$ k% e4 O2 n    IntSystemStatusClear(SYS_INT_UARTINT2);
+ `0 P7 A( O1 {0 e* G$ H2 g! S* g
    // 发送中断/ L/ @2 V& K5 |( ~
    if(UART_INTID_TX_EMPTY == int_id)
, c" `" N. e: f) Q3 D* \1 Q    {" e6 f1 V9 T8 \  m
        if(0 < length)
% A1 z5 F9 `3 R6 l4 q" X+ s* v        {( G+ [" F( X6 }5 e$ i1 u& y5 C0 e' S
            // 写一个字节到 THR( i- @; V! J. n& m
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
2 I: ^2 d& M7 x3 A            length--;3 z$ n7 }, i# Q3 L6 Z
            count++;5 d/ `1 G" ?; n, K, _% w9 i0 d
        }5 ?, ?5 D0 X8 {& j* S
        if(0 == length)
& N1 I5 c" }0 l3 X0 G8 ?8 R        {( W6 ~: q) @$ h3 h& _( R
            // 禁用发送中断  o0 @5 o; m: ~4 N$ R8 D
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);6 m# R4 W9 P* g8 f
        }! n5 }6 \0 ~' R) ~! N! Q
     }
5 r. O0 W" K- s
, Z) t3 ?* C( M    // 接收中断& y  ]7 _% O1 A
    if(UART_INTID_RX_DATA == int_id); p' D! F% k1 a( K1 c! z9 M. [7 O, P
    {8 x) l3 [% o# a7 ^7 P# Z1 @! V7 }
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
3 \+ t+ B- M1 m% Y5 n
2 M; F( B+ Y: R5 i- J6 U! s        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
( c  h5 W( Y5 U- g' G! _    }
! w) k, {! |" ]+ ~- C1 V  E* i$ P. n8 p- M0 e
    // 接收错误* M: z. Z1 h9 Q2 Q5 N# K( u3 P
    if(UART_INTID_RX_LINE_STAT == int_id)0 x5 \0 v; h. L, J. V4 y8 G' ~( S
    {' j7 T7 k( ~  Z0 `- P" b% q4 |; S
        while(UARTRxErrorGet(SOC_UART_2_REGS))
8 O3 y* ]2 g  R$ `4 V        {2 `! _; t( ~- x: }  b! B2 G
            // 从 RBR 读一个字节
' |2 [$ v. |% o, _! O            UARTCharGetNonBlocking(SOC_UART_2_REGS);; u( }' J. U6 e# |$ n8 w! k
        }1 E7 R2 R+ Y, y, H+ J' {4 N& _7 q! g
    }1 ~+ d  h. L/ y
    9 V: ^' X- y: k' [. T2 ?3 ]
    return;
) A$ B$ H$ o0 g) }$ k7 h$ b}0 s- N; `- w$ n
回复 支持 反对

使用道具 举报

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 y& ]# U7 ]/ C) U8 Q如果其它设备快速给你发送串口数据,你这边能正常通讯?

# F" e% K4 I: r% c" X/ Y% I谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-3 04:21 , Processed in 0.048368 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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