嵌入式开发者社区

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

作者: 17390601072    时间: 2019-4-30 18:00
标题: 串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]0 M, W" w( r6 N7 r+ T6 s6 J) `2 Y

作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
$ A/ R2 i2 j# h5 G1 d# L9 F+ o# J7 T7 Y' O
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
2 \, z# v; Q( A, f% y2 F3 i- P. j- B7 C2 c' M- y# Y3 T& `
#include "hw_types.h"               // 宏命令
5 V& N, V4 v3 H7 Q# A* |& p2 Z0 ]#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
- @* M  u: M  k#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
) ?$ |/ |; n  z1 c& W. d* ~) S( d" e) D% ~# ^7 B9 U/ h3 O) C1 C; x
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明3 r9 r9 ~) m( o6 P
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明8 ?/ ~+ v. i' y. u7 ?
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
( P8 r9 G$ Y" L6 v7 F7 ?#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义/ G3 O% l7 S+ W+ P

; R2 L* m) E6 X: \/****************************************************************************/. \6 |  _8 z' |0 H8 _
/*                                                                          *// Z( B, ~" g; K# K" S* s6 N
/*              宏定义                                                      */
4 M4 ?( c8 g2 ~/*                                                                          */
2 d/ Z* H0 n, b/ B7 f8 F9 X! P/****************************************************************************/
( x. o8 ^6 W7 J2 h// 时钟" t( V, P2 X2 S1 \, e$ B# m  b* ~
#define SYSCLK_1_FREQ     (456000000)
6 Q7 d8 D2 J5 h/ n, Z9 Q1 G#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
# I0 T; ^( X8 Q2 T: K7 V6 c* u#define UART_2_FREQ       (SYSCLK_2_FREQ)/ L! k( p5 I) i6 \3 Y

* X7 M4 R0 ]6 n9 r/****************************************************************************/; b* g0 T6 i+ }7 v$ V
/*                                                                          */
7 k0 e. l# {( I) v/*              全局变量                                                    */
# I+ `0 a- ~# x9 R# n0 ^; s/*                                                                          */" G1 n! s. F  l" b/ C1 g9 J! O- |6 c
/****************************************************************************/7 F) ^5 j/ U0 {) ~6 ?
char txArray[] = "Tronlong UART2 Application......\n\r";
0 Y7 B. _% {: H7 I
' G# D' S) P( b/****************************************************************************/
3 P4 s3 E$ G$ b* T. O/*                                                                          */
! z! b* ~6 M. u# V( R  N* \/*              函数声明                                                    */
. m4 p/ z3 E! d# U& O4 w. Z; Z/*                                                                          */
. F7 j3 O" W/ K/ p! ?. @1 t! a5 p+ N0 v. e1 Y/****************************************************************************/
! C4 E4 E6 H. t) m: l  v% F// 外设使能配置2 q3 e. y2 G) a7 ~9 ^& F! I# P
void PSCInit(void);5 z/ T8 f9 k2 P! I7 v2 P
8 D) B2 j, I4 Y/ I
// GPIO 管脚复用配置
1 @7 m( e" O/ i0 E; M( E4 p5 b  Hvoid GPIOBankPinMuxSet();
: T/ @, X; M: ~; S5 X$ l# k
8 i& A& ~6 Z$ M: Q: E' T2 H6 A" Y4 x// UART 初始化9 u5 e3 F! g+ p( N- M
void UARTInit(void);: S. d+ ^! c! a+ G: s7 \
// ARM 中断初始化
$ T! O4 ]5 I: I  m/ B$ w! Gvoid InterruptInit(void);
* P5 x* b( Q; G! A0 n1 a// UART 中断初始化
# j9 {7 \! ^+ ?% k3 a( Evoid UARTInterruptInit();. Y1 t/ l' Y' g; A  c
// UART 中断服务函数' |, M1 g8 b6 j3 C5 }
void UARTIsr(void);/ b5 r7 Q; U; o

  ?- N! w5 A+ V) [5 R3 X/****************************************************************************/1 W% j1 A3 r. M3 }8 E4 [# N7 T* H) a
/*                                                                          */7 D, s: E; }$ x* g6 O/ m
/*              主函数                                                      */
0 Y4 ^! \4 S0 K% H( B* @/*                                                                          */
4 q' P# H, U& I8 V4 g* w- f/****************************************************************************/
5 b3 `2 S3 n4 {* c1 R4 @6 Zint main(void)! W1 s: ~2 V/ \
{
: F* R' M+ `7 v# w+ N2 y5 ]        // 外设使能配置
1 ~7 q* l1 c8 Q* ?! w        PSCInit();! d2 \* e7 b4 ?  I5 Y
        ) C. n+ c' j7 g$ r; a: c
        // GPIO 管脚复用配置( @2 ?$ O0 `/ D& t6 [, M
        GPIOBankPinMuxSet();
' P0 j! A6 o+ z; K: r2 v
# g6 H+ {; }' ]6 l        // ARM 中断初始化
- c& r/ P$ y, G        InterruptInit();
1 S/ p- f+ f4 f) y& ~( W3 e2 u1 N; v, E0 \+ o' n
        // UART 初始化
6 i$ L9 n9 c& o0 `) N( Z        UARTInit();
# I5 \" p% D% C/ J3 h. |5 s# Z9 d) Q' L" S
        // UART 中断初始化3 t8 B- W4 S$ k- [" `1 P" w
        UARTInterruptInit();+ R0 g" [  C' k+ M9 c& S1 J$ Q8 z
. j( G) c" K4 ~4 `: l! l3 \6 t/ ]
        // 主循环
1 W* t% z6 U+ k  M# P! P        for(;;): o. a& ?. M& M/ V; j
        {
' _7 y* z( }$ f# v: j+ Z* H% O- r( }) v
        }
0 Y( b/ z% b2 e0 L; `}
" I7 R1 u& B: V2 o# t9 u5 g/ Q+ K- J( Y! p% w
/****************************************************************************/
+ u( p( y; z2 X4 ^. m) g2 i9 ]8 V. a/*                                                                          */& U: b! G2 }1 J) M) V2 L/ ^
/*              PSC 初始化                                                  */
# a- V$ |5 Z% L+ O, o& d& b9 y) E/*                                                                          */1 @9 v3 ?" t0 c+ _, g
/****************************************************************************/* o: g  q. P. ?! O# e2 I. V& [/ k
void PSCInit(void)3 c2 M( ]5 v) Z
{
8 o2 q4 J9 `  A: v9 J3 l. `( C8 E        // 对相应外设模块的使能也可以在 BootLoader 中完成
7 [- T: [3 ^3 e* C, ~; m    // 使能 UART2 模块; _- d' ]$ p! J9 S8 k& s  D; v8 _5 Q4 {
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);2 ]- i1 n+ }/ ^
}1 D8 \" V" h  }- d/ \1 }3 j
- P: U0 D9 A! i. r
/****************************************************************************/
2 m% j( u% O7 h* f  ]. Q. F/*                                                                          */
3 ?, A, ^" J$ b% g) ~- W- S/*              GPIO 管脚复用配置                                           */$ F7 ?' x8 q( o# a% ~5 K- X
/*                                                                          */
) A) h& g; R4 \9 J/****************************************************************************/
& ~: G* u2 ]! Jvoid GPIOBankPinMuxSet(void)
7 Y( J( S1 L- a$ `{
: ~( {, H9 H" {/ @        // UART2 禁用流控3 n) E  T; I, `$ a( l; x: }
        UARTPinMuxSetup(2, FALSE);
, J0 n3 |4 V. ~1 l2 c6 \  I  G}2 l0 E# ^0 F* I3 |  c  L

1 p0 N$ c' s5 T3 s/****************************************************************************/
6 l* `7 z1 k$ ?3 A5 y" \* {: n) [0 x/*                                                                          */* t7 v* F6 D3 j  E8 R* k
/*              ARM 中断初始化                                              */
5 E" T# w4 E1 O- C/*                                                                          */! ]" x( C, [! ^2 ]
/****************************************************************************/
  F' k; K0 r- m# C' q# I! Vvoid InterruptInit(void). D8 V3 _2 F  [6 X+ P
{
  F6 j$ R/ J- |3 i% F    // 初始化 ARM 中断控制器$ S4 M4 |$ T0 A
    IntAINTCInit();
9 q; |; @# ?# S- g& o/ h
$ y$ p/ x7 I7 h    // 使能 IRQ(CPSR)& }- H" O5 R0 @- a' k; ^; d. [0 Y- b  @
    IntMasterIRQEnable();1 i) G: V" ?- J: l/ a- F

' Q- B5 {- A& s2 n) _% Q    // 使能中断(AINTC GER)
$ y2 z. B) e( R    IntGlobalEnable();( x  L1 \* ?- W2 m) v1 m

6 ~6 R& C" _( n6 ?% P    // 使能中断(AINTC HIER)
) P% s% z, f3 o& c$ m    IntIRQEnable();
# f9 ?. l# j  {  `( o+ e}
3 s5 f8 T. Z- t1 h4 u% ?
3 U# ^( ^9 W, c" ~% C4 [/****************************************************************************/
. k7 Y0 n5 G1 z8 g/*                                                                          */$ \7 g4 A5 O5 o. g# e# h: U
/*              UART 初始化                                                 */
7 o$ b' p+ d3 h' r; c; T! b, s3 T/*                                                                          */
" z/ b7 `3 E! c0 h8 e2 a6 j6 v8 S/****************************************************************************/+ m, B* `% K) C% K3 q
void UARTInit(void)
$ \; E. c( x& n0 X4 |' r' v{& k8 M' ?  K6 t: m& c
        // 配置 UART2 参数
: M5 C% ?; x2 f( F' }3 h        // 波特率 115200 数据位 8 停止位 1 无校验位) @1 u8 I+ c/ ?" L2 f0 V$ V
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
( E8 E: B. k, p9 S) P. R7 h$ h" O                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);* K" Q) N  Z' G0 i7 w5 W" _& t
        // 使能 UART2
% _5 `* v1 |8 x$ X: Q$ G7 ~( y1 w        UARTEnable(SOC_UART_2_REGS);
$ e" ^% I: [* b, e4 ?9 v
2 \& J; c  X9 R" P    // 使能接收 / 发送 FIFO$ G( ]* q$ L0 L- W* G- k, F! j
    UARTFIFOEnable(SOC_UART_2_REGS);$ P1 A+ @* h, o, E1 U
8 k! H$ d+ A6 {5 g) |) f! W- _  C* u) l
    // 设置 FIFO 级别% h0 H# ?* I8 J' e, X; X# E7 |
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);0 t9 i6 ]& @7 {; L# j8 B# \
}
$ |: \$ f4 z( [9 s! N8 Y! y# d, d9 ~" a7 @. G
/****************************************************************************/
. e2 B# r! @* E! g  S+ ]6 u/*                                                                          */8 `+ r( `& O* p& d( p
/*              UART 中断初始化                                             */
  I/ c7 g, b7 L  O6 R% b0 [3 n6 S, h/*                                                                          */
7 d! m" Z$ n; L$ R1 V( o" T- U; c/****************************************************************************/2 J) Z7 t0 T' Y
void UARTInterruptInit(void)
3 W& H/ M* K% t$ H$ ~8 Y. I7 z{  y. L3 O6 @5 L8 g- M# r1 a
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
9 G# G/ c' ], ?* Y% Q        IntChannelSet(SYS_INT_UARTINT2, 2);, f) \) J: ~# L6 i
        IntSystemEnable(SYS_INT_UARTINT2);* T6 p: O; z. {" z: o" \
$ }0 X( _9 I! R
        // 使能中断
6 U5 u+ o2 X. K        unsigned int intFlags = 0;- S1 W; C  d/ H- I
    intFlags |= (UART_INT_LINE_STAT  |  \# L) `0 z( ]4 p& V& d5 @
                 UART_INT_TX_EMPTY |    \
0 O* K! W$ J4 d) R  d: p/ P7 C                 UART_INT_RXDATA_CTI);& O4 g; _9 y5 R/ P; j/ o
    UARTIntEnable(SOC_UART_2_REGS, intFlags);( U& g" K- n+ w! }! ]
}
% W7 \( l! L! f& I0 m7 C8 F8 p% D' j0 M# Z- A8 i' o
/****************************************************************************/
# l$ t) v' y% F. z  ]4 I/*                                                                          */' l; W8 [$ _! K" H3 x
/*              UART 中断服务函数                                           */
3 W, n; J# g$ C. {6 m2 p/*                                                                          */* [* h1 y4 }/ L8 q3 x
/****************************************************************************/4 G3 L; \& D9 q; C6 K  O# }% z8 v
void UARTIsr()- D+ A; `5 _, ]. O0 {+ E8 j
{
; g# }, }: T! h    static unsigned int length = sizeof(txArray);
! O4 p+ ?- v' g9 o    static unsigned int count = 0;  t& v) \8 |, `
    unsigned char rxData = 0;
  t& E& V7 c( _( Z    unsigned int int_id = 0;
8 W1 H& _5 w, i, H6 ?/ X' N% d- p8 W% {: a, G( O$ h3 x
    // 确定中断源
. q" L" w- H& S$ Y: ^6 K. V    int_id = UARTIntStatus(SOC_UART_2_REGS);. H% n9 N$ D- }; C* F5 F/ s7 u
0 N3 A" Q# Z7 u6 h7 k' F6 K
    // 清除 UART2 系统中断
( ^7 {3 K( O  h    IntSystemStatusClear(SYS_INT_UARTINT2);* ^; w* m( H% ?, S6 T( k0 d& [+ ~
- c, G6 `1 _9 V9 O1 a% [0 a
    // 发送中断% q* Z  L( Q9 R9 D1 C# i5 D* Z
    if(UART_INTID_TX_EMPTY == int_id)' l  \) M" j, y. A
    {; F6 o8 q. }- ^( X7 x3 Q
        if(0 < length)
; j! T& X7 A& j9 e- y$ L+ C1 h        {
# B' E! L7 Y4 F' T7 X! D/ u! D9 D            // 写一个字节到 THR
" s. u$ X& p5 ~$ ~5 `( O            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);2 q& p' ~, F8 e% m/ s5 b2 }; }
            length--;
7 c2 I8 M/ N: R# S0 [/ S7 e            count++;
( k1 Q6 B. N9 A* c" Y        }
8 @; X( S; W& U& P  }! x        if(0 == length)5 w) P. j$ w* j2 W0 a, P* C
        {
3 L+ g$ l2 U2 O' L- Z; }            // 禁用发送中断' d) {) Q% y5 k3 Y
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
! ?& u9 d0 q" o1 C2 Q5 N; y2 C        }
$ J0 A8 \. j6 ?, K4 }     }0 {7 h: a% B4 ]: I) N2 R

% o1 ~6 T) s) m# k7 R& {    // 接收中断" e- x4 O" `# k0 j8 B* T! S" {
    if(UART_INTID_RX_DATA == int_id)( g9 e6 T2 J; }1 @4 \' o* m  r
    {
- V. H$ ?& p; s4 _: E+ k* h* i        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
+ F; P' H5 @. y; l
0 R* g! Z+ a# d- U3 g9 q: O' T        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
) H# W2 P2 Q8 n3 a. p7 O    }
4 ~- G; l  C% z" z+ h0 Q  ^' U  {! W& v0 _1 {# ?
    // 接收错误
# U) w0 b* v& U6 q* ^    if(UART_INTID_RX_LINE_STAT == int_id)5 }+ O1 G! [0 k( H, s9 R: W
    {
# A" a7 M* ?( ^! W9 @        while(UARTRxErrorGet(SOC_UART_2_REGS))' L5 f7 R9 Y1 u  a$ x- T
        {
+ x; i9 \( t/ m) r            // 从 RBR 读一个字节; H  ?6 w! }0 c. C* P
            UARTCharGetNonBlocking(SOC_UART_2_REGS);) d; D) `5 U( T  J* N; P0 D
        }
4 _" A! B/ Y7 a* Q5 I7 F/ u$ Y) p    }' v! e$ L0 w$ n- ]
    % Q  M1 o9 y. u( r' \; @$ i8 d' M
    return;: i1 S4 Z# R0 i& ?' R0 H
}* l, {* R6 W; \1 o$ v! X% Q

作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25; q( ?% `; @0 r  N) V8 s
如果其它设备快速给你发送串口数据,你这边能正常通讯?
# r" r1 ?$ K) T8 i
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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