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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8682|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
! F% I' t2 i4 Q6 @% A

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。. e! T2 X- u0 y) K  l! v2 c
+ `' J/ e8 ^' r9 Z/ {, y* V, U
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
  l0 P; H; c8 n) B2 u* E2 P5 h1 p1 P; U6 y& Z) v
#include "hw_types.h"               // 宏命令
: z* Q) q% z1 S/ d#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器9 F' i& C; k; g& U+ }. r) h
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
0 y, x' `+ D- Y* ^2 Q2 c/ d3 H$ V! s1 }
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明  l7 L0 n0 S+ j; m
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
3 s+ l! g- G, [#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
0 \6 ~& c9 }- C6 G' W6 F#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义9 u5 m- X+ p, Y" t  ?, w* A
7 P; A, P7 C4 P: D6 ~, }
/****************************************************************************/& [! z" `0 B5 V& H( }: l
/*                                                                          */
  U7 x: j8 {/ n- R/*              宏定义                                                      */
, \3 S9 I1 Y, u2 w; G* C  |! F/*                                                                          */* h. X) y: w8 S# [- a) b
/****************************************************************************/+ O$ K) K8 [! W- l8 U+ ~& C3 K
// 时钟9 H) p" P$ M, l' V) z
#define SYSCLK_1_FREQ     (456000000)2 o7 C: y/ r0 E8 H# S
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)* X: K5 g& `! X, I! v( e
#define UART_2_FREQ       (SYSCLK_2_FREQ)
& r1 H, T( h6 P' W: p6 O8 U- e3 A% t( R& c& K1 ]8 y
/****************************************************************************/6 T% F$ i6 O" R
/*                                                                          */# h, |' _1 C! @. K! |
/*              全局变量                                                    */
; {" w0 b9 k8 W* D: B: h/*                                                                          */
& X8 K" [8 E. J/****************************************************************************/
: X! @0 y. R- b9 ?char txArray[] = "Tronlong UART2 Application......\n\r";
0 {- E+ D! P" v7 c' Q0 i7 U
0 S+ [4 k* Q. a  g9 v/****************************************************************************/4 [9 [; W9 A* Z. w. M' e0 P
/*                                                                          */5 `' T) }* F% K5 v
/*              函数声明                                                    */
* g2 Q6 H, }$ m- _% [  I7 w/*                                                                          */9 `% D/ b! o: g3 D. R! |5 H" P
/****************************************************************************/# l' V+ {) M; r0 p! H2 C% ?3 C2 Y# b4 b
// 外设使能配置
4 P. O4 ^- z3 U  w% yvoid PSCInit(void);/ J: b4 j$ ]0 S6 L8 [
" E# o* ?1 ?8 e1 m
// GPIO 管脚复用配置
5 n8 G! j  G3 I' bvoid GPIOBankPinMuxSet();# d( t2 V4 o6 B2 o

& j, d* x" }! Z* T: B' }( P& o// UART 初始化# j# r1 I. A6 `4 |0 S/ M
void UARTInit(void);
+ O) |& k' J+ \! b$ E! {6 d: r! z  \// ARM 中断初始化
8 V0 }% ?* e( T2 B6 Qvoid InterruptInit(void);
' [3 ^, E+ B- m# ?# U// UART 中断初始化
, o. l3 A: C0 R) c3 q' nvoid UARTInterruptInit();
6 C% E( h6 W7 L2 |5 Q6 S0 g// UART 中断服务函数+ s! ~( t/ I" K5 m. f, ?
void UARTIsr(void);
& E7 d6 t2 c* ]' Y& t) S9 J8 Y: }
# e* \' |5 _0 z( l6 o2 S/****************************************************************************/
9 j9 L0 x  `( d1 W; ~/*                                                                          */" r$ z8 O5 M6 I( R9 ]( m# h
/*              主函数                                                      */
0 k- S/ `5 V7 |# r5 I+ A+ z3 C7 n/*                                                                          */
6 O! n- W3 Z5 C- v/****************************************************************************// \: O6 Q( a9 {& Y6 Z' ^; I; d8 Q
int main(void)2 ]; d. f* K4 U- C+ D, A8 N# k
{5 T0 C' S! w: r6 r6 W) M1 K4 G
        // 外设使能配置
# F& H) J( v, d+ L$ `        PSCInit();
$ i" _! G2 P; \( ^6 A        & v, l# d+ a3 \7 I8 |% T- ~& q
        // GPIO 管脚复用配置7 @; V1 w* v. |2 D; J  R! O2 D  K
        GPIOBankPinMuxSet();
4 q# |& ?: k, K8 g, f0 ~. h- {& F* t& x/ E4 |/ U; p, g5 x
        // ARM 中断初始化
' @! D( `/ ]/ C% z( g4 i        InterruptInit();
8 E( ^' p$ t8 z+ P: T" t
4 V& R7 }! R0 d$ {3 i* z        // UART 初始化
2 R& X% W& Y8 I        UARTInit();
$ M8 k1 B, J! U; v( p; C' O2 k9 w, T' G
        // UART 中断初始化
$ L8 O6 q! n# r8 V        UARTInterruptInit();* Q% O5 V& P) E9 M# T3 {
! g: Q" M% q0 w
        // 主循环3 c9 ]% p4 a8 w8 z7 b* X* T
        for(;;)# o6 m: I% L) Z1 q
        {+ N% h9 V- t& f* }0 ~' R! {
1 L& S  p* {: `! h
        }
/ }- G, b4 e* ~( F* x}; s8 @9 H5 s+ V  ~, h
& h8 v2 O% y4 |1 S: I
/****************************************************************************/
' p  `3 h2 X& K, P/*                                                                          */
0 M  r! c- v: J6 S7 `! K" E: A) l/*              PSC 初始化                                                  */
, I+ }% b! V9 `5 I1 J) t$ |/*                                                                          */
. Y8 ?, |/ m! m+ U+ x1 o9 j, i/****************************************************************************/) f0 C/ h  K2 H, v! G) s+ V, `
void PSCInit(void)) J1 `3 t9 I% A0 s3 ^( Q
{
# e3 h0 ~( h) P5 M# i7 ^6 m        // 对相应外设模块的使能也可以在 BootLoader 中完成
' u( Y. K3 Z! S  d# Q, f: L* m6 D    // 使能 UART2 模块* Q- u3 e" D8 R8 n
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);7 w+ _% _' h7 }  K
}
6 E8 t5 m2 v0 ~3 K, Y+ l$ ?$ E; C' z% k$ y( J& `
/****************************************************************************/+ m7 v) O- n! @, e" P
/*                                                                          */
; I$ }: p) T2 W* u  E* d/*              GPIO 管脚复用配置                                           */
8 J4 d7 X( G2 Q/*                                                                          */
9 p4 b5 B* C, W/****************************************************************************/
: I( a4 a1 J0 Q% P1 T; Kvoid GPIOBankPinMuxSet(void)
& c- Y# ]! P9 s8 k8 ^/ P{9 W: S/ [: e( E  c6 C0 w' p: x
        // UART2 禁用流控  I7 G8 R( R# O: q2 V3 J) O
        UARTPinMuxSetup(2, FALSE);
$ k+ t& U/ }; j2 x}
/ i) V$ y' T0 M0 G+ @% {- ]$ Z9 ^- p" }0 C9 q" X& S
/****************************************************************************/
  [5 l! {3 J; j' ]8 m8 e1 u* A3 J/*                                                                          */
+ ]( [( @% b. ]/*              ARM 中断初始化                                              */: N( R! `6 {7 L0 y4 V; K
/*                                                                          */
: g& O0 s( p5 E; y" X/****************************************************************************/
/ i) g/ I/ t. l) N2 `& {void InterruptInit(void)/ {' V1 e  C8 ~
{+ Q; j" x+ R7 |
    // 初始化 ARM 中断控制器
$ j, w: o: @/ C% o0 {    IntAINTCInit();
* M8 G1 t$ E4 e% @' n" h) ]6 d) Y) ~  K4 s1 b8 B3 p& w
    // 使能 IRQ(CPSR)
% }8 r1 J3 S4 ^1 W    IntMasterIRQEnable();
6 ~& |. {8 L0 H8 r  f9 k) V1 F3 `' f: V8 ~6 O1 M. |: ?/ N- X
    // 使能中断(AINTC GER)8 ^. X. C- M% h$ K
    IntGlobalEnable();
! I  a! t9 J* D3 E' v$ `" r  c. G
  x( g" C/ B" h) {. _' Y    // 使能中断(AINTC HIER)
. f% e* D4 P2 P3 ^9 d* t6 e    IntIRQEnable();0 b; ?- ^' k, e! X2 W' u0 F6 j" x
}, u1 V" J. J% J- d
- B* P& j! c0 ?7 S
/****************************************************************************/- C% U$ U7 @5 K) _, S/ R
/*                                                                          */& {& K! U2 a7 j8 e1 M7 v% c# v
/*              UART 初始化                                                 */
/ I3 G5 |2 M7 X' H+ ]/*                                                                          */3 Z3 e8 a+ c& Q, Q5 F
/****************************************************************************/
$ c* V. f2 r% [void UARTInit(void)
! P3 x  f6 K% t. R8 x/ `{
% I1 v* T: j7 @9 z        // 配置 UART2 参数
; X- w! o/ m8 H6 N( p1 {* [( {        // 波特率 115200 数据位 8 停止位 1 无校验位* [2 x) p! ?* g5 U
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,$ v: D, \+ X" g$ J! C
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);  E$ H7 H- [( m( _
        // 使能 UART2
% w% ^, s1 l/ k2 ^& g$ x: P        UARTEnable(SOC_UART_2_REGS);
1 P6 {/ `9 g% I$ p
. Z. C' D5 ^+ C) O1 j8 a    // 使能接收 / 发送 FIFO& Y! N( r/ E) s/ i' y' x  q- V8 Q
    UARTFIFOEnable(SOC_UART_2_REGS);( A" B& @$ s3 J3 l9 `- m9 u; E

3 H2 V% i2 i0 D9 @! e. y    // 设置 FIFO 级别
% W" U& w; ?% r+ y8 r+ C    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
# \3 T3 Y7 h5 H! I  W! C4 W}
  T9 I/ {& U& k3 T( Q
( ?8 k" @, P7 a; g" h: `/****************************************************************************/9 O5 R1 X2 e$ S( q+ H: @
/*                                                                          */" `' z9 |: Z3 N  a+ @
/*              UART 中断初始化                                             */1 [! J2 y6 L" r2 A( G( K2 Q# m
/*                                                                          */6 P5 O2 s# K) o1 z' Z
/****************************************************************************/
2 P# u7 a! b  M5 {' ovoid UARTInterruptInit(void)
  a, j  h  `2 G1 F% O) I5 M{! P, X8 }: v( |. c, T3 ?
        IntRegister(SYS_INT_UARTINT2, UARTIsr);+ ~$ h- B- C% R) k
        IntChannelSet(SYS_INT_UARTINT2, 2);( {) K6 j3 |) U1 T, w! v
        IntSystemEnable(SYS_INT_UARTINT2);
8 W7 w5 j) d: l" W6 |& h
* E) w; q7 u, j) d        // 使能中断5 J0 F" J8 a! k! s
        unsigned int intFlags = 0;
7 ]0 k9 u9 A  D9 O    intFlags |= (UART_INT_LINE_STAT  |  \7 x) M3 g: }: U3 \, t  s
                 UART_INT_TX_EMPTY |    \
* u% p: v8 `. k; n! Z# J                 UART_INT_RXDATA_CTI);
. T6 O; X: A- L8 d    UARTIntEnable(SOC_UART_2_REGS, intFlags);
4 D( d9 O9 @) o& V* g6 _  \  b}
' p: Z8 h$ Z8 ~/ D  v% l; k( b# e6 k# r) S% e$ B' y, \. Q' |# I! c
/****************************************************************************/
% N6 p0 R  R4 ~0 T/*                                                                          */
, Z; `0 P7 Y/ G5 b" E  H  O/*              UART 中断服务函数                                           */
2 g* I% Z8 ^0 i0 _* A! v/*                                                                          */3 V; M0 l" W' G! a# G
/****************************************************************************/
6 M5 r+ A$ {8 Z- P  Z( z: {void UARTIsr()) s% v9 q6 B9 h$ t2 D1 T
{0 \: w3 Q& j* f! j; |1 o( c% s7 r2 h# V
    static unsigned int length = sizeof(txArray);* w$ |; j( a6 {+ O5 C, n+ b1 S2 E8 b- D
    static unsigned int count = 0;
% Y: ?' \" u* F$ k! j    unsigned char rxData = 0;
2 g9 b+ p) Q: a; T6 n( H* X    unsigned int int_id = 0;4 `, I3 ^% b; c- y  A0 W
( `8 t5 G2 e3 m% [
    // 确定中断源
7 f4 p% }% d; \2 _/ Z) T/ C" Q6 i    int_id = UARTIntStatus(SOC_UART_2_REGS);8 y3 K% i8 e1 n4 K9 J
3 S- ~( j. t* s' }
    // 清除 UART2 系统中断5 F) C. c  r; L* Q
    IntSystemStatusClear(SYS_INT_UARTINT2);( y$ ^5 N$ P" J) K2 Z+ L) t" a2 G

1 {# R. o0 D3 y5 ~2 T( u) L    // 发送中断
9 b4 J6 m- c: L; b0 s1 j    if(UART_INTID_TX_EMPTY == int_id)
0 T# X! P( H* r$ o4 K! a    {! X" f1 Q' F" k+ \- _' E
        if(0 < length)5 d: J# v. t: G: F6 D* e
        {5 W# b! c8 B) o* F6 x8 L  M
            // 写一个字节到 THR# p# }, H! X" M4 x+ k0 a
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
( T+ U1 g5 [. h9 [3 U/ K0 z( E5 V            length--;! T) u$ @3 l) @/ L, X) Y
            count++;
/ j9 H* ^- t* g5 B        }
3 K- @3 ]+ R6 v5 R        if(0 == length)
& g. C3 z9 f0 z% J        {
1 s1 v4 o7 \- w            // 禁用发送中断
( A7 V8 o5 E5 }            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
7 [) D6 o# O# Z        }
- G* h% f# D4 B5 G     }
- z$ K& ?* h* P
( [( ^! C0 U! Q! W    // 接收中断& m9 A& r* c& S5 J1 _
    if(UART_INTID_RX_DATA == int_id)
& R" _2 D) _  o    {" M- O! |9 f5 Y4 [) M2 @8 f
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);5 A  k5 x, J7 N6 i, {
2 T5 `! N  @- e# N# B: I1 S1 f# `
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);- q& P. ^; \7 k0 n; L
    }3 d( Z6 q5 h6 x; |! ~1 g+ d

* k0 ^+ I6 r) D+ z    // 接收错误! _6 ~: Y. e/ I# I: N: _! M
    if(UART_INTID_RX_LINE_STAT == int_id)
) X) x" G7 ?/ p! B9 p    {/ e6 x" [- N: {0 K" ]4 l
        while(UARTRxErrorGet(SOC_UART_2_REGS))
$ T% H4 N$ C$ k' N        {
: i4 g4 |9 e" v# v6 ~, a# v, s( k# {0 T6 ?            // 从 RBR 读一个字节
: [& a* j" q6 z            UARTCharGetNonBlocking(SOC_UART_2_REGS);$ M' I( V4 r* ?2 ~# `
        }/ o: g- F- S/ m( V  O( e& [* c/ ^
    }
9 P1 \3 \" B; j1 q    7 m5 Z2 V" m" o; W+ t9 {
    return;
, L2 V( J' X/ {7 D* A# o* u}
% X5 I' K6 k5 o2 q' ]7 ~4 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:254 v' ^* i* M; o2 j2 u# i, j
如果其它设备快速给你发送串口数据,你这边能正常通讯?

  d) k& b6 O$ Q2 U8 e. q谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-30 12:45 , Processed in 0.043369 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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