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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5641|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
2 K) Y4 @* v8 [% k  l) K9 c

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
' v- x& I& I4 B* x/ G6 E" ]; R$ {  W- H3 H6 P7 w% F( F" T
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
" X, l/ c% |* T
: k/ O9 N% A  {0 z#include "hw_types.h"               // 宏命令! Z, H1 p: G" ]( M
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器6 [' i- i5 N9 y" c  a: m, ^' M
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器3 {' O& p# [4 K4 l8 x
- A7 `6 Q2 r$ l) N3 O/ j
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明- a6 o& o( v# V9 d  I
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明) q; R/ M' P% J; C8 P7 E; P
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
' p% x4 m) N2 t6 m#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
6 L9 C' [+ H% h( F
5 }" F+ u. C6 ]3 K* V) i/****************************************************************************/4 }( W: d  ^0 s8 U# \9 S$ R/ S2 `1 b
/*                                                                          */
0 {" H' M4 O) n& g" p/*              宏定义                                                      */
6 |% O0 |, [& @' `9 ]4 I; Y, m+ N/*                                                                          */$ ?! f- N/ u1 D
/****************************************************************************/" K* n; }. I) _4 u
// 时钟0 X. W# a' Q3 a9 J$ P- S) o
#define SYSCLK_1_FREQ     (456000000)$ _; i5 `( r+ g' Q
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)1 e3 t4 B6 a7 j: {3 S" A
#define UART_2_FREQ       (SYSCLK_2_FREQ)
# \: x9 q$ a+ |8 k; n: B) Y
9 G6 x9 ]5 w) t# {# ^! L/****************************************************************************/
1 I$ Z  ~+ ^; z. Y, n! c/*                                                                          */
: Y, T# N  Q7 |; P, e/*              全局变量                                                    */! `6 A8 S. z  j
/*                                                                          */
- t5 L, \2 _% _/****************************************************************************/
' J9 G- B1 e, T) P7 Gchar txArray[] = "Tronlong UART2 Application......\n\r";
8 `, f. X) ~& @3 a' T1 O" R: e4 l% R6 I- `" @9 T( x) E! s  p$ e$ d
/****************************************************************************/
8 \! O/ W# I' H" a/*                                                                          */
, |" ~1 A- P' g* G6 Z5 g/*              函数声明                                                    */
: G- i& M9 D/ A/*                                                                          */
# V. Z2 h' i* L9 d- M/****************************************************************************/
' c0 D8 K0 L/ L& g) v& U0 H8 L// 外设使能配置! K0 z. O: u5 l6 Z. R' f: T. A
void PSCInit(void);! m4 F# N  Q4 o+ k9 s

1 E) C% l1 A4 `% P% _" p// GPIO 管脚复用配置, n" o: |/ p7 T9 G/ k" z7 z6 G3 Q
void GPIOBankPinMuxSet();
+ z1 r! o, H( H1 u; o* z% T) y7 N6 b5 p+ F( Z9 E! R
// UART 初始化4 Q" J, H' D# c1 L0 d# P6 @5 }
void UARTInit(void);
) y$ z8 g! T4 b( U/ k7 D) @// ARM 中断初始化
" I% J- S. u% J0 P  Avoid InterruptInit(void);
  i8 `% a; c8 }. }4 \- w2 K! d// UART 中断初始化" c) a1 J8 l  L+ I2 B0 j1 J" X
void UARTInterruptInit();# s2 F8 K0 [* F: Z( s( R
// UART 中断服务函数. O5 i: w1 S4 a- z
void UARTIsr(void);) @. [9 J% q: P8 l+ M. r8 [

9 i; P- {3 L9 _9 |" ~/****************************************************************************/2 C; }1 \- q7 B. G+ ?
/*                                                                          */
4 L* p) A5 O8 e# c3 X6 e/*              主函数                                                      */
" g  d/ _: B3 Y% C4 n/ v) c/*                                                                          */
& c' n' _# x4 l- _1 C  _" [/****************************************************************************/
7 a5 M2 l! R  h) Q9 I9 C& Rint main(void)
9 {+ p; L1 A7 z% n) O{" e2 v' d& }3 a$ z! R
        // 外设使能配置
+ m3 ]6 k' `/ ?) I        PSCInit();0 A3 Y5 h4 r- a, ]/ u3 h
        : Y% [% g( `  v" c
        // GPIO 管脚复用配置
1 O$ h1 G) J. b/ m0 T$ z        GPIOBankPinMuxSet();
4 y: e9 w" d% _, f! c* t
2 p7 d$ f7 V! r        // ARM 中断初始化
. x* Q; }4 L2 _5 v        InterruptInit();
$ G$ m8 ^( V2 Q" E# L! e+ E: C1 ]( {* B
        // UART 初始化; H0 n8 Q8 ]; i; k& l2 |; N
        UARTInit();6 I5 \' I0 g, U% o

9 ^8 E0 X, }. @! ~" @# ~; _        // UART 中断初始化, f% w6 w9 v3 @. R8 v2 |; w% u
        UARTInterruptInit();' [" s! e8 X( w8 g# S

+ E3 `. j; J9 p# S& ^$ P        // 主循环: L+ S' Z$ A& x) [# w6 a# A
        for(;;)
3 ]: h, n% g0 `# `! v6 z, B        {5 c5 g% |/ v7 J1 D% V4 k

. c% }3 |3 {4 E        }
2 S' `  N  c' A! a" Z+ e' S" E: F}1 L$ m8 [3 O1 n# m4 u
. d# t% @6 Z9 N" d, K
/****************************************************************************/
0 h/ F5 m8 y. h; }3 ~/*                                                                          */3 m8 n2 i! i' y4 q3 {( F
/*              PSC 初始化                                                  */2 L: ^6 U0 M; W
/*                                                                          */
- r5 B! o; p& B( ]/****************************************************************************/" j! L0 ^' K. Q' _
void PSCInit(void)5 E. m' A9 S/ Y% p6 q! A
{& w' h2 i% P9 F3 H! J& d% l
        // 对相应外设模块的使能也可以在 BootLoader 中完成8 C' R: u; o" D; ~% P
    // 使能 UART2 模块8 l3 Q5 \7 d  R5 I6 ^
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
* }0 ]6 F, Z  c6 o/ g}' h' _: O2 c7 }  P- f2 n7 U

0 a1 _8 X2 p& v9 }' Z5 ?/ `/****************************************************************************/
$ d  D! r  I: |' K; Z/*                                                                          */
, {6 g# w. J! x& `. g/*              GPIO 管脚复用配置                                           */8 P4 b  l# D; R, h& q. C
/*                                                                          */
& u2 T+ r+ H- m/****************************************************************************/- Y1 P8 {' A! _! n/ h8 j8 L
void GPIOBankPinMuxSet(void)
9 I" D4 d0 z# r5 L$ U# W& P{
1 H8 K  A# M7 O        // UART2 禁用流控
, B) O- E- c* g, b        UARTPinMuxSetup(2, FALSE);0 r  i  m4 z1 W% ~6 w- K
}
& O0 s+ s" ]& P5 Z, a1 i  ~. I$ F: X# w5 ~- R( S
/****************************************************************************/
7 N% {) D4 ?+ ^* f; Z7 K/*                                                                          */
- T4 L: C4 O4 B: w: C/*              ARM 中断初始化                                              */  {' U% t- A0 t; p6 B+ s% g
/*                                                                          */
1 U6 f, E! H5 G6 k& X) w/****************************************************************************/
9 M. f/ v, f& O) }6 @void InterruptInit(void)
. ?2 a2 H& B% V2 E$ A1 _& }{' t( D, k5 w$ Z, q7 B8 J* v
    // 初始化 ARM 中断控制器$ z( }0 o# v5 ~# M3 E& p
    IntAINTCInit();
8 `* I$ ^7 V$ B. V+ A6 o
5 x, D4 w5 c# }% }9 q    // 使能 IRQ(CPSR)
: ?% j& j0 N' B" n' C    IntMasterIRQEnable();! G/ e, [5 S6 E8 {( D; d- k5 _* j9 a
  `0 Q7 l2 ?& L* b  j6 h
    // 使能中断(AINTC GER)
& P- c; d4 Q& c% L    IntGlobalEnable();3 n+ s# a5 N9 p7 H$ Y6 p

/ }  b9 C4 V( K5 a: N    // 使能中断(AINTC HIER)
/ e: ?/ G: g0 U. y    IntIRQEnable();2 S# J% D% `6 x" X3 N* N# F
}
, N: f; ^* I* G* T' }2 j2 {3 l3 s- g  [6 j# X- s
/****************************************************************************/
3 Z/ `! O7 a! i  x+ B2 |8 J5 }# e/*                                                                          */
% I' h- {; q* ]! ]/*              UART 初始化                                                 */2 g. H% s$ A) y. [; r+ E
/*                                                                          */
" G9 F% t* A: Z7 g/****************************************************************************/
. o( g' g6 y+ @' E1 kvoid UARTInit(void)
' h+ t5 ^6 G9 |# Z8 v8 ~{
0 ^. D4 [+ q* m        // 配置 UART2 参数
* c1 k' S8 ]# T8 [        // 波特率 115200 数据位 8 停止位 1 无校验位5 \7 E0 M# x+ N' z) a
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
+ A# t3 A/ h2 @; x  {# _4 D                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);; [" `5 p9 j4 ~
        // 使能 UART28 c/ @+ ~, H% M1 x) ]3 ~
        UARTEnable(SOC_UART_2_REGS);- Q0 ^# \4 c3 [8 J2 V" Q
# E0 Y3 }0 Q* n; G' v& @
    // 使能接收 / 发送 FIFO, j" a9 m" ~! i* G$ B9 |
    UARTFIFOEnable(SOC_UART_2_REGS);& c' W0 M3 N/ s$ t+ m4 y5 o

9 v2 s% `2 d4 d  X# h( J% k/ c    // 设置 FIFO 级别
0 f" R' J& C5 j' n% Z1 w: q    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
3 x- D% U4 G9 \. M% x) z# c}
: H: d( @  x& P$ e5 C8 Z! L5 @/ W& e8 \
/****************************************************************************/8 {6 a. l# b1 s% U1 y/ E# L
/*                                                                          */
0 A: a2 ^0 q0 t& S/ K/*              UART 中断初始化                                             */6 T' {5 S( R0 ~- N/ G2 f3 c
/*                                                                          */
! ?- q4 P$ D* s, V! N/****************************************************************************/
2 k( {/ ~2 x5 evoid UARTInterruptInit(void)" r0 s; z3 U  C$ `# c9 t5 q2 f" N6 h
{
2 V7 U; e3 ^1 X) O% n& y6 W' v        IntRegister(SYS_INT_UARTINT2, UARTIsr);
/ r1 ]* g! z2 R9 k5 ]$ {        IntChannelSet(SYS_INT_UARTINT2, 2);* U6 I, z+ q( w2 r8 P7 i* K* e, [
        IntSystemEnable(SYS_INT_UARTINT2);& i8 I. v$ x5 x' n

6 M- T% y2 u9 ^! a        // 使能中断4 N; r9 T) ~) f+ k3 Z7 X& e8 ^' J3 H
        unsigned int intFlags = 0;2 K; g5 ]! D) T7 a
    intFlags |= (UART_INT_LINE_STAT  |  \6 R! N" p, A+ P0 U5 z
                 UART_INT_TX_EMPTY |    \
0 n6 y- f' \# d4 Q: @( \% V+ O( ^/ ^+ j                 UART_INT_RXDATA_CTI);
0 T4 @3 h5 @5 w$ c! L    UARTIntEnable(SOC_UART_2_REGS, intFlags);
" Q3 T1 M1 }( ^3 l, `8 u# T}
2 p" R1 w4 {- R# }) V
) T$ j9 {* C) ~& O* U) q+ ?* H  f/****************************************************************************/
+ b5 F4 M8 v4 v; E" q/*                                                                          */$ Q& A2 T1 q* O8 {, q# a& I, n! }
/*              UART 中断服务函数                                           */, x/ K( u0 N1 ]1 f  }
/*                                                                          */2 r+ G+ N' O, a* x4 b. X
/****************************************************************************/
. e& P- \6 |; S- ?; `8 ~4 q& qvoid UARTIsr()
8 w9 V+ n( j& p/ }' j{3 ]& I2 ]& O! k! k. i1 J
    static unsigned int length = sizeof(txArray);6 d* b$ N4 b7 |, u# U
    static unsigned int count = 0;1 S8 l) V1 Y; P
    unsigned char rxData = 0;
$ \& H3 C5 z2 {) h8 @5 E    unsigned int int_id = 0;3 q; }" ]% I. A7 _
2 e  r: b; t) `6 D: N+ Y
    // 确定中断源; x0 Z- f" o3 V! D0 Q# h1 I
    int_id = UARTIntStatus(SOC_UART_2_REGS);) \% S+ k# o' @) Y

" y! h4 p' ?2 u; M6 |- ^    // 清除 UART2 系统中断! Y2 n/ G+ G5 _( R- U
    IntSystemStatusClear(SYS_INT_UARTINT2);
3 k, }; T; \) o. o% f0 M  p  B2 f* |+ d$ V
    // 发送中断+ G. k  \- `- h! l  K# q
    if(UART_INTID_TX_EMPTY == int_id)
- ]* I: m( s# z2 z1 |+ _    {
5 k0 ]  L$ L9 o" \( I8 c        if(0 < length)
/ |% R) m/ b2 p5 T4 @        {5 w& r4 S0 w0 C6 A
            // 写一个字节到 THR" T" l2 `' _  y' H
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);- S6 {- q3 H0 C6 I* n6 s, z
            length--;7 M+ ~! ?' C; ], Y" H
            count++;
& Y: j  u6 P% Q2 G% g7 z" P        }
6 `/ |7 n; o$ H0 b; W' O6 a9 q6 o        if(0 == length)
  x6 i5 Y" h# Y/ H, z9 p& h4 }        {* A$ R2 Y, G$ {4 O, [9 @2 p- @
            // 禁用发送中断1 m3 ~9 A2 s0 z' ]8 k( f
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);$ n+ t) m& W6 \
        }
9 m  r! {. @/ o6 q     }+ i! I2 d% W  q+ J2 {7 l/ @
+ V$ t9 L* s4 I' D- f
    // 接收中断
4 Q; y$ K# @9 w# [; B    if(UART_INTID_RX_DATA == int_id)  x$ M' k: u7 Y" [
    {& n+ Z( a8 ^3 A1 r
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);, ~& ~1 h* ^/ [9 |  Y8 l5 x1 ?
9 r% }4 i, o4 ~) |9 u. D
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);& u* b% |8 q& m6 C  U3 \# E* G
    }
8 V. m2 `1 C/ F' u3 e+ `6 l2 a/ k& w- `( h5 e
    // 接收错误4 |: |0 N- n  N
    if(UART_INTID_RX_LINE_STAT == int_id)
- F9 F% g8 l# R- j# M  p9 z$ Q    {  |* U- l: h9 X  p
        while(UARTRxErrorGet(SOC_UART_2_REGS))! g; N0 P( N% L9 A! o
        {7 H- h+ M" d: P. w
            // 从 RBR 读一个字节
9 l1 s0 _- k* ]7 U4 c            UARTCharGetNonBlocking(SOC_UART_2_REGS);: y9 z+ W; A1 k2 Y* t% y
        }
) \& ]# G- M, T$ J! Q    }! n0 u7 C; D( u, l
    0 j$ v* S: U% l" Q
    return;3 v; U, Z; r/ W( G
}( |' F+ G" E' r
回复 支持 反对

使用道具 举报

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
/ E) d' a6 J/ {3 O9 J如果其它设备快速给你发送串口数据,你这边能正常通讯?

8 Z% t5 k, W$ R. F/ p谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 18:57 , Processed in 0.043636 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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