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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5591|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。1 Q3 w) {/ f5 o" I- B9 }

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。$ f5 Q9 @, N9 x6 J; O
; k4 f1 [) z- A1 Q2 c
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
' ?1 n9 h: |& G5 f* Z) B# P3 x' l% Q7 I! U; [- L
#include "hw_types.h"               // 宏命令
6 a- h* D; W) M' [3 j2 |#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
, M% \' k6 E* Z: ~#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
( N4 {; ]& V& Q# Z8 R) H0 c8 ]. ~- @3 e8 e0 P, v- j+ c
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明# o% u0 a" d- X: R3 a
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
4 R: z. Y$ U3 U0 p' M% r8 J+ o#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明5 e* U- T9 ~- E! }6 i0 A4 D* o
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义* O8 @7 H. }9 ]! V. M) t

! r, [0 e! w5 P) B8 T9 K/****************************************************************************/
- ~- A6 p) i& s' `) {/ ^6 U2 [/*                                                                          */
1 w; c& K+ {/ x6 r4 ?& W+ b# w& o% p6 t/*              宏定义                                                      */
8 H1 O/ z' F/ q3 x3 q8 Q: G0 M; }6 Z/*                                                                          */6 R2 l. g/ R; _3 |4 H& j' \( z; l
/****************************************************************************/' b8 S# Z- M  Y9 c; P& P
// 时钟
. @3 z$ V" d7 T' G3 C! C#define SYSCLK_1_FREQ     (456000000)
* z1 E8 p# \8 L) ]# C0 S, O( i4 h#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)1 N' V+ j& ^# S' V
#define UART_2_FREQ       (SYSCLK_2_FREQ)6 y# S- D% w' o/ G- N4 j
6 q, \4 T* O6 z' q; W% n( Y
/****************************************************************************/0 S* u0 K. i8 v
/*                                                                          */. e' @& f# W' |& E
/*              全局变量                                                    */
$ N' C  ^- I' W5 m/*                                                                          */
- `0 w$ G" P2 c) Q) U! G4 ]5 |/****************************************************************************/" {+ E' q+ `( l' H4 e1 Q# i
char txArray[] = "Tronlong UART2 Application......\n\r";& O% n' T' X, L2 D

" |4 T* U& @9 T5 |9 J; W, [. a/****************************************************************************/
# ]! F1 d: P/ h3 W, w) P" w) X/*                                                                          */
( M* V- d' z6 `, L/*              函数声明                                                    */
5 U! G2 t3 C/ A/*                                                                          */
: K% s. O- r$ L; |6 x3 M/****************************************************************************/
% W$ H# M  b! _% z$ i// 外设使能配置: N' w+ U3 _" Z6 [" c  i
void PSCInit(void);& D& \$ E# e4 v  T

# |$ E+ H, ^$ f9 k( X7 _: }// GPIO 管脚复用配置) J' j8 H* L; u
void GPIOBankPinMuxSet();* F* ?- R8 c4 s
. p: B3 D; p# u  V$ X% k
// UART 初始化( X; v, E" Z5 N- M
void UARTInit(void);
# l' z: C8 r" d3 K- m( X' G% I8 F// ARM 中断初始化
9 n. o( v2 X0 S8 v0 v3 B/ V$ ^void InterruptInit(void);
# |# E  v0 l2 y: z// UART 中断初始化
+ t) J/ A5 s* o7 mvoid UARTInterruptInit();- x: P4 w# r* G. p" J
// UART 中断服务函数
$ p3 c$ A8 A% z( B3 M$ mvoid UARTIsr(void);
3 U9 h! [/ Y9 e6 b* G1 f: D: s
7 w' m+ U# R. ?1 f. Y/****************************************************************************/
& E7 N' [' W; j+ b/*                                                                          */% J  o- r; R6 K8 J- g. t& ]7 Q3 Q# P
/*              主函数                                                      */
" f: r. T6 ]% B3 {* J/*                                                                          */# i1 b  `" M: z5 C. X5 G4 t/ z
/****************************************************************************/
. Q  l8 F( e' r; _int main(void)
/ W' c/ o/ J) ~2 C/ X( l{
* Z. f. E# ]1 w& n        // 外设使能配置
0 ^) I6 f! {" ?! w2 P        PSCInit();  {! I+ i6 F4 |0 w. s
        8 z$ i8 w( C% h( O
        // GPIO 管脚复用配置
0 w8 `9 Q6 R3 J! \6 A; k$ j6 m        GPIOBankPinMuxSet();
7 S3 H4 i  J2 F+ b$ f0 p0 g, \( t& q3 U  w0 P
        // ARM 中断初始化
6 B* _3 U4 u4 E5 F        InterruptInit();0 y8 @! `) S% }2 Q5 q
) i0 R$ Y! \* p. q1 t
        // UART 初始化
% F7 j8 U- B. A9 f% @  }) M) U        UARTInit();
. h0 f( t) B2 s. H8 ?; G4 Q& S" A* K% U5 O6 ], G
        // UART 中断初始化
! w: o) Y6 S# C4 Q$ b        UARTInterruptInit();1 ]8 C& d" U$ t; w0 E

2 t1 S& C$ h5 i$ h  [        // 主循环; N- \  w. b& _/ y6 V5 V5 Y
        for(;;)/ A0 a, F8 K7 w. @% f
        {
) O% q- m" t4 Z+ v" R2 w: E
# [# ~1 k& t5 \% M6 l  \8 F        }
# d! [9 w. t1 \! O0 w}
8 Z) Q2 Q* n4 K# c: o$ j. k1 q- C% L
/****************************************************************************/
  e: `, C, i* A* K/*                                                                          */' U1 a& O  f/ ~+ |
/*              PSC 初始化                                                  */% Q9 E- Y- S4 r0 v
/*                                                                          */& V0 R- L7 b6 I( H' G- q- e
/****************************************************************************/
# p1 d0 ]' m% f7 C1 A& bvoid PSCInit(void)
: A+ m$ N6 ~$ z) |- I{
% X% H3 z9 K' q% f2 Z, k" v3 P        // 对相应外设模块的使能也可以在 BootLoader 中完成
' ]+ U1 M+ N6 U) b    // 使能 UART2 模块; n9 i9 R  p5 d6 m( a# [/ g' n
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);- m3 ?, u9 b' f1 r  D, `
}- b# W9 i9 i4 F0 B8 F

6 |2 |2 O+ B% C# g' G! p/****************************************************************************/* ?0 X& a: _$ X/ P/ R- I
/*                                                                          */
- ^2 R, s# x0 I  m$ `/*              GPIO 管脚复用配置                                           */
. r1 O4 y9 B9 C, y$ `$ y/*                                                                          */. T& M* ?7 z5 U2 K4 z
/****************************************************************************/
* E) `- ?6 d4 J9 k) O1 ]void GPIOBankPinMuxSet(void)7 W- e& M+ ]9 m# u! ?1 i
{
8 R3 S. x% m% J7 i9 ]: F0 X        // UART2 禁用流控. Q( n5 E2 z- {  o/ J
        UARTPinMuxSetup(2, FALSE);1 \$ A& t" V: w" Y
}* a# w" c* V& I: u7 x8 o
7 ~3 |  P) y( _( D# F$ z4 U
/****************************************************************************/
( l5 S, O* I# b. q$ N3 ~8 V/*                                                                          */- {# h. L. g6 I; x* Y1 w0 _+ }
/*              ARM 中断初始化                                              */
1 q4 `4 x; H% l6 T! A/ x  {) \7 J/*                                                                          */# k& B& i# ]" I( |$ k
/****************************************************************************/
6 v+ S3 ?: @- ?: A% ?void InterruptInit(void)
4 n7 W* R# x# w% [2 R4 N% Z" z{: ]6 [: ]( f3 E; _4 ?
    // 初始化 ARM 中断控制器% _) i: v7 [$ k4 ]! G
    IntAINTCInit();
3 c# u: s% E; d7 u/ ^) u2 b  j  [: V3 w7 G
    // 使能 IRQ(CPSR)
! C5 F3 P5 V7 g& R    IntMasterIRQEnable();9 J2 [1 _* \8 B' d. j) [

  j3 {$ M, w# x, w) r    // 使能中断(AINTC GER)
3 H% V" L- e  n7 P    IntGlobalEnable();
9 b8 ]1 v" |' h
3 ^! q* K5 H  c  }/ W3 Y9 {. [    // 使能中断(AINTC HIER)
$ g0 U5 U" k- M6 B/ z    IntIRQEnable();3 b7 i# S% D, B  W& y7 t
}
2 U4 y* t  X0 T' Y- b$ h: c
7 _; S* v- I% u6 j0 J1 t- P/****************************************************************************/
( L, w5 k0 u# o# p) H7 ]/ t/*                                                                          */
9 f$ C# M0 p: c& d7 p/*              UART 初始化                                                 */
4 C0 Z. p4 t, }% Y2 y+ @) C: O$ Q/*                                                                          */( t) S, a8 d. J* x8 u3 t% T  u
/****************************************************************************/6 y% R7 [! _. E; D6 V/ n
void UARTInit(void)
0 a7 ?% W8 x) n# q{
. c4 L' C+ J3 }* F' K2 O* _        // 配置 UART2 参数
3 t. A1 X  e* t, I* b        // 波特率 115200 数据位 8 停止位 1 无校验位, F- s/ }9 P1 y! ~1 y% C) W. ~
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
- R5 w3 n& e  ]* @                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
4 }: U2 C8 [  _0 L$ f        // 使能 UART2
, R/ S( l3 T, N5 h" }2 \        UARTEnable(SOC_UART_2_REGS);
0 ^4 i; |7 B2 x* p7 H- R. Z4 g2 ~
  v: F1 q0 ^- g' A" |1 |. ]6 G    // 使能接收 / 发送 FIFO
; _" G  Q0 b" [, x5 U    UARTFIFOEnable(SOC_UART_2_REGS);/ {0 |+ j  Q- x
$ r& t4 Z' |% x8 z& D, L6 v
    // 设置 FIFO 级别, ~9 c# C7 H- z
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
8 k4 {6 |- r  x) O}0 z" c* r$ l7 P* e+ D& V8 m

0 j2 F  d' a* C5 @0 g8 [/****************************************************************************/, Q& C  C3 t; y( A/ r
/*                                                                          */
4 K$ m+ |) u5 l/*              UART 中断初始化                                             */% s2 P5 V/ c! J
/*                                                                          */) E. S7 n9 U2 X6 Z; d2 f( F
/****************************************************************************/
2 T4 C6 i! _# x  Lvoid UARTInterruptInit(void)
4 E# h2 c- g) x: R" {; j# n{/ R( \5 |# W4 j4 j. E3 g
        IntRegister(SYS_INT_UARTINT2, UARTIsr);% i! S+ |* M: f
        IntChannelSet(SYS_INT_UARTINT2, 2);# N7 I- o: T  C5 E: E
        IntSystemEnable(SYS_INT_UARTINT2);; C- c& \, `5 w! ?& g  v

( T! `( _& b2 ~8 V        // 使能中断% f* h' u; l% j
        unsigned int intFlags = 0;
* A, l! T2 R0 ~/ ^    intFlags |= (UART_INT_LINE_STAT  |  \* u' ^: a# h8 v+ x, n
                 UART_INT_TX_EMPTY |    \
2 W7 D- n6 }' p9 G% K8 `. T; Y; Y) }                 UART_INT_RXDATA_CTI);' g" u* P) x# f( K5 V/ w, H, G
    UARTIntEnable(SOC_UART_2_REGS, intFlags);! D; n. f# u* W4 g; e
}
; m9 U9 ?2 k7 I% E9 O) f, U. ^: ?* y, p" M" B' ]% @
/****************************************************************************/0 n5 ]0 ], ]+ W1 P. V6 Y
/*                                                                          */8 V* B) _/ h! ~5 Y5 h' o" w( E: l
/*              UART 中断服务函数                                           */! ?+ p! j# s4 }$ K; a
/*                                                                          */
; s9 g) M& C) N6 A6 \! g/****************************************************************************/
( C5 m2 ?$ g) g7 `void UARTIsr()
! H" L" a5 t/ `3 M{! }) I6 _# T/ Q5 n6 m
    static unsigned int length = sizeof(txArray);
3 T4 _" P2 p: b6 A5 g. ^* K    static unsigned int count = 0;
: g" d6 r! K. e5 M/ y& D    unsigned char rxData = 0;5 L$ w, L; K1 w  F7 X) c" I: M
    unsigned int int_id = 0;
' `0 u( O# {* J0 @" ?# X) U, i' r# Y# C# O
    // 确定中断源3 r. M6 C* s! w% g: K% |. C
    int_id = UARTIntStatus(SOC_UART_2_REGS);# {* h# R5 t! G& N0 A

" m, c0 J3 m8 F' c( P0 L; _7 l    // 清除 UART2 系统中断
' k9 B: }" D* ^% f9 y    IntSystemStatusClear(SYS_INT_UARTINT2);
! d& R" y( J/ n/ q3 K. P* c
  B* Z) Y$ O2 Y! _1 X    // 发送中断& F3 v/ X% F- G  g3 \8 k8 v
    if(UART_INTID_TX_EMPTY == int_id)9 v' w3 H7 p0 ~8 w( m- g$ q) P) }9 R9 q
    {4 K# T9 m& w& L0 i+ T
        if(0 < length)2 O' P1 D4 a; f8 `3 D& O; s" B2 X. v
        {
5 v. G* N/ _& M; T" e8 K" B$ ]            // 写一个字节到 THR; _# q% _$ q2 e
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);( n% F5 P9 e5 D
            length--;7 L3 D+ E; {# H3 R
            count++;1 b' K) U- V7 B$ P4 E8 f* L
        }. O+ I! e8 g7 h2 i  {' Y# R/ Q
        if(0 == length)& ~- i, S2 n( l& l, s
        {3 i4 g5 O: U5 Q9 ~4 b3 T
            // 禁用发送中断& I5 K* t% H3 E. f" O6 F/ _/ J7 s
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);) h+ y$ i( b$ ?
        }
: F6 ^7 \- E3 r( [, D     }
5 o% G, A& p' z  M) Z; p$ `8 j/ G0 M& W7 X, F2 Z- h: h& t
    // 接收中断
2 f  Q3 C3 i# x! b# X! t* ?) P    if(UART_INTID_RX_DATA == int_id)
, E( ~2 \! t% c/ @' b: @    {
! |, h) l+ V/ l" f6 \: M        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);7 ]# s; E) T) C8 K6 A
" `  r2 U' k1 j. a$ Y
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
; Z) J# L" B) R9 `6 t" c    }
! b  r" k; Q$ E4 t5 Z8 K- e! q/ E( r" O4 E( Z, f, d4 w* F
    // 接收错误5 K) V0 H1 ~# m% D$ C5 U
    if(UART_INTID_RX_LINE_STAT == int_id)" E, u5 e, u9 M' }: {9 _7 h& q
    {0 \' i; P8 R: V3 R; [$ R
        while(UARTRxErrorGet(SOC_UART_2_REGS))6 X9 E4 D4 e% T3 E5 `
        {
" G" l7 B$ z. R9 A$ M, I4 k            // 从 RBR 读一个字节/ [% s) A1 |. F; [" t# R
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
3 j8 f+ f4 A1 X( g1 y0 V        }' i; K0 j" w4 G$ }% ]4 P
    }
- J7 C6 A0 D! o) X; m; z  n   
) K/ s& k8 V" O    return;; @; `% |7 `' ^! B6 X# K0 D: X
}* A5 m  j0 }3 Y: \! X+ T. [/ ^  V& p; O
回复 支持 反对

使用道具 举报

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
) \1 y; Z. n* r# W如果其它设备快速给你发送串口数据,你这边能正常通讯?

/ A* ]% n& s  T2 Q谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 12:34 , Processed in 0.041578 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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