嵌入式开发者社区

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

作者: 17390601072    时间: 2019-4-30 18:00
标题: 串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]: |) G* j- {8 i0 d/ v2 _( z- _: I; N

作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。$ `4 P' Z9 U& ?$ j4 o# P  o

& L* Z  R2 f4 `! \! W2 G#include "TL138.h"                 // 创龙 TL138 开发板相关声明
5 C0 F8 G8 k7 r) N& N6 s
2 Q0 F( l% i7 O: j. O' C7 a#include "hw_types.h"               // 宏命令5 q/ h/ ^) _* U) s
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
, w) t) N8 t- v, ~#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
3 z6 Q; G, Z3 N4 P
0 T  u9 Q4 S/ ]. O#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
6 v+ _% N9 f7 B5 u+ w3 M( F1 ^#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明5 @" d0 ~' r9 h
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明* V% B# C) S! q8 ~6 L
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义% F! t2 |% a0 S% f9 _
4 J, i- `& q) @' s1 v
/****************************************************************************/3 E3 D5 R- O6 p
/*                                                                          */
$ K7 p( N0 A/ B/*              宏定义                                                      */- b* B* u& ]7 W1 H% R8 J
/*                                                                          */  }& c8 k. \3 D
/****************************************************************************/
: E& y$ |* T+ A& K// 时钟
- r, V1 Z* g+ x& l#define SYSCLK_1_FREQ     (456000000)
# f: S' W5 a% v2 G#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)# c% U" n3 @# N8 E. o
#define UART_2_FREQ       (SYSCLK_2_FREQ)5 @! G- H7 [  F: x/ C1 t1 k
0 V/ j% R  }+ B
/****************************************************************************/0 O, t9 z7 V& b
/*                                                                          */6 y# }6 a7 ^; y: [# u+ \9 f6 N
/*              全局变量                                                    */
6 N) _* j8 L2 y9 E- |/*                                                                          */
. s& s2 M4 f' c/****************************************************************************/
! a& A% L: X2 l( ychar txArray[] = "Tronlong UART2 Application......\n\r";
- R6 ^4 X0 h$ D( g& x+ f6 b
6 `8 j; [4 H2 r: ?' y/****************************************************************************/
! E% p- f4 R" S" G/*                                                                          */
% O' F- h2 E+ R8 M4 d4 i; ?/*              函数声明                                                    */
0 c9 N# a4 S& V0 h; ~6 {/*                                                                          */
7 Q) z9 I9 O! l$ X" R- k. a+ K/****************************************************************************/$ S6 I: H+ c9 ~$ Q  X( G5 k5 U% I$ R
// 外设使能配置
( U! t* r- w6 f5 g+ x3 Jvoid PSCInit(void);
) I; P/ U. W3 U4 U' z; w
# ^& J2 d1 s- Y: A; C// GPIO 管脚复用配置2 l' S3 _% I" V( j- I* N
void GPIOBankPinMuxSet();
$ Q4 s+ s2 O! x4 r1 G5 o
. A+ k+ X! N  p* d6 z% q// UART 初始化
+ d6 D' ^" x4 ~, Vvoid UARTInit(void);
% Q0 s+ B4 q  r5 h- p, \6 o& ]/ Y// ARM 中断初始化1 y; n, d5 A) l/ g
void InterruptInit(void);
" y9 J' F' `1 ~2 ]& H0 o' ^// UART 中断初始化
8 s$ }' [  t: n+ G' M) V7 `6 lvoid UARTInterruptInit();( |+ z/ l' e3 J: [- c$ K3 H$ k, j
// UART 中断服务函数
* W  P# v  N( T& xvoid UARTIsr(void);
5 j- [- }( ~2 ^$ S8 ?% x+ H$ L/ Q+ ?$ l' t
& X# `0 N+ p& W7 J( a6 a/****************************************************************************/& `2 w; |/ C. l% B8 O$ s& T
/*                                                                          */% n. I! P! W- a1 T/ k5 _
/*              主函数                                                      */1 v  j  L3 m  D( r4 b1 \% V) A! w
/*                                                                          */0 k6 N6 R/ h; {  E! U
/****************************************************************************/
+ v- d# q/ }% i. |( w9 U4 [- Nint main(void), {. x( b% O4 \& K
{4 y* q" p( T4 X0 Y9 a. }
        // 外设使能配置* L! m! r9 ], I0 S3 E$ Z4 ]
        PSCInit();- F! R. Z% Y) X' a$ X5 r/ K! ]+ t
       
# D$ y- H* g2 G1 H/ B8 E5 C$ f        // GPIO 管脚复用配置/ z2 i6 R: f: @0 _$ V9 |
        GPIOBankPinMuxSet();3 z! B$ G6 |' I& l( v
# S  j( \$ C/ j4 W1 r+ q. g! q
        // ARM 中断初始化/ @& |# o- @4 e# [- a+ {
        InterruptInit();
0 K/ {5 S4 R- Z4 G
# D  d9 I. S, [5 ^3 C8 {        // UART 初始化4 z6 m! H: @1 i, K. X4 _
        UARTInit();( ]! u' _3 z! x/ W

7 D+ {3 Z( d- w- z        // UART 中断初始化
) w# V( E' m5 a2 t! [7 S        UARTInterruptInit();
8 y% D2 @; f; g% R* H' E+ E3 [/ a- J% U( g5 V+ P( A' p
        // 主循环
' h( Z# P7 i/ r: }7 @) \+ r        for(;;)
+ x& H5 A4 f1 W2 {, S1 \        {
) p+ }& p3 y) w. ?
, D" @% C8 ~0 }2 t7 k" f1 ~2 _        }, M. r9 r; g  x, ]! K- I- N6 _
}# y2 t" W! v+ l% k- u

5 H/ w/ i; c$ d# }/****************************************************************************/
  h5 Y& V. F7 S% O0 M/*                                                                          */8 r# L" s( X/ ~  s! k, S$ X
/*              PSC 初始化                                                  */
) _- c3 Q  h* O, k: i% x; L/*                                                                          */
5 S" \, Q' \2 q  q/****************************************************************************/; Q1 _7 R7 K- d" q8 U
void PSCInit(void)
: a/ C7 W' E2 f. Q{
' W, S3 o) n2 r; S9 \3 N        // 对相应外设模块的使能也可以在 BootLoader 中完成
5 S" \4 R; l7 f' U& @    // 使能 UART2 模块
0 @1 w& ^/ M5 {( V9 u! K) |/ |    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);4 F. F# W+ o1 P  c. w. a  A
}
6 [2 t+ v! a9 U3 w& Y
7 b7 Q! {) ]$ K/****************************************************************************/
$ y$ N) f( x3 z; j) q2 [/*                                                                          */* x# K, J3 y2 n' }
/*              GPIO 管脚复用配置                                           */& V  G% K" {8 a9 v8 F2 Q
/*                                                                          */6 R: x, Y  w; S3 T
/****************************************************************************/
* |3 i' `9 c8 w" _  Mvoid GPIOBankPinMuxSet(void)
' p* g. |, D% h  ]* r( }+ o% h{5 v1 x0 G) M8 T8 r3 j( \
        // UART2 禁用流控4 L$ g/ W0 s4 o* a
        UARTPinMuxSetup(2, FALSE);0 x5 z& P# A) @4 x  V: H. O
}
, y( g/ `( V+ P& M% a6 \6 x, V
. e1 L9 F! f; H/****************************************************************************/* K' B) x2 N( j7 B$ [7 V
/*                                                                          */
/ o2 z& d; Z* h8 P5 p2 W/*              ARM 中断初始化                                              */
6 n: M# q! z/ w. ^. }/*                                                                          */# P) b  o( D: o7 h" k
/****************************************************************************/; R5 x8 N& o4 Q% c
void InterruptInit(void)
6 t& ]! x; v) [/ k6 F{8 M2 M" D  O% X+ I$ D
    // 初始化 ARM 中断控制器
) u* l8 D9 ]) ~$ N    IntAINTCInit();. ]9 i/ \1 M0 A$ l5 U: x

- Q) @- K; J% R) Q; Z% ~    // 使能 IRQ(CPSR)
8 U/ X/ k8 s+ R6 q$ Q% `6 S+ ]    IntMasterIRQEnable();
+ \: k, H$ f) n" t: A2 l0 z
+ {1 Z& Y- |; k* |3 x    // 使能中断(AINTC GER)
6 F% _: }) i6 S. ?    IntGlobalEnable();$ b& h2 e7 {, j) t! P1 N

  S( I% g; P+ Z) x" D    // 使能中断(AINTC HIER)
' [4 s. Z5 q7 p1 x    IntIRQEnable();
& ]8 ]9 Z) Q, d( z3 O}7 o7 k( I4 p% Q* w8 T* d+ U6 J6 m' |1 b

2 {: u5 Z! ?) t. H  j/****************************************************************************/
" ~! f  c% ?( M  m( Y/*                                                                          */4 H/ I6 o# r: n. J
/*              UART 初始化                                                 */
4 g/ W& _; H* P" O  O8 v( k5 }1 k/*                                                                          */6 B) A" Q+ K! X0 N5 D
/****************************************************************************/
3 O# s8 A  Z$ ?9 K2 F5 {void UARTInit(void)
. m6 ]1 p3 @8 G+ ]! s, A$ m{
1 X" l( |9 y) V- j8 }        // 配置 UART2 参数
! N! R% q+ d3 Q, n" o2 z4 }2 H        // 波特率 115200 数据位 8 停止位 1 无校验位* A0 L" }9 W% B
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,7 v9 ?, c) d( g- s' U# D4 M/ U, h
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
+ T6 P: A" O' \  e        // 使能 UART2
9 ~; q# d) X, Y        UARTEnable(SOC_UART_2_REGS);5 j" P) t$ _, g4 q' b) H
) _# x% K: W% S" d, j5 R
    // 使能接收 / 发送 FIFO: @  m5 M& A' C! g0 T5 T1 s' j
    UARTFIFOEnable(SOC_UART_2_REGS);
( d0 d1 P2 M# @
5 e# X6 o9 Q1 [9 Q) |    // 设置 FIFO 级别7 {; V. e& d% d6 d# k) {
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
, [. G" Q7 n+ j/ _4 E9 G. A}# O) B4 K8 ~4 }6 M: x1 }

3 [2 e7 u8 q' Q! `/ L/ c8 R1 C2 B/****************************************************************************/3 S! a6 ]. ~/ f
/*                                                                          */
4 O- F' W7 [" T' M7 ]8 w/*              UART 中断初始化                                             */
' s- Q: T# S9 }' a" T/*                                                                          */
9 ]$ P5 J. V7 X6 B) S* _6 `/****************************************************************************/
" V& u3 M$ @% Z. Z- C: w7 ~void UARTInterruptInit(void)0 @3 ^/ b$ F+ L( m, ~
{/ G5 i# {- f  S% L9 _
        IntRegister(SYS_INT_UARTINT2, UARTIsr);3 l5 P9 _/ K" p% H* v4 d9 y
        IntChannelSet(SYS_INT_UARTINT2, 2);8 ]3 h" T6 ^8 C: @. Q
        IntSystemEnable(SYS_INT_UARTINT2);
6 _! K& b  \: O( L; k0 O2 G& y7 `8 }) x+ u
        // 使能中断1 @. H) \+ ]+ ]+ b  C# M1 `/ n" Y
        unsigned int intFlags = 0;) E0 G$ M) B, G% i$ t8 X
    intFlags |= (UART_INT_LINE_STAT  |  \" I$ G% F9 n# _  G4 z
                 UART_INT_TX_EMPTY |    \
+ g. `) ?+ V1 w& [                 UART_INT_RXDATA_CTI);
1 h# |+ A5 o3 g/ f    UARTIntEnable(SOC_UART_2_REGS, intFlags);
1 g- \/ d0 `$ I! Y5 H& [}6 {' |  x4 x1 i% @! T' H
3 J, o; A% w% H; d2 m, Y4 ~  |( U
/****************************************************************************/8 {  Q9 N% w8 l! q5 p7 {: S. |, T8 Y
/*                                                                          */# z- t; f6 G) b3 P# {4 _' ^
/*              UART 中断服务函数                                           */
; N, p' q% c4 M' b  {, G/*                                                                          */
& s3 g1 F7 c: z) D$ o/****************************************************************************/
. ?8 I+ z' p  X: b; ?- {+ mvoid UARTIsr(); Z/ }/ W% e; k1 e% e: s. n* |2 g
{
2 I; L7 F) v0 {    static unsigned int length = sizeof(txArray);1 V4 J& P# M- v" }
    static unsigned int count = 0;4 b0 |3 O  K% q9 A$ G: `3 M  @
    unsigned char rxData = 0;; V( e3 i  Z" R
    unsigned int int_id = 0;" ]+ e$ y+ N+ E5 T% b3 L$ }6 y

6 }/ E/ }2 T: u    // 确定中断源
1 s) g9 {" V1 F6 @. T  e. \    int_id = UARTIntStatus(SOC_UART_2_REGS);
9 P+ D, ?% {9 K( {" s
" t4 W- e/ y8 F, R- A3 x    // 清除 UART2 系统中断, V# M# p* Z: f5 x2 Q
    IntSystemStatusClear(SYS_INT_UARTINT2);, b9 w; a6 c7 ]6 X; `
. Z1 Y4 I+ X5 O* C6 W
    // 发送中断
7 h8 z: A3 M3 ^, ^" t/ O! d    if(UART_INTID_TX_EMPTY == int_id)
5 E# w4 A" P/ D* M, j    {
! c! |! w, O5 \+ R/ f' u. _8 B        if(0 < length)
  ]7 h/ G" E" g; h: q. Z! S        {
/ u/ x  m$ ^: t' _$ [. u            // 写一个字节到 THR
8 R7 k- ?1 _0 @            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);" o2 I, m/ _/ m# f$ O/ \+ {
            length--;
5 V; o7 J) ~4 ~& {            count++;
) c& i8 T, G6 ?( I. y$ }        }
/ U& R1 j6 \6 s4 s- q        if(0 == length)
, |6 Q1 y5 p0 C9 s        {
, ^* k, r5 b2 m            // 禁用发送中断
2 w9 o& H: y- R            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);, y& b# n: v, v% Z
        }, I/ J8 h! P4 U6 u9 m
     }
  ^& k6 g$ n1 |, D, E* P, Q* u$ X% G% ?7 f
    // 接收中断% O& l' Q- S3 m3 E% u; `
    if(UART_INTID_RX_DATA == int_id)
+ t& E! {3 ]" b" u3 g9 M    {1 k  l9 q% J8 X* e$ |& y, T+ E8 n! D
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
9 r; H0 T" G$ y% @0 ]/ E0 y) N- B+ j( Z0 Y
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);4 j/ O0 c# z1 R9 L9 x8 J
    }
. g: v6 d2 i; r7 E8 \. u$ ~# z% g; J$ u2 S" `* ]
    // 接收错误
' a9 ^5 M4 U; p2 K7 f+ a+ }    if(UART_INTID_RX_LINE_STAT == int_id)
& J5 l, f, j0 }8 z5 c    {
& O; o) S1 Y5 O# @        while(UARTRxErrorGet(SOC_UART_2_REGS))
3 w4 N" e, E- Y$ R' c5 K        {
! ~' J- L: h, n; b7 d            // 从 RBR 读一个字节
3 w) n- @% y" P' x. X; X            UARTCharGetNonBlocking(SOC_UART_2_REGS);
+ c  f& s2 _1 @# C5 P; x        }5 A* t% d' B2 C* l( `
    }) X1 @0 x$ j1 h
    " K1 S1 U/ G+ h, g; q- S
    return;! j0 N% C: ?8 K; ~
}
$ a3 W# m" S3 T  x
作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:259 g: O/ H" X# Y; M" ^
如果其它设备快速给你发送串口数据,你这边能正常通讯?
/ b) a# C& ]& G+ S: p
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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