嵌入式开发者社区

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

作者: 17390601072    时间: 2019-4-30 18:00
标题: 串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
9 y8 I  Q3 Z! |$ ]6 b7 f
作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
7 s; i6 u1 E/ d- h* E/ m) o. w' M9 s: Y7 b! H  E
#include "TL138.h"                 // 创龙 TL138 开发板相关声明/ `) l0 U3 G: w) Q

; `0 }3 I& }; o; A; n& u4 K/ D#include "hw_types.h"               // 宏命令2 P  v) L. b. l
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
8 {1 r  n6 l, J" c' k& h0 H#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器  T/ L/ E. T' D% V9 @+ n- ~

7 i2 V4 @/ V1 p! V#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明9 L/ n  M% ~1 k! r" k
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
" g* F6 G/ B2 C& Y; V5 m# J: R/ g/ y#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
0 e" }' q4 R* _% O+ p#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义- [' i7 g! U2 C% W! N- X* c
2 V6 [% b1 F+ \4 |
/****************************************************************************/
3 `' G' S! ~: [3 ^$ X& a/*                                                                          */  Z8 G- q' ^6 @1 s  L' r
/*              宏定义                                                      */7 D# s1 }- Z/ u5 r. @
/*                                                                          */
2 C* f8 N! g8 T/****************************************************************************/' I! _8 C5 @/ q$ G
// 时钟
/ `6 H  l4 V  O7 R0 u9 R#define SYSCLK_1_FREQ     (456000000)( R2 _, b9 y$ }: G4 c& l3 E- [1 h
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
8 I2 l7 N7 c2 h% A; a. H#define UART_2_FREQ       (SYSCLK_2_FREQ)6 Z( z" R5 O2 C9 X

: L1 @1 J% o7 K$ t/****************************************************************************/, x* o  V7 ~9 P8 e( f  ~
/*                                                                          */
% a: D7 Y; S$ I: d/*              全局变量                                                    */, v& w) Q$ j# L6 \8 `
/*                                                                          */
3 a/ a4 I5 j' a/****************************************************************************/4 x# o' [( j1 h: t0 l
char txArray[] = "Tronlong UART2 Application......\n\r";
7 C- r8 @7 x: s" m6 Y9 M  ]9 ~4 k$ K9 u5 z2 L% @
/****************************************************************************/" V) N; O9 }( Y9 I0 ?( a
/*                                                                          */& X" j. _6 f8 L, P; m
/*              函数声明                                                    */
7 x: z/ o! T: X8 Q/*                                                                          */# @( B6 a6 G  ]+ f& u& Y
/****************************************************************************/- L, @) z" I+ [0 \6 m0 {4 M' W* d0 |
// 外设使能配置
% T/ X2 f; W4 s$ X/ gvoid PSCInit(void);& B5 n- H. u. y8 j& Z1 o- g( \, [

& |5 k. c) Q0 Y2 K1 _" u* N// GPIO 管脚复用配置
, E1 \; p9 _7 V4 L; cvoid GPIOBankPinMuxSet();' k! K/ c6 V& h

) D+ ~: w( G& X// UART 初始化# ?1 K; e# t, L1 u
void UARTInit(void);
* h7 b5 q! n, L& u3 v! F// ARM 中断初始化
0 Q: n7 i% O# f9 \) }7 ~1 mvoid InterruptInit(void);0 e) O# O7 D8 J( A
// UART 中断初始化
" g% d2 J: w/ A0 r9 l4 mvoid UARTInterruptInit();
: t- ]8 I5 t1 c. r4 N# x// UART 中断服务函数
+ B- ]% |+ r2 j. _. Xvoid UARTIsr(void);1 w3 ~" v( `& r% n7 Z7 n

  k, a! Q% v- H4 j/****************************************************************************/  f7 e* v; V1 s
/*                                                                          */( p- h; j& G: c5 j/ c/ t
/*              主函数                                                      */- E1 p6 ]# y* e, ?6 t* B- M
/*                                                                          */8 s/ h! b, A/ s) D/ S: K, q
/****************************************************************************/5 f" @7 U3 s/ ]1 U4 v& Z
int main(void)- Z" \8 s2 F) N& \
{, R$ s2 f9 Y+ `: N7 u
        // 外设使能配置
' J2 t* H5 k' b5 a! A3 p        PSCInit();9 ]/ ^$ s2 q$ K% ?$ R0 A
       
1 P  o1 T9 B* F( }$ f' G4 z        // GPIO 管脚复用配置0 p+ O: Q5 @0 h% s4 W4 o( r% x  \
        GPIOBankPinMuxSet();
1 I. n3 s1 o. Z2 `9 [
# i# ~) @6 x$ l) C& y  Y        // ARM 中断初始化
, ^, X1 B3 f* H' A        InterruptInit();# I8 _( e& B1 l1 o5 q" f' R

. m2 o  U2 T  Y8 E1 n8 Q6 v( a        // UART 初始化0 _" W! _# A! X5 J
        UARTInit();/ l8 a8 s. B% W$ W

0 X3 d8 b; n4 A        // UART 中断初始化( L, q8 H0 l: U3 V% P8 e
        UARTInterruptInit();& |: S$ R8 X9 b
7 I1 T% C& U% ~% K, ^8 i
        // 主循环
, b# {, ]$ ^! W        for(;;)
  M& a, F$ c: p. f" t0 C        {. ~1 F7 L3 v0 f9 E2 s/ f4 D7 T
4 k+ k! o( N( m* y* y3 W
        }+ F, O% B0 x6 d2 i" ]8 b& d
}3 s, D: F1 a- f! h- V

7 z( }" d  S. }/****************************************************************************/8 }& X  `8 ^' e: e7 T
/*                                                                          */6 K. }# k& f& I: L& {
/*              PSC 初始化                                                  */
5 h3 X  ?' l. J; v/*                                                                          */2 y- n6 ]/ z4 \6 L8 Q
/****************************************************************************/# i0 P  g$ U+ @' B
void PSCInit(void)
, z: ^" S# U6 q% E! k, s2 N; R{
2 [# ^3 R6 f# G/ z9 F        // 对相应外设模块的使能也可以在 BootLoader 中完成
/ ?' {' ^/ }$ @$ Y3 b1 m    // 使能 UART2 模块
1 {0 [; g. n! f/ W3 R+ k/ t# I    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);3 N: W7 z& @2 h7 I- m" ^3 {6 ?
}
/ S, Q7 I& h# t! N3 S9 K+ H4 R5 _) b) E+ M5 H
/****************************************************************************/5 i: B2 y4 n3 _& r1 F7 h0 A* D
/*                                                                          */' s/ s8 l# h3 r' Q: j8 E1 g6 k+ `+ l
/*              GPIO 管脚复用配置                                           */
' r8 e( ~! V. C0 i/*                                                                          */2 Q0 q+ ?% R5 y' j/ e( `. w# N
/****************************************************************************/$ S1 ^4 G5 M2 |5 d* f4 E" a7 q$ B( @
void GPIOBankPinMuxSet(void)
1 }3 {& V3 m. Y3 `) o- l7 C9 i+ p{$ [- P7 y5 X$ k) l% G
        // UART2 禁用流控
  G( z/ g0 c9 o( f# K; ^, y9 ~        UARTPinMuxSetup(2, FALSE);
2 b6 \) x/ |! l6 B4 H& k}
' Y1 j4 F% X/ \: K8 ?" ~# ^; Z
9 O& A8 M+ I2 a- F  d8 ]( \/****************************************************************************/0 E3 N" }% O0 l0 U1 z+ P
/*                                                                          */5 C9 B0 P$ x+ {
/*              ARM 中断初始化                                              */# g7 e2 ]) E9 i6 p
/*                                                                          */6 q8 K# P1 r" n6 @% {4 D* z* x
/****************************************************************************// d5 o" S$ q0 c2 W
void InterruptInit(void)" ~/ \* q* Z+ f& a/ m
{
- E0 f+ p: r" y- p7 u- O$ E    // 初始化 ARM 中断控制器
4 x! G1 m& K- [6 ?    IntAINTCInit();
* m, F$ m* h' B  F5 @0 p. \) C8 T0 E- p( q$ h* y
    // 使能 IRQ(CPSR)
* u% A4 |: Z/ E7 s4 _8 G    IntMasterIRQEnable();: x' y" g8 o) l3 C0 c# i! y

6 q5 @5 i; D1 v" r  t3 {8 C( b# }6 [    // 使能中断(AINTC GER)8 ]4 a3 c4 W0 I6 m
    IntGlobalEnable();
1 d1 |, s; C; u4 Z, c. P  L( l
5 D& |, Z0 ^% f! l( \# n/ I    // 使能中断(AINTC HIER)
& I/ T( k4 P  f/ r' g' M, s; V* \    IntIRQEnable();1 u. r- q& ^' L9 g
}
  i9 q& n) A! P; Q1 V/ G# m7 B3 l1 f. f8 J. h& E  ~9 a
/****************************************************************************/
  T4 Y$ C, c* L/*                                                                          */# R# X; ?2 S2 X* e) H- N4 H: g) g* p% Y
/*              UART 初始化                                                 */* W+ i, S1 N! a
/*                                                                          */$ n1 Y. \$ A' ^& S# S# E9 F4 `( C
/****************************************************************************/
- L! d4 k) G3 y" `  uvoid UARTInit(void), e) m" \& G3 P, P0 i; B2 D
{5 K1 L, V" ]# ~; A0 l8 K) y
        // 配置 UART2 参数
0 D0 K- g- l4 h% F        // 波特率 115200 数据位 8 停止位 1 无校验位
; Y" A4 d. r0 s0 D' A  n) w    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
  `/ r* u% L4 E) ~+ Y( y                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);' z, P* j5 ?* Q9 e( w) C
        // 使能 UART2
3 i3 h; Q( c5 H: W$ I* N        UARTEnable(SOC_UART_2_REGS);
$ ^5 x( F2 E5 C4 Y' e9 `
* \1 G$ l2 }5 T4 E5 _    // 使能接收 / 发送 FIFO
) D! C5 k6 w* `, B0 F6 h$ F    UARTFIFOEnable(SOC_UART_2_REGS);/ r: s# C$ `( c3 R
9 Y) A% o4 B6 V
    // 设置 FIFO 级别
/ p8 O4 c9 Y. _9 e5 Z9 t    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);( R7 y/ k, d  t7 a0 z( Z
}, L1 f3 G4 A. h0 |

! ]' O. l& y3 C2 t/****************************************************************************/5 P8 `: N% y/ V4 T' D
/*                                                                          */
; u6 M$ }- r. |, v3 A- j0 z/*              UART 中断初始化                                             */6 p3 b  y+ O/ M5 L  A% e& C9 n
/*                                                                          */
7 P" T& j* W+ K& E1 b8 a2 N2 d/****************************************************************************/1 g4 u2 q+ O3 J. D
void UARTInterruptInit(void)( o) q) Y; n9 A+ V; B4 u7 W
{* s9 ?1 D$ S4 [% m% _
        IntRegister(SYS_INT_UARTINT2, UARTIsr);0 @$ J+ g& z# s
        IntChannelSet(SYS_INT_UARTINT2, 2);8 H1 m% z% c9 t) B- P) F' _( B. ~: P
        IntSystemEnable(SYS_INT_UARTINT2);
3 {- D1 J: O/ g0 z& K/ j- H. J- K( }: @2 N
        // 使能中断
$ `& L" ^$ [7 G  G2 ?; N9 ?        unsigned int intFlags = 0;
. y2 q; f$ o1 G# P    intFlags |= (UART_INT_LINE_STAT  |  \
  L  c2 D6 r7 @' w+ T( b                 UART_INT_TX_EMPTY |    \
, X8 S9 b9 o- q  o. m3 N' y                 UART_INT_RXDATA_CTI);: j4 [0 Y! W: x, e8 s
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
. I  i7 {9 D: U$ B3 [7 P}+ l' a: r; E# _$ {- ?
3 O6 w; g1 D' H
/****************************************************************************/
1 I% K/ |* V+ w( o/*                                                                          */
# O4 z! V& }" _2 s. I3 t5 o/*              UART 中断服务函数                                           */
" M, j1 c* K# t6 \' o6 }) j1 E/*                                                                          */1 l. K6 r5 c7 B! Q# X* z' ^
/****************************************************************************/
4 B2 B! R( T  X/ g; y/ rvoid UARTIsr()
5 e) S4 q8 _2 L) q- g$ J$ v{9 U% {; j# G# r4 f. D; |
    static unsigned int length = sizeof(txArray);
6 |$ m1 D, D9 P$ F    static unsigned int count = 0;
, u; b. N' A: }+ |9 `    unsigned char rxData = 0;
1 b4 ]' g1 e4 M; G9 `+ \$ j3 p    unsigned int int_id = 0;: S$ v+ Q4 ^3 M. A  Q
9 C; g1 U/ k1 X. {; N
    // 确定中断源. \. V  z7 U. N0 K% z
    int_id = UARTIntStatus(SOC_UART_2_REGS);3 a1 w7 I# Y4 d5 x: u$ r$ X

) F1 q* K0 ?% }) |1 t' B    // 清除 UART2 系统中断3 R5 `" s& c! h6 i1 v( Z, w
    IntSystemStatusClear(SYS_INT_UARTINT2);
3 g; B: J7 O% v( a5 _" `! M' ^& Z
7 X; c4 ]6 u) a( Y& |  S) l4 T: O  {    // 发送中断
' y; `  F8 |2 x! x. e5 k/ x    if(UART_INTID_TX_EMPTY == int_id)
2 R: G, |3 A. `5 n) a. b) `    {
' U  w: G5 V# x" E        if(0 < length)7 o7 _' e& @) I1 v8 e; Q
        {8 H: d, I  j3 [" R5 [8 H7 t9 I
            // 写一个字节到 THR0 x4 ?4 t$ V1 u6 }. A
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
1 s( i" a, G- B7 [* h            length--;" B5 n1 S  h! Z% u& d' _, l) U
            count++;
' O' L, D) h! `$ V        }# F) [8 ~1 c% I) L+ o
        if(0 == length)3 v1 p3 a2 Z& w/ q) J) N
        {0 u' B$ M3 f- V7 l
            // 禁用发送中断
& W; e7 O6 I! Q- O            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
) x* P$ D# s: U- g9 o2 Q        }7 B2 M  D% l+ P3 U5 O2 U) C
     }, c% p3 u# f& Y% J

8 Z" Z' H' {8 s+ p. r+ {: E    // 接收中断9 l7 Q" L  S+ @& w
    if(UART_INTID_RX_DATA == int_id)
+ F3 [& [! Z9 E/ r, Z    {
% p8 g1 b6 h9 R1 b8 y        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);  }9 h& G, V* Y$ t6 [- }4 A. |

- L* N  U9 C  n- z        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
- Z' }) [' M1 H; I% {2 d    }, U, c6 c  x6 f  q; g

+ ]2 p# D# k( Q! {5 g$ P/ |    // 接收错误# q' }  m7 S3 O  m3 u+ r/ y- Q& H- B0 L
    if(UART_INTID_RX_LINE_STAT == int_id). m* P1 X! Y, W! e
    {
& \* \4 I# S3 O) J5 y. k        while(UARTRxErrorGet(SOC_UART_2_REGS)), D1 t, v! o0 r7 ?. H  W9 j3 ^
        {" H9 M4 t- k+ v, y. Y. R% X+ h
            // 从 RBR 读一个字节
$ Q" C% a& e: I; Q/ Z/ O" N            UARTCharGetNonBlocking(SOC_UART_2_REGS);. c" @# f. R0 m. @
        }
" i9 A9 V' b: R/ M- |! R    }
9 `3 i; q  J9 }/ y2 E$ S% C+ A    / |" X8 U, {- G, K
    return;$ y  ]3 m4 H6 [" X1 Z7 f
}9 e3 {1 h4 _  B+ z9 p

作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25( r% t/ Q" b* F8 Q4 M3 s
如果其它设备快速给你发送串口数据,你这边能正常通讯?

' k6 j7 j/ k! `5 E/ _谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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