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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5582|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
9 a' A4 W  b) q( Q; {( Q

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
地板
 楼主| 发表于 2019-5-5 22:36:34 | 只看该作者
785235014 发表于 2019-5-5 22:25) @# ^( v+ |+ w7 ?7 ?* Q8 `& j
如果其它设备快速给你发送串口数据,你这边能正常通讯?

3 J( f& F; l7 A& A" m4 C2 i( U8 n! f谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

1

主题

5

帖子

1034

积分

金牌会员

Rank: 6Rank: 6

积分
1034
板凳
发表于 2019-5-5 22:25:37 | 只看该作者
如果其它设备快速给你发送串口数据,你这边能正常通讯?
回复 支持 反对

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
1 ?( H8 d8 `7 q1 l; j* I, p# n' o) v  \$ H/ R3 m
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
! M7 F! w3 i9 ^/ \, N5 B2 J" |0 c; s: C  A
#include "hw_types.h"               // 宏命令7 _. N2 Y8 _! v! k" y* @
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
; Z8 T- H8 ], r9 d, [% }' n#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器" I+ o/ ~% k$ ~# D

; W" T1 K# A9 _! b$ x# B/ G#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
, H1 K& {% z* ?2 S4 x#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
- ^' M: o1 M5 r& t( d$ u8 X#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
3 `( a  s, \$ e& r- X#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义) g+ M0 i1 F5 l# M- A% g1 a

8 V. R" a: O1 F/ |$ R$ e/****************************************************************************/
. z7 w& W( @' Z/*                                                                          */
3 {+ L9 {3 v: B. d/*              宏定义                                                      */
4 _5 ~$ b% q+ E7 U, A/ a/*                                                                          */
- p8 x+ R/ I' a1 ^/****************************************************************************/% w2 b. @/ s1 d" Z
// 时钟9 n4 C( M8 I- s9 c
#define SYSCLK_1_FREQ     (456000000)/ ]0 T# R, ~, u
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
" n4 ^; `+ F  c8 f#define UART_2_FREQ       (SYSCLK_2_FREQ)9 ^+ q1 C  |" R- l7 a6 }9 @
- U' z, f$ [& X  W# Z# `' t# ~
/****************************************************************************/
3 r8 l$ C- y! L$ ^+ A) ]: @& S/*                                                                          */8 \+ e$ R8 k  ~
/*              全局变量                                                    */
9 Q* O2 h/ `, c5 [9 `7 }/*                                                                          */
% V# W" R' Z; b/ Q2 L9 H7 w/****************************************************************************/
9 P! y2 T0 d7 ?, ychar txArray[] = "Tronlong UART2 Application......\n\r";" D3 T& W2 M. ~4 D) l1 C# W* k
1 x3 O6 I; D( V# f  H: h4 D+ |
/****************************************************************************// C" D- a1 o# l8 A
/*                                                                          */
4 b" `) `( d9 ?0 h$ N/*              函数声明                                                    */* `+ \0 ^( ^% k
/*                                                                          */
6 ~) B6 t! l3 F/****************************************************************************/" {  }- T0 _9 N4 |
// 外设使能配置" [8 u# p! \5 k. D
void PSCInit(void);
0 E/ }5 R: ]3 t& V6 @$ s: J. j
8 H) z  j( t1 ?, A; ?5 A// GPIO 管脚复用配置. ?& o. a0 F4 h( a9 [
void GPIOBankPinMuxSet();5 b0 C2 R5 k% `  n2 T3 U
* N* x% c  j. S: `. r- Y* P
// UART 初始化
  q* T( B  B+ i0 @: v8 Mvoid UARTInit(void);
# R' I$ Y3 q( @+ c; T- w// ARM 中断初始化, ?" C. \. I! k3 L. p2 x
void InterruptInit(void);8 t$ K7 R* o. m/ _$ l: W" c
// UART 中断初始化
* o3 G5 I# f# ]; Y+ tvoid UARTInterruptInit();
; z5 w( l, E( N5 D// UART 中断服务函数
$ H4 l  \& p. g$ Ivoid UARTIsr(void);
; M- B1 o, u$ _+ l+ \" y
! k6 w7 \' k4 w: `" r/****************************************************************************/
+ W( P" ^) K% p/*                                                                          */
; t* |; U" m" ?/*              主函数                                                      */
& H$ X& H$ y: N# N/*                                                                          */. _9 e& [6 t# B$ u
/****************************************************************************/
! I- R2 d: k$ m0 J1 M* h* v& }# ~int main(void). |: r) \, t- Y3 T- N( I1 }
{
( ]) S+ Q, I- @$ L9 p; O& r        // 外设使能配置
# e7 V9 p0 n7 t. A        PSCInit();
! F  v1 W, A/ T! e  y  n6 {1 x& H       
. w3 E) v4 c0 |1 @# w1 K, Z9 K        // GPIO 管脚复用配置
! V3 ^) a5 [) U% E7 V) `$ r        GPIOBankPinMuxSet();/ r& _8 ~2 ?8 E
" j9 |4 ?6 J+ ~
        // ARM 中断初始化$ l  I" {4 e; Y0 A( A
        InterruptInit();
2 S# I- o2 f; @, i7 Z
' C5 L0 J2 @5 |& u/ h        // UART 初始化
* ]# ?  u1 F- Z( p' \        UARTInit();
" L: C! ]2 n: p8 _1 H" r
5 g" M& s: j7 r+ `9 o+ y        // UART 中断初始化; Q. m: L. H( g6 R  ^: o- Y
        UARTInterruptInit();* s8 L% U$ F! \9 m

  [" f+ ^1 ]) @7 I' w. ~        // 主循环( f! ~8 A% |/ W7 e5 ^
        for(;;)
  Q+ G- x% x! P: k( L* R( A        {' d/ E% I$ |& i+ l$ u+ y* p

! l* r7 Y: r6 Z. h$ o        }
# W3 v- U. r3 r4 m* K! Q' m}
7 u! z6 t5 `4 \' k0 n1 G5 X0 h" ^; k5 j
/****************************************************************************/
! M! D) n) G8 Q! s5 i# ~/*                                                                          */' l) q( |2 X6 x' i5 d* E
/*              PSC 初始化                                                  */& }# B$ t# _& |! ~/ H
/*                                                                          */
  _$ B3 g, Z3 L* E% n/****************************************************************************/# m) p* {2 G& [) d
void PSCInit(void)
; _- F4 M6 J2 V; D: Z- _/ X{
+ M2 \5 _6 b/ I7 f: j* [5 A        // 对相应外设模块的使能也可以在 BootLoader 中完成8 R/ o) [) [" Y3 l
    // 使能 UART2 模块! z6 ~; \4 x5 H; n. G+ u* W
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
" g' _/ _4 M* t, c}
4 ~7 J& G9 {4 U- s# n6 Y2 ]3 r" ~
5 `" J5 Y1 C5 _2 I/****************************************************************************/
7 V! H" V% n# ?9 p* E- H/*                                                                          */
. K2 ?5 f1 m" \1 Y$ f4 j/*              GPIO 管脚复用配置                                           */
0 p2 x0 V0 ^3 @9 ]- |/*                                                                          */2 K' V+ N# k+ O7 |% ~) m
/****************************************************************************/  u+ O1 o3 ?0 g
void GPIOBankPinMuxSet(void)4 ]* x& C1 _( Q# i! S) J# |
{  Z5 i% e4 w" }: D1 X
        // UART2 禁用流控/ [. p$ [1 Z/ h3 w" f3 l
        UARTPinMuxSetup(2, FALSE);' a* j& h- c" O; F- m' M
}
( {9 N2 q" q% s* r% ~. z3 `
8 t: X/ G) G' s$ d9 F: |; C/****************************************************************************/
& V; L# d' w, |* ~( Z: O; a/*                                                                          */
  O1 p1 s/ s! q$ r3 `* X" Q/*              ARM 中断初始化                                              */
# }0 R; i, \; E5 ?3 T, Y/*                                                                          */0 d. V5 r- Z* j
/****************************************************************************/, K7 Y3 A* i9 N( @
void InterruptInit(void); t) _" D( A1 |8 x' X$ E
{
; O/ V+ q  q) _. D, `- a    // 初始化 ARM 中断控制器6 S; a: y% s9 S5 B7 W' y( a3 s
    IntAINTCInit();
* {. B3 ]* U6 j  x% H3 k9 K: Z# |) q# M+ o/ A
    // 使能 IRQ(CPSR). D% C& D2 R4 R, R
    IntMasterIRQEnable();1 N! d  {% J' e% f- [, V2 B; o
# v: a$ J" Q, r/ F
    // 使能中断(AINTC GER)3 s" G/ v5 l' Q) d
    IntGlobalEnable();6 D) v" A- O4 g" i6 F/ e
, G- C: w6 I" \" X# P
    // 使能中断(AINTC HIER)
8 I  u1 |0 p+ j    IntIRQEnable();' s' }! X8 M& m0 D
}( L& Y  N7 _  w% f, M% T

' g& n' b- |2 ?6 G6 S/****************************************************************************/4 F. U5 Q' C  f
/*                                                                          */
6 o; `# P6 g0 {0 c! i5 d; q/ H/*              UART 初始化                                                 */
; K2 ]2 U& [& H6 E" \  M/*                                                                          */
5 h7 k: s' r- ^' Y* n% o3 e! M/****************************************************************************/
* @) Z9 E) M: X8 z& c* xvoid UARTInit(void)
! N2 ]1 F$ J  n( Y* Q6 P' }" ^  @{. H  z3 E9 [: T5 u) V
        // 配置 UART2 参数
: _7 Q1 t6 f$ |8 e8 m. l; l        // 波特率 115200 数据位 8 停止位 1 无校验位
! |! P5 U/ w; q/ X+ Q* x4 |' C    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,7 M; b# c0 u* x7 p2 ~
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);! `' y) d7 `# l/ i6 m
        // 使能 UART2
! c0 C* c+ _6 }$ u        UARTEnable(SOC_UART_2_REGS);
  [. `3 q8 v3 z* A0 K; D
. Y! N' @/ }9 ?: n  {, c    // 使能接收 / 发送 FIFO  k; v4 h" y: R" N
    UARTFIFOEnable(SOC_UART_2_REGS);1 R5 X+ _8 C- i( q8 M

9 c$ x6 R4 ?6 T% i' {! \    // 设置 FIFO 级别2 r$ J% f1 R. _, T& Q
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
2 |. Z" L  Z3 A- \+ _}
, W8 j3 C* w1 t8 q; y  a
% ~& f+ |( y7 T8 b4 P1 U: g/****************************************************************************/
- Q- k7 O1 V; U2 L6 Q8 ]/*                                                                          */
/ _/ X% f6 L* }7 D/*              UART 中断初始化                                             */
' t8 B4 K# w0 c2 |1 x/*                                                                          */) R: L% T6 a2 B3 `/ T" ^
/****************************************************************************/
7 s1 u6 s" c; z4 m. _  Avoid UARTInterruptInit(void)& [- u% p4 ]; B# V  a3 |
{$ \8 }8 b: B: k0 s( |. ~# e
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
/ V% |( ~# \' W- z0 ?! Q% V        IntChannelSet(SYS_INT_UARTINT2, 2);
7 R) e+ l, t7 r; I5 [) `9 l        IntSystemEnable(SYS_INT_UARTINT2);
4 l2 L6 P, Z5 m4 r
) n) r! G' N5 d$ I& a/ C! N1 M, v( T        // 使能中断% I' A! @" ]$ g' l  y
        unsigned int intFlags = 0;
3 J/ u  {6 W' _' r. v/ U    intFlags |= (UART_INT_LINE_STAT  |  \% P3 \' H9 m4 K  D
                 UART_INT_TX_EMPTY |    \+ |/ n: Q5 i4 w; E5 R
                 UART_INT_RXDATA_CTI);
  a- N$ Q, n9 i# ~: I7 Q; M" g    UARTIntEnable(SOC_UART_2_REGS, intFlags);$ L6 f) W9 q1 s6 x/ a. F
}
1 d1 t& a) @' c) o. A, s8 s& d# L/ S9 P% g3 Q6 U8 h8 Y
/****************************************************************************/
" O: w" @7 I/ M: i/*                                                                          */
* d' E) T- x3 V6 u3 ?  s1 w/*              UART 中断服务函数                                           */( A- J  H* J% y, Q; _) i% _
/*                                                                          */
" y% u# l" P- ^7 m0 R) ]: q/ _/****************************************************************************/
: @! j  `( q; X& U. |# ovoid UARTIsr()
; U, q& f. S8 ~* Z5 ~{- L. h" ~& i/ ^6 Q0 S
    static unsigned int length = sizeof(txArray);
5 s$ d0 {  a9 W7 D9 H    static unsigned int count = 0;* ]; N8 @0 H" V3 @% L# ]
    unsigned char rxData = 0;) C# u, e9 q% }5 g2 D
    unsigned int int_id = 0;5 @. m& f3 I2 v
8 W# n8 Z6 n* R( ~
    // 确定中断源
4 }8 ^- r5 Y$ Z    int_id = UARTIntStatus(SOC_UART_2_REGS);9 q8 _7 G* E" y% O) `+ O- E! `6 T

4 Y; ]+ p' Z7 E" k3 B& z" G    // 清除 UART2 系统中断
- s9 c2 o; [! d; v7 O    IntSystemStatusClear(SYS_INT_UARTINT2);
$ r8 S* }) C* S  F/ y. N) B+ D1 g. P( `4 \3 q6 ]! \/ L
    // 发送中断3 F$ p1 m  }; {" E7 P; i# t' J8 P
    if(UART_INTID_TX_EMPTY == int_id). `; l( M9 g% Z) w  j* a) N6 W
    {
  G2 o$ D' ]8 F7 |        if(0 < length)
* H( [& w) j+ W0 V        {
& C- ~6 T5 R# F            // 写一个字节到 THR7 M: \3 M' d* g3 ^# }( p% G( q
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);# }" x6 [* A3 p& a5 m
            length--;& X2 _- t6 G4 Z8 i8 o, u5 l/ h
            count++;
5 O% w) K' }/ {        }
- o& }7 K6 J+ N2 X        if(0 == length)
" v  P/ ]/ |* y- b        {6 I" X- C3 M6 g' j3 Y. D. A
            // 禁用发送中断4 g1 |7 n) g$ U* C9 ^
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);* W. r4 ^, S2 N' u, q. F
        }
) r' M7 i4 E/ u9 q     }
% F# ]0 \; W6 j, S9 s/ r( _  V& ?8 o1 h" c
    // 接收中断
: d4 \! @+ R5 \    if(UART_INTID_RX_DATA == int_id)
5 z& ?0 `1 T) t& K. x    {! ~* T2 G# W& ]5 ?: j3 t: g  O: K0 k
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);3 S* B) n* F% p4 C( f" W2 k7 N

9 Q7 u: d' e6 u9 j1 E: |        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
/ W- G% e$ j* u7 n& {    }
2 U, i1 D! `+ v0 v
# ^$ x8 U' `+ ^  E% e, B; T    // 接收错误
0 |) g3 B' L8 X6 A! n6 C    if(UART_INTID_RX_LINE_STAT == int_id)
% x9 J# X! f! d2 Z    {
  C$ f, F$ e  O: m. D        while(UARTRxErrorGet(SOC_UART_2_REGS))# }& ^" G3 \$ C+ T$ H" q
        {+ a3 m$ V8 {" N4 |7 T8 ~; `
            // 从 RBR 读一个字节
9 r1 L. s0 j8 X% W3 o            UARTCharGetNonBlocking(SOC_UART_2_REGS);# H5 r6 \: Y/ b0 L
        }
* C2 u( B) ~; ~2 t7 {    }& H1 L% t8 ?, x, o, Q1 R9 Z
   
. J! ~7 a- ?; z+ i    return;! r1 l' ^% ~% ]
}2 E8 v& S( j: z2 R4 E7 d" Q' y4 J
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 06:25 , Processed in 0.040688 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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