嵌入式开发者社区

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

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

作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。; y& f: N. i$ k! Z8 Z2 }( P

5 \' I9 z# M) s* F2 e# J0 B#include "TL138.h"                 // 创龙 TL138 开发板相关声明
/ L+ w" s% M6 [/ s
+ E: X1 S0 N( U+ G#include "hw_types.h"               // 宏命令: ^1 V3 X. }" X  M" f" J: M6 K
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器2 \$ L2 D( d  S/ C" ~% K! |5 N
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器6 k; ?6 q5 Z9 i7 }. b  Z2 ]- s
8 c8 ~( f9 ^- n5 M- G
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
$ u# u% a5 d$ S0 R( F#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
. }' d2 ]1 ^$ a#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明3 |- ~& [- |& K8 G; \
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义9 o4 _7 d( q+ V" n6 n

" n. s( M4 m8 v/ B- _, V/****************************************************************************/
' Z* S- ?9 l: z5 L- ^/*                                                                          */
2 k1 \9 c7 `7 A3 K7 ?& _/ x/*              宏定义                                                      */# t  q: n0 b# J: f! |
/*                                                                          */
7 T+ {; |) I- L" X$ H/****************************************************************************/. S4 g7 L- I* V) ]9 v
// 时钟
2 d/ e$ B! O3 Y2 _5 N#define SYSCLK_1_FREQ     (456000000)% n4 k# J5 \. [3 T3 ?& z
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
; G# ]8 e0 R! _& E) E, z" w- M, m#define UART_2_FREQ       (SYSCLK_2_FREQ)
$ h8 K0 M, y" _7 k: t" j! j! r5 ]2 l4 Y8 F
/****************************************************************************/
( x/ O, T  r! o: O7 ~/*                                                                          */8 a  G9 \! [+ u; S% C0 d- @
/*              全局变量                                                    */  R0 b- j( O2 ?  E
/*                                                                          */
8 m! H. c2 }9 y! @/****************************************************************************/9 V' x- m! `! K& K2 x" q# d1 g
char txArray[] = "Tronlong UART2 Application......\n\r";
* W/ b7 d! f  u( \$ `/ e0 k2 t+ B
! X' e1 J' X& i1 p1 a" Z% t9 V/****************************************************************************/! {4 }- k6 C2 @4 L, }: ~: a
/*                                                                          */
' e" c! \8 b/ g* z2 ?+ J/*              函数声明                                                    */
2 r& y6 {$ H' @& c; g/*                                                                          */
7 T2 m  W& i8 N) U/****************************************************************************/
1 f% B3 @# s+ k/ m1 D// 外设使能配置4 Q0 l& {" B6 [7 g5 F3 i$ {
void PSCInit(void);5 Y8 x0 K8 B( P) k8 J# W

) e7 j( d/ Z: D, M// GPIO 管脚复用配置  ^% K3 {7 I  u5 U  g; i
void GPIOBankPinMuxSet();/ x( t$ ]$ \. b
2 n( n# l) l! r0 o$ x: W# ?! ?
// UART 初始化
& d- Y1 e$ F0 }: K/ s& e2 z3 hvoid UARTInit(void);- F1 H" S# O; y" m1 R
// ARM 中断初始化
6 K! X7 p  n& {void InterruptInit(void);' S9 }# U  K) {- j
// UART 中断初始化
7 X# U0 G6 J5 x: p+ Bvoid UARTInterruptInit();! ?) X4 n& Y& Z0 T3 z; a, d
// UART 中断服务函数
; K& e' [. r" L3 u+ |void UARTIsr(void);
6 W* A4 z4 P( m& Y6 m+ o( Y: H
0 L. t3 G% }( A- h% c! h/****************************************************************************/' A9 C% @. `, e0 g# Z2 b5 I
/*                                                                          */
8 O/ ~) b, e1 w2 y: ^" |/*              主函数                                                      */, x6 L$ Z) j2 {+ l5 R' }0 s' M
/*                                                                          */
" R# b7 i0 b9 ?! M% ]/****************************************************************************/
- a: J( y$ t! S! C8 C/ B' f' Pint main(void)  l/ h) q( R% M+ Z9 j! e
{& j1 i: q- I5 |3 S, f: @/ L
        // 外设使能配置; u% w* Q. \4 U* u8 p4 g  D& ~
        PSCInit();
$ }* ^' L# {' Y# p2 o! Y        " \/ E$ T1 c8 e1 {% C: J
        // GPIO 管脚复用配置
6 ~6 O0 R+ h' }        GPIOBankPinMuxSet();' B4 X5 H. z1 U: C1 g
, q/ z6 N# T& C3 \$ S4 _
        // ARM 中断初始化
  W% e7 L4 M7 o& H' x: L' p+ T        InterruptInit();- D. i. c- m' G( ]7 N6 C; \

: l: w$ @) R/ [* j        // UART 初始化
3 O/ s( |" D" ?3 T        UARTInit();  o7 O+ i6 n) O: {& E

: N; W1 d6 a( j0 O" E* @        // UART 中断初始化, ?% g7 L% i4 _& H  U, r
        UARTInterruptInit();1 g8 N$ I* j  z5 ?+ \2 L! u8 o
' |9 I) u* S; }( I1 i( I
        // 主循环% h  t, W8 F4 _! q% X% G! G0 |
        for(;;)
# n) x+ }: X5 _! {! |6 E        {# H# }: A& n" s2 C( Q+ _+ ^
" E1 h5 f) o9 M  R1 J
        }
' R+ @7 }: I3 I3 g' m) m+ b. b1 @}- h7 i" b, y. A

, H% S. S/ O. k$ k5 f/****************************************************************************/' C6 g6 |7 R$ ]" H
/*                                                                          */' M" N: f0 G5 V  J
/*              PSC 初始化                                                  */- T& K' [+ r  o4 Y- D
/*                                                                          */3 G5 a6 u" X& h5 {
/****************************************************************************/
' S& i! ~) f# \3 J" H. k. uvoid PSCInit(void)
" u/ J5 m2 a$ v' o( v{
! S) f! m  \- U3 ^7 Q, j8 F        // 对相应外设模块的使能也可以在 BootLoader 中完成. I5 X& O8 d, `# v% s6 U( A
    // 使能 UART2 模块# l% y' n' \4 e! d- @
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);2 D% A. z) _; P3 \0 H8 `
}/ W" B/ _1 z9 b0 G( V0 P9 U
' E, j  T$ Q5 f/ P1 }
/****************************************************************************/  n8 ]! ]3 d/ w/ p0 K, Y
/*                                                                          */
* K7 d% L+ V, ]' f! J0 \/*              GPIO 管脚复用配置                                           */6 P( B1 m0 H6 l5 Q3 D( u! x0 p6 n7 A
/*                                                                          */
& q* i3 a& S$ t6 X/****************************************************************************/5 m" c, F8 a+ A/ n$ V; }! J* |8 N. ]
void GPIOBankPinMuxSet(void)+ H) g. _  B# m& U
{- Q$ G- x4 ?* z2 o
        // UART2 禁用流控
6 N6 [% _. y' \1 {, Q7 k        UARTPinMuxSetup(2, FALSE);% z/ l3 t( z' o. {' Z
}3 P& Z8 w, c3 m& `* r9 L% G

3 K9 z+ ^$ ?" S5 b: y5 }  a+ M1 j/****************************************************************************/4 ?$ d# m& Q* z/ G9 m
/*                                                                          */1 H4 R1 h1 Q( [. Q0 f/ ~
/*              ARM 中断初始化                                              */
. W2 D% N; ~+ e: D/*                                                                          *// p/ S3 K- Q& l8 j( Y3 _0 o' ]4 w
/****************************************************************************/3 F3 z5 X: Q, C- M- i8 ^- b$ F# M
void InterruptInit(void)
7 \- b0 a4 p$ L. Q! G{3 j: H& n2 Y! B1 D$ {  p
    // 初始化 ARM 中断控制器8 j4 J9 y% k$ B7 z* g
    IntAINTCInit();  {' v/ b- H3 Y3 N6 n$ @  n
% Y$ u' `3 c  Z! `# }" g
    // 使能 IRQ(CPSR)
  H' o# j" k! ]9 n, U0 X5 O    IntMasterIRQEnable();2 k9 K) r& w+ f. H

6 G0 }6 M7 _* q. N    // 使能中断(AINTC GER)
1 L, R* R* T/ O8 J/ J    IntGlobalEnable();' Z% r5 S  ]+ ~' ]) r
" P4 R- V8 j  b
    // 使能中断(AINTC HIER)
* c* I. W! k8 U# F    IntIRQEnable();1 D9 {, P5 ?: ?  B: P0 R
}  W" f5 l' t$ ]; ^* t
' A% z2 J0 J: ?0 v
/****************************************************************************/
- U0 ^; c- @0 v3 M3 E) h/*                                                                          */
# z5 v) ?  g/ }: L/*              UART 初始化                                                 */7 [. Q: U: D) F; ~) {8 S2 r
/*                                                                          */: a6 X# y  h1 e" c- b$ s( V
/****************************************************************************/
3 Q% k- L' I- V' X6 zvoid UARTInit(void): h* ]- ~. }! O+ Z7 x4 W5 F+ k
{
1 P- t0 H7 e# G- d        // 配置 UART2 参数
0 X4 I* b- i- ^: R* y! j        // 波特率 115200 数据位 8 停止位 1 无校验位% y/ X% m2 W& l$ f% O
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
  K& o, `8 {) {9 V                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);3 s0 P! K. T7 m; j) H
        // 使能 UART2
" Y2 g& [. J5 w        UARTEnable(SOC_UART_2_REGS);8 \: Y# g8 \. ]+ m

: b) P* U4 Q2 ?+ m    // 使能接收 / 发送 FIFO
& n# C% p3 ]; H5 ^/ h0 U    UARTFIFOEnable(SOC_UART_2_REGS);
/ F( o7 {' D' `! s: o6 ?: A7 h6 \. B( D
    // 设置 FIFO 级别
/ F) I8 {* D8 |- X& {0 R    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
: f3 [1 t9 K5 ]. k1 Z. l}
! Y+ I* U% r7 [# T) n. D, u; k0 e- D+ S6 r9 ^( w; M5 B1 N
/****************************************************************************/6 Q8 h+ }/ v# J' p
/*                                                                          */4 b% v! ^( D* f& N
/*              UART 中断初始化                                             */
" F2 O" [! S& r5 G1 R2 V/*                                                                          */
/ x( P6 S7 b; h, ^, q. l/****************************************************************************/! t) [3 o' f0 e; Q+ H. R9 l4 d0 x
void UARTInterruptInit(void)
% l7 z/ O5 P  `) i" Q{
* j' R7 ]$ @' B2 C% ^- `        IntRegister(SYS_INT_UARTINT2, UARTIsr);& B4 ?+ y; U( Q' w
        IntChannelSet(SYS_INT_UARTINT2, 2);
* x4 A) F6 R- j/ k        IntSystemEnable(SYS_INT_UARTINT2);6 u# [& n5 I' b& B% K( o* x

: i7 M$ b2 c. t, J# B9 s        // 使能中断  T' ^3 I. w/ c) i/ }+ A: e. d2 w) [
        unsigned int intFlags = 0;; |+ y# ^' t  b5 V) c0 n
    intFlags |= (UART_INT_LINE_STAT  |  \
, j! X6 y1 b& Z$ ?+ C& n6 Z. x                 UART_INT_TX_EMPTY |    \9 p. @) c2 O) E7 a  I7 C/ l$ B
                 UART_INT_RXDATA_CTI);& q  i7 [/ O! q0 H: p. U3 |
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
+ S7 |3 o( g7 C6 {: m}
. I6 E" i: _, I1 H4 f, @! X+ t4 _5 w# ]+ e) Z! P
/****************************************************************************/
# n( P2 o/ K7 `  g9 F: A6 v) @/*                                                                          */
+ {. i! h/ j: V- o/*              UART 中断服务函数                                           */
9 {# m% }2 |& B, [  X3 z/*                                                                          */
) c* J8 k. \5 v/****************************************************************************/
2 M% G8 Z( S) C! N6 g' j, m' z8 y2 Hvoid UARTIsr()$ ?+ z0 k6 u2 c7 l) n
{  [6 p8 i8 z8 S, i) c; j9 k8 D
    static unsigned int length = sizeof(txArray);; q7 d2 i  v9 u; H2 H3 B/ I
    static unsigned int count = 0;) o( s. r( Q7 G1 G/ M2 C. m
    unsigned char rxData = 0;& |" z+ y2 W9 \+ g) ]# s
    unsigned int int_id = 0;
6 T2 [1 f/ t6 t- e. o
2 Y) R1 |. P6 v+ U    // 确定中断源
4 f0 l/ l. L" V5 z, A+ y4 v    int_id = UARTIntStatus(SOC_UART_2_REGS);
: }- C6 O% T2 T3 _% l' G) u" c, }
% Y2 G7 n2 n3 Y5 M! I0 c" x    // 清除 UART2 系统中断* C; A, q4 T$ r8 B0 w, v
    IntSystemStatusClear(SYS_INT_UARTINT2);  {2 A/ N! T* Q: [9 ^# W

) f/ x2 \5 X9 z# }  [, y    // 发送中断
5 k0 ]% [; J$ F0 w: w    if(UART_INTID_TX_EMPTY == int_id)
+ i3 g5 e& J# N  P# h% G! G+ n  l    {
3 k5 n% l1 _' d3 V( g1 e        if(0 < length)
& M+ h5 w, w1 B! k        {: N7 l7 ^8 S6 J3 j. h
            // 写一个字节到 THR. r# V* H, H$ H! @
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);3 |; ~7 D4 d% R; Z& g) z
            length--;1 b4 Y) z. H7 F+ u8 Y9 |
            count++;) f( i6 W0 l6 H
        }" C, @3 n$ a7 u, j- U
        if(0 == length)' f5 ?1 p% g7 Y) f
        {( Q9 S8 z1 v2 {% H, J! O2 P
            // 禁用发送中断
( V+ |1 X1 c3 Z2 f            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
& }  K/ r8 H0 \& H4 g* r: P        }% P" w; E3 N/ }7 v
     }
8 C$ \0 W/ y  l: E" H- y3 f7 T- R
3 w# {9 D# r3 M- L    // 接收中断' f! e* x' b" h5 r8 Z5 j
    if(UART_INTID_RX_DATA == int_id)
) d5 Z; ]" f6 ?4 \1 |1 f    {
0 P1 A' K9 n8 B4 b. Z9 w. h        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);3 {# T2 g' ]: K$ }: a# h

! h0 e5 r8 ~4 f: V2 Y0 E% ^        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);5 d! W8 p& R2 _- W  K8 _
    }% H6 Z: u& W; ?1 _% Q0 ^3 {" j8 N1 B
9 V# E# [6 O7 p7 L' k+ q
    // 接收错误& H, G  N+ l) u$ ?3 a$ C. g( Y- K
    if(UART_INTID_RX_LINE_STAT == int_id)
- @/ `2 o/ Z0 O9 @. e! u    {
- a  n( L, b# K8 q! \        while(UARTRxErrorGet(SOC_UART_2_REGS)), U, t; Q+ z' W* t2 B6 i* }
        {
6 d" c# X# B5 ~& T0 M: z% Z; d$ W0 k            // 从 RBR 读一个字节) k: k3 r! g5 T. i- U1 J' n' h" `
            UARTCharGetNonBlocking(SOC_UART_2_REGS);9 l3 a6 {' c/ z4 n. v! |
        }1 d% q4 o5 y- X9 ^0 \' h$ a
    }
* }. e8 a. M/ s/ [4 S, C5 f    / B. U; t6 \2 e; Y5 \+ p
    return;. \$ L0 y# G$ A. d$ F2 u0 J
}: x0 `9 J7 y4 p) e/ ]4 [

作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:250 U. \  ^% O: {/ f2 F  g
如果其它设备快速给你发送串口数据,你这边能正常通讯?

8 J' W3 M$ @: d: l谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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