嵌入式开发者社区

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

作者: 17390601072    时间: 2019-4-30 18:00
标题: 串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
1 T1 s* d4 ]' t7 A/ g2 U
作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
- ~1 l6 V7 @1 S* u( n7 G
$ N3 r; m- B) h1 i0 {#include "TL138.h"                 // 创龙 TL138 开发板相关声明9 f0 Z  X: N+ Q, q  w
/ F' I, Y* p- ?2 H& _# [
#include "hw_types.h"               // 宏命令) C3 @2 v8 v, K4 o* s0 B
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器6 j2 ]" m0 M+ U2 I. b. v  {" f/ W) y0 v
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器- O7 x- [+ i4 S8 b5 c
2 g* M( _' A% r8 v: S/ P
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明: |* L; Y, A/ {' G0 `
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
3 D5 @5 A" s' Z' D! z8 R4 E#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明! ?. j# D" b, `1 o; }) O. j; s
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义8 b9 [, o+ U7 s8 y% I% p

0 _/ f% D7 Q( x( j3 r/****************************************************************************/
5 o( O! s4 G! W2 ^9 ?/*                                                                          */. u) S1 O) @6 k
/*              宏定义                                                      */
( E7 @  L9 r# n4 P/ t8 r- Y$ ?/*                                                                          */
5 j+ U4 M$ t3 ]; D' W" I" n/****************************************************************************/' K/ \4 f' r0 {$ H5 b/ _$ {$ ^
// 时钟2 Q& t# R0 d$ O" _+ r2 ?/ c3 I  Z
#define SYSCLK_1_FREQ     (456000000); t; j5 J) S! P/ Y- Y- Q8 G
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
1 L: A1 o* h- K! R' ]" x6 K#define UART_2_FREQ       (SYSCLK_2_FREQ)2 x- W4 D; T) r
7 S# b* U$ _: K9 Z/ h4 _
/****************************************************************************/& _# g: }$ o" ?6 u" o
/*                                                                          */6 X& v) |; }: w( X# z, N
/*              全局变量                                                    */6 Q( V) G# |; c7 S
/*                                                                          */
+ `6 i# H. R8 b! j/****************************************************************************/- |; ^0 }7 j$ s) M3 \
char txArray[] = "Tronlong UART2 Application......\n\r";* ]/ Y: Q+ k  g) i6 A

8 o! @6 Z: c# a, \1 z2 d/****************************************************************************/; O9 e- p2 S& l# m4 @- N2 K5 j
/*                                                                          */, d+ A, h: J: _2 H# w/ O$ w# g7 z
/*              函数声明                                                    */
" s: d7 B$ X6 f* @: i# S/*                                                                          */
2 E. C9 X; ^8 Y/****************************************************************************/+ e+ ~( d" d2 f1 l5 e% Y: J; W0 W
// 外设使能配置
- g* f' m7 E3 Q& fvoid PSCInit(void);
8 o- N# h. j0 m% q) D' z# s2 r
2 m. q5 \7 I5 [% |  D// GPIO 管脚复用配置
2 d' j; V" }  ^3 ]void GPIOBankPinMuxSet();" t0 h5 Z+ \5 q% }3 S
* U% C1 n- Z" X7 n$ ^5 u
// UART 初始化, S6 `: k% J6 l" D  T
void UARTInit(void);. z- K9 [* o! r7 S& K$ ^0 B. w  l
// ARM 中断初始化* A3 N' m; J# g
void InterruptInit(void);& e. {" u  I5 M6 q$ I& f
// UART 中断初始化+ |; w: R, ]! }' X
void UARTInterruptInit();
$ }4 G, S' `# E! `# W// UART 中断服务函数
) g- E- P) a3 U; Z$ w& B* n3 V0 R! Kvoid UARTIsr(void);
. M3 f$ y3 k; O2 Z
" J1 f0 ^4 U& x4 T( D# j9 x% p5 X/****************************************************************************/
( y' P7 Q1 V3 S! j/*                                                                          */
; {, P* s: |) P/*              主函数                                                      */
) e5 d7 G1 ^) Y5 C: Q3 ^/*                                                                          */% O) W2 `4 H. L; O
/****************************************************************************/4 F* X: F3 n- b$ M% Y! u) b3 @
int main(void)( u2 I; Q+ n$ z
{( s, i, q. |0 b! W: ^; k
        // 外设使能配置; e# H8 n" J7 L" I) C
        PSCInit();3 v5 n8 H1 Z9 _( f( N/ U" ?
        8 @$ N7 j. h2 B* \& h4 x! R
        // GPIO 管脚复用配置
- m5 |5 r+ g5 b2 P# K2 \/ H4 V        GPIOBankPinMuxSet();
3 N3 t- ~: v6 M6 A8 P3 H" P3 N# p! v# g6 k5 b' h/ M
        // ARM 中断初始化) A& n. T2 g' G9 h5 t& H
        InterruptInit();
8 ]" t5 d7 H% N0 Y  P. ~& y; s8 A6 g0 y/ s
        // UART 初始化
/ m$ W. G: Q! b. a        UARTInit();. P# @: H: x+ t" l6 ^' ~& f. M( s0 l

! v/ \8 r- n8 J" S        // UART 中断初始化! I/ O; e; |  d6 _# ?* R  m
        UARTInterruptInit();
) k4 y2 d" a" q& c  d0 U. U' b$ R2 b& g  K* l
        // 主循环
  x8 `2 e; n. ^$ K; Q7 O        for(;;)
& j4 v7 f. t% r        {
4 f! M) ], X0 g0 J1 u
0 n# O- G1 F% T) R        }
' }1 f2 g) k% ?9 [" L}
* i; }. I4 s& P  H  \- n
, b. b0 J7 L: I+ j& g2 v1 p/****************************************************************************/) T1 Q- m7 O0 C8 g3 m5 G
/*                                                                          */
/ Z  r' r5 @: l8 l: m0 O( H/*              PSC 初始化                                                  */
" v! D* V% J( P( B9 P& g/*                                                                          */
/ k, P% `" T# o% I$ `# h1 R/****************************************************************************/, v- v9 |4 U/ ]5 B& u1 v
void PSCInit(void)' F) T* F9 B7 I
{" F! |2 z# P8 O! E* O- \
        // 对相应外设模块的使能也可以在 BootLoader 中完成) j2 U; v$ a; M: s) s: _
    // 使能 UART2 模块
, A6 u3 i4 w5 e# l+ p/ ~6 C    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
& F- K6 F. ~  A! R  g}- U2 d. N! F! H; x5 ~- I8 L

. l+ a% V1 X4 [) m/****************************************************************************/% @& }* }$ }" Q/ z( F) v) H! d9 ?5 a
/*                                                                          */% L9 G7 d8 y% C% O
/*              GPIO 管脚复用配置                                           */
$ k, F: N3 L4 ?% v# `8 H/*                                                                          */
9 z+ Q4 x6 G- ]! x# O; S$ i/****************************************************************************/
$ {4 B' L) `: G2 D+ V! ^void GPIOBankPinMuxSet(void)
: @6 N: p- Z( B0 t' O! V{
5 V  G, Q; q2 A% |, M        // UART2 禁用流控
( a/ T3 V3 \- f3 A        UARTPinMuxSetup(2, FALSE);
. A1 k) U. m8 _2 |8 o1 t# l' ~$ ?. i}! n6 {5 M/ a2 `6 |$ ?) v5 i0 a2 h
6 R; r+ X/ t% D! C! H* ]2 a2 z& m
/****************************************************************************/+ T0 _; r% O0 s6 m4 g$ F# w% q
/*                                                                          */
& U+ t, ?. c8 v9 R* ?1 A& n/*              ARM 中断初始化                                              */, m" F3 i6 v. Q* _8 u% g5 s
/*                                                                          */! B2 A7 j, {' h' M0 l
/****************************************************************************/
' `: Z& B. ]0 }" A+ T4 Hvoid InterruptInit(void)
6 F& W1 V. C& x) W0 `" ?7 ?( r* R{/ U) |* N( D! _8 J( v$ q5 `5 e
    // 初始化 ARM 中断控制器
# h; W! e! F3 @$ ^" B    IntAINTCInit();
& ?4 F' L6 p/ a7 _1 t" q2 n1 R6 q" }1 w
    // 使能 IRQ(CPSR)9 m4 B- v2 p. ~: n: n0 p
    IntMasterIRQEnable();
& h6 I& i+ X4 l/ U( T$ h6 ?9 `
, r3 k; I5 n  h8 T$ d5 P' V& ?# N    // 使能中断(AINTC GER)
) C6 f- T. h5 i- O- H5 R& O3 p0 r    IntGlobalEnable();
" t1 \/ O+ a1 H; x! G2 s; `1 l" u- o3 y
    // 使能中断(AINTC HIER)  v! ]) }! ~9 |4 d" P! Z
    IntIRQEnable();$ {* f/ u- {, J: g
}
$ q7 I" m5 R' G7 P' q* u1 J6 d0 t9 w4 C$ ~
/****************************************************************************/  t; l% T1 b7 Y: M7 m
/*                                                                          */
* u. x. W. r* [% ^. B, Y/*              UART 初始化                                                 */* P& u: P$ q$ A  R, k' h
/*                                                                          */" e* ~8 g6 K3 d% u% P
/****************************************************************************/
3 P* Z1 `) J+ [# x5 U3 H5 nvoid UARTInit(void)
1 U' K  X1 m! a, `4 o( \{
: r8 L/ ~* i; {8 c; A) \0 h        // 配置 UART2 参数" q7 t/ M: I* e6 y. m
        // 波特率 115200 数据位 8 停止位 1 无校验位5 n$ g( L7 a2 P4 x% ^2 m4 m  K
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
; x4 q+ O; b& U( `2 |                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);2 D- a# M4 M4 A
        // 使能 UART2( m9 q! K0 S$ Y# d
        UARTEnable(SOC_UART_2_REGS);
# @" U0 }2 E; M. C& E3 f5 T1 p7 j& Z/ i$ L# E4 `6 B8 u
    // 使能接收 / 发送 FIFO
" M/ V2 U4 T( L3 [" S+ M. ?    UARTFIFOEnable(SOC_UART_2_REGS);& P  a! R! z* I" _- Y1 k4 T6 E# N# h& r( V
7 p* \! c! w# g8 @) R$ M
    // 设置 FIFO 级别
2 F9 u: c* S* k" f1 n    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);5 \8 U+ f7 r+ R9 _8 w
}( l& S) T; ~: b7 Z5 k8 k9 W( J
, Q: L, q! P& |5 {
/****************************************************************************/5 s+ m% |5 [: Z9 f9 e
/*                                                                          */
: b0 N3 a  m7 y5 p# Y) H$ R2 g7 Z/*              UART 中断初始化                                             */  R- b& t5 R- R
/*                                                                          */
5 F8 S. a. k0 b/****************************************************************************/
% ^, H5 G, p% ~$ d0 e  m: rvoid UARTInterruptInit(void)0 q& Y/ p8 z7 D
{. w! G% R+ ~$ k: ^7 G8 u
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
6 c8 n, U! ?6 D2 x0 M        IntChannelSet(SYS_INT_UARTINT2, 2);
- V9 \: F. R0 k8 y        IntSystemEnable(SYS_INT_UARTINT2);9 s. g2 B3 D* W2 A' h

4 }4 z3 K) Z3 k$ c        // 使能中断
5 B# R/ ^4 v5 s% c1 @3 F        unsigned int intFlags = 0;* f0 N* \* }; C1 J' i
    intFlags |= (UART_INT_LINE_STAT  |  \& P% W1 O1 X. U) w( \& ]% ~/ _2 C5 K
                 UART_INT_TX_EMPTY |    \
3 [, i4 S. q/ V& @) d                 UART_INT_RXDATA_CTI);( H' a: Q' a% [5 [+ }4 M3 W4 w& A
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
7 Z. k( `- e* w2 p* @/ i}0 V8 Y& e1 X. v3 @9 Z: T* @4 ^

  O' ~9 E0 x' |# Z; ^/ X/****************************************************************************/- |8 U* _3 o8 M, c
/*                                                                          */# B8 H# Q7 U" t& G9 E
/*              UART 中断服务函数                                           */
, O. ?; l" r9 o# o/*                                                                          */
; d: ^8 h) L& F3 X  l/****************************************************************************/
  d. ?  r! u+ k. g2 Z3 h. r7 cvoid UARTIsr()* x$ S7 g# s4 k9 p' T3 y
{, I8 i& Y4 _# y' K
    static unsigned int length = sizeof(txArray);0 {# Z- X, O5 p6 Y( y
    static unsigned int count = 0;
7 }$ H) ~3 A" u  o& a    unsigned char rxData = 0;
! V( D) s" @- x1 u' |' H    unsigned int int_id = 0;
3 w& w% ^' R1 k! v9 k8 g
; K' [- y9 Y$ o' s    // 确定中断源
, S0 ~0 b+ ^& Y7 G, }    int_id = UARTIntStatus(SOC_UART_2_REGS);
! l, d% t2 g' T: J$ V/ @+ B& r- c$ C8 I" Z) A2 ?$ e" E) `: T
    // 清除 UART2 系统中断' P" f2 e" a$ w$ P7 z% o0 |! Y# _
    IntSystemStatusClear(SYS_INT_UARTINT2);
- D, {# h$ {& S( w3 Y7 f$ C7 @6 `) P1 t+ {9 d: M6 \: q
    // 发送中断
9 M" s+ @. @/ A/ x: B9 B    if(UART_INTID_TX_EMPTY == int_id)
+ P" e4 l* I, s+ t- |    {
( `/ i3 s4 O, u* q6 N3 f9 D        if(0 < length)& g( {. y  }6 _0 y+ s: [; R( v
        {# }& a2 R+ u/ V; \0 M
            // 写一个字节到 THR
( L3 r, P0 S9 Y5 x5 D3 U5 f            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
$ |  T1 H2 u1 e2 y, P6 w            length--;; i$ A8 S4 B) _5 b% ?9 @
            count++;% @& R) U9 C7 R, k  U! F
        }
9 a" K: @" p: F+ b/ f        if(0 == length)
9 J# r, M, q* u/ A: a2 n        {
3 p3 y. s; E* c6 f            // 禁用发送中断
, p! ]9 U9 W" c! _# q1 G6 P            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
2 m3 y. g2 K1 D1 F# F        }4 y1 t! F! f& B& `
     }  B# A( _' ^; Z

8 }: n8 m/ m, r6 j5 |* N3 k' c& Y2 J$ N    // 接收中断% N8 A0 U1 X6 H( {* X0 X" u
    if(UART_INTID_RX_DATA == int_id)
2 H8 A- C' T* r$ \! M6 H0 ^, B    {+ C& d+ ~7 K  J4 r3 I) R- Y
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);6 \3 n6 {  ]: j" H. {
1 T1 T- [# |* H& U1 N" z# C1 A% Q
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);" ^: q' m  N/ A) g* C
    }
) S- o6 T  z9 v1 P5 q9 N$ Y
7 {3 G# {, }" d    // 接收错误) E6 ?( l" y$ F  f4 W
    if(UART_INTID_RX_LINE_STAT == int_id)
: h" K& v" D7 B6 P) u    {; G3 s4 L  C' B  g4 L
        while(UARTRxErrorGet(SOC_UART_2_REGS))+ e$ Y; ^5 s2 _. d% [
        {
4 t9 z5 ~3 A! H# A& n  _6 A# _: s! S            // 从 RBR 读一个字节$ W" U: J4 N6 t( g
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
% M, F8 U; K  [( {        }; K% g, A; v0 ^; T0 S4 f
    }
2 O/ J3 U0 S3 a  P$ r   
. n& t  o; ?: @+ [# M" t5 A3 Q    return;0 j" F2 e' l" W6 E4 K% U
}
) `) D8 Z# r2 J9 f, l
作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25. h# g! u. ~1 R, Z4 h, u3 L1 i
如果其它设备快速给你发送串口数据,你这边能正常通讯?

8 }) y5 |% D, D# E1 d: L/ _& {谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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