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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8220|回复: 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- b2 f  i& @" u2 \! y( O

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。4 X8 x* N% d& v% T7 B

# k' r( e, K5 Y' j' `#include "TL138.h"                 // 创龙 TL138 开发板相关声明
1 p3 }% a' s, W- D
7 N2 V3 K, @0 s1 V. c- c#include "hw_types.h"               // 宏命令
5 b9 u9 a& G! }7 J+ d. f1 }4 o% b#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器5 O% M7 f' x7 R7 @
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器" g- F  ^" \8 B" Q

% ^$ b2 p) r' g; v% O9 I#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
% p3 Y& z, r; l; Y7 U8 m#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明) |2 T6 T  f2 N8 }
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
% f- k/ E5 U' h1 c9 ^; c- h7 P#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
0 l% r* h3 I9 @* }3 i7 Q& F' b$ ^) V+ Y3 j. q* f
/****************************************************************************/& C/ |2 g) r( Y; N
/*                                                                          */! x+ h8 ^  O" z( E
/*              宏定义                                                      */& e& ~2 o' P' x; C; h' N
/*                                                                          */5 U4 u2 q) s' G$ @; x% E
/****************************************************************************/- `9 m+ j9 |# Q. E4 b
// 时钟, u( y* a" E! g2 L1 O+ ^+ ]! a
#define SYSCLK_1_FREQ     (456000000)
5 `( _1 X6 q! N! ~#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)- z  z. \/ x# Z- P- Y4 G
#define UART_2_FREQ       (SYSCLK_2_FREQ)
9 y: ?( x/ v$ I& o) N
' Y2 J, \* ^: ~' t/****************************************************************************/
4 U; f3 W7 `6 [/*                                                                          */- i6 W0 S) H' c  o
/*              全局变量                                                    */- n. t0 {* ?: e0 A# o% D. [
/*                                                                          */0 l5 A* G2 j" |5 b$ P/ b5 |
/****************************************************************************/& n. _: _4 P5 s$ A( r6 ]
char txArray[] = "Tronlong UART2 Application......\n\r";7 x: i3 M: k8 j* ]+ I1 w; d* }
4 W$ U( l" b: I9 c! N) j$ U+ b1 S
/****************************************************************************/' O! d" P/ Z; f
/*                                                                          */
6 F" \! I2 C4 _/*              函数声明                                                    */
7 }' i* ]/ V8 Y( D6 I9 M/*                                                                          */$ q: s. g$ u1 a/ h: z  o7 o" {. h4 ]
/****************************************************************************/
) l$ p  a! |9 i& k0 [' U2 K// 外设使能配置
* S3 Z$ L( g  Z0 g( Bvoid PSCInit(void);
/ p7 i; {1 d# L. G0 \) e0 r' u. O- v& }4 I  n7 s% Z5 m
// GPIO 管脚复用配置
+ k- l8 b& j3 ?% g' j' Uvoid GPIOBankPinMuxSet();* Y: O) v* t' M% |

4 t; e! I6 p3 k8 s! `// UART 初始化. m# e# v2 f- p0 T& Y% X
void UARTInit(void);
3 O- Y- P0 Q5 q! k// ARM 中断初始化
- B3 y0 o" G  x5 V# Gvoid InterruptInit(void);
5 F$ m4 D0 k) s( R// UART 中断初始化
. c% c0 p9 _& cvoid UARTInterruptInit();7 A3 d0 K7 }( ^# X0 t
// UART 中断服务函数
( y' M- V/ f3 t; i- _void UARTIsr(void);" b2 F4 y9 c- ?
9 I3 w" n. v5 K+ v) X2 }" d
/****************************************************************************/
, t$ l4 \5 a# u! O/*                                                                          */  A& l- N! C) Z9 t8 [
/*              主函数                                                      */8 p3 K1 `' D$ i: _
/*                                                                          */
3 w) w3 E7 }! T/****************************************************************************/
. B( Q  f( l; Q* Y0 s' L% x+ ^, cint main(void)
( Z/ j4 N6 U" N9 S" P6 Y{% }: @6 E9 r0 ]& N
        // 外设使能配置
; n! N7 q, E5 _/ i$ p        PSCInit();
4 I1 T  ?' o$ G: y       
. v) r' j6 ~% f, w        // GPIO 管脚复用配置9 X; b% U  m! ^! o7 Y" w" l
        GPIOBankPinMuxSet();! D! F3 P/ |+ T; F  Z

* B4 }9 d8 s! |" I  v        // ARM 中断初始化
: [: f2 h  F" C5 w        InterruptInit();
% z; x( j6 V- ?2 r$ P5 ]* S+ q: v4 v: b6 p  K$ R4 j1 D$ n
        // UART 初始化
; K$ B8 R2 y0 u/ }. z% n        UARTInit();
: l5 T7 y" h0 V6 Y0 }
% ^$ F$ B( v. P1 k( n        // UART 中断初始化
6 ^0 q' h; |) ]$ o; n' d        UARTInterruptInit();0 @% e, z4 i' T7 R7 _' @

- d3 p5 x! s/ \1 ^        // 主循环
- p; _" K% K' o. r' L2 T4 M/ s  V        for(;;)
7 f$ `8 X( w- e( k/ U        {4 h. T, s2 O+ y
( Y) F- T; P6 G' ~' a
        }6 U# P  ]0 R2 O1 F1 c( [5 I
}
/ F3 i: y0 `$ w7 r# f* b' U* d% A" W
/****************************************************************************/
4 s8 n1 c( v9 y1 K7 W/*                                                                          */8 Z# m7 `) e6 Y0 B/ N2 m! c
/*              PSC 初始化                                                  */
5 [' g0 i8 C2 z/*                                                                          */, I  m* Y+ u. x- P8 b( A0 S
/****************************************************************************/1 o$ o/ Q9 j1 V0 ]
void PSCInit(void)
0 O5 G% O1 ^' v$ l: n. n7 N9 n{
; h4 H+ b" t* \9 I0 F  U% w        // 对相应外设模块的使能也可以在 BootLoader 中完成/ h1 V0 b3 V" o% R0 T
    // 使能 UART2 模块
1 u- L  Y5 H- a3 r6 N. {7 q, {8 R    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);" Q4 }. x, S" ^1 _8 ?7 n
}
; s6 U# f! P7 [: Y( l/ L3 x; d  ~7 k; M( Q! _
/****************************************************************************/$ a+ Q8 t+ o$ G8 w! L$ m$ p7 P
/*                                                                          */
! U) i3 j6 L/ g0 }1 ], H  _/*              GPIO 管脚复用配置                                           */+ t6 Q; y1 N; e% B) B' A
/*                                                                          */
& Z. r3 B+ C2 l' e, v/****************************************************************************/
1 i; j9 ]- e. ^/ M% h: A3 Svoid GPIOBankPinMuxSet(void)
5 z4 j% R: x2 O{
# N" C7 ], W2 v" {        // UART2 禁用流控8 \' B, D/ t4 e3 R; D) S
        UARTPinMuxSetup(2, FALSE);
+ n" W) v0 H- a* Y0 ]}: c* o# e( d) r. K8 L0 r; V; ~
! L7 W$ j% ]" r! B+ C2 q
/****************************************************************************/
" y7 M3 ~6 A8 J6 s/*                                                                          */
8 i3 ]; S$ Z- L+ V% [0 X* Y/*              ARM 中断初始化                                              */
4 I( D8 Z$ c8 b/*                                                                          */3 Y" e4 L" i' L2 D: W# m2 I; c0 k
/****************************************************************************/
2 Q2 e; x& X: I" _void InterruptInit(void)
0 V+ |6 P* K5 M; K) L{- w3 y! ~$ ]8 @: ^6 X: b, M- x
    // 初始化 ARM 中断控制器
( R# m0 Z8 [5 d    IntAINTCInit();- q) }# ^* n9 e5 E
! M" e) |$ r; Y2 ^5 x5 \4 U
    // 使能 IRQ(CPSR): A2 {# C- r. x# u$ x+ T4 {$ M
    IntMasterIRQEnable();) n6 q8 i& h; Y5 C7 n8 r

, G" o4 V* T1 O# i: H& X# X    // 使能中断(AINTC GER)* W' h: d3 A4 |- u
    IntGlobalEnable();
; w& i& {- c8 O
0 p: u0 G, w/ f    // 使能中断(AINTC HIER)
+ Z* h8 N: [' ?1 `- k3 ~7 H& r    IntIRQEnable();
$ `/ B* i9 s& X% L9 B% C# u3 W" g}" `* G" p7 B3 ~0 e' V. s0 Y0 J* c
* F4 R8 d/ Q( j" [# C# p" `( v: r
/****************************************************************************/
) f( f' m% Y9 m$ S6 `. ]+ h* |/*                                                                          */
9 b& D8 t0 o9 V/*              UART 初始化                                                 */: H5 y; e& h' Z! U* L4 w' g' u2 n
/*                                                                          */- Y- z$ K, M1 A: Q1 ~0 u
/****************************************************************************/# V1 H; ?4 u' G& @
void UARTInit(void)- @0 Q& Q) s& \, c
{
& K; }7 M& b6 i, e9 C6 `0 P        // 配置 UART2 参数
  ]6 s0 P; S2 u' ]; d        // 波特率 115200 数据位 8 停止位 1 无校验位2 O1 q; ?0 m1 k4 J
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
2 e# h. y3 C/ H1 ]. p$ F2 d* z5 d                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);# r0 W0 |( k- w; e: p5 _3 `3 c5 k
        // 使能 UART2
! W! P' T$ ^0 Q3 Y0 y9 i' m# s        UARTEnable(SOC_UART_2_REGS);) K5 w4 L# n# T
: b" N+ w$ z! C9 L  P
    // 使能接收 / 发送 FIFO
8 k  z6 {- w' g; g* n    UARTFIFOEnable(SOC_UART_2_REGS);
) R; }/ O2 I1 E5 P4 U
8 ?  X4 @0 ^4 I& x9 \1 Q    // 设置 FIFO 级别5 G( V" `1 l) b7 {
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);" X! R  I' j8 o  W
}/ w6 a  w0 ~1 Q. Q, n4 z

1 r  k9 k& Z3 s9 X/ {- K& M/****************************************************************************/  ~0 {" h- x5 v  N& r/ J: m
/*                                                                          */1 i' o- d' _  C6 Y9 u
/*              UART 中断初始化                                             */
0 n. D* G6 t( K& [/*                                                                          */
9 Q& e& L/ W5 @' Z# U" ?3 j/****************************************************************************/& [, A+ X; L* q$ r) m$ z0 |
void UARTInterruptInit(void)
8 i& y# ~' z7 B" @6 P6 Z. Z# \3 G; A{
/ @9 }2 f5 J! A! ?( `        IntRegister(SYS_INT_UARTINT2, UARTIsr);- ~6 x2 Z) t- s$ k
        IntChannelSet(SYS_INT_UARTINT2, 2);" b; I) d( s& B" ]# A
        IntSystemEnable(SYS_INT_UARTINT2);
3 ]+ F0 b( ~3 N6 \7 b( _) h: p- f4 A% J- K
        // 使能中断5 `3 ]4 F  i1 r
        unsigned int intFlags = 0;* x, x) u0 j, v
    intFlags |= (UART_INT_LINE_STAT  |  \3 c& X9 z: Z' e. g2 H6 i. |" R
                 UART_INT_TX_EMPTY |    \7 u; P  v' D4 ^; s
                 UART_INT_RXDATA_CTI);
8 l+ S4 G  P3 v: E5 m) z% U, Y    UARTIntEnable(SOC_UART_2_REGS, intFlags);
9 m; s% W+ k' c2 m# A6 t}
1 f% O" {& ?- w* j3 V
8 i9 P8 q* n+ l0 [. c% V/****************************************************************************/
2 Y5 m! }* n. W" v% w! u9 C  Q0 E/*                                                                          */) A$ t( ?, S# h0 v
/*              UART 中断服务函数                                           */' G0 J* K& D7 T0 g
/*                                                                          */" {4 Y# j3 q4 T3 P& S
/****************************************************************************/6 b3 o, t' [: F4 u/ b
void UARTIsr()& D% b$ p7 o: D1 R5 K
{
& a7 O4 \2 G& A' z: y2 T    static unsigned int length = sizeof(txArray);
6 V& N2 ]0 ~6 U8 |4 Z, V) q% t& H    static unsigned int count = 0;4 o5 A- e& S& I* g" C
    unsigned char rxData = 0;
0 Q+ U8 f5 W9 a6 c    unsigned int int_id = 0;
1 u, x% w% B3 @* Q# p, k% g* A* e% k) ~" t9 |( k( f5 G: `
    // 确定中断源2 J) \1 C& A4 w+ [' W; z% Q
    int_id = UARTIntStatus(SOC_UART_2_REGS);
; m1 D# b7 p5 u; f/ V  ~
. ]4 J5 ?$ r+ d5 ~# _    // 清除 UART2 系统中断
7 i7 C1 X9 G. @" ~. q    IntSystemStatusClear(SYS_INT_UARTINT2);3 u1 y+ M, e% o; o  N

5 a: p* ^# q/ g    // 发送中断8 {; h+ q; K/ K* A2 |. E, W
    if(UART_INTID_TX_EMPTY == int_id)1 _, x: y  z) N" r) G+ g0 u
    {
; {$ a* f6 F- h8 w( Z: t        if(0 < length)
8 z, A8 h* @; v; ?5 V' C) a        {
' [2 w" y, x1 B  J0 N2 o9 @/ Z            // 写一个字节到 THR4 |* w$ _+ d  s. l
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
8 G9 f' V) l% m            length--;! Q( t9 _, S( O) i& P1 q% C# d8 e- J
            count++;
# i' z3 D! W  w, o# a! a        }
2 _9 A6 Y- S6 R/ r        if(0 == length)! X5 k9 ^, Q, F
        {
" w1 ]& i3 _$ i$ X8 P; y            // 禁用发送中断- S# m  K( x  ]7 b3 Q
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
' r0 B) [( f/ h  ~$ n1 b        }
+ i9 Z4 M$ E0 h- D# v6 C# X3 i     }
6 V4 O% Z5 ^& U  A4 u
" W2 M- r  X* C  `# T4 r$ p# c7 p0 d9 W    // 接收中断* t. M$ i! ?- c  z7 r; o
    if(UART_INTID_RX_DATA == int_id)
+ ]4 ^: }3 \! C    {
  [4 w! p% f. f' ^  G: ^        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);$ X! B8 U+ r# a; M# N

) l7 U, j3 k# i* {6 x$ B* ?& u        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);0 J5 n7 ~3 p' r( D) q+ i1 b( A/ I
    }. G: z- V4 M1 ]& ]) Z  U) c
, r  a0 {" S; f* S+ N8 ~
    // 接收错误
& ^* }4 v  L* P, i/ n    if(UART_INTID_RX_LINE_STAT == int_id)
) s0 ~+ H, `* t# \* y' I3 W6 [* k0 w2 j    {. P" O  ?5 S% |' f* i
        while(UARTRxErrorGet(SOC_UART_2_REGS))0 N" @6 O% W% J) ~
        {2 V/ x* e1 O/ }# u
            // 从 RBR 读一个字节
  i7 ^  }% M1 J/ P  e% C6 h            UARTCharGetNonBlocking(SOC_UART_2_REGS);
( \0 X! @) t/ o  d        }# W2 x& j) x8 v7 s
    }
4 z6 K7 x' u0 V    7 [- H6 @' W) y9 a
    return;
- k* ?& u: f" `}
0 _# _; L# u  [6 E$ [3 B
回复 支持 反对

使用道具 举报

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 l' K% y% c& V
如果其它设备快速给你发送串口数据,你这边能正常通讯?

9 ^5 O- N2 k: c谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-2 02:22 , Processed in 0.045393 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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