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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7480|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
) b0 w1 o( Y9 `7 w

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

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

# }) G- U) N' D' k, k; V#include "TL138.h"                 // 创龙 TL138 开发板相关声明" S1 Z$ w4 R0 P$ ^2 o* f, o; N

& |9 ~0 Z. M+ e#include "hw_types.h"               // 宏命令
4 |- j1 N2 z% K6 b1 r" y#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器5 V. m) ]3 e. r6 }, Q
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器9 Y. p: A6 P; k3 I4 ~: M, L

& l! @& a, D2 r1 M$ Z) j#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
+ o- _' ~' ^* ?#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明2 a$ ^4 l; R6 Q
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明) w1 b& Q6 N- |6 U
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
! {  r" t# N9 u( T. {& l
2 \8 Q5 `. a! b. P/****************************************************************************/( x( y& S& J0 q0 u* N/ }
/*                                                                          */
$ v( C1 q/ M/ g$ z4 D8 n/*              宏定义                                                      */5 Z' G8 Y. E7 R. ?# V/ q& \4 C
/*                                                                          */
* K+ i& T4 m6 _6 P6 d5 Y: ?/****************************************************************************/! F7 r& N7 O& l& g
// 时钟
6 |7 _- s4 e% @8 y& U2 R#define SYSCLK_1_FREQ     (456000000)
; b' C) G1 q; f/ J; w" `#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)9 a6 n  i& K& ?* w! Q
#define UART_2_FREQ       (SYSCLK_2_FREQ)
& P: n3 N* p1 d1 q7 T% k) v- Y
/ G& |- P# \7 x/****************************************************************************/
' K0 ^3 l3 z0 m1 \: }* o, M/*                                                                          */( t8 a" N- G1 K, f
/*              全局变量                                                    */
& K5 v  U$ G4 M+ N/*                                                                          */& D, @/ B: ?0 C+ Z
/****************************************************************************/
3 C0 ?& p* G4 P  Y" ychar txArray[] = "Tronlong UART2 Application......\n\r";
) ^; a  J. S0 D! P# j
5 N& E6 L: j1 r( y7 c* [/****************************************************************************/3 j( I, }2 }3 w' p1 {2 X) |7 t
/*                                                                          */
2 {# G4 v. D" e. i/*              函数声明                                                    */
% j( W: I$ n8 p0 r! c/*                                                                          */
: U5 H' q! u' i3 f$ t4 T" y/****************************************************************************/& A( y4 Q  J* F
// 外设使能配置. D* l  Q2 C$ w( d8 L* }% e* R- i) r
void PSCInit(void);, p$ ^  s6 y4 q/ Q0 @; _) x

0 d' i" Q5 {8 w" o9 p// GPIO 管脚复用配置
/ _1 G8 l1 q5 G( B4 Q( Y: t1 jvoid GPIOBankPinMuxSet();
$ x/ h# G9 T; a2 n1 K: `- M
; b" ?% [" t$ b- ~// UART 初始化! R7 v) T2 T- C! V
void UARTInit(void);
7 J- F6 T3 J' W+ R' Z1 h% G// ARM 中断初始化
" d- j5 j. W* Z2 I- O4 Nvoid InterruptInit(void);
3 `$ n+ b1 Q& f+ Z% ]/ x// UART 中断初始化
! X$ B3 Q6 J3 K" z5 }void UARTInterruptInit();$ k) J  G8 x5 C0 c, j
// UART 中断服务函数
% C2 c  M" h' C, x3 T* mvoid UARTIsr(void);* P" y! V" S3 \( M+ Z4 |

' C0 ~- l0 d+ h3 I/****************************************************************************/
9 y, P; J  i0 ?% e/*                                                                          */( m$ \1 @, o7 @) {$ q! S, |& t) {
/*              主函数                                                      */
' M3 L& K2 B0 O1 Y$ @' h/*                                                                          */+ T7 Z3 |7 H! G( F: p
/****************************************************************************/
3 x# a( }. Y3 q# V( uint main(void)8 {0 h+ ?; X: T1 t5 a5 _  r
{
' V3 @6 u' ?, |( t        // 外设使能配置8 G( Q' A6 I1 o; N- S) l& @. {' I
        PSCInit();% X0 I% U+ B0 h* m6 k+ j
        ! f) p* B+ L0 ]  |2 s" N
        // GPIO 管脚复用配置
9 M3 Z5 d) f. a& k/ P& t        GPIOBankPinMuxSet();
% |, a# j' a  v2 H. j* Y6 w5 }! b& w% o! M" v* b6 e
        // ARM 中断初始化
: H( x9 ]8 i; {6 t! ]1 `        InterruptInit();  R( k7 c, M" ^8 _
) X+ h9 q1 |, J. l% _
        // UART 初始化% b" N* {# z0 h6 \! L
        UARTInit();
5 @0 w* S3 O7 @2 P0 f; n, \2 M0 h) @: \$ Q
        // UART 中断初始化
- ]* f, n3 b: A: j" n1 [* U        UARTInterruptInit();
5 ]9 }% B+ V" q3 q' K) q9 ^" g. t# y% h# A" B: o9 H8 ~
        // 主循环! h' n% M6 i9 Y; o- g( z
        for(;;)' }% P+ O8 F. n+ C3 A& }0 t
        {
. [% ^" l5 J1 L( u9 p0 a# h( f: ?9 `/ g+ {3 `5 m+ I
        }  r% e# B1 }5 b
}
/ b9 I4 K4 h) E9 ~2 N$ e5 `6 h- Y) N$ |* v7 M# ^. }$ }
/****************************************************************************/" u! ^$ Q) m3 ~4 h* j
/*                                                                          */) Z: h0 b) m+ N  q/ e/ U/ J
/*              PSC 初始化                                                  */- |0 i7 B7 M3 T' @! p+ B9 T
/*                                                                          */. D/ I0 f! h3 a) H8 Q6 p
/****************************************************************************/' J/ v: y' ]6 m
void PSCInit(void)" g4 d- M5 W: c5 B6 t
{  N4 J$ f  I, q* e" I
        // 对相应外设模块的使能也可以在 BootLoader 中完成
, y9 n& `; S: e% F# Q9 o    // 使能 UART2 模块
! I# [% ~8 c6 P$ G9 q3 v) Q/ w    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
% J8 I7 A) V2 Z# E8 w) p}: s$ ^: S3 j( h2 G! I
1 z, O2 w+ t) S2 {
/****************************************************************************/
- F9 D( G- @' j- C3 }/*                                                                          */
% X7 |; u+ B7 Z. V3 c/*              GPIO 管脚复用配置                                           */
4 U6 d# T$ I3 N, H$ `. @/*                                                                          */7 Q6 I' C& N* R8 [# I+ w$ @
/****************************************************************************/8 B/ U5 {5 R, Z, `7 z
void GPIOBankPinMuxSet(void)
! N' t. g# B9 d, q$ G3 P; A+ R' R{
: t4 x* z+ Z+ w0 `" D* e/ t; ]6 d# S        // UART2 禁用流控
( V8 \7 ~  M- F        UARTPinMuxSetup(2, FALSE);  t4 N6 q/ a3 V# P
}: {  a' G9 ^; ?' x

- l4 Z; R# b2 G3 L& U/****************************************************************************/# K3 }( D8 ]4 q9 L
/*                                                                          */
  m$ _; h4 R! k! W; Z8 r/ m4 X/*              ARM 中断初始化                                              */' Z' h# l* h8 r! ?: v
/*                                                                          */
. E1 Y5 C& Z5 _; h9 N1 m& }2 ?/****************************************************************************/
6 V5 m* d" T. F; b: Cvoid InterruptInit(void)0 t3 L# f# v- F. P, B
{
+ I, |& u! f  d; N, Y    // 初始化 ARM 中断控制器/ k7 f# }6 J1 u2 x+ h0 _0 R
    IntAINTCInit();
8 s% W" I4 C& r: Q; b; c6 I
7 {8 i$ _% A! N( e# |8 G! e8 N* P    // 使能 IRQ(CPSR)$ B% n. j; E- z1 Y' c% h
    IntMasterIRQEnable();
; X- c5 X. A  ]* d  J1 H8 K/ F* j+ P) N( r$ N. I/ N1 E
    // 使能中断(AINTC GER)
% L. h7 S; L7 i  C. [* f' V    IntGlobalEnable();) Q( M- \2 D* S2 F- u/ z
4 z" W/ W$ H1 o, H8 |
    // 使能中断(AINTC HIER)
3 G  ?8 i. p$ l) y  h7 {; L    IntIRQEnable();
3 a+ B0 Z4 X9 p! Q0 x! k9 N}
* W( N9 ^7 N. o+ p7 \; V- f. P! R: P* Z
/****************************************************************************/
0 J) r* ]1 X3 ~4 I: L/*                                                                          */
  {# }3 W6 ~. ]* [0 L8 y' Q. P/*              UART 初始化                                                 */* M9 F1 J+ o! c9 O- k- }" k9 O
/*                                                                          */
; L9 ]. d* V9 H0 K$ m/****************************************************************************/. ~, h# h0 L; o4 U) Q% h8 _, V
void UARTInit(void)
7 T* ^6 t4 z3 E6 W: w* ^0 `{8 G$ s8 W) p& g0 _
        // 配置 UART2 参数( [9 n( V6 i# C) t& ^7 H
        // 波特率 115200 数据位 8 停止位 1 无校验位
5 `$ Q; N1 g8 o  {& M; ?    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,( |0 ]. b6 P0 P0 v' k  x% R  G
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
5 A+ J/ x4 D, Y) q! S$ K0 ~) I        // 使能 UART2( }) p- @2 h; n* ~
        UARTEnable(SOC_UART_2_REGS);" r8 h3 j/ [: k& s7 _

; \2 A  M- o0 h) V. F6 K% v    // 使能接收 / 发送 FIFO8 f& H+ \) C4 ^! b1 m7 N. k
    UARTFIFOEnable(SOC_UART_2_REGS);
+ y1 E: C' R* z. U( a  I, Z+ A. _; i, h- u
    // 设置 FIFO 级别
/ _1 }, s/ U3 d+ h  e( n    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
1 H4 r& b% q7 n- P& i: d" Z}
' R6 V- o$ t# i( j) k2 f) b
' ^" q$ T& I& `/****************************************************************************/
% j& U, N" s# U/*                                                                          */
, J5 ~8 b4 f" ?2 f: n/*              UART 中断初始化                                             */
' }. Q' z) }  e! h/*                                                                          */
, f3 C* T; |( J/****************************************************************************/
8 M4 B& X" a/ u6 {0 Zvoid UARTInterruptInit(void)
/ s3 [: o+ w, ]2 ~8 r0 d{
# p' L$ p: h% K: Q) r8 x% D& t3 I        IntRegister(SYS_INT_UARTINT2, UARTIsr);
  e* _/ g5 ]2 s3 \$ q2 C        IntChannelSet(SYS_INT_UARTINT2, 2);) K, q; ]$ W1 Z) Y5 q3 T
        IntSystemEnable(SYS_INT_UARTINT2);  f+ F* ~) G  d
$ i: C, `4 W/ c7 F
        // 使能中断6 m0 V3 A6 X% s, X1 n1 T# ]; z# U% ^, _
        unsigned int intFlags = 0;
, s4 J$ M. n' Z( m    intFlags |= (UART_INT_LINE_STAT  |  \
9 I- m/ q' Y8 t3 @+ g& y                 UART_INT_TX_EMPTY |    \+ g4 R/ f; S7 `& {
                 UART_INT_RXDATA_CTI);
  j+ c" y# w; U% @    UARTIntEnable(SOC_UART_2_REGS, intFlags);/ d8 E( V6 S, F
}
7 a' L/ D% y* k. ]/ e
7 ~. w! @& L6 z8 C# u: i/ O+ i/****************************************************************************/, s: V/ T" R  v% c9 h, ^/ A! d
/*                                                                          */
1 i* r9 k  w# \/*              UART 中断服务函数                                           */) Q! I- O' ~. q: b4 z9 I0 ~* N* t5 n
/*                                                                          */' n9 V4 Z+ a% n) k& W3 f" y
/****************************************************************************/
5 r; x7 Q: ]9 U0 Gvoid UARTIsr()  e8 _, t! M6 n6 ^0 H
{
3 n5 q" c" E1 ^1 U  t3 L    static unsigned int length = sizeof(txArray);6 J  G6 B0 w/ ^+ s5 C$ K
    static unsigned int count = 0;& i1 Y0 h; v# K# W6 G8 S
    unsigned char rxData = 0;! Z9 j1 }9 h; V- q5 J. H$ a" B) a
    unsigned int int_id = 0;
  B8 s) }. m* U1 r2 D5 {) ?  U+ _& c8 ?$ K! k" y, u, G
    // 确定中断源$ h8 ^) L1 ^2 Y9 [
    int_id = UARTIntStatus(SOC_UART_2_REGS);
; ?: f) K5 P2 Z: l- M: p) ]$ B* T/ u9 \6 L! m  k1 E
    // 清除 UART2 系统中断
: r8 L$ t9 a3 `! T0 ?/ j2 ^  Q- m  t    IntSystemStatusClear(SYS_INT_UARTINT2);# _6 t/ B6 h. u  ^6 \& b: e

3 r* E/ G5 n8 @+ s* h! W* {8 z    // 发送中断
5 [3 F+ p/ a* L; J5 ?. K# P    if(UART_INTID_TX_EMPTY == int_id)
  h! h( B; m3 j) i0 {6 |4 |9 ?    {3 P) C. L: m/ q, f8 z2 f  O# _' [
        if(0 < length)# i. K  J; ~1 \( D# w1 n
        {3 |2 ~  L6 u  _0 S: u& t
            // 写一个字节到 THR
, b) m: E4 U0 h            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
# X/ P* r. M5 `+ E8 W5 U% U# h            length--;% q% M6 U  U9 k7 M& G
            count++;4 x) R+ e1 K% N7 R( V
        }% H# O: O" \% N/ M# T1 Z* s/ P, l
        if(0 == length)
0 L/ ?1 v! ^- d% {        {
9 j+ Y5 t8 i( h            // 禁用发送中断7 _6 p8 \; r4 T% O
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
7 V, m+ {5 ?! q+ x4 }6 G        }3 @8 K7 t0 l, U# i
     }0 ]5 [5 ]5 T/ I* y* ~% h3 O
# O0 A: {- K# l7 h; n+ ^' }
    // 接收中断2 H% C5 E+ f8 S7 V; w$ Q
    if(UART_INTID_RX_DATA == int_id)1 H7 D" O) x& w; t, w0 H$ y
    {; J* L' d5 g6 |' P8 f
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);& Q4 \6 m8 I& s; |

! _8 _! B6 ?2 w) `        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);9 P; D/ Y3 B! _! N: \' e0 P; H
    }% L3 l1 Z# b) t
  h  F! j) W+ Y! u: E% C
    // 接收错误
2 D. q6 m  T3 z, f- B9 k, f    if(UART_INTID_RX_LINE_STAT == int_id)2 i' t2 m1 ]  c( N6 Z1 N% Z% o0 m  S
    {
3 ^% F9 a' ^( U4 U+ R        while(UARTRxErrorGet(SOC_UART_2_REGS))
+ N8 {" v7 c& Z. n; Z. A3 \8 l        {0 A" L* }8 o. R% f. U  R
            // 从 RBR 读一个字节7 G7 @# W3 ]* w8 {: Q+ H
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
% R0 g; H8 [6 X6 w/ H, v) |6 j        }; G( k( W4 k/ u% d2 R; Y' u
    }! i+ c, A# P9 Q- p
    6 _" g. h/ @/ O6 n3 s( M7 @
    return;- \" z8 R: `* D5 M; _
}' R) h" E" a! o8 s1 J' F. Z
回复 支持 反对

使用道具 举报

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! K9 T+ n5 ~$ }. B( x
如果其它设备快速给你发送串口数据,你这边能正常通讯?

4 ?5 J7 S; A0 b  m谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-16 07:04 , Processed in 0.044122 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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