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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8460|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
$ I) x+ N, v1 i2 x4 g

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
- a# W% a) D, `  N# C4 C  R! P& N: A1 a
#include "TL138.h"                 // 创龙 TL138 开发板相关声明1 D& C: I! z9 H: G2 B

! ^  f1 ~: J7 F0 w. }, X- U6 V#include "hw_types.h"               // 宏命令7 B7 i6 ]- {: w/ V2 x) H3 Y  i
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器; _) F# d5 C2 _5 k1 ~/ F
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
' y  B; e5 D0 g! M9 L) Z! T! o7 n" F. b8 ^- o+ k
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明9 Q0 _1 v( @5 k2 q* F0 B
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
! U+ @3 F! f. \) s+ C2 T' p& C#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明- `1 ~9 h# v2 ], z( F& a
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
/ i7 e9 F1 w, [; X% D8 _. f. t" ^
$ ?, ]/ [" M4 l, C& _8 f+ ?6 n/****************************************************************************/
7 h6 x1 N' V/ M7 D6 ~( b/*                                                                          */
) ~* x) g/ p) e/*              宏定义                                                      */+ ~: q& c2 Q2 J5 r
/*                                                                          */
0 I, H( R8 t) x6 l/****************************************************************************/
; `  p2 y# ]& `. f2 U// 时钟
9 q2 m& g) z" A. q#define SYSCLK_1_FREQ     (456000000)
. [' }$ F0 J2 e3 _/ z. b. s#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)5 g# F( E2 V% b( K
#define UART_2_FREQ       (SYSCLK_2_FREQ)/ v9 I* I* R) R+ {3 T- h* `+ z

5 ^( w0 X% }1 l& ]- L" |/****************************************************************************/& R- m" |# i' N
/*                                                                          */1 Y3 x' `: i6 {+ ^; |
/*              全局变量                                                    */8 K" m/ [" E' @7 X& J
/*                                                                          */3 X% I% a1 ]9 T1 V! F
/****************************************************************************/- A2 H1 y, \4 u$ a6 i3 r
char txArray[] = "Tronlong UART2 Application......\n\r";/ K# s/ w- z6 }1 c: R
% `1 c& W: x4 @/ L
/****************************************************************************/8 y7 h" I7 y) }' S/ f
/*                                                                          */
6 I9 b6 u! ]5 o: o1 B4 ?. ~/*              函数声明                                                    */  \7 e4 e) i/ t9 `5 l
/*                                                                          */1 ]2 M& D) A9 g( @1 B
/****************************************************************************/
. ?  p7 W- N$ a. ~; u# i: \// 外设使能配置
+ `8 Z& B9 E# Q( evoid PSCInit(void);
7 P9 F  K; q  c' O0 ]- X2 y3 Q, C( G. W) ^
// GPIO 管脚复用配置, N: Z& J4 K& G- `5 L( M: r
void GPIOBankPinMuxSet();
7 A* C, u2 m; K2 B" ]7 x) ?
# k- C5 X1 ?8 ~$ V/ E, v// UART 初始化7 B! ~. E% ]* ~( J
void UARTInit(void);
( e/ n4 m* v" a2 `. V7 x5 k- F: ^// ARM 中断初始化
( b& M  c; M9 t& ^8 Zvoid InterruptInit(void);
0 ^  I* }( e4 y" h// UART 中断初始化
7 _2 R0 G2 P# Y$ m9 f% fvoid UARTInterruptInit();, a+ \2 L- }' ]2 d' `2 C& L
// UART 中断服务函数
. I% D. i: [1 P$ V$ q& ^0 kvoid UARTIsr(void);; I) _* K  W- U

# f! M, e! p# u( \; V/****************************************************************************/8 u4 F  O& j$ m9 c5 G# W
/*                                                                          */' S. d- o$ ^3 m" W& D
/*              主函数                                                      */  w8 k6 w) {5 ]- a3 T
/*                                                                          */
) \5 b. A- v0 ?! o$ q- c/****************************************************************************/, V7 I2 X( u5 P1 K
int main(void)
% S2 L6 q3 [5 i& h- f/ N$ \{. N; n; k) T& a/ p
        // 外设使能配置
3 E: x( _+ `; B        PSCInit();
# J/ y$ }* k8 X2 y  S       
! d- J. F0 R! @$ s# Z! p5 o& c8 n        // GPIO 管脚复用配置
' a% z# S- @9 v  X        GPIOBankPinMuxSet();
) d# c# d( }( K+ s; Z
( B( Q) `0 x0 ~. o  s        // ARM 中断初始化! I$ X" z% E- Z! |9 y9 c
        InterruptInit();, Q2 V) B  ?- s" i0 f

  r* b* f* n+ `7 Y4 D        // UART 初始化
, X8 ~! B( k0 ?/ F" q& b3 j& U4 z        UARTInit();  G6 J# o; r( ^0 o1 r0 N) o' G+ @
: V3 N; G' c* i6 ?
        // UART 中断初始化
+ p$ ^4 }, z& [9 b7 n        UARTInterruptInit();
1 I# G0 f' k% F( v3 p3 ]; L  @9 F/ N7 U, t
        // 主循环* b) v- ]( ]0 ?& ]' h
        for(;;). k% `, q' j8 ]
        {
7 e" e- l7 r* B$ V. ]# x" {8 l) F0 n; j+ i) B1 I3 v" ]$ i
        }
2 R" R" w4 N; T$ ^( a& G}- U) G! F# l7 f2 B

2 F3 c0 o0 W$ o  ]8 c/****************************************************************************/
( a, w1 U1 R" V/ ^/*                                                                          */
6 n  S! G4 f8 N4 r5 P( [7 T- e# F( D/*              PSC 初始化                                                  */
/ w) z: v: E3 Q/*                                                                          */# M! Z9 ]  O1 W0 g7 ^9 S* L
/****************************************************************************/  L: c, v" j; V. X7 n& r+ v/ ~. t: l
void PSCInit(void)
- o% P# @+ R' {$ a{
2 t: u" U; R4 `. h        // 对相应外设模块的使能也可以在 BootLoader 中完成& d  h7 u6 s& n/ l) ?: Y5 H) G
    // 使能 UART2 模块
9 u2 d7 i- e1 \. v6 r- w    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
8 m$ `6 L4 a0 n! J/ w! D}9 s( ~2 s6 Z( l1 n, E

" T# G+ `$ s0 [8 ^8 T$ A* l/****************************************************************************/
2 ?, A* A6 D: b5 I0 F/ p/*                                                                          */
% H* d- s0 t/ ^: h" _- p3 t; O; y, X! ?/*              GPIO 管脚复用配置                                           */
2 h8 ]$ K: F. |' f) q/*                                                                          */" H! N7 H+ v# c: t  P0 h. m% {! F0 h
/****************************************************************************/
8 N$ l6 k& `4 {3 h4 r' p' }3 V0 \void GPIOBankPinMuxSet(void)3 i! u0 v5 E( E- Y9 e8 ^6 F* c! q
{
, ?1 F5 E+ N3 ^% t' p8 {        // UART2 禁用流控: e- |3 u6 r! O& c. L
        UARTPinMuxSetup(2, FALSE);
+ ?2 @/ m3 n2 F; W" M3 p9 Y}
; {" G4 X! I/ D" ~' C4 A* r8 A) j$ e% B( {) Y
/****************************************************************************/. @0 e" i; l, w- G9 ?9 L
/*                                                                          */
) v" D3 w: Y2 @; S& t- f+ g+ X& C/*              ARM 中断初始化                                              */
( e/ a3 ^5 c& E, v4 Q; f/ j/*                                                                          */% M+ `. V! l2 y6 Z/ E4 g6 k) e
/****************************************************************************/
, ^6 w/ c' S6 L  I' O; Nvoid InterruptInit(void)
3 n4 X. y  N' T: [- I0 o; }3 c: f{
( ^7 O& q- R- n6 y    // 初始化 ARM 中断控制器
0 F( N1 b7 d' G+ i4 ]2 p    IntAINTCInit();
( i* [/ [5 X- L* ]* X7 `2 R
: Q9 M8 E: o9 X# B$ d  B: Y    // 使能 IRQ(CPSR)
% y7 m7 ^/ p8 \* v1 Y    IntMasterIRQEnable();9 o# I' S1 A3 r0 u  M3 W
  I# g+ _+ ], ?/ z
    // 使能中断(AINTC GER). r- o- X, K1 G
    IntGlobalEnable();
5 ~3 l# Y- X5 r& Z4 `7 y( N& r4 R1 _/ o, p' V
* I- G, T& D" a    // 使能中断(AINTC HIER), ^/ Y+ Q  ^2 c% E9 s" L1 l
    IntIRQEnable();
$ h1 \* `2 \- ]- l* g/ y}
: U( v/ L. ]0 Q1 Z% ^% w' p
$ n' C6 S7 x" ]2 N! A/****************************************************************************/
3 y" o! l4 n; n5 X3 N4 G! p8 d  A* R/*                                                                          */& w3 ]' f, H. A7 J$ _( u
/*              UART 初始化                                                 */
" J. b- \3 D# c+ H1 ^/*                                                                          */- a" d* T5 A( Y2 Q" X) H9 o5 B
/****************************************************************************/. @' A6 r5 z; k4 C2 U) h2 p
void UARTInit(void)' E. r5 @1 B3 o
{! R3 `4 l2 G( p5 u9 s' J- E& ?" j* j$ E
        // 配置 UART2 参数) C7 a" ]; h1 |) Q! o* O7 [  v
        // 波特率 115200 数据位 8 停止位 1 无校验位# `3 L4 Y) j% Z, S. y: C, v8 o
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
# y- L- f6 G' J6 @: H                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
  y0 }" N- G1 c+ r        // 使能 UART2; k( X  j' l) }! \- B
        UARTEnable(SOC_UART_2_REGS);
) P% _7 X1 `3 M  d/ s; T7 w/ ]. o9 q0 @8 r+ N' D# q
    // 使能接收 / 发送 FIFO2 u+ d8 O' K: `3 g- w
    UARTFIFOEnable(SOC_UART_2_REGS);  g5 v. g$ h/ i. Y- U
4 V0 H2 [9 G9 z6 O" M- O+ H9 o
    // 设置 FIFO 级别( c8 |, R4 R; g/ @+ K2 l
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
, f1 V. \( X) C& r}
3 R# _* b0 a( O; e4 o( \3 L) N8 `3 V& m, U/ v: F
/****************************************************************************/1 r+ V6 j1 M+ Y- n1 f3 B* e
/*                                                                          */
0 t& I( h" L: \/*              UART 中断初始化                                             */& _2 p' ]3 K- {
/*                                                                          */
4 e( b  x  Q+ C$ d' O( r/****************************************************************************/  D1 J# E$ |' W6 i* X
void UARTInterruptInit(void)7 V) K  V! A$ ?  P4 |1 p) n
{
. @1 [& R6 O" ?* w7 Z6 \        IntRegister(SYS_INT_UARTINT2, UARTIsr);; x# K; m1 v/ ?4 m' K, m
        IntChannelSet(SYS_INT_UARTINT2, 2);
0 d5 N5 }* j) O: J& n4 v( j- z& ]        IntSystemEnable(SYS_INT_UARTINT2);
+ |, m* ]+ h/ B2 j& R+ W
+ O: r; c& v6 U, \  V        // 使能中断
! u/ j8 R5 P- P( ^8 B5 h6 F        unsigned int intFlags = 0;
9 V! Y: B: [2 z    intFlags |= (UART_INT_LINE_STAT  |  \
4 L1 f( U6 T4 t/ S, N1 ?# |. l' J                 UART_INT_TX_EMPTY |    \7 Q7 a. ^% d( A, P
                 UART_INT_RXDATA_CTI);8 z1 f1 Q% @0 z7 R" B
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
, l, b/ w. |7 K}# J# C+ _- f) o
4 x* G8 {" A: t2 R, l8 Q3 Q- ^
/****************************************************************************/# I6 v( `; g9 J5 y4 T
/*                                                                          */4 u' |2 k0 D8 |* @9 `) ?! f+ p
/*              UART 中断服务函数                                           */
' Q. k3 J7 D4 Z5 A  M$ Z/*                                                                          */
, q& K0 }, m, s1 t' I6 |/****************************************************************************/
, y7 d2 j8 @& w4 K9 Vvoid UARTIsr()2 ]' w7 J- b+ I# @6 J
{
% K# k) _( ~6 I7 L& I0 W    static unsigned int length = sizeof(txArray);
' F( I$ z$ X1 M, ]" z, a$ k    static unsigned int count = 0;
( }% E% l: \( C" Z$ H# t2 W' @    unsigned char rxData = 0;+ V  `) `; \6 H" w" E5 c
    unsigned int int_id = 0;; c0 H$ R0 l9 e  _6 b9 [

+ W& S9 W+ J7 B2 ^- O0 s5 p& ]8 A    // 确定中断源
4 q3 B* r0 d# U: W    int_id = UARTIntStatus(SOC_UART_2_REGS);
( y3 F' g" E! a  B
! q  S! v  X3 D' b9 G5 f    // 清除 UART2 系统中断/ f7 u" s$ b. U# V2 y' l
    IntSystemStatusClear(SYS_INT_UARTINT2);$ B9 C- v% f2 O4 Y( x9 X

8 ]9 W  T, x7 j) _/ m. [, r8 K+ y    // 发送中断# F5 x. H5 A/ t$ L/ C
    if(UART_INTID_TX_EMPTY == int_id)' s) H' {+ ?) D! b
    {+ b/ V' L. I/ n2 U- R  C7 }
        if(0 < length)0 ~. X+ t! F. M6 e2 {$ A
        {- |7 y% F$ |8 Z0 J9 o! [
            // 写一个字节到 THR$ B3 f) j5 {# T9 h
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
) P9 F. n4 j7 X            length--;
6 J  l% J5 v+ a) D. D; [            count++;. C( c% ^  d: F' I8 F
        }! k7 J8 A  ]0 p0 T
        if(0 == length)/ Z% z# H0 s' L' a! i
        {0 R5 \/ ^; b7 Y# S* M6 i) p% G
            // 禁用发送中断  s* U- l+ P' m6 B
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);9 k0 s& C- P, Q
        }
2 y5 i0 ~; {7 R1 Y" V0 f     }8 o% F8 I" [2 {. \

) O  Z' v# d! ]" ?  b' h5 @8 e    // 接收中断, j0 R9 e& C, S  \
    if(UART_INTID_RX_DATA == int_id)  Y0 A0 l. J/ ~* {, t$ d
    {
7 F" h1 Y/ k/ B        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
/ Q9 f, F' ?! t8 W; L0 G" k/ f
% S3 G6 ?& i7 a1 ?' d        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);  J! n3 @2 }4 }  k0 P% Z, q9 b
    }: O# c' J; v! Z5 O

/ s& M- N( v6 @. S    // 接收错误
7 t3 }+ e6 l- `' _    if(UART_INTID_RX_LINE_STAT == int_id)
4 T3 c3 P  t$ a+ r. L: E    {
% n  s$ d4 s7 M( H        while(UARTRxErrorGet(SOC_UART_2_REGS))) i. d: \& _6 U1 b, b
        {- i8 _( n4 M3 z; {
            // 从 RBR 读一个字节/ |8 Z2 e/ z1 B) A8 Z+ Q
            UARTCharGetNonBlocking(SOC_UART_2_REGS);* g, q$ f. Q# v' K
        }
5 E1 a9 d/ S& B! x. B    }
9 v8 E/ m3 A( m7 k* _) r0 k   
! }2 V- }" N1 h- `, s% y( g    return;
% `3 q- `% j5 k& ^8 c: @}( |" |3 ^! v+ n! _0 |
回复 支持 反对

使用道具 举报

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:256 r+ w- K4 g: i. Y6 F2 A9 W0 J
如果其它设备快速给你发送串口数据,你这边能正常通讯?

* A) T; X8 J2 `. }9 j5 _谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-7 18:55 , Processed in 0.046479 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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