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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7812|回复: 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# C6 [* X6 t

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
$ h8 w8 t  X6 O; Y( R& _. M, x
& f# z; ^0 R( g  W5 F! G, u#include "TL138.h"                 // 创龙 TL138 开发板相关声明1 O' {( \# v+ ?  P

8 e. D  r" G' Y# n* M* I0 }#include "hw_types.h"               // 宏命令2 t: h% F( O4 Q# v7 W' W: z4 R
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
: c4 X/ x" a  U/ v. K/ r$ T#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器3 \0 J/ N7 Z5 T6 g5 c% f

$ w' I$ n. T) X3 b#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
- Z! V" q- B9 c0 f+ C7 R8 @#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
6 Q, |- w" I, K! X- L+ H#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明4 D: a3 \3 {: u' W6 @
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义+ @7 ~& K3 N# Z8 ~2 p
" G" ]" t; w" d
/****************************************************************************/4 T" K5 h( [6 [& n
/*                                                                          */' w4 r5 l3 a) [9 u# ~
/*              宏定义                                                      */
7 A1 s' g* b( D/ H* p! f! g/*                                                                          */
% j1 b( R; Z3 a) G  H/ X$ d/****************************************************************************/
, r* l9 W  j  r; F5 a2 X6 [// 时钟
+ c& |3 S* i% d- \0 V" @#define SYSCLK_1_FREQ     (456000000)
5 ]- N: ]% b+ a. i& R#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
5 E/ O/ e  f4 c  ], z5 d#define UART_2_FREQ       (SYSCLK_2_FREQ)! F8 v, J2 z$ Q8 e% O
$ z8 e+ N( i) x. Y
/****************************************************************************/
- i3 T# ~  G' m# M9 o2 v/*                                                                          */9 a& L& w& w9 J; k/ [, U. _9 T
/*              全局变量                                                    */  z+ a/ Z8 U3 z0 F0 D
/*                                                                          */' p0 x  z2 W# F: S7 s
/****************************************************************************/
4 [) f7 A; h8 |) [$ k- P5 ochar txArray[] = "Tronlong UART2 Application......\n\r";& A/ _( z# O, e  _6 ^% y1 t5 E
4 a: p% S1 ~$ a5 f' Y
/****************************************************************************/; W8 ]3 b* N: t/ E# G( u
/*                                                                          */2 n8 w3 C4 a$ ]
/*              函数声明                                                    */
" b. S7 ?% e& p/ ]7 K/*                                                                          */: ]( G% n* I$ k$ A# ?% t$ O# f( Q! n3 ^
/****************************************************************************/
8 t+ Y3 B9 r% Q, c8 d  V$ k// 外设使能配置
( w( n# G2 c8 m# a' _2 J- q+ @& \7 N, ?void PSCInit(void);
( M5 H# r4 X/ ?' Y7 s! _, v9 Z) M( Q0 W6 F/ ~! @
// GPIO 管脚复用配置2 f2 q. P- I3 g5 t  `% B
void GPIOBankPinMuxSet();
& h% J4 w6 K8 O* E
$ D& ]) V: p8 W5 z1 p: ?* o// UART 初始化# {+ i. R- A% u. Z+ G$ x
void UARTInit(void);
0 s' V! L2 n' q3 f- C$ F; G// ARM 中断初始化/ x6 R; T# h6 k4 u( z0 K3 ~: L
void InterruptInit(void);
# F( I2 l" ~. D. l: u" X% \& G// UART 中断初始化* A  \! k7 p# D+ {4 Q) U
void UARTInterruptInit();  s" U% S, y' K- T# F9 f" y
// UART 中断服务函数
8 z# U# V) ]& b, b) ]void UARTIsr(void);
( F+ b8 r2 G  i0 N) |3 K, Y9 [4 H' J
/****************************************************************************/; G* I+ a" t/ X) K2 c( S
/*                                                                          */& `: U! m& x! U/ I
/*              主函数                                                      */2 r  ~3 P5 ~4 N( D8 u3 r- f
/*                                                                          */
- p# j( O) ~8 y( U' h% a; u8 Q/****************************************************************************/8 f7 E/ b! ~, ]2 t/ c6 S" Q3 X2 m
int main(void), f4 V, Y/ f7 f$ J! Z
{
2 z9 t: y5 j% j+ i  Q. c# I: y        // 外设使能配置
# j$ D$ ]# _3 b! w* n& D        PSCInit();
9 p( q' O" I" `! Y0 z        ( b1 h# ?/ U9 w
        // GPIO 管脚复用配置
( [" h+ E1 \$ y  C) w6 A, V2 }) u4 N        GPIOBankPinMuxSet();
0 h3 U( L+ |6 i  c+ S% ~
# e( |& ~+ ~9 J0 O        // ARM 中断初始化7 r2 Y6 s4 e4 i: B, _
        InterruptInit();; k* ], @% I$ V: t8 B" X

; _  a+ M  b& `0 y  g        // UART 初始化
. l1 n, n$ B: S9 A# e6 U0 g        UARTInit();
/ e' ]$ Y: u* Y3 k. p0 }, l+ i* `$ d. t0 C- d+ L
        // UART 中断初始化2 L( E7 d% ^) d$ g! P- L
        UARTInterruptInit();
; D# {4 c+ H) m8 r0 y+ W
( i( x; B/ u* S7 k$ b        // 主循环" Y6 W5 t" E% G. ?% s1 H$ a
        for(;;)
% c0 m5 _* k. v& [& O0 \        {% X7 q1 t/ n0 N. M0 m  R$ P8 N

+ S5 u! \. f: Q& [        }! z& p2 V, w, {4 g
}& h* U# }& V# e1 A/ v& c
2 B$ D3 D/ b$ G9 z7 M: U  n  \
/****************************************************************************/
$ s5 T, U0 \6 Y) |/*                                                                          */
) m2 j7 f2 V1 ?8 m9 I/*              PSC 初始化                                                  */
* B% e8 S% R' w6 ~/*                                                                          */% s# g. a6 j+ Y1 m1 P5 D( ^
/****************************************************************************/. n- c* |' R! I% m% c/ `" ]
void PSCInit(void)
$ C, B7 B# V8 @% F$ E2 h) g! l/ ^{
" k3 v1 Y- A, Q" i: s& x5 k& I        // 对相应外设模块的使能也可以在 BootLoader 中完成/ {3 Y" Z: X( E
    // 使能 UART2 模块$ m$ T( F# V% n# l9 m4 q
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);7 x$ [" S( `6 z$ i
}+ ^. ^) A* x5 j# j( ^+ [
8 G" V) ?0 @* K% ^# z
/****************************************************************************/2 j0 X- b- ]1 q9 \
/*                                                                          */  c8 y2 `( G; Z7 x$ G
/*              GPIO 管脚复用配置                                           */
+ e0 _# S3 y8 c/*                                                                          */1 K3 H/ o6 b9 q6 F) ?8 M( G
/****************************************************************************/- H8 l+ i. ~% c$ l; t6 I1 m
void GPIOBankPinMuxSet(void)
1 Q7 f5 c' U/ @' w6 w8 R{, L$ ~" k7 ?8 k
        // UART2 禁用流控( u2 [, D0 ^6 q( t$ B% K0 d
        UARTPinMuxSetup(2, FALSE);
- U& A2 r  M  Y- @$ E0 d}. E5 {( M6 }. v+ s  s( f

" n  }8 W8 Q; b/****************************************************************************/
* N; R' H9 b+ k  p/*                                                                          */+ C" Z5 K$ K- `! r/ w
/*              ARM 中断初始化                                              */
; W9 A. p5 x4 o, Q' |! {/*                                                                          */
! \' d& j3 W. q) B' @6 B/****************************************************************************/
$ E7 X2 w! d# K  x, o" L* evoid InterruptInit(void)
2 `- A2 G. \" L! E" Q( @{4 B: e. M9 _' d  }' R4 [
    // 初始化 ARM 中断控制器
1 N+ a2 V7 F3 J1 Q5 T    IntAINTCInit();- u6 t- r; `$ j% ^5 Y% h( U, `1 T

" |  }; U3 ]* p% h: B: B) ^2 \    // 使能 IRQ(CPSR)
/ W5 C1 @% c5 q1 t8 I    IntMasterIRQEnable();: w8 C& s3 D; {! N+ C$ L
1 B. @* q8 ?$ g1 E& Y, e
    // 使能中断(AINTC GER)
% d; t8 W: t; p8 V    IntGlobalEnable();6 S3 ]% v* }7 W/ Y+ X
  ?7 a- Z; o, e' v9 @1 j* z
    // 使能中断(AINTC HIER)- ]0 _/ b1 L1 E, p
    IntIRQEnable();
6 R3 f/ e4 ~8 b0 _4 W5 g& S}
$ |2 u1 _6 i! R3 P  ^4 N
2 f4 x3 |7 Y3 E7 M  b/****************************************************************************/5 ~7 P5 Z/ b2 o
/*                                                                          */: L6 P+ |7 x% X/ p7 f3 h
/*              UART 初始化                                                 */  Q% e7 j; P* P( ^
/*                                                                          */
& Q% W+ G- q6 _# r* P/****************************************************************************/, O$ Z# \" K9 `# U/ Y9 u0 O& R
void UARTInit(void)
4 x8 y, ~. Z# Y. |{
9 g) }  d- s3 ~* i- s$ w8 J        // 配置 UART2 参数
2 ?* o+ ?2 U0 ^8 S+ O        // 波特率 115200 数据位 8 停止位 1 无校验位
% K/ f) V6 J* A    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,7 h' L6 T+ {8 |0 G3 b/ S& t
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);$ d% y& w1 e; }* F2 Q/ K5 K
        // 使能 UART2
7 P. y# }" A# J        UARTEnable(SOC_UART_2_REGS);
' C# `! o4 Y# b# p" A9 b
2 Z5 O, U6 I* ^6 f+ U4 u- D2 l    // 使能接收 / 发送 FIFO
/ \. [) Z; A" x  s* G9 Q" q    UARTFIFOEnable(SOC_UART_2_REGS);% |! Z  @% V' L$ [

4 g' Q. O6 g$ e9 V! i( G8 `! ^    // 设置 FIFO 级别( t/ X. F2 C9 M# Y. f* I
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
* c+ Y8 ~7 l  @* x! ^5 Z% H8 A, H) [}5 E+ W3 W) H: d9 W

1 a/ N# {5 G, q; v  y/****************************************************************************/
+ Y  ]# {+ q; I' x( \3 z/*                                                                          */
" e3 g, L" G7 w. A1 C/*              UART 中断初始化                                             */
, ~9 `& r) v2 K; }4 Z' h/*                                                                          */
( U$ l, W7 c6 Q3 \/****************************************************************************/
+ p8 p* ~  S; w; m( w. N& }6 jvoid UARTInterruptInit(void)- e6 L" {2 k* o! ^+ V; M
{0 }" N6 Z1 ^5 ^* `5 [7 d0 |
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
3 ?6 E: T. @7 ^; l; n9 a        IntChannelSet(SYS_INT_UARTINT2, 2);. D0 Z/ Q! B9 A# h2 w9 K' D2 u
        IntSystemEnable(SYS_INT_UARTINT2);
0 v* X2 T! G2 W2 d, p4 Y) a: z
5 F% T- A! K! v" j9 D        // 使能中断
5 D; V9 A( r/ h7 K6 n        unsigned int intFlags = 0;; l6 L& ^- T& ^# F
    intFlags |= (UART_INT_LINE_STAT  |  \3 Z: H& f4 a2 ~
                 UART_INT_TX_EMPTY |    \
$ x9 o* [+ M7 b) \                 UART_INT_RXDATA_CTI);( m$ V2 f  u* r/ ~: M" G: Z& W
    UARTIntEnable(SOC_UART_2_REGS, intFlags);5 D7 Q/ N: F. Y/ ]( l2 a
}
9 J7 k9 q1 G4 G: i# ^
" R. M" }% x: ^- S/****************************************************************************/
. m" m4 w3 }/ Z; M  l/*                                                                          */* v5 G! _% X& J$ g/ b! K
/*              UART 中断服务函数                                           */
) ]- J2 y9 ~2 m7 O/*                                                                          */- J, N3 \. v3 H9 I6 R
/****************************************************************************/6 D( E9 l4 h/ G) R, t: E
void UARTIsr()
$ M: \) a, w, I- S/ {5 b{
2 q& M/ p2 ]* T: k! t: k9 n    static unsigned int length = sizeof(txArray);
+ m! F# `4 ~7 c: o7 ?# p8 A, ?    static unsigned int count = 0;
" E( }( l  l8 ~) c    unsigned char rxData = 0;& _( y' L  u- [3 {* S# ~& ^
    unsigned int int_id = 0;
& T4 k( L  A# n3 S% }1 o9 K& V* }' w2 v, [' ]3 b; f
    // 确定中断源' f7 D, J0 q6 z
    int_id = UARTIntStatus(SOC_UART_2_REGS);
, N* D. g1 W$ A( c3 f9 v
- Y- s# C3 y6 u  d+ P    // 清除 UART2 系统中断, [2 \! N6 }! t1 V. q1 R0 b
    IntSystemStatusClear(SYS_INT_UARTINT2);- i0 `7 @- u( A' s! ]9 k

4 F( f  d8 O6 q    // 发送中断  g& w2 \/ a5 @( D$ ~4 }
    if(UART_INTID_TX_EMPTY == int_id), m1 d+ |) z$ _& g2 G
    {
( w! N& n: _* r# f1 f# G9 }( ?5 n        if(0 < length)# c/ w0 w7 l1 _4 U/ M6 x
        {5 ^0 l9 f/ I4 M7 U( o- s
            // 写一个字节到 THR
5 C0 c9 U* C' u$ I, z            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
7 B% v6 ^3 a' ?0 n6 U            length--;. |* g; A3 g$ W: u- S
            count++;
, E$ c. C* x+ U7 ~( h6 `        }! N: q& p: b" d' Z) }. ?. S
        if(0 == length)0 c2 Q: A0 t0 O+ \) w
        {$ Q: M* N  N9 k9 e8 c4 h
            // 禁用发送中断% f+ Z: N( {9 D  X  X# U4 B
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
; |) Y: S: T6 _5 j/ l# m( x) N$ t- q        }
7 S# k1 f0 V4 k     }9 @8 }: X8 p6 C) `$ K- Z
8 E/ a2 u7 c. I% a6 i+ `1 B
    // 接收中断6 F" q7 O/ c( Y0 d& J4 J
    if(UART_INTID_RX_DATA == int_id). j: c" d! r; s( n6 H  g% R) q
    {
9 D7 v! j3 X4 }4 _        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
. h, {" X* D2 Y& i# J: C- o" [4 s' l) ~- R- l6 z* i" a! ?
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);' ~8 Q4 a2 k  Z% G2 o
    }
' G: Z& X& G% ^' z% y2 W
" r% y" n- m  U  e    // 接收错误# s3 ^9 R3 t! v9 A  j4 O7 ^
    if(UART_INTID_RX_LINE_STAT == int_id)
+ A. `, M* ~/ s) ]/ V! D% u5 l# N    {) g" Z0 w! b1 x
        while(UARTRxErrorGet(SOC_UART_2_REGS))
2 y+ s- a; \1 X( E) r  M6 ]        {
/ o" t: j! _) W8 a            // 从 RBR 读一个字节5 I# f  l* W9 _) H$ ?7 l
            UARTCharGetNonBlocking(SOC_UART_2_REGS);. `1 S* w5 D$ ?2 F! I8 [
        }
$ y% A3 O4 M6 W' q+ `9 g4 k# Q    }
4 T3 [1 z3 X' ]. z' F% c% E& z    7 X+ U- M: b' b' J
    return;0 B2 b9 N/ _; C2 @* e: ?$ O
}; X& h* E# z* C3 a# k* M
回复 支持 反对

使用道具 举报

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/ M6 i4 s! I9 k
如果其它设备快速给你发送串口数据,你这边能正常通讯?
* r$ O6 m( Q1 a, v, ?1 I- o
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-18 12:31 , Processed in 0.092262 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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