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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8086|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
# q- N/ A* z$ s+ o) @' e3 S; B

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。2 \% m; A7 K: f% _' O, }( E

2 F* A, }$ n% Y5 W* Y#include "TL138.h"                 // 创龙 TL138 开发板相关声明
! M7 B. U, K9 \' [. m
% N) M5 v5 a; o; b) T#include "hw_types.h"               // 宏命令, ]' o0 D: {3 J) ]# j) C  S/ E
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器' r1 K" s; x9 Y6 \2 H6 ]  m
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器( y. ^3 f' V% y  S* p

3 Q$ B1 y% T8 l6 X; M9 X, w#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
* z( a2 {/ Q7 Z" V! I1 D9 O0 F#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
- d$ h7 Z; P# D+ X! @& ?+ C* t#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明2 I5 ]& y! E1 z1 u  Q$ k
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义& |% V6 w; i# e0 j" J
  a  b0 Y: H2 A5 s9 e
/****************************************************************************/7 y& t( S0 ]- a9 _. h  B* n6 S
/*                                                                          */
7 G* s' j7 e7 T: C0 D, r/*              宏定义                                                      */
+ Y. }4 k: Q6 ~, ~1 @- L& u/*                                                                          */
8 o  D$ _  Q! `7 D; Z" R/****************************************************************************/
4 r$ Z, s2 ~/ Q/ j// 时钟0 ]6 h6 r0 E* g7 N% v. P" p$ Z
#define SYSCLK_1_FREQ     (456000000)0 i0 N) a. l& N# G; T! A
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)+ w( a9 [! L( V
#define UART_2_FREQ       (SYSCLK_2_FREQ)- I9 u  F+ z# w  W  @/ C+ t- n: L
' K9 {2 ?. a# [6 S: o2 x& d
/****************************************************************************/9 o* E1 m% Y- v
/*                                                                          */( {+ |$ t# c& c: h
/*              全局变量                                                    */
$ ]+ M; X8 |' y/*                                                                          */
! W& ]* m; t# V/ y5 K! k* w/****************************************************************************/5 Q( q# G, Z6 f
char txArray[] = "Tronlong UART2 Application......\n\r";: g& Z; j' m7 r4 [& ~0 B; I
+ k2 E9 S0 b& Z+ ^! m
/****************************************************************************/
% Y! W  w8 `# M  X/*                                                                          */
2 U& Z3 ?0 B, D/*              函数声明                                                    */
4 S/ w) J5 o7 f* M% _3 L6 s" O  w/*                                                                          */: A0 c: v( H2 B, I
/****************************************************************************/& E% v8 |* ?; U( q
// 外设使能配置( e0 \, ?. m1 s* y+ w$ b% r8 a
void PSCInit(void);
; d. M/ i* S) p8 y+ j- e! V) P7 O2 p. {1 J. X" a2 D& R
// GPIO 管脚复用配置" Y' s8 r+ t  `
void GPIOBankPinMuxSet();1 ~1 q4 x! G  s2 B$ Z' N2 W+ E

' D! K, `7 u6 @8 c6 n// UART 初始化
+ [* u+ d5 e0 y5 G# B# [# Kvoid UARTInit(void);) g  r" q; S9 w
// ARM 中断初始化( c+ B. x! f) l" S7 P! K
void InterruptInit(void);
. y7 S2 N  P  [, q1 O/ _// UART 中断初始化
% E6 P# \5 N& r- _) w+ B7 W6 wvoid UARTInterruptInit();
( O( z( ?/ U( x# D* N8 I4 G// UART 中断服务函数
- ]# X/ R" ~7 n* q3 wvoid UARTIsr(void);
/ z3 G- u( Y- g8 f* F' p% S) F: l, j' I
* \- j! m+ X. f+ D% |% V0 D/****************************************************************************/% F9 s0 G$ x$ I/ e
/*                                                                          */- |! x  T6 a% {# g6 J
/*              主函数                                                      */( _2 l; l- |* d1 n
/*                                                                          */7 Z, B3 o& g! Z- A% }
/****************************************************************************/+ p/ b! ~* g  S7 z' c; |3 E; Q
int main(void)
$ |4 x4 T$ R0 Y/ g* g1 I{+ A4 w5 P, ]- H0 Q! s8 B/ C
        // 外设使能配置
1 s/ `3 m9 N) v        PSCInit();; ~, g  R& r3 e: |6 O- _2 y7 _
        1 t7 `) O+ w3 p- P; i
        // GPIO 管脚复用配置
& f) s9 d; z: r% b& ?) s' J        GPIOBankPinMuxSet();
9 V/ B- I+ K. t/ a, F4 o% A1 v, S7 |1 M. A% D. _2 g* b! ^% ]' F# ~
        // ARM 中断初始化. D" H" r" l, |6 P9 @  W8 K; o  A) y
        InterruptInit();5 u% Z5 o: P; p% S* s

3 x; d* W; F0 N        // UART 初始化
# L) z; Y2 D& ~        UARTInit();
, A4 T1 R) d5 W1 M6 n5 c! B0 h; X3 ~
# Y  n. j/ }; z* c        // UART 中断初始化4 h8 E% K& p  F- ]
        UARTInterruptInit();
5 ^' k/ F% m  q' t6 H. I5 u7 H8 a, p( Y& e: k
        // 主循环5 L4 ]# F' d; t! \/ W8 n6 d
        for(;;)
3 X2 F, L: f! ]/ I9 J        {
5 Y: l# H% Y7 a, V! ~- R+ c: I
/ c% n3 L/ t- \6 P        }6 S( u' N- B: d5 O
}7 ^6 z! h' A4 L! ~$ A9 T1 \  C; N4 o

, ?5 d9 I" t' {/****************************************************************************/
' ~1 C; z8 u- q; j( Y; y/*                                                                          */1 g. T9 x: f# _3 v" d
/*              PSC 初始化                                                  */
  m/ }% T- b: A/*                                                                          */+ F0 e. U0 b3 ]' x+ k7 |  \7 \' O
/****************************************************************************/" m" U2 H( G$ H+ e
void PSCInit(void). z( W  I% S& {
{6 h! c2 D* w& s5 O7 z) g( ]
        // 对相应外设模块的使能也可以在 BootLoader 中完成
% H: `. `; m" P1 V7 a0 ~    // 使能 UART2 模块
7 V/ b4 f. g5 A2 ^9 S    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
9 I3 N5 S( |- W' B0 r, i}
. x. I( T) C" V1 V+ G0 x) x- T0 \) q' _7 z7 @& l; l
/****************************************************************************/5 O, Q) B) S9 P) V
/*                                                                          */3 \/ n1 R0 l7 [$ ~$ l5 q2 ~
/*              GPIO 管脚复用配置                                           */
$ z+ @5 m9 M; I3 L4 @2 `" {& w( W/*                                                                          */
, C9 J8 B4 I" G$ }/****************************************************************************/6 d& g% w: j: g; d  F# d
void GPIOBankPinMuxSet(void)1 c% j9 l  [5 d5 A
{
# `$ p3 O8 D- ]) R        // UART2 禁用流控7 d& k# T+ r% ?6 E
        UARTPinMuxSetup(2, FALSE);
% I' A1 I( X. N1 D! h) |. G}
9 c& f6 B/ I1 [
7 f9 W. \! E4 H$ D1 t! L% x# ]/****************************************************************************/
8 ~+ Y. r  @/ Y/*                                                                          */
( n9 @+ @4 g$ Y, [/*              ARM 中断初始化                                              */
! Q% D0 }. W' M/*                                                                          */5 w6 z- j5 T" |8 o( k" R
/****************************************************************************/+ C. }' |5 W0 L8 _
void InterruptInit(void)
2 U  }. A3 i7 F- y$ ~$ K{8 A5 L" G; S7 h% A& s. r
    // 初始化 ARM 中断控制器$ Z, p1 ?  |7 F
    IntAINTCInit();
0 K9 {- \2 a* M; @- B8 J
  _0 m' y* g+ X( q  X    // 使能 IRQ(CPSR)
8 I; o+ U: e. l* P  _    IntMasterIRQEnable();* r6 X; d$ v4 d* ~/ c: i' f2 y& W

; G- r  l$ R$ p5 M3 F    // 使能中断(AINTC GER)
% R+ e+ t; d3 E' u, \    IntGlobalEnable();
. t3 g% f) E  m  e4 V3 ^4 P
7 M- X; P6 j! [7 `8 J# [    // 使能中断(AINTC HIER)
0 ?* Z% A+ a0 U# j1 N    IntIRQEnable();: k9 W6 U. J& o3 y5 |! q5 w
}1 t# r) t7 H6 m. Y( m

6 E1 s# S( x7 D9 ~5 H) J/****************************************************************************/0 o6 _7 o5 J+ T
/*                                                                          */
* D7 r4 \; c. O- u) P9 v5 Q* z/*              UART 初始化                                                 */
" k: w/ b8 T; y7 I: w7 F& |/*                                                                          */4 e8 C  f6 [$ }  Z4 S
/****************************************************************************// p1 `7 v; o" I! ~
void UARTInit(void)) W. |! @( H4 O3 ^/ l0 s
{% L2 E& V7 n: q
        // 配置 UART2 参数- g5 {1 O! m6 t) @
        // 波特率 115200 数据位 8 停止位 1 无校验位
& V! x; W! f8 M7 R    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
+ }; T( X4 p+ y8 H6 M6 {# ~7 t+ N                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
$ O  Q4 F$ K' {7 m8 [0 u# B        // 使能 UART25 K3 X+ r- R9 y  a$ c5 w. `
        UARTEnable(SOC_UART_2_REGS);. F! o" R: J: j1 p

' J" A5 a4 ?3 n( u    // 使能接收 / 发送 FIFO. ]5 H+ b$ V* t- N4 H6 K3 n/ p5 T
    UARTFIFOEnable(SOC_UART_2_REGS);& n8 u+ W% q7 ]8 g$ C& u% v

" T( V; W" K! ~( |; i6 f    // 设置 FIFO 级别
0 m% P' X# s7 n    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);# O& ^$ w- }1 O9 D0 z7 ?
}
. l. `( L8 n; G8 \  i9 K: Z3 L) ]* u4 R, V& G# k
/****************************************************************************/2 O) l1 }& |. s
/*                                                                          */
! U, n* @- n2 i& }5 b* N/*              UART 中断初始化                                             */
6 M3 J, ^: c2 ]% L( |4 `8 `/*                                                                          */
0 M0 a6 x) y4 t. r7 J/****************************************************************************/" s( C( r+ E6 N
void UARTInterruptInit(void)
9 _2 m1 z7 U' ~& b9 M! v6 \{5 D- E" h! q0 v, j- p" G
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
" |$ Q7 j8 \1 Y        IntChannelSet(SYS_INT_UARTINT2, 2);
* s. }( d# L, J$ _( Z" T: ^        IntSystemEnable(SYS_INT_UARTINT2);6 P) A. }& E" r  s  x1 A: Y5 m7 h- v$ d/ `
; r- D. I9 Z6 Y# {# Z% u
        // 使能中断& J% O8 p' d1 O  _, j
        unsigned int intFlags = 0;# d/ j" t1 |( x* f$ Y  i" T9 k$ @
    intFlags |= (UART_INT_LINE_STAT  |  \
" ?$ O/ a8 B7 {: d6 w                 UART_INT_TX_EMPTY |    \( z' G) t5 U; L) R! b
                 UART_INT_RXDATA_CTI);
' X9 [" T6 O+ p0 L* c+ A  g, y+ m    UARTIntEnable(SOC_UART_2_REGS, intFlags);
. `) z# E; A: L. W* a}
9 |! J/ g% T5 d1 X& _1 X
9 q' H+ ~" G" T+ B" F# ]) t/****************************************************************************/$ A1 X/ `! N$ O" j
/*                                                                          */) R) a" M4 z9 n' Z
/*              UART 中断服务函数                                           */
5 k" R! l9 h# b: ^/*                                                                          */
8 o4 B+ \" W, _9 f1 B( t8 @, V/****************************************************************************/
7 x- |. }8 a7 x" D7 y6 mvoid UARTIsr()
; W( i6 d; F) ?! e{
  E  w. A& q( I1 m) r4 U3 z& D    static unsigned int length = sizeof(txArray);
9 X2 o8 x) h, r+ `    static unsigned int count = 0;
2 T/ x6 o& c1 Y    unsigned char rxData = 0;
6 b: P" j. V- _    unsigned int int_id = 0;
# M2 l% Z8 c7 I2 ?4 ]. w4 `1 f8 ]/ t: G: ?- o
    // 确定中断源
  M* ]9 Z4 y6 f; B3 g    int_id = UARTIntStatus(SOC_UART_2_REGS);
$ R2 e) P4 ^' D) m  Z
" R5 G6 n% X! d7 I. l* P/ Z, ^    // 清除 UART2 系统中断! A- Q0 [& ?, |2 i' g
    IntSystemStatusClear(SYS_INT_UARTINT2);
' W* S. S0 C1 C6 J) y  C$ S
$ {: G5 U5 i8 j    // 发送中断& ]4 G8 I3 `8 K1 {" |
    if(UART_INTID_TX_EMPTY == int_id)
2 j8 U/ G  b5 N2 U9 w5 ^  N    {
$ R4 O+ e! v& S7 v, P        if(0 < length). E- y% i: f7 g* ~3 R
        {9 N& Y3 y9 _& g$ U" k! ?8 Y
            // 写一个字节到 THR2 Z$ W, Z6 g+ ]" {
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
6 n8 D: b; ^1 Z4 j9 L+ y- N            length--;
  W. o$ O  n, l$ A. T% ^            count++;
7 |- K2 p: }7 B5 p. H0 N        }
% J6 D5 N7 w2 u4 F        if(0 == length)
% U+ k5 j. q7 x* l5 }        {2 D: r3 M! y" p3 w8 E& T7 C
            // 禁用发送中断
+ F& a! ]2 i% E8 I6 h            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);* A2 q" v+ e7 B$ {% i5 p
        }& s. i! M" a) B9 e  |4 s& ?1 X
     }" @4 ~& g: A& i  U

) d* w  O+ L$ T8 _  y2 Z' A    // 接收中断/ N; @% S+ }  f* A( S3 r
    if(UART_INTID_RX_DATA == int_id)
+ @2 }3 y" K) K5 j    {
* D" y8 X6 K# F1 V  F! ?) Y5 m0 f        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
7 B; E  i. z) W' T
6 H. n6 b2 x8 @1 N* g0 f        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
* }3 r4 F; b) ]+ U    }
8 ?% f: B# e4 r' V* s3 h  h. A) z' g$ s7 f% e
    // 接收错误
+ Q: u; X3 U& ]9 \7 t4 q7 M    if(UART_INTID_RX_LINE_STAT == int_id)9 o1 g! }: Y0 u9 L& `) I9 j
    {
- Q+ ?- d3 r: P) t/ ~        while(UARTRxErrorGet(SOC_UART_2_REGS))
1 p. ^, E7 O0 b+ M$ A- N1 K- R        {4 L% M# T) S$ v' v4 C! }
            // 从 RBR 读一个字节
2 e) J8 {* B* u$ Y3 K% X            UARTCharGetNonBlocking(SOC_UART_2_REGS);: k- e# Z& O4 M- ?
        }# u: Z9 h6 y5 D; l5 S
    }+ C. Z7 j  A. ]1 {- M
    8 Z6 V! \+ F4 g# o' m" m
    return;
+ c6 U* k$ \3 X( p8 @+ y. a9 f}; B! |- B( L5 F
回复 支持 反对

使用道具 举报

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 B7 y8 E6 `9 y* C8 B如果其它设备快速给你发送串口数据,你这边能正常通讯?

/ I: L+ p; S+ V1 Q' V谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-7 14:10 , Processed in 0.043281 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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