嵌入式开发者社区

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

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

作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。  o+ H8 Y1 s) g" R/ Z

+ g; @& r7 G, c#include "TL138.h"                 // 创龙 TL138 开发板相关声明
; x( s+ c% O0 e# n0 @/ c. i6 r
6 S( f' Y7 g6 R: s! O4 f) U#include "hw_types.h"               // 宏命令8 t2 d( l6 X% X  c: I: w1 C5 D
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器4 m# S5 U  v, b/ j
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
9 r1 T* [, O* z) X+ e  u
2 Q" C3 S, y- L' c4 X. l#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明/ E6 a2 |; e" t1 b/ Z
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
# v( ?1 [3 e( e: g) z#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
2 ~9 g/ D2 N/ x0 y( q5 \/ k: F# X#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义( m) S# X: o: e1 i1 Y+ A
: [/ Y" b2 |* n" A( g! ^
/****************************************************************************/
) S9 [$ r  I  o/*                                                                          */# w3 `6 i* j$ f; M$ t
/*              宏定义                                                      */
. }1 ~2 K2 K7 a" Z/*                                                                          */
* c) K2 c1 T- _" a4 N/****************************************************************************/
4 \# |0 {' J  @( d1 e9 ~3 x+ `  s$ A// 时钟
8 y; Z1 X9 k5 m# n! g- i#define SYSCLK_1_FREQ     (456000000)) O+ L+ g/ k. ~& ?! }' X1 e
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
6 L1 H, _/ |! E) Y& ?#define UART_2_FREQ       (SYSCLK_2_FREQ)
5 V6 X9 B% K$ D- L8 H% v$ K
% ]" H/ K+ r& z. D/ p% z/****************************************************************************/, T/ f, [8 c: V) ?: n& h4 i
/*                                                                          */
7 J; p5 i& V/ I6 _. V: q/*              全局变量                                                    */7 w7 S$ Z7 |+ t7 Z9 V1 Q* c. l
/*                                                                          */9 o7 V$ c- O) F2 L; J9 t
/****************************************************************************/: h2 S7 A6 |; o
char txArray[] = "Tronlong UART2 Application......\n\r";
" ?6 O5 G3 x. y5 K
* C& ^. W! q4 w7 S" x' H- M/****************************************************************************/$ u2 N" R+ t$ o+ T8 ~2 j
/*                                                                          */
( _% b5 Y) X- ~7 L/*              函数声明                                                    */" j# P% [& ]: d. U- I4 y8 R
/*                                                                          */
' t; Y+ l2 Y& F+ J# S3 V9 }+ d/****************************************************************************/
2 ?( u# j- Z3 v0 _4 J4 O  t0 |// 外设使能配置! z, m: ?! c" S3 C. `
void PSCInit(void);4 t) s) X: P1 m5 V( `6 ~* l' a
0 Q3 ?# y( Q2 v: {
// GPIO 管脚复用配置
8 Y. Q0 T" d. @0 Pvoid GPIOBankPinMuxSet();" s- b+ N& L5 Z4 ?1 Z( e+ y/ C

2 |1 k: J" |9 @( `' ?; y. Q// UART 初始化3 K, {' `0 K! `, L5 v
void UARTInit(void);0 @& M  t5 ~; _9 r
// ARM 中断初始化6 K! j+ @# ]* z' n/ W% V: @
void InterruptInit(void);( H! i; F. L4 E
// UART 中断初始化9 k' C7 Y0 j, j" _7 S' u; X9 ~
void UARTInterruptInit();
$ }, u/ `( B# [// UART 中断服务函数
5 v+ d1 \$ P& t* N/ F/ g$ Q4 Dvoid UARTIsr(void);
; A# K) K( Q5 Z/ Z! I1 n1 [* @* B- @
/****************************************************************************/1 a2 h8 m7 p" \9 c
/*                                                                          */
5 O" R- \" R" t/*              主函数                                                      */$ y2 O1 Q# y( q* y
/*                                                                          */
  Z4 d1 `) A* J% O  C8 c/****************************************************************************/
3 e) v. J* v& L* G. xint main(void)
# M$ R( j3 c% Y2 ]{
' c+ F5 M, q- K: `        // 外设使能配置4 W! f- l- p' w
        PSCInit();
+ P( M) [9 A, Q: Z' {+ W, [        # j5 w6 N7 h) x) b/ L
        // GPIO 管脚复用配置" w3 y! E" k' B( V2 g% B3 W; z* N
        GPIOBankPinMuxSet();
+ f: a8 r! p( G4 N* `8 E- t4 [- g/ L7 B6 q; B% H8 V; T/ P3 J
        // ARM 中断初始化
( j* }3 l2 V0 @! t' p* v        InterruptInit();& j0 B5 v4 k" B. N, u
" T3 v" G) J- k9 V0 J+ ]
        // UART 初始化3 ]+ N9 i! `) e4 T. q1 F+ V% z
        UARTInit();
6 H7 u, |( [% ^) [2 j# B
4 q1 v% M+ _7 V/ ?& U9 Q7 W1 S3 M        // UART 中断初始化, O! J4 W% {6 E0 |$ {& y: Z) Y
        UARTInterruptInit();
. N( R* I  G6 Z. O7 r
) F# `" E- A9 O. j, }3 y* W0 E        // 主循环% B3 a/ k. C; `7 d
        for(;;)2 F! c2 I% ~( g) T$ d$ g* X& Z
        {9 o6 N0 a; I: |, h, _# G3 u

% W9 v9 V8 b+ K5 w% n! `# z: L        }
" G' J6 D4 c# U$ R* K3 }0 }}9 h  R3 c% X/ y. u& x4 d! G

% g' l7 Z: p- r; Q1 ^# S/****************************************************************************/
3 g, Y2 O* @1 F+ e/ }; m/*                                                                          */6 }3 E# ~. @5 D
/*              PSC 初始化                                                  */" N" Q7 i* c8 Q- j# m% i3 H
/*                                                                          */. n4 o# C: k4 @4 O2 ~
/****************************************************************************/. k1 f  G# S( O; B' n
void PSCInit(void)
( a) K3 b! M) l3 G{
$ B4 q; w4 f0 `  w# U, X* \0 c        // 对相应外设模块的使能也可以在 BootLoader 中完成
+ h9 n5 h& h2 P! ^/ }    // 使能 UART2 模块
  d- J8 B% [8 q' h    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);' Q: M. O' ^, `  Q- S4 Y
}7 [7 z% O. m# d) e
9 s; u6 U3 r4 N$ ^
/****************************************************************************/' B2 g3 x  h6 X
/*                                                                          */
/ _$ S" v! Z6 N/*              GPIO 管脚复用配置                                           */
" w9 y8 v3 Y' F6 j1 F3 a3 k* ?7 ?/*                                                                          */# A! t) k# i  c
/****************************************************************************/
9 R1 v1 {, x: A6 evoid GPIOBankPinMuxSet(void)
4 Y, A+ l! O3 w. U' W1 J7 r+ ]{+ A7 L1 g& A( U: ?& w! v( I
        // UART2 禁用流控. N, G5 C. {& }1 h' y. q3 Q
        UARTPinMuxSetup(2, FALSE);) l+ l$ f& g% d5 d) t( T
}
/ }3 p/ S9 I, _: g3 F5 S; T: b/ x2 v- t7 B$ f7 e, ^
/****************************************************************************/
1 A# z0 p) c: J& D- j" j( s1 J/*                                                                          */* p  \7 |' N4 u4 `- G1 ?
/*              ARM 中断初始化                                              */
8 \; S& c8 v/ X/*                                                                          */: S8 ]4 N& z4 O  D
/****************************************************************************/" }9 v1 m) r$ y
void InterruptInit(void)2 A% Y0 u0 G5 @5 Y0 w
{0 K6 Z2 u: q- Q4 L4 ]- O
    // 初始化 ARM 中断控制器
5 I; ^* O. V! E: z2 P% P    IntAINTCInit();
4 [; U4 S7 ]4 N- ^/ A1 q! ^5 h
  Q/ x1 W. l7 x    // 使能 IRQ(CPSR)' c+ [' ~8 h: z" p+ e5 y
    IntMasterIRQEnable();
  O/ ^: j. o$ [# c# W/ ?+ e" C0 S7 N( l5 V; q
    // 使能中断(AINTC GER)3 S) d- L/ `9 f9 n  _! C' N4 [6 y
    IntGlobalEnable();
7 h7 K$ o# X& y; ?4 Y0 a! p# w. V; a# l  p
    // 使能中断(AINTC HIER)  q0 |. a% N: `9 Q; j7 Y- V
    IntIRQEnable();
$ F" g6 I' b1 n}
! G: i7 w, K' K2 W
, W5 D, e! _. C: x1 S/****************************************************************************/' V& H0 X# W0 g1 y9 p
/*                                                                          */7 B; A  _# k$ P8 _3 x2 k3 A
/*              UART 初始化                                                 */
! w7 Z/ S+ K; t/*                                                                          */6 J! M6 K. ~6 e  C
/****************************************************************************/
4 Z& }% ^4 P6 x# a3 Jvoid UARTInit(void)0 ~' P* g7 U* S' s
{' Y3 I4 Q0 F* h9 w; _
        // 配置 UART2 参数
, O( ~5 g. r0 ?9 {4 Y        // 波特率 115200 数据位 8 停止位 1 无校验位( d& a  F; i' M& P& g8 a
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
. X+ F6 j4 m+ S7 C/ X6 k. [. n                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
3 y$ u# A9 q; H1 V9 x& |# u        // 使能 UART2
1 U3 @/ \, E- c! [9 `        UARTEnable(SOC_UART_2_REGS);
6 X, R4 `8 `$ ]' S- D( t# C$ O$ H5 c( V) N9 p
    // 使能接收 / 发送 FIFO
& o8 z. z& U7 u9 R% E    UARTFIFOEnable(SOC_UART_2_REGS);. T8 C; e- z0 \5 k7 W' e
! J' F  A8 Q" I) {2 `
    // 设置 FIFO 级别
+ G/ H* h# p% X5 c+ P! y% @    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);6 s0 q7 g7 h0 y7 m# ]' `
}
" T4 v7 Z1 e, L7 f2 C
) t$ ^* t7 ?+ {. E' n6 I7 ?% c/****************************************************************************/
) Q; u" q+ k. K/*                                                                          */# [5 g5 M5 ?; o4 r- z$ S/ j& H
/*              UART 中断初始化                                             */
. s' b, z- `" @7 m7 L6 @/*                                                                          */
. {8 P9 m6 l2 P  z/****************************************************************************/
8 C5 P. n' `6 H: w: |void UARTInterruptInit(void)
6 @  B$ g7 n' W4 ^, F6 ?' A3 t, s{
  |2 o4 M+ Q# \2 O( X: o        IntRegister(SYS_INT_UARTINT2, UARTIsr);: x4 j# ~9 O# \+ P
        IntChannelSet(SYS_INT_UARTINT2, 2);
- G- D3 S" M" g7 p9 c+ h( p        IntSystemEnable(SYS_INT_UARTINT2);! l8 o  j* f' k7 D0 D

% G6 L3 r: ~4 u6 l0 G. N        // 使能中断
( M- f8 R- |7 y& G8 r, S; r( \3 Y        unsigned int intFlags = 0;3 _# L* I9 p. r/ l% l  _( p9 I7 @
    intFlags |= (UART_INT_LINE_STAT  |  \) W0 v3 |4 p+ `% M, T6 o/ ^
                 UART_INT_TX_EMPTY |    \, o9 q% }# b' U6 {8 P
                 UART_INT_RXDATA_CTI);. ^7 |7 a  l( F  N
    UARTIntEnable(SOC_UART_2_REGS, intFlags);) a6 A9 L! }" N, g: i- ~# a
}
* A8 ]2 L6 y  h8 |/ s
- A8 a1 F( j- q5 K& a" }5 L5 z/****************************************************************************/
7 P- |5 l. Y+ f, b# P  t/*                                                                          */* p; {" s' c3 d4 i0 N
/*              UART 中断服务函数                                           */# a6 C/ u: W/ V/ U7 l1 Z
/*                                                                          */; p% L# p3 S$ J, y
/****************************************************************************// K3 r, b0 V0 k$ l0 Y  J" v
void UARTIsr()) {3 j3 q& ?1 S# R; y: M
{: j5 J! E0 h6 a1 M
    static unsigned int length = sizeof(txArray);- K; a8 u1 t5 w+ ^% R% U
    static unsigned int count = 0;0 O' s/ |7 u+ ?& M  N
    unsigned char rxData = 0;$ x( Y. P. y. j6 A+ g0 q4 ]. p- U
    unsigned int int_id = 0;
% M( s1 U' U5 }$ |2 H( u+ w  Q# ~+ p. y7 n# t: z- t# q
    // 确定中断源3 X1 K4 c/ B% B( j7 [1 g, y
    int_id = UARTIntStatus(SOC_UART_2_REGS);" v: P$ s3 R( v5 H' `

4 J6 i3 q! Q9 M7 k" r* v" f' h" d  ~* \    // 清除 UART2 系统中断& p' q6 K, M: L
    IntSystemStatusClear(SYS_INT_UARTINT2);3 V" m1 u, t0 \* _3 u+ J$ a) o

9 I3 Q! h. p# {+ `6 {# }    // 发送中断
3 a* ?0 Q, |* h' f    if(UART_INTID_TX_EMPTY == int_id)
5 E0 q+ i1 q/ A2 _    {
7 \4 z4 ?2 c  `. t( P        if(0 < length)
' G) w* k- L8 Z        {/ i- h1 f7 K% o/ ]6 p6 V# x/ y
            // 写一个字节到 THR
3 @6 u: E* ~% l            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);* S  ^2 q! O2 M7 ]9 g
            length--;6 C, d7 B1 X3 a) `- E1 e
            count++;. b" j" Q8 X9 i+ k. V# q7 x* }
        }$ g% m3 _% R( Q
        if(0 == length)
& X% {7 _' u/ D        {  s) `" v! M9 w: V$ {2 O3 h9 f
            // 禁用发送中断3 e( X8 A  }( O. t$ c; k: o
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);9 b# b$ w! c. `6 ]+ Z
        }$ H7 w7 C, F5 a9 J3 U
     }
4 R' [/ T6 A5 p$ _  C8 d2 ~! Q+ d3 @+ z6 q
    // 接收中断
- W$ A8 m2 i. H* V! n    if(UART_INTID_RX_DATA == int_id)
/ I! ^$ \% U7 \! d- a' {    {2 b2 {6 H! x! k* H3 D8 R
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);- I5 Q- y: Y" T( L6 k+ i
/ v5 G9 U1 m. g+ v* q% E
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);6 q3 b/ U2 |& N' o/ e3 y5 i6 L
    }8 q. _% ~* `; a' L6 U4 _3 w" {
5 T! p: v/ S5 Q7 b
    // 接收错误+ ^2 I8 ~) f# a3 N$ f
    if(UART_INTID_RX_LINE_STAT == int_id); q. X( A& h0 ^! k
    {4 C4 U, t" N7 o' y8 n5 @# h
        while(UARTRxErrorGet(SOC_UART_2_REGS))
& ?5 k7 u' l5 w$ u* k( n        {
& ]/ i. H& [6 N/ H6 S            // 从 RBR 读一个字节9 e) B4 r' I. ]# Z( ^( P
            UARTCharGetNonBlocking(SOC_UART_2_REGS);; h* Y( o/ @. C9 c
        }1 G9 ~3 \. [' H1 |% E0 @
    }5 ^( M, K% z0 [( u1 H  r
   
( D- n. \$ F, C8 U! J2 F8 [    return;
3 k# r/ h; O7 b}
, Z8 Q" T% B4 b/ X2 G6 e
作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
8 s4 a# x5 j* r3 J' b8 E# I如果其它设备快速给你发送串口数据,你这边能正常通讯?

; f* H* ?4 ?' e, _+ |7 e9 _谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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