嵌入式开发者社区

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

作者: 17390601072    时间: 2019-4-30 18:00
标题: 串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
! k6 Q3 `* g' J2 [& \+ f
作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
5 G1 L6 u2 O6 i. R/ g7 C0 Y; b
' [7 L5 u2 S' P+ F#include "TL138.h"                 // 创龙 TL138 开发板相关声明
8 ?; g" k; S: \1 T/ C* u: H- b! N% I: }
#include "hw_types.h"               // 宏命令
& Z4 l+ C9 n2 |' ~, G6 J#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
! l* V. y# a4 p' X& h+ k#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器/ q: S  h3 Z5 {8 k

; k, W- b1 N% u9 u  F$ y5 c$ S#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明- [. z. K: A: ^! Q- N
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
" O/ r6 D' G0 X) B! g. }#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
) I+ Z& f, l' x- J#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
$ V9 |+ O9 x/ }& b4 J# W. f; `3 i, r% e2 \, D8 v3 Z& o* Q; c! g3 H
/****************************************************************************/
2 P9 A, Y: Y7 D1 g2 ^! d/*                                                                          */+ u0 u3 d) O4 C3 O  M$ F
/*              宏定义                                                      */
. |- B/ j, Z* B5 M5 w; g/*                                                                          */
6 _: B& R) r) V4 @/****************************************************************************/
( g. F) ~4 M, e) T// 时钟3 F+ ?: {5 D0 _( w/ L# G, b
#define SYSCLK_1_FREQ     (456000000)
7 J; _5 S* b( D; n7 ?0 F  H* a#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
& u8 T' ]5 o4 a9 ]" n% U#define UART_2_FREQ       (SYSCLK_2_FREQ). N: ?6 _# e4 S1 A9 A, d
/ E8 J) b6 ^0 w  H) K
/****************************************************************************/6 ?5 h8 ]1 B* y( L
/*                                                                          */% r) z3 `0 D3 E- u  X7 ?
/*              全局变量                                                    */
5 h# r" W2 ?/ e5 K* H( c/*                                                                          */' Z- v+ [9 C0 l% \
/****************************************************************************/; @  \  E/ e: }( ^
char txArray[] = "Tronlong UART2 Application......\n\r";
4 H, O/ T. T$ B- G  n8 B
1 ?. `/ V5 P0 p/****************************************************************************/9 ^4 w5 o' `4 T
/*                                                                          */! _4 h4 a& r8 D4 v; Y2 K
/*              函数声明                                                    */8 o& [' I, i# [' o- [' A  f0 \$ i
/*                                                                          */
; x$ Y$ k# F5 T. {/****************************************************************************/
9 s6 f# T5 q8 R) |; k// 外设使能配置3 o3 d% h8 w% Z% g  b
void PSCInit(void);* n  x9 M% `6 K6 g0 m; H( Y
  V. k8 H* Z8 ?9 ^( a
// GPIO 管脚复用配置0 A) O$ A& [5 H/ a( ^
void GPIOBankPinMuxSet();
( l$ l9 f. D0 h. e  j
! E& i- l8 z8 I// UART 初始化
; b6 f9 u9 ^+ H( q6 W/ S' t: Ovoid UARTInit(void);
- O( G) J% M% B& t# C+ D// ARM 中断初始化
0 f" F% z# u( b3 B# J- Xvoid InterruptInit(void);2 c+ ]; Q. u! L0 g# f5 A) o, Q
// UART 中断初始化+ {8 ?' L( o6 e+ m# A4 m) f
void UARTInterruptInit();
! F. \  H+ w/ d# Z3 u8 [% k4 T6 U// UART 中断服务函数
3 x+ |0 u6 T% @. V" N! dvoid UARTIsr(void);, L  ]2 f+ l3 b
7 ~# I' v9 S1 a9 [) r& \
/****************************************************************************/
5 G" s( j* x* O' j+ z; n/*                                                                          */
# `. }; v7 Z1 e6 F9 P/ g( \+ v7 U, q/*              主函数                                                      */
. Q6 g# Q' k# l8 F! n8 q/*                                                                          */! z9 @" X9 G* \9 z
/****************************************************************************/
0 M8 w1 ^0 e, G  n( kint main(void)
) {: k0 c) q# A* M& j: _- C{; y3 \2 W! w, h" ~( Y
        // 外设使能配置
/ x; _+ P3 u% w4 ]$ b% G$ W8 H        PSCInit();
: e7 v- w5 R7 j# y; u& j9 V8 e* @       
" a  X# o  I2 j% B0 u: D        // GPIO 管脚复用配置* y1 L4 {8 M% z* Z' K
        GPIOBankPinMuxSet();
/ L% X* S# i& @' s: f* V
/ }  h4 t! x. Q& r8 ~2 C        // ARM 中断初始化
$ U# I+ ~! F9 Q" J0 Y        InterruptInit();: a; m/ P2 F0 w2 L' g% R, M! P& |0 O

+ Q% Q. w4 C  Q        // UART 初始化
* }" f8 K: a& J# H1 v/ u        UARTInit();
8 r5 v( ]# U, j
  _( S/ o* F3 I* [3 m, I        // UART 中断初始化  c* W# V2 m# C" Y( j
        UARTInterruptInit();
: _6 c' e+ B+ H8 A
. ^0 e* {/ f+ e! }9 Y        // 主循环$ [5 n' y+ O0 X8 W
        for(;;)3 K% ]5 u# E$ Z' ?0 [% a
        {
- k0 f4 F1 Z% Y. {, V. e3 w# e! U4 @
        }7 w8 q' ]9 T3 [+ k8 A- q) ?
}
/ O! u. i! K  o$ B9 [0 S: B  p
( ^9 P: j* r8 [% [; v8 S+ J/****************************************************************************/9 i4 i( F6 a% X( ?% D/ S3 F2 b
/*                                                                          */
7 U. }7 Q8 E% M& n8 N+ y/*              PSC 初始化                                                  */  i7 }" x" d$ `+ N+ ?) T
/*                                                                          */9 ~9 v  ?' K5 x1 D
/****************************************************************************/% e+ Z1 q, y5 A! U4 x
void PSCInit(void)
8 v; V; _2 w7 V" b) L( ~: B4 \{
' N! f: s; s% W, J        // 对相应外设模块的使能也可以在 BootLoader 中完成& T5 _8 S. ^+ K4 U4 f
    // 使能 UART2 模块$ h9 h8 E' _& _. K7 W
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);4 m2 }8 n. H0 p8 ^4 o0 R  T
}* T' o: Q' W2 A: V
7 n  e' H) }4 J' D: o6 V8 ^& R; u
/****************************************************************************/
5 K) R" s* R$ A1 y- K- f1 M/*                                                                          */
1 ]- \* _1 |. B( G+ l2 w/*              GPIO 管脚复用配置                                           */
7 V! [9 i1 R0 Q/*                                                                          */
+ f4 i$ E/ C1 K/****************************************************************************/8 S0 x; a5 n1 ?$ z5 J
void GPIOBankPinMuxSet(void)
+ @+ ?, i. [( F+ T% M$ o3 B$ H! ?( Z{
7 z! {; b2 C( e) j/ k1 V2 T1 G& v# z# \        // UART2 禁用流控
! p2 d5 @1 u, ^        UARTPinMuxSetup(2, FALSE);
( j9 U  H" ~. y9 Q) K& t( \! Z7 Q: g& p}
8 Q- B4 |& a7 A. r( Y  r% z) K  s2 o6 j- P/ v" L# r
/****************************************************************************/' z. Y# F2 w: }9 ]  g$ v5 J0 A
/*                                                                          */& n5 t; O: a3 }9 O4 I7 \* z0 o5 p
/*              ARM 中断初始化                                              */1 I, Q  f( H$ ?2 S4 @
/*                                                                          */5 @$ c  F$ @# g! P* V
/****************************************************************************/' g# h! }) u, f/ k: h
void InterruptInit(void)
  g8 _0 C0 V9 ~& o{
9 y! G/ Y& i6 \2 P    // 初始化 ARM 中断控制器
- ?8 w' Z- h$ s) x. ~' n+ M+ `# d    IntAINTCInit();
$ D0 a( U$ }3 p( B6 X4 p
2 Q, Q8 a% }3 w% q2 \    // 使能 IRQ(CPSR)
/ O) G" I% ~/ R& l$ R( g' J, @    IntMasterIRQEnable();% A* O+ W9 c& a, R% N7 Y! r
7 _$ N& ]: G5 F8 H& Z- R# l
    // 使能中断(AINTC GER)
$ h6 d- N! r4 M+ ~6 {    IntGlobalEnable();
, v  }  v: N1 A" y( x* F6 _+ r
& y, G) c4 ~( b9 O3 W* H$ k    // 使能中断(AINTC HIER)
7 g- N+ C+ K, c( g6 `    IntIRQEnable();& r& D/ g' Y. c7 t- r0 F
}
7 }( @1 u  V( z& B9 ?
; m. N8 s$ v+ C; t) V! [' z/****************************************************************************/
  i* A+ |% ~; X* w% T% t* }/*                                                                          */$ M% [5 o2 C% F4 d' B
/*              UART 初始化                                                 *// Z& b% p; T( `7 D& p
/*                                                                          */
0 p0 l+ b# ]7 G( A- E/****************************************************************************/
( T" z+ H: p% q6 Dvoid UARTInit(void)
4 m7 h0 j, R2 ]3 G' o0 [{* }  C, l3 x3 l8 l
        // 配置 UART2 参数+ l$ @+ S- Y1 U$ @, o2 c
        // 波特率 115200 数据位 8 停止位 1 无校验位
. A0 P6 ~: S, O8 c$ W' H5 I3 P    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
4 M- g: _! F& W8 s% f                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);9 N4 N% m, d0 c' B
        // 使能 UART2
3 P0 B$ A5 h- R& i: R. ?# \$ l        UARTEnable(SOC_UART_2_REGS);" A, M+ M% R5 Y* O/ y
* ^" _: h) G, c+ h# A2 q/ K
    // 使能接收 / 发送 FIFO3 V) k3 F5 f! n! ~; |6 ~
    UARTFIFOEnable(SOC_UART_2_REGS);
8 W4 x  `) _$ r' {) N% m, U: m
0 G5 n* O1 ?2 W4 y6 J3 A2 p4 J    // 设置 FIFO 级别
3 z2 a! y0 p5 {: }8 F    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
, v0 ~% ^4 X3 Q+ }1 X* |}
/ N$ w. M- \1 |' n) Q! w2 D' S
) t7 P8 r# y* H$ J6 i# U/****************************************************************************/
$ f. J! N  n, G% u/*                                                                          */
/ O. p% Z; ^7 C5 Y' e7 c$ F/*              UART 中断初始化                                             */
4 _; [% |4 s) T! x3 D' ?  T/*                                                                          */, D, x: `' t2 j
/****************************************************************************/
( S$ c* z7 T; A4 C+ @' R, @: uvoid UARTInterruptInit(void)" w5 l( Y  x% A. _: z/ H& U) W
{5 T+ _' Y/ w( h1 b7 D1 `2 W5 |
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
+ u% C: B1 H7 Y+ p        IntChannelSet(SYS_INT_UARTINT2, 2);
. V# O* j& x/ a, q/ N; p- R8 s        IntSystemEnable(SYS_INT_UARTINT2);2 o/ m, t& A& {3 p6 g2 _

, N/ q$ }/ n% |7 X        // 使能中断
9 k3 \2 {" g( h  d4 o        unsigned int intFlags = 0;: |  S5 ^5 {! b! v) a
    intFlags |= (UART_INT_LINE_STAT  |  \
1 h4 B, T  r" |7 E5 i                 UART_INT_TX_EMPTY |    \
: }' ~: b8 b. E                 UART_INT_RXDATA_CTI);
) G" V6 A7 k6 [1 S9 L2 f  F( D; E7 O    UARTIntEnable(SOC_UART_2_REGS, intFlags);
2 ~' J  M7 P# Y( I7 G! Q1 \}
) l# z: J' k/ z2 B' w1 q& G) h" k( V) M
/****************************************************************************/0 G9 k. i( l' p( B5 u) s
/*                                                                          */
7 y- _+ v* B' E1 c) ^/*              UART 中断服务函数                                           */
  H7 {7 o5 `! e! l% y: w; l3 H/*                                                                          */
6 H- B' {+ e! ?% c8 H/****************************************************************************/9 Z! T0 F; |( e: O
void UARTIsr()
# P8 m5 @8 i( p{& u- d# m! l: s$ s2 L8 B* d
    static unsigned int length = sizeof(txArray);
: N. R2 I% J; ~  h9 _2 P3 p    static unsigned int count = 0;
* P! f( ~: E. U) v& D: V    unsigned char rxData = 0;
; w  m7 H3 e  P- W! q4 l; H    unsigned int int_id = 0;
& r2 g0 B# N$ p9 x& a" ]! L1 L" {0 U. j
    // 确定中断源
6 o9 b' \/ W% E0 S    int_id = UARTIntStatus(SOC_UART_2_REGS);0 w' p0 F' q* S( k* A

- B. g5 J( i7 @# d5 I8 C    // 清除 UART2 系统中断
. p6 R. g$ b& P, E    IntSystemStatusClear(SYS_INT_UARTINT2);$ I- C/ n' m! \4 M' K
! @1 d& l- _5 Y/ k$ Y2 z: }
    // 发送中断
+ o5 c6 ~7 ~, J$ N3 l    if(UART_INTID_TX_EMPTY == int_id)
+ q2 J2 ]4 v3 @2 V4 Y    {
8 r6 r! e* r1 a% y( m        if(0 < length)
" p8 S, ?+ Q& W$ D: @3 e$ K7 F        {
7 _: I2 e; K+ L            // 写一个字节到 THR
/ @& r; Z, n6 Q3 U) i3 [            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
( s1 M# v/ f0 Q: ]            length--;; |! A8 x0 W4 Z! A( q7 w
            count++;* @2 U% m8 i7 x; l: e
        }
, _+ R6 {: d9 m' d; S' f        if(0 == length)
, X/ j1 q. M! a7 _3 x        {
1 L& ]% J0 l* L' o3 K            // 禁用发送中断
$ x) p/ f+ t! n3 |            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);" y5 q7 P. d! S- X
        }8 |' ]' u5 M3 m5 t9 T
     }
- @4 u3 N$ l1 t  ]7 c9 n6 l3 U6 X5 V; S5 K. A5 [1 x
    // 接收中断; u% ~" ^2 t7 s* o
    if(UART_INTID_RX_DATA == int_id)
: d3 a) _( S( ?4 w5 y0 f    {5 e, x' F  i2 M* V8 x
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);+ L( G$ T" K" [8 Z2 G2 q
+ M1 o7 X$ d  b, k
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);. m9 a1 H$ X) V9 \8 j
    }
; |# N' h% K/ D& F
, F: i/ h5 B- X6 t( m% ~' f& f- l    // 接收错误2 C" M0 j% G2 p7 w5 U
    if(UART_INTID_RX_LINE_STAT == int_id)7 S, H, l( X, b( m6 M( y; w
    {
% j- y0 q8 Q  R' x4 F, }        while(UARTRxErrorGet(SOC_UART_2_REGS))
, u5 C7 q2 F4 x        {
9 @0 B' b6 W1 A8 a$ Y4 d+ W            // 从 RBR 读一个字节
' }- s" d: K) @% M5 }- J! n; k9 s3 ^            UARTCharGetNonBlocking(SOC_UART_2_REGS);
4 M3 K2 F* z9 w& E        }
) y$ N1 }2 z1 [" Q    }
, V3 V7 y# N* @# `# ^  ?) H    * W) v; v" L, M1 }
    return;
0 A6 w9 |! _/ @+ {* E}0 G' W% z5 w( G& c+ ^( F

作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
6 v+ p# Q, Q4 |如果其它设备快速给你发送串口数据,你这边能正常通讯?
$ x: ]: o: c0 v: j/ u
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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