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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8144|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
, c& n% ?/ |4 @  \

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
1 ^' t( v! Q3 [& M, f8 w& e- j" q2 G8 ~: c' t7 ~
#include "TL138.h"                 // 创龙 TL138 开发板相关声明# Z; T$ _. @# c8 r$ J$ J

" e$ S1 z) t4 j7 Q#include "hw_types.h"               // 宏命令* T9 C  Q; p7 V
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
5 u6 [, s4 t6 x9 o+ T4 I$ w' M#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
* b) N) o" ~" ?$ ?; D" ~0 p: {2 I. U- a: n2 ^3 ?
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明, c/ K8 d' c! e8 B- M. ^: I
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明& p/ m9 t. ?( f' A' g# ~- R% s
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明( @; g& d4 e8 c8 H3 G+ X6 T
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
8 S  {% k! u% N& m0 h5 s) a( M# m& N* l$ [% Q' C  R" Z6 H% o
/****************************************************************************/
( p8 ^) Y5 b4 X; K& s% e( A4 ^/*                                                                          */
+ E& j5 P1 I5 i3 x  e/*              宏定义                                                      */
8 M) b  V* V: r: V/*                                                                          */
" @  j9 {9 U) i7 g9 `/****************************************************************************/
+ h, z9 t8 u0 k4 U$ I. J// 时钟
9 e/ R/ |9 m% U) b#define SYSCLK_1_FREQ     (456000000)
; F9 ^$ e" @, f8 `# Z9 {#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)" G" {+ V+ I# }0 Y7 l+ v
#define UART_2_FREQ       (SYSCLK_2_FREQ)  U1 n# s* Y, H' d3 e

- G3 G. I4 }/ a0 S/****************************************************************************/- m$ `& ^3 F5 k# A1 B
/*                                                                          */( s4 |' ~2 e0 v; C! E" d0 b# i
/*              全局变量                                                    */# w1 Z7 ?8 u8 Q0 M+ N% ?
/*                                                                          */
' U) j3 o2 \  m/****************************************************************************/2 R) O: R0 Y2 M% Z: q, Y" h3 K4 _
char txArray[] = "Tronlong UART2 Application......\n\r";
" `3 v% @3 f* z, T8 L6 a3 F' f# f) U2 V0 r
/****************************************************************************/" R1 L) J; e; ^. B  m6 r. }! P
/*                                                                          */. L8 L1 [+ M$ ~7 z: Y+ n8 s& \
/*              函数声明                                                    */
: l2 M0 s1 C6 G  @2 j8 I/*                                                                          */  t1 X( t& D- |$ ]
/****************************************************************************/) J; v  o2 {  ]' I9 n
// 外设使能配置
4 R& o+ {3 |/ _2 z" y$ M4 rvoid PSCInit(void);0 v% G' R, {2 V# t/ G3 L
$ U4 F' W: r' _2 m
// GPIO 管脚复用配置; k& o9 ~! z) ~2 }0 o1 P7 l
void GPIOBankPinMuxSet();
% z" h3 `. ]. _5 C' D. F  r, E& H: Y( y8 a. f  \
// UART 初始化
8 |* j* y9 k. O6 z. gvoid UARTInit(void);
. c+ [7 P) m! T3 H& l, \, v5 f// ARM 中断初始化! M5 |; x/ L7 v1 j' B* \. P
void InterruptInit(void);
2 y: t* @2 D1 ~2 C2 w# v7 F// UART 中断初始化. q8 |, g' g/ _2 Y# m! K
void UARTInterruptInit();
4 d0 N! Q, H4 c' R3 f& Q9 M// UART 中断服务函数# K" b1 e  o9 h
void UARTIsr(void);
6 p! [  \  Z' O: s" L$ R( ~8 B, D6 S, h  x; t
/****************************************************************************/
( W. B3 H+ N- k: }* K3 z/*                                                                          */
. `" a/ R, J& W  X0 O; l& X/*              主函数                                                      */3 w, n0 ]$ Q3 ~" J- A0 u
/*                                                                          */
  k, B! x: E6 ?# I/****************************************************************************/7 C  S! S" k3 k8 o7 s/ i
int main(void): }+ \# M' u6 A, Y+ F
{
) T3 }( s) K5 Q9 s8 H! V% Q        // 外设使能配置) }' K' f' B$ F& {( V
        PSCInit();
- l7 f% \( y  C" e& Y3 u       
7 ]/ g( }1 A4 W  w        // GPIO 管脚复用配置
! `0 ^5 q) P. @5 \% g- t% X4 {9 k        GPIOBankPinMuxSet();7 u, w6 G1 _: b) L, D1 G7 K3 a! K) N6 K
" o# P& m- P$ E1 I1 \! q
        // ARM 中断初始化
" a1 |' M  z* M7 E1 J- Y        InterruptInit();
% n# {- O& X6 e5 E7 D  ^0 u3 Y, P3 U! J$ x; ?1 F! h' o
        // UART 初始化
' r2 Y% f/ K' A& z" h        UARTInit();  `( K! L, P. }' b$ c' ]+ l
; x( D' _  j5 w% W  @4 y8 r
        // UART 中断初始化
" f1 d& g" h) c7 I        UARTInterruptInit();$ w7 w" k  s- A, N1 U7 L% S. o

" y$ N' j6 ]. r4 K% r5 c, L; }        // 主循环6 m# M0 x6 B- |; F5 p) I
        for(;;)
  z3 f$ c4 f+ \( }+ k        {
7 T, @8 C1 d! d- \$ ~. v: V
: q- c  ^: S/ A9 p        }
+ D1 N% V8 |2 h$ x+ M}3 [7 `& t7 }' m9 {% P% i
2 f% _: M- R, Z" I
/****************************************************************************/6 f! Y/ m: u4 a- ~3 H1 V
/*                                                                          */
2 j7 p. y  R: x) m/*              PSC 初始化                                                  */
/ j! f+ \' B; i3 n% E3 o/*                                                                          */
* t& L6 Q0 Q7 @+ _2 F4 B/****************************************************************************/. B* Q2 R# u& K" j$ J
void PSCInit(void)
- ?, n8 g: m3 a9 I8 M  A! k{$ [* J+ H+ Y& ]2 o) e  L+ F
        // 对相应外设模块的使能也可以在 BootLoader 中完成" u3 P0 j% n5 }& d6 T) l
    // 使能 UART2 模块
4 `: Q7 `/ v( c7 w. w8 T0 X$ w$ @    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);4 ^9 Y* ?5 d1 b2 h1 O0 Y
}% R' `  e0 t1 b
+ v& Z, U- i" m5 t. n9 b
/****************************************************************************/
/ t- _+ z% ?8 @2 N3 t6 N/*                                                                          */9 K% l6 q) D! Y+ P5 {
/*              GPIO 管脚复用配置                                           */
9 X1 i: Q+ j5 L/*                                                                          */7 N( t3 K1 a3 Q$ `
/****************************************************************************/
' e6 Y) E  d$ H6 p: j/ h2 rvoid GPIOBankPinMuxSet(void)
8 J, U& ]1 R% G# v9 d* o( s{
3 w3 G9 z& V  Z' T1 T7 n        // UART2 禁用流控& j- c# Z+ ?' D- V8 A- z
        UARTPinMuxSetup(2, FALSE);
4 S  H: I& R% i! @  r4 V}
1 A" ^$ i, l6 @- `/ ]# R4 K/ J  O$ }
/****************************************************************************/
! g2 t% x! ^0 _; U/*                                                                          */
8 j6 p; H$ B3 i, `; y. p/*              ARM 中断初始化                                              */. I( c* M5 s+ f# Z. N' a7 y7 f
/*                                                                          */: t$ d. _+ O" L* R( |! U6 s* C+ S' W' M
/****************************************************************************/6 A$ M) C8 E8 ?0 G" ?- H# X
void InterruptInit(void); s% Z/ ~8 G' D
{( Z% m4 v; q# ]' C; N  ?6 Z4 g3 D
    // 初始化 ARM 中断控制器& X) }1 U- T9 ^2 O) i" h; a
    IntAINTCInit();
" ?$ v% @! m* e5 _3 B2 T& M4 ]8 v0 i6 c' B% z0 Z2 D6 b3 T
    // 使能 IRQ(CPSR)  R# u: N! F, d& q  L
    IntMasterIRQEnable();
' a1 T' D8 I0 e. f5 T5 b
% [2 V5 {* C+ \% P7 R    // 使能中断(AINTC GER)' `8 N/ d2 e: ~% ~
    IntGlobalEnable();6 q3 B5 U" L8 S) I5 B6 M
/ Z+ F: O! W* {, z8 i
    // 使能中断(AINTC HIER)
& @, ?- c: p/ J+ F2 P+ a; {' L7 e" B: a    IntIRQEnable();% m- j! I0 ~1 t( m4 n7 l' Z! }
}
* N. d! O# C5 Y6 [, c/ l! c
" a' S1 D9 ]& Y. H5 j1 }/****************************************************************************// K- _/ }8 v' O
/*                                                                          */, f6 u# D& e) k: v6 r3 j! |
/*              UART 初始化                                                 */& x5 C. r  _% A# r6 Q9 }
/*                                                                          */
' P; P: g7 i3 k% r+ M7 h6 \/****************************************************************************/3 }9 G9 l+ O" A9 o3 Y( W
void UARTInit(void)$ t8 O2 b% ^# S9 P- l% B
{+ j* a; T0 x- N8 C7 v* U( f
        // 配置 UART2 参数
4 k) m# k7 \  M1 @5 |        // 波特率 115200 数据位 8 停止位 1 无校验位
9 N2 l2 [( @/ c. v: c    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,2 W- Z; d- v: H! K3 v. }+ [' b4 K
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);+ M! Y. j' J, b" E. w
        // 使能 UART2, `  j6 c. |/ H6 f6 f" d6 P9 W
        UARTEnable(SOC_UART_2_REGS);
, Y# U2 V, c  `# H8 f
5 L) y" P- l& c$ Y$ H% B    // 使能接收 / 发送 FIFO
( w: Q+ Z$ L* @6 J- v6 e) ~1 v    UARTFIFOEnable(SOC_UART_2_REGS);
6 L* @8 e, K1 y0 N7 R
) y# y( c) Y7 b- D    // 设置 FIFO 级别7 G9 B* l8 `% c1 h
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
; B5 p7 f5 H7 |" B8 v9 P# x! |) m}
$ P5 P6 |' @2 F
7 U& j+ ]6 `: ]8 z) t/****************************************************************************/
- G3 e3 k* P9 L! j+ Z5 D! g/*                                                                          */
9 R, T: r9 L6 }0 b& B7 G/*              UART 中断初始化                                             *// F, N7 r" ^7 @  y3 Y# Q
/*                                                                          */) o0 T1 W0 |7 k! U5 `- ~* F
/****************************************************************************/
$ V& m* ]. m6 A7 Evoid UARTInterruptInit(void)
# D' e( q" o5 Y) g/ W5 o, t+ F{$ M9 }, w- Y1 p
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
8 m/ ~( y1 e5 M* `- @+ P5 U        IntChannelSet(SYS_INT_UARTINT2, 2);
! n2 F6 b+ Z2 c& T% g" b: q        IntSystemEnable(SYS_INT_UARTINT2);4 M/ F0 f& T! g. {/ s
6 P" e$ T: S3 ?) s
        // 使能中断
& v3 x" K  ?3 t6 Q. V( w4 S        unsigned int intFlags = 0;& J( s4 b; f  e' ~$ Y, F- f% ~
    intFlags |= (UART_INT_LINE_STAT  |  \
+ F2 m4 ]" _: u/ K; R0 {                 UART_INT_TX_EMPTY |    \# i4 k% W; Y1 {; S: o/ M( |9 N
                 UART_INT_RXDATA_CTI);) A1 C  P: ]" \, o% R
    UARTIntEnable(SOC_UART_2_REGS, intFlags);" m4 R% P; ]* J& G( }0 M
}
' W& Q6 T) L  I% y9 ~5 {, L5 a7 u* J7 h) o
/****************************************************************************/
& j  l6 I: S1 y) L' u1 Q/*                                                                          */; @* j- q1 c1 W; c
/*              UART 中断服务函数                                           */' m# Y" }1 k/ E3 t6 U
/*                                                                          */7 U5 h2 t9 n, k* T9 S/ c! U
/****************************************************************************/
2 k( _7 U. ]5 W7 z+ }+ O- ?. Hvoid UARTIsr()
& ~- J9 D% S: t4 k{) z3 [  W! X+ w
    static unsigned int length = sizeof(txArray);
# v) U& k1 x% @' U; e& a    static unsigned int count = 0;
& V# \; i$ s9 P, J0 |9 D$ G    unsigned char rxData = 0;
% h$ h& h' `( y* K; g! o# C4 K    unsigned int int_id = 0;% _0 l/ s/ p: y0 |( Q

' U& q3 ]8 g) M! J9 z2 d% _9 ?! u: c    // 确定中断源. I3 R" L' |; T
    int_id = UARTIntStatus(SOC_UART_2_REGS);- M  r2 r, {0 ]$ t
- p+ u7 {% r) |6 z% a
    // 清除 UART2 系统中断
& `; I" V) O" g  Y1 B; J- ^' m    IntSystemStatusClear(SYS_INT_UARTINT2);
& B* I/ f8 S2 m/ d2 u' R) N6 ?2 s* u8 u3 [
    // 发送中断5 e3 s2 V) T  M, f) S/ U0 e
    if(UART_INTID_TX_EMPTY == int_id)  p, J( s. Y3 Q6 |
    {
. |9 Z4 E8 E$ p9 \# O$ r        if(0 < length)' {  u3 i8 f& a$ N5 R4 k0 S" g
        {
. I6 q; [- K9 s5 v1 B            // 写一个字节到 THR2 B6 m; `0 v7 d
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);7 ?( [4 D. \( {- Q% F$ o
            length--;' t% W1 O) C+ ~2 l) z/ k( @& }% L1 t) \/ g
            count++;! j; w/ j5 n' ^. y' X
        }% X3 j" z- L1 X
        if(0 == length)& [5 s8 l9 @4 O$ p
        {$ m& H. W9 s, q/ x( M2 V
            // 禁用发送中断; L, i9 z. P7 ~+ Z3 r5 r
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
( V& y9 H) m- T( ^9 v        }0 {% i+ S: G; \, r8 e
     }
$ I- x" J3 j! a. Y8 c4 s; T8 M- U7 r, \8 d6 {$ O
    // 接收中断* l. F4 j0 R0 s. ^- h
    if(UART_INTID_RX_DATA == int_id)
' q1 ^' j0 L/ Y5 g: Z3 r    {: F, |* a9 y0 z$ J7 g' V+ H
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);) j/ x7 T3 R$ E' C

2 @: K. r, }' {) v3 n5 q; M        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
9 M1 ]! L3 ~, P3 C, X    }
; j, n: t. n9 P: o# d& z6 e3 E4 l  I. }2 I  I% o) G
    // 接收错误
8 i+ _6 x; V7 J7 N5 ]6 F    if(UART_INTID_RX_LINE_STAT == int_id)6 Z' N; z  ?! l  h
    {$ Z% |9 o  E0 j0 u
        while(UARTRxErrorGet(SOC_UART_2_REGS))
1 }! @& y' r* R! X# D8 A/ Q        {- W3 P* d- C- o, M0 M7 U
            // 从 RBR 读一个字节
. M2 |: ^: A5 G! Y! f            UARTCharGetNonBlocking(SOC_UART_2_REGS);
- y. N5 E# Z' Z" c7 B% H0 q  E% g        }
, G8 y3 ^* D. T4 X$ T- U0 }    }* [0 w# E2 O8 I- A2 ^' \6 c
   
9 K# k" G4 ~& u& o    return;
3 g8 a# m  j2 G# H! x4 M}! c" ^0 H' Z6 j& [4 W
回复 支持 反对

使用道具 举报

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
: n; L7 f8 k1 m* q" B如果其它设备快速给你发送串口数据,你这边能正常通讯?
- @4 C5 V3 M3 G
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-17 16:01 , Processed in 0.045718 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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