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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7503|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。7 ], Q! i0 X% f$ g- o

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
4 T# S; r9 N4 P  n% v  l+ }1 v' a; X+ v/ D" n' A
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
0 t  ]) T2 b* z. y
# s9 D) M! ~7 A#include "hw_types.h"               // 宏命令
7 B4 |7 g: R/ x#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器7 ^& s/ V0 q1 A6 `
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器4 K, O" r- f  x$ Z
1 q7 h) f' b+ E) q
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
* m) V. r" w0 x8 ?( [#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
  d' v! }' Y* s#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明2 U/ v0 [2 T6 }/ ^8 o
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义1 A+ H3 z$ D4 U
2 m5 d. v: V5 U0 L6 a1 o
/****************************************************************************/
# r' D! v. P' T, D0 y% x/*                                                                          */
- A$ g; g# s0 X4 G6 k/*              宏定义                                                      */
8 e" m6 z  f, ^6 q  j/*                                                                          */
/ o. R* P- a! K- I/****************************************************************************/& j0 P* [) p* b/ x) F5 Y
// 时钟
. g$ j1 W* r7 A6 |  I#define SYSCLK_1_FREQ     (456000000)
( u5 t& y4 Q5 I6 m8 U( `#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
* E- X* u0 E$ o* z3 T#define UART_2_FREQ       (SYSCLK_2_FREQ)1 t. e. V5 E: m& g8 t! J% B

: ~) e- j* n2 R/****************************************************************************/: }$ N( o( h/ x5 M6 Z/ P& M
/*                                                                          */4 G# f2 K1 R# w" D/ ~# C
/*              全局变量                                                    */
) C; E5 R0 g4 d! w/*                                                                          */
6 f0 o% h' }1 \8 C4 Y) x/****************************************************************************/# l/ ~& J+ s+ u
char txArray[] = "Tronlong UART2 Application......\n\r";; }9 R8 T7 w: q% B$ A% s" `" m2 P
4 W# t( B: O% j+ x# n2 \7 u
/****************************************************************************/
, T9 \& Y$ b1 O& |/*                                                                          */% T# U* a& c" \- M# A5 P- h
/*              函数声明                                                    *// s) C8 v: x" q5 y  t, e
/*                                                                          */5 \$ ~- E# _! |) o0 t5 @* R
/****************************************************************************/
9 c1 Q& l* ?  }5 G// 外设使能配置. W. i2 `% k- Y
void PSCInit(void);% _7 @  Z9 d: g% ~
% }' I( k# x. H: n& R* H$ ~3 t
// GPIO 管脚复用配置; v# f! c$ C/ d/ O& h
void GPIOBankPinMuxSet();
5 o9 ?3 G* G# D
; K+ H" E" ^0 ]* r9 X// UART 初始化
. N+ S! x, n  L! H0 Ovoid UARTInit(void);: q, R2 T' i) h/ o6 D. n
// ARM 中断初始化3 s, I! a) K, S8 Y, E8 n
void InterruptInit(void);( B# x5 \6 w* Y/ c- Y  h$ [
// UART 中断初始化( D! Z" U2 `' |1 T
void UARTInterruptInit();
' I' [' ~5 J! r// UART 中断服务函数
# T& O% j! g/ i, jvoid UARTIsr(void);
  R1 T  e( y3 _1 X( p2 z* ^0 _
  m, [- H0 A0 b6 |/ f  F% w" b/****************************************************************************/2 s3 [6 E4 A" M) B, A
/*                                                                          */
0 W0 R, ^! I! |0 T5 Q/*              主函数                                                      */* A, h$ Q: W* p( |; x
/*                                                                          */
% ]6 `# J9 u( z. U/****************************************************************************/
/ p# l; x4 z0 p% |int main(void)
* {% d2 z" ]; x* p8 T) m* Y{, a' N4 t, h# j( p7 _9 r
        // 外设使能配置- m, t* i  Q. b/ i' G0 U
        PSCInit();- w2 L8 S% J# Z: u: o: P
        & ^6 A% N: }: U0 u
        // GPIO 管脚复用配置
0 F# A0 U  |& y/ v2 P% r3 I9 Y* r7 t        GPIOBankPinMuxSet();9 i9 ?8 z3 f9 l
$ k, Y0 \; Z6 R4 `4 |' J) H
        // ARM 中断初始化
- s4 n  s2 R0 i' C        InterruptInit();/ b5 x9 D. p8 F. U: ~) q* D

" u0 t" v) o3 x* p8 i        // UART 初始化" g/ H: P2 y) W* H4 x
        UARTInit();
% t9 d1 s. K# u- a: y* w
1 f- H0 z% Z; m8 D% y/ F- d0 q        // UART 中断初始化
2 n/ Y1 v5 w  d3 Q+ x1 j. D! t. N7 ~  K        UARTInterruptInit();
4 U3 u- M+ o8 F1 D1 ?" S$ @# B3 L5 m) a2 ~- v( G5 u  d
        // 主循环
( Q' F& M  p/ p; D) l; Z: |$ M8 [; o        for(;;)
! v2 ?  ?2 Y- m2 Q1 M        {( _1 V+ t6 O8 t8 b+ B

) v, x) N( f9 }7 b& O        }, k. U5 C* U% M3 \
}7 |/ S: b0 |& O# O( g) a

5 B: c; m* O& [$ x; C' I6 l7 i$ g/****************************************************************************/  A) a# p( p% W# O4 ^& x; n; {/ A- G
/*                                                                          */# @! Q4 ~5 u2 w# |
/*              PSC 初始化                                                  */, b% S3 Z. ]- y) _7 Q$ p& b
/*                                                                          */
5 `) s2 r- m# w/****************************************************************************/
1 w: U/ t5 a" m6 o. Tvoid PSCInit(void)
4 K* i3 c9 W/ D1 g8 M{( n4 {4 R; |: ~* Y" E4 a
        // 对相应外设模块的使能也可以在 BootLoader 中完成/ v! a$ f. e! p, A% X
    // 使能 UART2 模块
) _2 h1 a  D3 f; p' k! g# k    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);/ }2 o! Q8 {( M; s, _2 F
}
& V, V/ D/ T1 t$ `* p* {- W! ]
! j+ C& S  M2 x  u/****************************************************************************/  o3 I& }+ Q( T% K* u$ \* |, @
/*                                                                          */4 r6 P5 X) U. c; V% O6 m
/*              GPIO 管脚复用配置                                           */
% T, Q, g* Y0 p2 A( F! l9 R1 i/*                                                                          */) v9 ]' P- }, Z7 W; |) @8 |# z1 q
/****************************************************************************/$ ]8 r! d0 [; y& E2 B% E+ s, _
void GPIOBankPinMuxSet(void)" R5 Q- r+ j8 U6 a4 |0 z7 c
{
, x0 \, K9 X4 N8 l. r! j2 L* \        // UART2 禁用流控
+ k5 W& |6 Y) x) |0 b2 }        UARTPinMuxSetup(2, FALSE);
# t3 e& P2 D. g}4 s8 I( |3 {1 h- N! v& ^
5 a4 u$ x. f0 ~1 _5 d% {# J
/****************************************************************************/
: `$ E3 `; O# u/ n/*                                                                          */, Z! _! W& r( F9 n9 |
/*              ARM 中断初始化                                              */
$ {5 M) }6 H: n+ C9 m/*                                                                          */! ^9 M* h# i* R5 p+ V& @/ m/ D  Z
/****************************************************************************/* X8 o3 r- W. X& D1 `
void InterruptInit(void)3 ]- O, s  N+ P
{
7 U4 p) z3 c. K4 {" v# a6 j    // 初始化 ARM 中断控制器: P  F9 z, X" H2 q
    IntAINTCInit();1 y8 c% t6 Z$ m$ ?' Q$ E; G5 [1 ?% e) D
, \1 v& J- {8 k% e8 Y# V, S: N
    // 使能 IRQ(CPSR)
' B8 i, ?% u! s" h! W  O    IntMasterIRQEnable();. p; U7 C& k) q6 q
1 g) g2 h( z( {7 V2 M# \6 g
    // 使能中断(AINTC GER); A) g4 D' ]$ Z) v8 _5 N4 t; m
    IntGlobalEnable();
  S/ }+ O  q0 P. l4 l/ i
# W0 n  L+ ~7 e. T# y9 a/ U$ y    // 使能中断(AINTC HIER)& x2 D; G5 X( f. K7 o
    IntIRQEnable();4 V0 y* F! e8 j( o- q/ [) L
}
9 F( ?$ y0 A+ F+ R* L$ ^" L7 g" N/ ^+ I' {% O# G2 d8 _
/****************************************************************************/, G; Z( F- I) j; U' a& p
/*                                                                          */
5 c9 G& p& `! v+ Q  g8 C0 r; q! z/*              UART 初始化                                                 */! o2 Z9 u  p6 a+ [7 R
/*                                                                          */3 G. t4 O$ Z5 E7 d1 j) E
/****************************************************************************/2 ^. v$ M; ~+ S& x( j. B  N* p
void UARTInit(void)
$ s+ J" L9 S6 g3 i( J{7 h0 H% S# C4 l2 Y8 G) D
        // 配置 UART2 参数* x" V& Y; c* W. ?% N" b
        // 波特率 115200 数据位 8 停止位 1 无校验位
. |! v7 {8 w# L6 n) k2 k/ p/ {    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
! p7 }; i3 b, w5 P                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
% B$ }' E! K7 W! x) P/ o        // 使能 UART2+ w/ F' c3 W: H( B& \. t
        UARTEnable(SOC_UART_2_REGS);: g" v, x4 ~0 d
- y, L+ c& W+ r9 y  M" s$ S+ E5 \
    // 使能接收 / 发送 FIFO
) N& G* e; b4 m0 R    UARTFIFOEnable(SOC_UART_2_REGS);
1 V& V2 ~+ Y; _5 _* R/ i2 w4 w
! [# W2 u& \7 }1 q    // 设置 FIFO 级别! J" g( s0 A' S3 V
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
  q' S4 a- l1 E  K, g: T! A6 O}
. r+ s: V. O; @5 P$ R$ ~  W* {; O9 r3 M" z( C% k
/****************************************************************************/2 y  l0 c0 j+ e
/*                                                                          */
* ?- B2 Y' f$ l5 H! t/*              UART 中断初始化                                             */
, N0 ]# Y0 L3 E+ d4 J# X- E8 c$ L/*                                                                          */6 m" w0 E+ c7 |3 C$ J$ ]1 f- J
/****************************************************************************/
: S" m' \- `; Zvoid UARTInterruptInit(void)" B8 k& e0 n) @1 G* w" F
{7 V( o$ d2 c' ?. _$ I% V2 K* j2 w
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
2 o4 K  y/ C) ^8 C/ i# @" t        IntChannelSet(SYS_INT_UARTINT2, 2);) I( U' U# G) N2 X0 t! C& V0 J  f* y
        IntSystemEnable(SYS_INT_UARTINT2);& v! [! t5 o$ ~& }2 w
! W8 g; `* i2 K" k, j8 E' e) u% x
        // 使能中断
- z+ R  u! h4 A0 P5 s/ Q+ n( Y        unsigned int intFlags = 0;
' z2 U& E* [3 W) N: Z. S8 }    intFlags |= (UART_INT_LINE_STAT  |  \0 F3 c, s5 e" _2 W' w7 h+ D2 ?
                 UART_INT_TX_EMPTY |    \: ~- `1 ]5 ]: `2 i( u- u0 l
                 UART_INT_RXDATA_CTI);  N2 J- {1 [0 Z& m0 v! H
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
8 [( {& n  |% s. [/ [) f1 g}
8 j: G2 j, Y$ L# _, |+ O/ Z* b1 F0 e( S6 v+ \1 a
/****************************************************************************/* s' t9 a7 |0 ?% E( n% E
/*                                                                          */5 Q% h5 F  i: N+ Z7 h0 _; R" z
/*              UART 中断服务函数                                           */  u7 L( s9 t  s* K* m
/*                                                                          */; ], g( a: b6 ?7 i: Z* W
/****************************************************************************/
2 L& v" @, V& e; c: N5 avoid UARTIsr()
) W$ D) H9 v" E) Y{
" s' y& U% ~5 S    static unsigned int length = sizeof(txArray);- Q: _; N9 S; a# L5 K
    static unsigned int count = 0;- g$ L3 p& o# L* e$ n: D
    unsigned char rxData = 0;  y' ], y, b  b8 ~+ i
    unsigned int int_id = 0;* }6 u" R7 |4 G  O2 V1 E
3 b- m9 u. R2 U+ l( v! E( |* _2 y
    // 确定中断源4 s0 ]2 O) U) h  i- v  [, l& [. b5 s
    int_id = UARTIntStatus(SOC_UART_2_REGS);' b( ]; w6 n8 M( E
1 B  I3 F2 _, _
    // 清除 UART2 系统中断- U( L- \2 r9 g/ P9 {  L$ s" d
    IntSystemStatusClear(SYS_INT_UARTINT2);' S# L7 Q9 D  t* d6 j7 L! ]) g- O
- S% k; n# \9 n4 t' |) u% f/ C8 Z: v
    // 发送中断% u2 {# G9 r2 @7 B3 d* J
    if(UART_INTID_TX_EMPTY == int_id)
: t) l; ?5 |! ?9 a# m$ O, W& @    {1 N* _& n3 J* M* {3 d  ~
        if(0 < length)
" o) I8 k) \! U$ ?/ P+ @% V        {
1 \! A8 x% w. ?: r3 \, V( [            // 写一个字节到 THR
8 n7 N; S- X$ f9 W            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);+ {8 t8 l3 F! M6 t6 Y, B: W6 i
            length--;
5 J$ b* `2 h. c; r  g            count++;4 D6 e" ?& J* O
        }
# u6 \- c& n; a        if(0 == length)# z- g0 g7 L: ^7 l. h  D
        {8 X! K! G0 E6 m, w2 M' s* {
            // 禁用发送中断
* D( X7 k6 G/ v3 C' {& u* d" [; {            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);' d- r$ E1 h% }* w. L! H# z
        }* X/ V: |0 y: n# h' t
     }2 Q  Q9 |7 M4 C$ D. w7 V* z( F. G
7 Q- F. `: G2 `6 b' z. q
    // 接收中断. S0 y9 d/ F, ^( V2 m  `6 t$ j
    if(UART_INTID_RX_DATA == int_id)8 A3 @: E$ ]! L
    {7 V3 H! F% X5 P5 v, ?
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
1 M' n9 S9 \$ O# J- m9 {/ l; ]- B& O2 b' M. ]( A; p% u7 @0 H. [
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
$ I! O% }$ _; u# s2 I! D    }
6 n. y8 a: S3 b0 G8 e) j( ~  }; F4 o
    // 接收错误  D7 J) z" z/ o6 O1 p4 R8 X
    if(UART_INTID_RX_LINE_STAT == int_id): a( [4 D- {& R, [  ~
    {1 a  q6 W7 m4 H* D& Q
        while(UARTRxErrorGet(SOC_UART_2_REGS))7 x6 a9 k! \- B  s1 V
        {
- ^7 M7 W- ~% y1 o2 t  ?: ?            // 从 RBR 读一个字节# f# G! V" R  L9 g& l
            UARTCharGetNonBlocking(SOC_UART_2_REGS);: w" }" w7 W% A8 m" l& B6 ]: z
        }
8 ]/ `' ?# c' |3 G/ U) o: O4 U    }0 o3 O2 N& @; e2 _2 [, e" D5 w) H+ P
   
! k1 N0 v0 c$ R3 p+ ]    return;1 M3 j1 f* F/ \" B9 D
}
: y+ n  v, c7 O# \+ [4 @, ]' {5 h) s
回复 支持 反对

使用道具 举报

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
6 ~, o5 ^) p( p如果其它设备快速给你发送串口数据,你这边能正常通讯?
9 k: C" m- p; _1 [4 _, d% k
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-19 07:20 , Processed in 0.041342 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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