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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8026|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
9 j" v' l! L9 L7 Z2 ~2 T/ t

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。* o+ `# ~! g! Q8 g
; G0 |! K0 v& J8 o* o, _
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
: z2 B* O/ M% T" Y, B8 Z6 U
5 D# m& g1 U0 y2 f1 P. K1 @' \#include "hw_types.h"               // 宏命令) C/ Y+ i+ W- U9 U! |3 k; X" t9 P
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器7 ~  w" p& ?$ _& I9 B
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器4 z! ~' Y# I; a' |' y
3 i% T5 J' L8 }
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明+ i, M  w( I" M' |# X! v; N
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
; D. h; m, a$ h. ^2 \( T( O#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明6 d  b& z- l& E9 o
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义! D7 \1 G9 T: J3 P* E  L

- r& l& p% L8 H7 d/****************************************************************************/
7 e" l. k) G% g  {' ^" r& T8 i/*                                                                          */
3 E+ z, r/ ?/ V( E/ m  {- N/*              宏定义                                                      */! }2 A6 ^! k" |& w& U& b0 Y4 j
/*                                                                          */
0 E$ G* M2 q0 S! D/****************************************************************************/
% w* Y3 L( K* Z2 Q8 Y2 V' M// 时钟7 v7 T5 a  c9 B& u" a
#define SYSCLK_1_FREQ     (456000000)9 S3 f+ l: V# L0 f- s
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
4 U; I. L7 K# l$ B) Q2 {; c9 x#define UART_2_FREQ       (SYSCLK_2_FREQ)
1 E, |' Y' z! f5 P" s
& g+ f- A, b5 d5 f% d' a/****************************************************************************/- b& I' b) `$ y& [
/*                                                                          */
+ H0 f6 E/ u# ~" ^5 p/*              全局变量                                                    */" H; o; u- t/ R8 ^
/*                                                                          */
% [, Y4 U$ R' D- v# K+ T! D/****************************************************************************/
6 X2 m# N5 n4 ^- p# J0 V* ?char txArray[] = "Tronlong UART2 Application......\n\r";0 V# |2 X- F5 U$ r
+ D# w" V: s: Z  O
/****************************************************************************/
6 J  o) C/ R! X6 C/ o/*                                                                          */& ]! Z+ _1 U% E2 p% V
/*              函数声明                                                    */* r0 Q, A  L+ b
/*                                                                          */) r/ p4 ]1 }7 \, v, K2 \% {6 y
/****************************************************************************/" n: b9 a& Q% @
// 外设使能配置# W. d0 U8 b) W' m, U5 }
void PSCInit(void);
/ H8 w" I" ?! J
, ~# ^' ], K1 P, h9 d$ T// GPIO 管脚复用配置% s' p6 W! n# Z
void GPIOBankPinMuxSet();
6 \5 ?( n: m# P/ E: Y; `
! g7 V$ y0 g( x// UART 初始化* O; J( c/ k% x7 [5 |' A
void UARTInit(void);
) u) c# z! k( w. o9 h// ARM 中断初始化
/ r; g$ I+ X  ovoid InterruptInit(void);
1 C/ j4 a: s8 A0 Z: U3 m+ g// UART 中断初始化( W; E8 g9 s7 t5 a. S
void UARTInterruptInit();
# ^7 `+ E' E1 |% h7 l* k// UART 中断服务函数2 v* p0 o% _+ l* Z
void UARTIsr(void);$ c; v1 s% a  w$ B3 u  O
# @, V- t- h$ I
/****************************************************************************/2 r3 R9 L! Y+ ?& Z4 K
/*                                                                          */% t/ f# l( F* X4 c1 N# e
/*              主函数                                                      */. b9 E; ?8 C6 T
/*                                                                          */
; A( Q/ l5 s: ^! l& y  g. }; |7 b/****************************************************************************/7 }' x3 R- W9 |* \, y
int main(void)
3 m, D* a+ B3 x* D$ R{
7 D1 ~" D, p- j5 C6 B; W1 E0 ]( }( r        // 外设使能配置
1 ?; R1 K6 t# F  h        PSCInit();
7 k. H, f# D' T) w4 x9 q* n       
% w3 N4 d' B. v: w" C( A; L        // GPIO 管脚复用配置
& F7 j* ~4 L; q% q8 |        GPIOBankPinMuxSet();
4 Q5 S0 b) e! U' D; ~# L1 l$ A- m
( o) o! c* W1 r1 F: B; C6 z        // ARM 中断初始化
' p% M% e& j1 _6 d$ c+ a        InterruptInit();9 \( t" _$ ^$ h& g( h
8 R4 A, Y2 X7 `5 }) J
        // UART 初始化
; A+ j' {6 N, O; ?+ R* \3 D        UARTInit();" L7 T  Y: {! }: L/ Z

* q+ ~/ G( W% y        // UART 中断初始化7 U% G* [" E% J# ?7 d+ \
        UARTInterruptInit();
4 G: q" d6 H; B* u" V6 u; X$ M' N6 x3 Y# d
        // 主循环+ q0 O# {) V; g" z3 |. W# z
        for(;;)
# u3 i$ o; L8 N  k# c) z  p$ H        {3 s+ f7 Z8 g  m+ V* I
+ u$ Z9 [, _5 g' Y) d/ x
        }
; u% \3 U4 K& p}
/ c7 b, k) c0 h8 k
4 H, X# Q" u# }3 T/ Z7 ]# G/****************************************************************************/8 a' B# c( k) f. ], f
/*                                                                          */) H5 ~2 |- G$ L" r1 |. g' U
/*              PSC 初始化                                                  */
! K1 w) c* J2 C' Z3 |* @/*                                                                          */
# t$ B5 p- a" m  i, g/****************************************************************************/
5 o* x3 _7 B+ `- ?6 |3 C% P. a% h+ g6 Bvoid PSCInit(void)
3 X7 V5 w; ?7 }2 k5 S. p{
9 {& `/ X* z. _2 N9 T/ S        // 对相应外设模块的使能也可以在 BootLoader 中完成; H' M: I& A1 [5 p  t' T9 I' m4 m, t. Y
    // 使能 UART2 模块
( _. x. o* s+ u( y" a    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
4 x# s' p) Z& _% h: S* t. a1 |}4 V; i: s# ~0 G& t

. @) D" x; U& R1 r& f2 i/****************************************************************************/
- ^, t( q3 t8 T% g0 `6 R9 p' K/*                                                                          */
. Q3 k$ x) q" x: `, E+ p0 s/*              GPIO 管脚复用配置                                           */* W' g9 e$ R: ]; J) `4 r
/*                                                                          */$ [; I, @; f: J* I' d* L
/****************************************************************************/
" V& L9 m/ Z9 z0 Q4 [' l  x( Svoid GPIOBankPinMuxSet(void)
. R# w) K  V. c7 N{
1 H  \/ k1 ?: n4 v7 P        // UART2 禁用流控
. ]; `* N; o' a  v        UARTPinMuxSetup(2, FALSE);
) L( g3 b% r; l4 s}
4 A3 A) K' O6 U6 v: O8 Y8 n8 p0 E5 M; z9 W  Y# w2 S* ]2 `
/****************************************************************************/0 ?0 e: V# D3 @) ~  K$ T
/*                                                                          */5 E: i- O. f% h0 k
/*              ARM 中断初始化                                              */& k& e+ k! F) D, b& x' w# w2 c
/*                                                                          */" {+ H4 y$ M: O8 R/ k5 h5 o0 ^0 a
/****************************************************************************/6 n  |8 y+ N- x0 g1 Y
void InterruptInit(void)
$ a0 f. V- [2 Q" `7 @. [: b9 W{
: ~  g1 Y8 C4 ?2 _    // 初始化 ARM 中断控制器
% A6 ?0 e- Y* D4 ~4 r8 z9 l' Q. l    IntAINTCInit();) ?8 ?) \6 }, X; Q# z! @

2 N$ B3 U# a. J' r( \) R    // 使能 IRQ(CPSR)' T4 y8 G+ B& h# H2 `
    IntMasterIRQEnable();
+ r4 G% V( t) m# s" s5 D9 E: i( G+ q% C( m. D# h0 H
    // 使能中断(AINTC GER). K% ]# Q9 I( @
    IntGlobalEnable();0 n9 N6 Y- r! b# N* H$ }
9 J+ Q- z6 X8 R& _3 ?! D/ ?( ]
    // 使能中断(AINTC HIER)7 A: y: G2 g5 h2 J3 W
    IntIRQEnable();
3 l7 i8 E" w0 s0 t" }) @# N}8 ?: S0 j8 @6 u% v3 ~

) a) S# x& q2 P8 t3 n/****************************************************************************/4 z" C. X7 g. q
/*                                                                          */
: E! F* d8 B- i, A9 v+ ?; L/*              UART 初始化                                                 */
+ S9 d+ y2 q: o8 _2 ~1 @" i2 R/*                                                                          */. U7 m! b( `' B
/****************************************************************************/
6 F3 ?6 e, L) P, Jvoid UARTInit(void)6 x1 _8 H% J2 A7 F
{
9 R8 v2 t; C: h0 F! [        // 配置 UART2 参数* K, p4 _- }& R; Q( x% ~# u0 G
        // 波特率 115200 数据位 8 停止位 1 无校验位% J* q0 {' Z/ [) X- D; N4 H
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
- ^/ `+ G# j# @6 m                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);1 Z' Z9 ?/ c) O1 O, v# ]
        // 使能 UART2& Z6 r" [2 \- ^5 C4 R  t# q1 R
        UARTEnable(SOC_UART_2_REGS);: F, v. T" U8 R; R+ Y" ?! d

  h5 S8 s: U" g7 p) p    // 使能接收 / 发送 FIFO
' c9 ^6 ?; ~4 S* a9 X; X! v( F: l2 _    UARTFIFOEnable(SOC_UART_2_REGS);
% b* o# M% E/ B8 N. q: @% z# {% G* A0 U1 \! y: X3 M4 f
    // 设置 FIFO 级别! f4 ^; \( c8 ]" ]+ n6 Y, F! }
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);( i) d( e( z% T# J+ ]# X3 {* V
}; R3 m! @( p3 a  Y3 h

. _; c. o# `- P! a1 r5 K& Y/****************************************************************************/2 ?6 e$ b% {7 p. j$ R/ N
/*                                                                          */
7 ~: Z! z. p7 F$ _; _/*              UART 中断初始化                                             */( X0 h! c1 r5 K& \$ ^
/*                                                                          */
# y- @: W& |* U1 d" B' s7 g# ^  P- ?/****************************************************************************/! q  D9 g5 _* f1 ]$ ~/ x
void UARTInterruptInit(void)
: g" M# T2 v: W2 G: G# H+ j{$ S7 @( R- w$ w  k
        IntRegister(SYS_INT_UARTINT2, UARTIsr);' O3 q3 a2 H4 G4 P- L1 b$ N
        IntChannelSet(SYS_INT_UARTINT2, 2);. F7 J3 m% e; r8 e& [
        IntSystemEnable(SYS_INT_UARTINT2);5 J: Z( h5 a2 e6 g
  c" y0 n; [5 q3 D, M+ w( u
        // 使能中断
" R, U# I& N1 X; G7 h1 A        unsigned int intFlags = 0;
: ]  D: K. @0 A$ F- ]    intFlags |= (UART_INT_LINE_STAT  |  \- ~" h2 O. x% c- L3 J
                 UART_INT_TX_EMPTY |    \9 [$ x) H% T# o( B1 M( n/ _
                 UART_INT_RXDATA_CTI);  g! b: @5 J+ Y' b
    UARTIntEnable(SOC_UART_2_REGS, intFlags);* O) g6 U$ K4 B. Q- Q
}
8 y8 q/ X$ \8 j& `4 S1 O
" M' C5 d( W" y/ e/****************************************************************************/
) c+ y1 k+ H* W9 o/*                                                                          */
- Y: F; d; a5 N4 o% u1 O/*              UART 中断服务函数                                           */, n. [  j/ U) j  a5 M1 s
/*                                                                          */
1 O2 a6 `  a9 A" I4 o$ s/****************************************************************************/
9 v% W3 r. ~, q. Nvoid UARTIsr()% p: W- G1 W6 q& j( P
{
; c( Y3 m, \; F4 i7 J    static unsigned int length = sizeof(txArray);' e- [9 k0 w# \, d" p8 `
    static unsigned int count = 0;" @" @2 k% a- G  u" `
    unsigned char rxData = 0;
1 `, ?7 p2 }; P; U! c* o+ F    unsigned int int_id = 0;
  `0 q5 O% S3 I
+ q9 ^, t' Z+ X) M    // 确定中断源
, e1 t7 r3 P& p: c% l' b0 c/ c/ H1 r    int_id = UARTIntStatus(SOC_UART_2_REGS);
# [6 |4 b, Q) C; `7 t  ^9 w2 n% N% ?8 U7 |7 \2 j
    // 清除 UART2 系统中断
9 |. X* S) s/ b) ?$ o8 k7 Z    IntSystemStatusClear(SYS_INT_UARTINT2);
9 |" `4 p9 j$ `0 F# `$ G# s, S; `7 V: C0 g+ q& z" B7 B
    // 发送中断& D( r3 a. ~: C8 Z
    if(UART_INTID_TX_EMPTY == int_id)# l4 h) z+ `; P
    {& e: B+ U4 g4 R/ C: T9 U' L0 w
        if(0 < length)
- N& J, ~' F- j1 l0 H6 r        {! C1 w: D4 z$ S. m7 Y; x9 @0 E
            // 写一个字节到 THR
; U* t/ R, H- s% E" r1 e" D, ?            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);: e8 ?5 _9 h8 o; W0 S& R3 j
            length--;
5 F0 ?* i9 u. Z            count++;
. K' t8 W, ]2 E8 ], n2 e) H( ^0 C* d3 y        }3 B6 t) [* r: m6 s2 K$ _6 [3 \/ j
        if(0 == length)
+ A7 O+ p4 I2 _, M        {
2 h6 R& G$ a7 D, K            // 禁用发送中断) d9 G( e9 Z3 e
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
; n4 w5 _3 q  {# j9 ?) W% [1 H        }
+ r  ^9 X; F! c9 {! l     }
0 h" z. K. _0 \5 v5 I0 B
* ^0 b; p% n) z* J    // 接收中断
# O& }0 p9 O  h; N  g- b! e0 s    if(UART_INTID_RX_DATA == int_id)
  e- |9 ]; L: Q. t) R1 v0 N    {
! Q! v% Z& l. Y        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
  H) }3 }: L& C6 U5 J/ T) H* ~& @2 C$ g+ d8 X4 ?4 h
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);- ~5 U% [- o6 V8 M& C- H. |! [
    }, u6 P' z/ ]' U4 H% \* U- H

3 J; U7 O2 p8 s    // 接收错误$ n; p% Z$ C* @  H' M) G9 q
    if(UART_INTID_RX_LINE_STAT == int_id)
+ f5 W- b& c0 Z# o    {5 `1 O( t+ {) d: f: j* l
        while(UARTRxErrorGet(SOC_UART_2_REGS))+ R8 o' K7 L' K4 G& u
        {0 q) \  W& r& d/ n
            // 从 RBR 读一个字节2 e4 e6 x0 @3 p' G5 p* A
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
4 ]& _$ k/ L/ m+ |" \& E        }; i4 d. i# r' Q0 v0 Q* Z# b6 b) Y
    }, f$ G4 ~, H3 V( W$ K- B
    6 B( K! a: u0 U) Q/ l" q0 i) c8 s
    return;
: m/ X$ X& Q) w% C# O}7 Q. y( z  [% h2 E  `
回复 支持 反对

使用道具 举报

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:258 r& K8 T) I# M- o. ~* X. W8 k, s
如果其它设备快速给你发送串口数据,你这边能正常通讯?
3 A; Q8 B5 L) |
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-31 15:01 , Processed in 0.043842 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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