嵌入式开发者社区

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

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

作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
: K$ U$ a" D" K3 o$ s5 S- h9 ~; z. z  V; ?/ o0 P
#include "TL138.h"                 // 创龙 TL138 开发板相关声明. N6 z, S2 Z5 }* L/ D. M$ F8 j
/ V# r3 V3 q+ ]5 C0 @# ^4 L( B
#include "hw_types.h"               // 宏命令( n# [" d9 G  P! A7 P0 ~
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
4 ?; u+ q  @+ T#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
  r/ m4 h) M1 G7 z" `' f0 O0 [+ q6 ^. R- j0 W& k
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
, B' s& c7 V. c" k#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明/ x5 e& [: ~! o
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明1 v) C% [$ f5 }2 I
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
( ?1 H  E& q( ?- I
! B4 F% p! d( G4 t; k7 O  ?2 u/****************************************************************************/
2 m9 o" F) s6 H# T  a$ `3 i/*                                                                          */0 G& s9 X" r) S+ ]
/*              宏定义                                                      */  r1 B% x  a7 E, @- |+ o
/*                                                                          */
- g3 w; q  G" C$ j0 |/ H! Q; Q/****************************************************************************// v0 O/ \# K$ E/ w; j  u+ E1 r: o+ k
// 时钟
5 c+ w& v& V- b8 ?! b$ U) p  b#define SYSCLK_1_FREQ     (456000000)% [! [) D0 e- l! Y- ?& f8 J/ c
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)+ u' A; Q# U8 A+ [" D
#define UART_2_FREQ       (SYSCLK_2_FREQ)
- C/ q! \0 I, D6 B) q3 @6 [" q- E
. O: \8 }0 t, T/****************************************************************************/  u  s  n% M3 n0 m: x/ s/ O
/*                                                                          */
1 ?- M' F4 c7 m# C3 u. n1 R1 Q* Z/*              全局变量                                                    *// K  @0 S7 ]; X
/*                                                                          */
! q5 m) s9 `/ d8 g/ X1 f/****************************************************************************/
3 V, R; \" D* l: N6 a2 a" q1 ichar txArray[] = "Tronlong UART2 Application......\n\r";. g1 [' @% A" G
1 b$ Y; c8 ~8 Y, D
/****************************************************************************/
# V, N- H) a+ j5 y: N/*                                                                          */
  l. z0 T0 W! L& {4 i/*              函数声明                                                    */: S' p3 l* d5 w6 l. j- x1 n$ Z* G
/*                                                                          */
% N; I' [% ~% W/****************************************************************************/
* q8 s/ Q, |% Y  \, \// 外设使能配置
) i7 n9 G8 Z1 U. N1 x' Svoid PSCInit(void);* m2 @+ B3 E& m, ?( m; {4 b- {

3 `' T% q* z7 P1 c) c( c' [( p6 n// GPIO 管脚复用配置
/ v, J1 S8 A) P' A$ zvoid GPIOBankPinMuxSet();! Y9 l# M1 V. x9 \# H: {

* m" @$ j( q% I  F4 ?// UART 初始化( n$ d& z( m6 ]  u! t+ K6 e* Q9 G8 n
void UARTInit(void);& E- O/ }1 Y1 K9 v/ R
// ARM 中断初始化4 x% H$ i8 N5 h& @! ]) I
void InterruptInit(void);( ?% E3 {; t4 ?: a
// UART 中断初始化4 F9 G# Z0 F6 h
void UARTInterruptInit();, J/ k5 W# c& s, X$ I* [
// UART 中断服务函数6 U4 q) B4 a- z; s2 w5 H
void UARTIsr(void);
9 d8 ~7 A) u* W& ^- f/ p6 ?+ i2 L& i
/****************************************************************************/$ s( c$ q% r2 L: W. C) U4 [
/*                                                                          */
; C/ Z# e, Q1 u9 {- T/*              主函数                                                      */2 L; ]! K# N5 E$ r  `5 |
/*                                                                          */
3 k5 e$ {9 R  t: f* F/****************************************************************************/2 w9 r' w8 [' A1 J. c$ E
int main(void)
6 L+ g! h- s4 q3 x  T' b* g{5 l* S$ ?* s* U0 u' ?' S
        // 外设使能配置# M; Y, h; a! K2 P
        PSCInit();
1 N8 L) d+ o5 H, N9 T& U       
3 n. m: r+ k- k# f1 ^! W" l/ M* ~        // GPIO 管脚复用配置
- P6 Y' m! `- P( p9 f9 t        GPIOBankPinMuxSet();( v6 q8 l9 s. w2 t, r

6 w$ W5 }1 q' i& f* H        // ARM 中断初始化- ]5 R7 G% F# e6 |% Z& K
        InterruptInit();
$ I$ L7 c; H1 Z' x9 x4 B- C% V1 G$ g( u$ ?+ W0 z
        // UART 初始化& Y  H# f5 y- B. T# w! W$ Z
        UARTInit();
9 [: V% F( @1 ?6 l$ ?5 A6 \6 Y: w5 i' L( A  D' T6 t0 ]. S
        // UART 中断初始化& a/ b- p: h$ g" f& p, t
        UARTInterruptInit();( V* `! z0 c4 |3 X3 ^2 U/ P5 l
. a' f+ r( ]( _& h* l/ Z6 j
        // 主循环) q8 R0 C! M6 e  C" k1 N4 H
        for(;;)5 O4 j4 R$ T( Q6 u; i5 C
        {/ S0 m" i" H: C5 e6 Q5 O: v
, V  G7 m+ g+ @5 ]  k
        }8 E. T( F0 p3 W5 |0 P4 j
}
7 v" V7 F/ a7 g/ ?( U0 W2 L$ q$ q- I( K
) L/ e5 d; _' e* U+ _2 A/****************************************************************************/
* G8 o4 Y, L. O1 t0 z/*                                                                          */
9 C6 L7 u- i3 q) |, F- v/*              PSC 初始化                                                  */! ^9 X6 m9 M% {1 Q
/*                                                                          */7 H: O' V2 H9 K, Y. O' Q: K
/****************************************************************************/4 F0 b+ L; k6 q5 P# A! L8 G7 [
void PSCInit(void)
3 r. k6 |4 `2 k{
( V( d8 Q' w' g: @3 ~* u9 u        // 对相应外设模块的使能也可以在 BootLoader 中完成, _: {% o9 S1 d' W, o8 \7 b
    // 使能 UART2 模块& v/ w# @8 o: H7 _! y2 k& S. }9 c! i
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
4 T1 x4 A! N7 O  L2 V. r, ]" _' z}
  X) h% Z5 U0 C0 o  e2 `+ ]2 M9 `& R1 p+ @
/****************************************************************************/! N# w  _) S5 _6 c, ]+ o& h
/*                                                                          */
7 G) O7 Q4 B8 q: _0 Y: e: E/*              GPIO 管脚复用配置                                           */
; p, \. Z# v* S$ n: D4 P/ i. u/*                                                                          */
1 S+ y5 t/ b. z8 n% G, |- k& ]/****************************************************************************/
/ \  ]! _: w  i! [void GPIOBankPinMuxSet(void); a: B' x. y2 p1 d$ e$ F
{
% @* s) h& L/ X9 _% b+ W. ?+ a- E        // UART2 禁用流控/ L; X9 I; c1 v% \# Y. @
        UARTPinMuxSetup(2, FALSE);  a, i% O; K+ w3 X
}+ B: O0 f  y: q* h  F2 _. M! f# g

- Q. n4 {7 D* t& Z  `' `  o0 p; F/****************************************************************************/+ _& E0 H. Q7 p2 `/ E0 i* f9 _
/*                                                                          */3 \8 m0 M9 x( I9 F" @1 Q& x" B
/*              ARM 中断初始化                                              */, H$ q) L# ~9 H6 `
/*                                                                          */5 b0 w8 V$ T" E* A6 F! c6 K5 c
/****************************************************************************/5 a0 {9 K2 Z7 }! n+ S
void InterruptInit(void)  B. y0 x# A; B: G) ]
{
+ J( e* |* ]4 W2 a! f* Q: H    // 初始化 ARM 中断控制器
5 l) x( C7 m- {) G0 J( v; K  w3 S    IntAINTCInit();& T7 b' {: G6 v4 n" p" Y: n

2 i/ M4 M7 q. d; v% M; h    // 使能 IRQ(CPSR)
8 q7 g0 o- U$ _" `/ F    IntMasterIRQEnable();! L  }: I1 C  {, m1 Z' |  L
3 l" `  k5 p) p% U8 h& w
    // 使能中断(AINTC GER)) n4 |" Q/ i4 {, W, D; C
    IntGlobalEnable();) M( N. y( C( u

9 B. V1 ]* Z4 v& ]4 s( F    // 使能中断(AINTC HIER)6 c/ A* e; M+ Z
    IntIRQEnable();6 K5 }& R* n1 f
}7 s5 ~1 I+ T0 P0 T% |! Q9 U

$ ?" t8 I  t+ S9 p$ \7 k3 ^2 p/****************************************************************************/; r" x' @- [+ e" R. \
/*                                                                          */
  n" H! e2 E8 v9 N: X2 V7 u2 u/*              UART 初始化                                                 */) T2 `6 {3 \. _
/*                                                                          */
. r, o9 E8 M9 }7 P! y/****************************************************************************/
8 E; L6 F: w+ q" l6 mvoid UARTInit(void)6 x4 G' z7 v7 W. Z0 u- ]
{
4 J6 h" c# \$ M, Z) K/ E  ]        // 配置 UART2 参数- L! k+ Y' Z) Y6 A
        // 波特率 115200 数据位 8 停止位 1 无校验位
; O8 ?) t! j+ J( O" k7 K. o9 [, e    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
% \' C- \% h; ~7 [                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);& i- _' R$ ?+ d( T" J. Z5 ^$ C) F
        // 使能 UART2
' S+ s! A: f5 R3 R        UARTEnable(SOC_UART_2_REGS);$ W8 M+ s  A+ Z( g$ k: m6 z

, p6 }, f, \# @9 v    // 使能接收 / 发送 FIFO
8 O9 Z8 d4 Y7 q4 B5 l7 y    UARTFIFOEnable(SOC_UART_2_REGS);
1 t5 c) K0 S. x% u
0 N# K' n/ M6 E, \; O2 s    // 设置 FIFO 级别
" x$ a1 h! H% @9 L    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);7 c4 X$ @" e- c  R$ f
}; @: n4 c" {) K* o3 b! O8 K0 h

% P9 K% ~2 V8 N4 T" Z, ~8 C) x/****************************************************************************/, W) N; }* R" r! y) i
/*                                                                          */; q. H/ ]* Y1 a' {# M- X5 |, E7 a
/*              UART 中断初始化                                             */( L$ Z, `" t4 W6 H( O
/*                                                                          */" M# c: {8 g) V  o; O/ L" G+ }9 Z
/****************************************************************************/0 v' q- K! c# @1 U
void UARTInterruptInit(void)3 [0 C0 b6 `' D3 N0 |# [/ [
{  ]3 ]  t5 c- ~2 q
        IntRegister(SYS_INT_UARTINT2, UARTIsr);3 r& p% h7 ?, B/ y% |
        IntChannelSet(SYS_INT_UARTINT2, 2);
/ T6 ~# x6 {: g1 Q/ }        IntSystemEnable(SYS_INT_UARTINT2);; V5 X" S- z8 J3 U' ^. s1 l

6 F/ o* o' L% R3 z4 n+ B) g6 I5 w        // 使能中断  s. h& J# V7 [& g9 F# |- @
        unsigned int intFlags = 0;( X$ c$ j7 ]' h' I" E0 p
    intFlags |= (UART_INT_LINE_STAT  |  \! t0 d0 j/ n1 T* @2 S2 S
                 UART_INT_TX_EMPTY |    \
$ q, E; @% Q% v' E  a                 UART_INT_RXDATA_CTI);9 w# g8 i: R" [3 I+ m3 Y3 p+ u
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
( @' D; w! P& f}, `" ^5 ?" @+ s1 R; h1 A4 H) a" h
+ }7 u% G, c8 ?, _
/****************************************************************************/& K6 @  w) ~6 S" L& ^
/*                                                                          */
( k  }: g: g* B5 Q* V. E/*              UART 中断服务函数                                           */% N5 C" C. q! `* z3 Y/ P
/*                                                                          */! ]$ I( _! w+ G& K( O
/****************************************************************************/
4 i& Z& W( |% ~4 c, }% X5 {$ xvoid UARTIsr()
4 m3 s0 M2 D+ [2 v% b, R+ {3 d{6 Z) M7 C, R4 t# S& N4 S
    static unsigned int length = sizeof(txArray);
2 F0 E3 h. n6 Y2 \  [) O1 R3 l    static unsigned int count = 0;
  D; s7 X5 f8 L% n" m7 p    unsigned char rxData = 0;
0 o/ }+ Y# h  U7 k4 d    unsigned int int_id = 0;* E2 Z. j$ `1 s: f4 ~

$ o3 `) @4 t3 g9 i5 V. _% Y: W( m    // 确定中断源$ Q; K3 N+ P% @& d# `
    int_id = UARTIntStatus(SOC_UART_2_REGS);: [4 Q% m$ M' B! F
' Q6 @8 a( r0 N% v1 Z0 d( {* q
    // 清除 UART2 系统中断
( j4 S$ f- {0 G. E$ }+ F* A. p    IntSystemStatusClear(SYS_INT_UARTINT2);4 w" N- @+ l0 J5 H; z3 w+ P3 U
6 G  B7 r" L+ @4 E
    // 发送中断
' M; b5 v, ?2 t3 q4 n    if(UART_INTID_TX_EMPTY == int_id)
. ^5 z5 r  `  I. w    {
; ?0 L% P! E4 }* ?: x1 E+ l( X        if(0 < length)
: I2 p3 w+ X7 l; o" Q        {
/ B) ^* B+ \+ x1 x2 F# ^            // 写一个字节到 THR
+ b4 c( k2 x! N8 r* u: g' \; K5 Z            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
, O7 b* f$ ^7 b            length--;
# h2 _( U% a; ~5 e6 m" A            count++;' j4 i6 j! j  a. v  e1 H
        }
# h1 U) `/ t' k2 k* C* g( r        if(0 == length)! B2 }  C+ ]1 p! q
        {
6 |; I/ j3 G( U2 t            // 禁用发送中断# l" p5 h; N4 _1 u" j: R/ q& q
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);, z& B: N( l  F4 \- p6 {
        }
, ?+ s3 l: g) E& j& ~     }
: X) Q4 T' v) N4 X, h2 B* L
. i; X7 L1 e( S& Y9 ]9 H    // 接收中断. y. Y- P/ T7 T' R9 K/ f% U
    if(UART_INTID_RX_DATA == int_id)6 [) U- C7 w/ _, ~( O" X
    {
5 F: z2 W4 v- h: o6 M6 e        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);! {( p( v( @7 b( x# W  s

1 t& \5 j% v& o- p; v) E' E' x        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
( v9 Z& t. R% ^) b  g+ r+ M! ]+ d    }
; c/ g+ X; S9 p7 K: l# i
- d4 v+ L0 G. d) A( o    // 接收错误) ]3 x2 z8 A8 R1 K% m6 b' J
    if(UART_INTID_RX_LINE_STAT == int_id)
; _; d6 ]* u+ S: B) o9 K8 m* l    {
! \2 m: M8 M) k/ \# ]3 [( v5 z        while(UARTRxErrorGet(SOC_UART_2_REGS))
/ j& ~7 l  p- |$ j, ?        {
# w* a' f( I+ P- y3 ~            // 从 RBR 读一个字节$ o& @, s8 F  p5 C: j5 a3 H
            UARTCharGetNonBlocking(SOC_UART_2_REGS);$ p  d0 `: Q! T, B. U
        }
+ t/ p% R! B# |8 e- C* b    }! o; f; i' v% J2 C' K
    , N/ u0 R# A, s. I
    return;
8 |, w0 Q. O! ^}5 h" [1 H1 t2 O. y  |

作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
* S% G% l- D: M2 D2 I% j% M! h如果其它设备快速给你发送串口数据,你这边能正常通讯?
2 F$ b% _) G1 h0 Q3 R
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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