嵌入式开发者社区

标题: 串口发送中断触发条件 [打印本页]

作者: 17390601072    时间: 2019-4-30 18:00
标题: 串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]- A8 W6 K  {5 b# ^: d6 P/ `

作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
( T) h) m. l7 D" \" B# K
, r$ @- p& k. a6 {: ?2 L#include "TL138.h"                 // 创龙 TL138 开发板相关声明
' s; g) z" f5 D$ E5 o6 E
, }' a% x( m* Y2 x#include "hw_types.h"               // 宏命令8 o  U( O$ Z$ v, B2 G3 N: z
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器9 i, ~! r6 H& g- C: J  y  L1 j
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器) s  e' g0 Y1 J: k
5 a$ h+ {% I* h6 a0 [) j
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
/ B6 |1 }) N& R6 i#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明* f4 s; K$ t8 J) v0 ]+ e
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
( l$ t0 L, R1 t9 V5 r# H+ b#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
3 g; w4 O$ r# M0 B' s7 B& b0 K2 P7 S+ _% ], p
/****************************************************************************/' V* W* @. R5 T$ X
/*                                                                          */! J! o9 l& l: \6 ~* v0 e
/*              宏定义                                                      */; L! {( Q) u4 C+ t! ^3 }# e7 E+ y
/*                                                                          */
  D6 ~# `" M, Z% [# f- S; f2 p9 p6 z/****************************************************************************/3 Q8 N0 X% C$ Y$ J" T3 M: {6 w, m
// 时钟! ^9 q( v2 C2 H. h" Q& F
#define SYSCLK_1_FREQ     (456000000)& D0 E9 a; m0 K- C2 E) i; u6 L
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2), c$ R  r* d( @1 j8 w) y7 g
#define UART_2_FREQ       (SYSCLK_2_FREQ)
2 T; {1 @! p) A2 y: ~
, o$ s( v5 D" O3 N/****************************************************************************/
  d( |7 j7 b5 d0 t  p8 ^: L7 @" O8 {! F/*                                                                          */6 @: t! j  V% m4 Y0 o
/*              全局变量                                                    */' |  E1 Z, h) d& @; N8 g; q
/*                                                                          */
( I6 R* }! ]+ |1 J; ^3 `# ~/****************************************************************************/. X% g6 K, N1 l
char txArray[] = "Tronlong UART2 Application......\n\r";5 k& ]5 U+ k8 I
2 e) t( J9 h; L* f4 n1 e% w
/****************************************************************************/# v- G8 q8 u, l7 r) M/ g& o
/*                                                                          */
$ r( g/ N+ k" S9 X+ ?- T) _/*              函数声明                                                    *// T1 v/ q" X6 ]5 A$ O3 l
/*                                                                          */& y* a  S  |/ L1 n- J8 l8 S- B5 W
/****************************************************************************/
# ?. t3 C1 K# S  \) F0 }// 外设使能配置& o# U. `6 Y/ v5 ~* [9 k+ s
void PSCInit(void);! y$ o2 }( t0 ?

2 q0 s, K  }. n' A( k7 p" X// GPIO 管脚复用配置
% I+ G7 n' e' M7 n. G# q- L2 yvoid GPIOBankPinMuxSet();2 ]: u5 t, Q1 z* s4 o

! V; ~3 O% b9 e' a  g1 G, e$ t* R// UART 初始化- N( X# u. h  j
void UARTInit(void);
0 y9 A) P8 t5 N  r; A// ARM 中断初始化
9 Y$ z- J9 E( s. w  I5 a! Q/ Kvoid InterruptInit(void);! F0 i+ O4 T" R5 U8 A# U& S
// UART 中断初始化
9 u, T1 F% M) D* Hvoid UARTInterruptInit();
( w5 D2 l, a# w6 K3 _% \% N5 Z// UART 中断服务函数
* E* T. \/ U0 P6 c7 Yvoid UARTIsr(void);0 k: N  u( [* h# U9 \* z: q
& j3 |" S- k; J
/****************************************************************************/
' O+ V% T% D  G  O3 o/*                                                                          */
2 ^4 a4 j2 N/ {0 F7 ?0 Z' Y/*              主函数                                                      */' k* F& }+ L% I. {5 J: u; d
/*                                                                          */
9 W2 ], O8 ?; G4 w* I  O" t/****************************************************************************/
5 b4 J. ]; K/ K+ k! Hint main(void)( H' b" @8 b) O9 V' X
{
2 z5 J% h& @) s* y8 g        // 外设使能配置2 V( q/ h/ T& m* Q9 h0 J* _8 P- }
        PSCInit();
% P1 Q$ U# u% s% J% {1 \: G7 T       
9 r& K3 R) G& V  ^/ T6 Z  J        // GPIO 管脚复用配置" g' P. g/ a7 k# x* _7 N3 \
        GPIOBankPinMuxSet();# _- H- l% h+ x  Z

7 j9 e' R) @. ~( g$ N        // ARM 中断初始化
- }" L% U* t, J: b        InterruptInit();* K) G0 r/ T& v

# r# V/ @" t7 E5 t/ Y' z        // UART 初始化! b: l6 q. a7 ^; {+ C) d; @; W- E' A
        UARTInit();
. t+ R( b9 J. E) Q" A; c+ V$ \! k0 P6 ?( Z! a9 s* e, H
        // UART 中断初始化
/ |8 \+ g: f3 C- L4 H  A$ N        UARTInterruptInit();( a6 i5 c0 q2 _7 ?

; T0 Y- k- d. l1 g        // 主循环, r# _8 {) _: w, o6 Q4 |
        for(;;)
, ~) L" S% F  o1 F        {) y) Q, z/ \! i* e1 }  f( p
& G% x# U- i9 q, @1 Q2 U
        }
  |9 }% d  o  Z6 }}0 A- r: i1 `' f
5 S. T% U/ T) x, H
/****************************************************************************/+ _( b+ \$ V" c4 Y6 `! J0 v, r
/*                                                                          */; |2 z3 [4 G8 a+ B
/*              PSC 初始化                                                  */
3 s. g% a) p& h: \2 J4 `! V/*                                                                          */* N) G" M* N+ `
/****************************************************************************/% H& n: |8 i' c; j0 [
void PSCInit(void)
/ U1 D3 s+ r' m" `% ^/ S( r7 A- J5 T{+ l, f& ~5 F# r) D- K1 |
        // 对相应外设模块的使能也可以在 BootLoader 中完成7 F8 E; f- `1 q7 I" z) e
    // 使能 UART2 模块/ `* s4 ]  F9 L
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);2 N! s- R1 T& {1 e
}
, L+ k% W* V; i: d8 \/ W) X) _2 q+ |/ Q( c# d; c1 [
/****************************************************************************/
+ E% r* u! t. k/ _$ E/*                                                                          */
6 ~- x* k# v1 |; W/*              GPIO 管脚复用配置                                           */" A$ f* h- w+ P1 a8 G7 Y( s% l
/*                                                                          */* q, N0 p3 [' W6 q7 W  Y. r# X7 S
/****************************************************************************/
' [$ W7 b( q6 G. N' ]. \, z/ tvoid GPIOBankPinMuxSet(void)1 |! o/ @5 g/ T& {
{
* Z- X6 G& @$ v9 O- |0 p  Y$ Z        // UART2 禁用流控5 p% ?7 ], C1 s/ z$ E, F4 H
        UARTPinMuxSetup(2, FALSE);  F, x- k7 Q. X* f8 l, F. ^# g; A
}& p5 M; Y9 b* S9 p6 Q; c# n
- i! z+ S. f+ A2 P
/****************************************************************************/
& R. F2 P# q0 M6 t& V6 c/*                                                                          */" R( D/ T( A* _) {7 y$ ]! h
/*              ARM 中断初始化                                              *// U( F$ ^) y* I$ X/ q  t6 \
/*                                                                          */
1 A" s# W  d7 [* z/****************************************************************************/# \2 @* z$ w' _- {  ]
void InterruptInit(void)) h! y( H2 U3 U9 u
{
3 K$ D" F$ p' h    // 初始化 ARM 中断控制器
% L* F3 H2 p6 P# D9 ?6 P    IntAINTCInit();; |( H5 E) V2 D3 d2 [
% m: [# x/ S* ^6 E' \
    // 使能 IRQ(CPSR)
9 n. X* E7 j, a; i& B  N4 D$ X    IntMasterIRQEnable();8 S  W: T& |  s7 T
# e" U7 f3 W) @/ y5 b0 U
    // 使能中断(AINTC GER)3 I7 K7 [7 T  N3 v
    IntGlobalEnable();
! J) E3 O! a% ]. [- u7 \3 q8 x6 W. K: j. q% r  S  ^9 q
    // 使能中断(AINTC HIER)
! F+ b) s4 i3 c0 B8 u! u    IntIRQEnable();: k2 `4 b& m0 N& w7 u$ k% e5 y
}4 N* d$ A! F5 O, h7 W
# C" e- e  H& T. ?& y3 |7 k
/****************************************************************************/0 ], |# g/ w0 ^- n
/*                                                                          */
4 P' y2 ^' l5 I: i5 U5 X$ k' A  h/*              UART 初始化                                                 */! p* n4 @  D) J4 c; G  N* O
/*                                                                          */
# N: c1 `& p: @/****************************************************************************/: h5 g: D$ d7 A; f0 e  ]- g) |/ @
void UARTInit(void)! W1 E4 N" Z. \- A3 ~
{- \: r, {/ ^/ |4 c& O2 f
        // 配置 UART2 参数
3 v/ c; a8 @5 l( V        // 波特率 115200 数据位 8 停止位 1 无校验位
* V' u& O* Z5 H# z% ^$ `2 C    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,0 I5 K5 K& @0 P5 i
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
: ^/ q% u6 k" E) [        // 使能 UART27 `+ `. K, h; f) O! q* O+ S
        UARTEnable(SOC_UART_2_REGS);
' W0 K. Q; w, G/ P& g' ]# h2 q+ R8 L5 e* |$ `
    // 使能接收 / 发送 FIFO. D9 A% J; {$ k1 T
    UARTFIFOEnable(SOC_UART_2_REGS);6 y! x% Q8 {; D# {4 L

8 J  ]! |  r/ Q5 f4 I9 [    // 设置 FIFO 级别- R( _& n: m* p9 Z
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
8 {/ V+ m& r+ |4 C3 z  H}* V# M- R7 B+ Z" u/ Z, M& o

! K" Y1 S/ a% N: s/****************************************************************************/
8 J, h8 A6 N" ?8 L/*                                                                          */
% \; i7 f; z* o3 C/*              UART 中断初始化                                             */
) V' o$ j- D# t; r" l  v. g/*                                                                          */5 }1 R2 \* ^" }3 h' b
/****************************************************************************/2 l. y7 E! A7 M7 X
void UARTInterruptInit(void)  e; r& C$ J! y' B1 S
{
; O: x4 w; p2 [% g% l        IntRegister(SYS_INT_UARTINT2, UARTIsr);
1 a2 \2 y1 K2 ?  k0 j        IntChannelSet(SYS_INT_UARTINT2, 2);) _5 l# w2 X) `
        IntSystemEnable(SYS_INT_UARTINT2);
! D( n8 [9 x" c: }  P! N5 H! h! a
( R# k  \, i  C% q  N0 D        // 使能中断2 Z( d3 f( M# L  v; p9 w
        unsigned int intFlags = 0;
2 F) B8 @  R4 P( n  u8 V    intFlags |= (UART_INT_LINE_STAT  |  \
) u0 ^* a- A* T5 W                 UART_INT_TX_EMPTY |    \5 H& X! I  v% ^; c0 A% p2 ?
                 UART_INT_RXDATA_CTI);8 o+ s$ i6 H/ l
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
- l9 ^, o3 J! y# u+ r}3 T7 j* c3 A# S( F. p3 W& F$ I

2 g! [; H% F( b/****************************************************************************/8 \: z) @. b& `. |  x  ~4 o3 w" E
/*                                                                          */# a7 {* Y9 l+ T$ J5 ?; ?
/*              UART 中断服务函数                                           */
' ]' S$ i1 ?$ x: e/ u/*                                                                          */2 z' s  S( Y5 F" A" ~2 z9 U( F
/****************************************************************************/
2 W7 ~7 U2 V; v! }1 K3 N; _! mvoid UARTIsr()
% ^; [2 N6 l% F{, U- a& v% Q/ C2 J9 J3 L
    static unsigned int length = sizeof(txArray);" C$ O7 \1 O# ]. D
    static unsigned int count = 0;
$ V7 [/ l+ m  ?9 e" A    unsigned char rxData = 0;
- N- n' p* u+ z    unsigned int int_id = 0;
9 }4 S: Y+ M( m6 I7 B" e/ Q* a: C6 B& r/ E# P0 f  @# e" `8 d; u$ M& T
    // 确定中断源  }% U- E# r9 C9 V4 ]
    int_id = UARTIntStatus(SOC_UART_2_REGS);; E7 g, G- O& C* k$ F3 [
% {% @& r" D! p+ x( K+ l
    // 清除 UART2 系统中断: a. P0 B- B1 v. v2 G
    IntSystemStatusClear(SYS_INT_UARTINT2);
0 e4 @- t) g2 X( {0 i" L
2 e3 S. X1 |0 @7 i7 b, L( O  f    // 发送中断+ M$ d5 D' f4 C3 R8 u
    if(UART_INTID_TX_EMPTY == int_id)) \3 v! [" b; [1 [7 N6 r
    {
+ Z7 x8 O2 R; m# _# b5 E3 y9 n        if(0 < length)0 c6 C: M& {* A' M& W
        {, \" v3 s! ]0 t7 `1 x
            // 写一个字节到 THR$ v. U& k, ^: k" F0 i7 t
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
9 F1 s5 Q7 y/ O            length--;
& U' j  k( a% P: n9 m9 k- @            count++;4 T) y* ]4 e, J, K, \
        }1 G2 D& ?/ v/ j, u3 |4 i6 X
        if(0 == length)) i5 C/ [3 Z1 e, {
        {9 h% J0 m" I" z3 Z# t0 Z
            // 禁用发送中断
2 Q3 i6 U4 [9 c: g  V0 `) U: N            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
! H" u) E! q+ D- N0 S4 l( c9 [0 j        }% u. O8 O" J8 ?+ t2 @
     }& R3 m" [  K0 `  {

5 S4 y8 Y& ]! t2 O9 V    // 接收中断
3 \% |- }+ F, D3 Y8 K    if(UART_INTID_RX_DATA == int_id)% e6 a9 f. t4 q$ \- q1 O
    {
, ?* {- {1 {7 ~        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);' j6 y' v+ Y. ]; o( t

% l2 c3 L' q% p% _" x" ~        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
0 P8 D0 K; x+ q    }& u& U3 D1 e8 v9 I4 ?5 r; O

! u+ L: S* o7 {8 X! E) L    // 接收错误6 L( L- A/ I7 A5 R# m. M
    if(UART_INTID_RX_LINE_STAT == int_id)' e* c/ z( n- C2 A
    {) F0 @' P# N; M- d  |
        while(UARTRxErrorGet(SOC_UART_2_REGS))$ C3 L2 W8 g( _/ s
        {
' h3 B! U7 p- R# v7 i9 ^# K3 |            // 从 RBR 读一个字节
5 J! b5 `, z% w            UARTCharGetNonBlocking(SOC_UART_2_REGS);
, U) T7 |* `8 W5 O7 o7 I/ |        }+ m! H/ Q' U) c! I' u$ e
    }8 ]7 V8 D; i, I+ y
   
/ F6 }3 a+ D- t$ C6 c    return;- h/ F6 O+ e" S# X) O% h3 V# A% w
}7 Y( J+ d" _: U  u, A

作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
& X( q* P4 {2 f) I+ }如果其它设备快速给你发送串口数据,你这边能正常通讯?
8 G1 O% F& `6 z" x/ g* @
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4