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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7266|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
# c3 v/ m4 n; k. z

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
; S& U5 B. b/ ], q  A9 K( p0 ]
' H) y& O) W6 f5 b# A$ t- }#include "TL138.h"                 // 创龙 TL138 开发板相关声明+ X4 t) [* m8 D

5 w2 g, p4 ?2 N# }0 t- C& y9 b#include "hw_types.h"               // 宏命令
. J) w9 o5 ~& x  a#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器2 Y' k0 i" W, e- E1 D( c; S
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器, c0 e; w: i1 r6 I  T
; I- `5 u5 @' j/ |$ n
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
2 H" e3 q( w6 I, l& o4 c: c  P" G) F#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
+ I4 w. s6 _+ I+ o, F8 l8 g! N( {#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
8 S4 ]" W- P1 M: z. s8 I( W$ Y. _! P8 y#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
# r5 j/ w, d/ e% s: X* b5 t% ?
, D$ p, A8 d. _* `3 o; J) C+ H$ d/****************************************************************************/, ^8 I5 o% I; u+ S6 k. y
/*                                                                          */4 Z" h' E. \) n, s
/*              宏定义                                                      */
/ c" ?! `9 y7 a' g& o/*                                                                          */8 G1 F4 E, U0 G$ y
/****************************************************************************/2 s; F6 Q% C% }" ]6 b: t2 v+ Y/ V
// 时钟
0 T- _# N; M! T#define SYSCLK_1_FREQ     (456000000)
5 ~/ j; @) q9 \3 A#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)& i) ~8 [8 U; N4 R+ L! k/ L
#define UART_2_FREQ       (SYSCLK_2_FREQ)0 e, X9 B! G4 l* ^

4 V2 e2 h* ?! c9 ~" I! F/****************************************************************************/
& [# x* |0 b$ F9 d* t0 q: S/*                                                                          */- U% N! e* N8 {# ^! W+ c: a$ ~5 \
/*              全局变量                                                    */
6 T7 K& V# x" L0 m8 W/*                                                                          */' b& x! B8 p, ~0 t1 o  p
/****************************************************************************/
  N5 O! }3 }5 q- \- U/ Schar txArray[] = "Tronlong UART2 Application......\n\r";4 N; P6 r5 |8 \2 Z% I/ S% m
5 a- t+ \6 t  w: Y! i9 n
/****************************************************************************/: p3 |/ Y  D8 Q( v
/*                                                                          */7 [$ c* ~) M* A* Z7 P
/*              函数声明                                                    */2 p' x3 Y. m* L% H; h: @; ^% Z
/*                                                                          */  m: I/ S  |6 W6 ~- Q6 T( e: n* S* _
/****************************************************************************/# u( `/ p0 Z5 r1 ^: [
// 外设使能配置8 e0 ]' j7 G& |" B$ r; {0 T
void PSCInit(void);0 \) x% Z! u: n
, P# l+ a" S& a7 N" e) X8 S' ~: V
// GPIO 管脚复用配置
, K$ ^- {3 a2 [2 p  Zvoid GPIOBankPinMuxSet();
3 [3 Y+ D/ a- V: E/ a
% b+ \  t) w( x8 d// UART 初始化# `# l* }" q7 _+ D( g
void UARTInit(void);! R, e! g/ B2 }! t; ~" V
// ARM 中断初始化
+ c2 q# s3 c( i" x# evoid InterruptInit(void);5 A2 P; t; H/ `! s0 \6 B
// UART 中断初始化3 t2 P7 c8 j. f& g. `* @
void UARTInterruptInit();$ `$ M9 H5 k; h4 n) g1 w, i
// UART 中断服务函数
6 t6 f* j% }! w: y4 I( B: T! }" @void UARTIsr(void);% Z: |9 q% ~# [3 ^0 m8 P

0 N9 a  i& t! {  v9 V+ V1 }/****************************************************************************/: d' C' z- e/ e, p/ [: y/ G
/*                                                                          */* c0 s% z) q  B7 d' l0 F8 g
/*              主函数                                                      */5 i1 f  x" ^  k# S1 U
/*                                                                          */
% }3 p1 W; i1 ?+ r) N! o/****************************************************************************/
! _- Z6 R0 ^! B  ^( g* U9 o* W1 S, yint main(void)
+ a/ U1 _) Z9 H5 {6 P( h: V" J{+ T( V) J! F5 H) U+ Z8 h* ^/ [  g
        // 外设使能配置
5 W* y- m, l1 n8 ^; L7 R" K        PSCInit();
1 D& b& J% O& ^- l/ [% S        5 i& @4 A) A* ]( \* Q& r
        // GPIO 管脚复用配置  u+ w& `" U2 ^9 }  R
        GPIOBankPinMuxSet();, x& L' b+ O, z2 y: K: y
+ M2 I! ^5 w$ f  \
        // ARM 中断初始化
6 t( U4 `" u7 I/ K        InterruptInit();
  w0 v4 W2 M8 D' e8 T" M! m* x# O/ {% S
6 B. M; m- M) }3 R2 x  Z6 h$ x  K        // UART 初始化
# J) l) y  ], G3 o1 k5 s* B3 ?        UARTInit();. a) U% p' \5 i, K9 T

3 t& @2 J5 z$ j3 }2 [# K, }        // UART 中断初始化9 l. n* J, Z( {4 A; J
        UARTInterruptInit();3 a# X9 b0 [9 e; D+ W
2 J* \: ^8 }) n
        // 主循环7 b3 |2 b3 {/ D  }& E
        for(;;)& r, }9 Z1 H% {4 n* I
        {0 w: }/ L( d" o/ V- Q& i5 z

  {" g3 O  k4 C6 M% V/ J: ?7 I# Z        }& l: v+ P" d. x# [4 a# y
}
2 d$ G; t* r) v: P0 j* ~' ~
& ]. F0 V; k  a- a# q/****************************************************************************/
# H. t- k% X) X/*                                                                          */
+ b  @% ~4 {7 F# x/*              PSC 初始化                                                  */3 M8 ?" a9 k! `! N: ]; D" x. P& C
/*                                                                          */
5 ~/ Y+ V9 P3 Q( I. b9 ]/****************************************************************************/
  v& `) {" }5 z0 L. gvoid PSCInit(void)
: @( Y( i. U+ Z. z4 j" k{  c) ]) e8 B- d- f) M4 ?: z
        // 对相应外设模块的使能也可以在 BootLoader 中完成1 ~% ~; m3 z- X+ o3 {9 d
    // 使能 UART2 模块
: N0 G# e/ ~! _0 J8 v    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
! L0 o0 _$ I  D# L$ p# Y6 j% m  ~2 x}) p; P" z: g( c; [3 Z

/ b5 C" r% n5 X! `0 ~/****************************************************************************/
4 U4 q( B0 H) N9 f: F" ^/*                                                                          */- z' e- [: i% _' l  V) t
/*              GPIO 管脚复用配置                                           */
# Q6 s: t. Z) U- N5 X/*                                                                          */3 Q; f5 }3 T+ Z. ~' y) W- }9 P5 p; e
/****************************************************************************/+ ~, R: v, _( l5 V
void GPIOBankPinMuxSet(void)
" w; Y* s- J- ^9 Y4 R- M{* ?4 D. S5 C% y
        // UART2 禁用流控
2 y% ^+ ^  U% R% p# d        UARTPinMuxSetup(2, FALSE);1 P* r: `) t$ P+ P% C7 H
}  A* j5 g9 x9 ]& V

* ]) b! V: i0 y$ ^% O8 a/****************************************************************************/% e5 d! e2 i5 L  Z9 _+ T! V
/*                                                                          */
8 k) ~5 B! C$ R( z* a- ?& u/*              ARM 中断初始化                                              */
# f" n" ^% A2 Z6 f4 U/*                                                                          */+ Q) S4 P0 X) i4 H
/****************************************************************************/
! G6 Z  _; K, Gvoid InterruptInit(void); e; X3 L. `; L3 U8 D
{5 ?( p$ M% N! ?4 e/ W4 r8 N2 S+ @7 F( ~
    // 初始化 ARM 中断控制器4 V& r+ V+ F) u$ b9 D4 Y
    IntAINTCInit();6 F/ M$ n% q. m
5 n. Y, o' N- G) N& l' d3 Q$ q6 h
    // 使能 IRQ(CPSR)
0 h; o# U; p% ?* c1 F& `, A' G    IntMasterIRQEnable();
4 k- l: N9 ?! ~7 f: T. Z, V  B$ D& y) ~6 @: U' k% I2 o, n
    // 使能中断(AINTC GER)$ x/ B: K* L* S0 K) p& N
    IntGlobalEnable();
5 [  l3 u; S: N
5 N2 x. k0 M& r# R    // 使能中断(AINTC HIER)1 ^5 I# a6 ]- \5 B4 N  t( @
    IntIRQEnable();0 D$ u, m  L- M
}% ]4 v/ U6 n7 E
) M7 l: w$ q# ^/ o
/****************************************************************************/; Q! k& W. B  H. z& V: p9 X' T4 {
/*                                                                          */
8 l3 P# p: l6 e& d& p/*              UART 初始化                                                 */
0 f3 Z# Q' N0 E/*                                                                          */1 ?& o- z! E1 E4 ~
/****************************************************************************/
* t5 ^9 w% g% bvoid UARTInit(void)
" q7 H- i/ F8 d1 s3 Z{* G% ~1 G1 ?" s! f  G
        // 配置 UART2 参数
' N. D. Y6 `; }7 S& U  }$ M' C0 K        // 波特率 115200 数据位 8 停止位 1 无校验位
9 A3 y/ b9 l( K% j9 C: c    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,% n: e: L- \4 x0 h
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);, w3 h7 Z# O6 [% x! \& D# F& m. j
        // 使能 UART2; K0 b6 N) X( C. t" s  O, I$ W
        UARTEnable(SOC_UART_2_REGS);
/ d8 G; d3 U& S0 W# C6 D- n
3 S2 Z* `5 D+ L$ k    // 使能接收 / 发送 FIFO
& e( b  p$ I  u4 ?, z    UARTFIFOEnable(SOC_UART_2_REGS);
7 o$ [) v! F  J/ D& u6 z* V! V0 j
9 M. o- X0 |+ d$ ?! j    // 设置 FIFO 级别1 o* V6 V5 |; ^( R
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
* r! A  `: T' v9 L}
) V1 |" G* A7 d! g4 C8 p0 i6 W+ ^) n# j% P* T# K
/****************************************************************************/+ O- X( F2 b1 [. G) {" T: A" y' S
/*                                                                          */
+ u9 |/ m0 l- z- o6 F. j+ n8 u! U/*              UART 中断初始化                                             */
: P, D+ Y4 _4 ^0 ?/*                                                                          */
+ d% h3 K, \  Z9 d1 G" y; z/ G/ B/****************************************************************************/& @( d: t3 w  C) j. y2 n6 Y7 F
void UARTInterruptInit(void): @5 j; z$ r  M; j2 L
{
, s, s4 Y" k: c" S- j- r& X        IntRegister(SYS_INT_UARTINT2, UARTIsr);2 H& R5 d% n; K0 c( W8 q2 G
        IntChannelSet(SYS_INT_UARTINT2, 2);8 X* O  ~& G: v: ?
        IntSystemEnable(SYS_INT_UARTINT2);
1 \% v  Q+ R# \3 m3 H( p" B' N8 l. M+ q0 T. M, s4 `
        // 使能中断4 P5 K! V. i+ i0 B3 l8 [/ e
        unsigned int intFlags = 0;1 b* J6 b6 s/ P
    intFlags |= (UART_INT_LINE_STAT  |  \  h# c0 B7 i1 W  a
                 UART_INT_TX_EMPTY |    \
/ W! ]  h/ @! I% D7 k                 UART_INT_RXDATA_CTI);
+ t9 Y+ g5 h3 M    UARTIntEnable(SOC_UART_2_REGS, intFlags);8 v- n3 [. J. Q2 y
}
! E  F- F9 ^. _/ K; Q0 Q" s  E4 C5 l! g0 \# b$ [
/****************************************************************************/+ Z( x  R& Z6 }, ?% D/ t* c- w
/*                                                                          */8 a0 S7 U. ?  Z4 H( E1 I2 m
/*              UART 中断服务函数                                           */6 I% Z. [0 X! t& a4 \
/*                                                                          */8 y! @! N4 S. v3 Q8 E1 l7 @: ~
/****************************************************************************/
$ Y$ m& l( g$ O# }void UARTIsr()9 [% `( D: b: W' h! C3 ~
{6 x) B  B; B, m
    static unsigned int length = sizeof(txArray);" v  C: R4 c1 x* T" C; v7 @
    static unsigned int count = 0;
% z( o, {" o9 r9 r: ]' E  Z    unsigned char rxData = 0;
1 A7 B4 e. U# }# X/ o    unsigned int int_id = 0;2 K5 b0 V2 N& }

' |" ^1 O' q3 x$ V0 v; o6 F! f    // 确定中断源* P5 k2 a8 u0 l
    int_id = UARTIntStatus(SOC_UART_2_REGS);$ u- X9 B5 N9 H) f, d- [; X

4 m, N7 L4 V, M    // 清除 UART2 系统中断
7 ^% _- V0 K9 W. H. K& o3 I    IntSystemStatusClear(SYS_INT_UARTINT2);
1 g4 c" V. i$ [
( N# B9 ]2 u/ T( T: i5 H    // 发送中断* z" ?  Q/ E& A( E  p: D
    if(UART_INTID_TX_EMPTY == int_id), G/ O$ K5 K, l0 `4 C6 R
    {
7 [8 b1 I' y" v6 j; R* K        if(0 < length)
  _6 D4 J; V3 c0 o        {
5 x( |, e; D9 ~& F/ `3 v2 q" S            // 写一个字节到 THR
) X4 |) I: ?7 B# d* c' R            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);1 }) c& v' b) o9 Z
            length--;/ Q  u; {( q" K" w1 z/ }, V
            count++;  K4 v' d  m+ Y$ D/ d4 x( n5 A" `
        }
: u% g* l& Z' i! H        if(0 == length)
- r$ V" \1 y. V* ]        {4 I( f  A, }5 O' ~/ d: B
            // 禁用发送中断2 \8 Y/ |# J9 k
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
  o% l) ^. z( i% {/ b7 ], _        }- l, z* U! H' Y6 V, q' b- B
     }* k" k+ o! ]' N) K% ^7 c# D

& B" `& |- m6 h    // 接收中断, W+ e% }* Q; W% a; z
    if(UART_INTID_RX_DATA == int_id)
* n/ ]* N6 w/ d7 Q    {
* \, i$ h, P# }+ D. U$ f$ i2 j7 C        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
! d/ @4 R. f$ _0 {. M" P. t
; n2 F. R/ w/ C+ s) `0 `" A# {5 U        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
9 k5 q3 S- r$ u9 K6 ?  z: {    }0 G- \6 W+ [' v; c6 F3 ?

; T' ~" n. f1 M    // 接收错误' i1 C* N8 [$ y9 _1 `( h
    if(UART_INTID_RX_LINE_STAT == int_id)
/ b0 w* W; n$ L; L& }8 J) ^    {
5 D2 {! a" c+ q        while(UARTRxErrorGet(SOC_UART_2_REGS))
' u0 J+ ?8 ~. X) q7 X7 K( a        {
+ j4 d( l' F  O( ?1 q% B            // 从 RBR 读一个字节" D4 p* A$ H* m, L; f$ a
            UARTCharGetNonBlocking(SOC_UART_2_REGS);8 `3 [1 U: w. Y& {1 \" h
        }) }  a8 }5 z2 I' C6 B; \
    }, w! o$ k- F* U# T* g3 h
    - v4 I' G8 `) b, r) ~  U
    return;
, t" f# y1 `" g- U* t; X# ]. h}) {6 B' s' o5 X$ d" c; x3 R$ S
回复 支持 反对

使用道具 举报

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% I3 T& }# f
如果其它设备快速给你发送串口数据,你这边能正常通讯?

- T1 i- ?- n& n. _# K) Z' L! z谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-15 22:02 , Processed in 0.040496 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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