嵌入式开发者社区

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

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

作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
9 }5 @( B) \. b. C( @/ z0 S8 t, z7 L) a9 G0 \
#include "TL138.h"                 // 创龙 TL138 开发板相关声明# a# W# i- K7 [9 A# k
) z- R1 Z! w3 R' E
#include "hw_types.h"               // 宏命令
& `; r4 N( R, @#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器' L& t6 f& N6 C6 G5 S* ^: B* v
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器! u- x" ]$ N/ b* G/ N
0 q- o, K4 C/ f6 O- X2 j+ I5 X( U
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
3 s7 S+ I/ e) r! q#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
& t3 R9 b' Z' m4 M7 G#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明2 f2 Z5 C4 q  t4 O+ L& X" a, b
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
) Y0 y6 a( a0 p) j' @" j
* z! H4 j* Z/ y9 ^/****************************************************************************/
0 G: T" J/ I( y/*                                                                          */
. ]$ q. `" O8 J" `+ y& B+ y/*              宏定义                                                      */0 y% ~+ b  v& N  V- i% U
/*                                                                          */2 X( A# i/ v% \& r% c# s
/****************************************************************************/, c! c$ ~. B, |  i3 x
// 时钟; V, z1 |$ ^- L8 p
#define SYSCLK_1_FREQ     (456000000), O# M2 L' C' I- S0 E$ K2 n
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)3 n0 v3 |6 ~9 I, V+ p9 \- R
#define UART_2_FREQ       (SYSCLK_2_FREQ)3 T2 N+ L1 U# E1 m& p! @6 A* j/ n
" Q  z  n! e3 M5 }, G6 F% S0 C$ M
/****************************************************************************/7 f+ F+ }- _/ `9 J9 b
/*                                                                          */, h- }/ N4 {) ]/ h) U4 Y
/*              全局变量                                                    */
6 d9 o( W* r: b3 e5 @# f5 m* ?/*                                                                          */" i' L8 _( F- l/ w) R
/****************************************************************************/
* b* t( C% P8 x  Z$ @/ xchar txArray[] = "Tronlong UART2 Application......\n\r";0 ~( R% l) \0 j' z1 L

" ^+ P, I( I& B' K! |$ j/****************************************************************************/+ W( \. z! u! b$ T: M' @( d1 H- I
/*                                                                          */& P: g8 ]5 O. Y
/*              函数声明                                                    */7 g9 W3 R8 Y6 q$ W
/*                                                                          */
4 u% m# ~9 d" e$ y7 W8 Y0 V- l  G/****************************************************************************/
; f6 Q5 t7 S! [1 B6 v$ P// 外设使能配置
# I: d2 B/ Y$ D# u4 C3 m3 N6 tvoid PSCInit(void);. T/ u' B% e* L: s: D

- M! y* L9 ~; \% M4 s" o( K7 K// GPIO 管脚复用配置
/ {; F  ?( m$ V3 n, S: D# Dvoid GPIOBankPinMuxSet();
1 D; i/ `) L% n' ]8 S; W$ w2 ]+ j" d/ d% v4 F  I7 s( O% O
// UART 初始化# i/ O7 i) q. ]8 @; t  \
void UARTInit(void);
2 r; P4 G1 v7 Q7 j. f! \// ARM 中断初始化, O" p4 P3 u8 N" W
void InterruptInit(void);! e8 A1 ?% d6 r, N) C0 }
// UART 中断初始化+ v7 b/ `- ]' v, G/ Z- _
void UARTInterruptInit();$ L* {1 j8 {; F+ N& K5 ^
// UART 中断服务函数
8 d8 Y, c1 Y; `3 ]void UARTIsr(void);1 D7 N: q- d6 o: X8 B, k

0 |4 R1 E" \5 e3 n/****************************************************************************/+ ?% R, w; _8 y, D: A% [8 Y8 X% ~
/*                                                                          */$ }3 j/ s0 p, l3 q6 b. {
/*              主函数                                                      */! O0 z" Y) i# ?& @+ v6 ?" ]% g
/*                                                                          */
2 z- m" T7 |1 y. F3 I4 o+ \) {/****************************************************************************/
& N* N( G& i: P; ~int main(void)
3 U' M5 h3 E0 k! m1 T) p{% `, j4 j; [2 E6 C! E
        // 外设使能配置
' T- P& f4 Y8 p8 @( Y        PSCInit();  }: `+ r; i  q) W: |$ U
        ; F$ ^& u" j. i( g) g  e5 }
        // GPIO 管脚复用配置% F# s% E3 K3 S; D8 m  ^
        GPIOBankPinMuxSet();7 n, U9 A& T5 M  n8 x( y

$ v/ T8 f: H, Z        // ARM 中断初始化
% V8 \! h/ ?; o        InterruptInit();+ Q7 R+ l. f3 `$ z6 S. U5 j  Q: R

5 S* J  F6 Y% {0 A% h  s& {        // UART 初始化" W9 Y7 u4 i( |
        UARTInit();
7 k2 u, s1 {2 w) N! @% J
" N& F, j  q' o: }        // UART 中断初始化# S% H+ q) U; u
        UARTInterruptInit();
' j0 ]/ H% C2 B! W! T* {9 C, g4 o/ ?3 y% p- {; @0 a
        // 主循环
% w$ l/ n% W$ M0 J; @        for(;;)
( [3 {& r, y) K( Y) b7 S( G        {
+ a3 e/ k+ ]5 @- v9 s9 k# C8 j* i8 N4 `
9 f4 F/ q% j0 M0 S4 V( j        }4 m  H* @5 u) K) B- n* R
}
! ?4 q. Z0 y! G& i# w: V" |6 @& _2 F7 S9 t
/****************************************************************************/
7 C: X+ c$ ]9 I% F2 A2 U/*                                                                          */
) L( l) _+ @) Z& m% C/*              PSC 初始化                                                  */& J0 I7 |' A1 [
/*                                                                          */( ?3 e6 ~& C% ^% |& I; @( J# [. s) V& R
/****************************************************************************/
& I6 d$ x7 U4 fvoid PSCInit(void)
; E+ G9 b( D& k- L; v{
( c  Z' S  o6 O! m- M, f1 X        // 对相应外设模块的使能也可以在 BootLoader 中完成
3 F2 o4 w8 I0 L3 v* j7 e    // 使能 UART2 模块+ m; |! [9 H4 _. N  `; u
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);' o: Z, A# q& c% O) X% [6 g3 O
}
/ J/ F, P9 g- ^( C# W7 b" z
& ]% [$ C( \+ g+ z/****************************************************************************/  L+ g5 V$ i7 X  }2 i% c8 v
/*                                                                          */1 e& |/ f# ^' W# c
/*              GPIO 管脚复用配置                                           */- D8 B; x3 P# \+ n! s! g
/*                                                                          */: z1 j/ `& \+ O; o6 n6 B. b% O4 ^
/****************************************************************************/! [% O+ P* P/ t+ J% s
void GPIOBankPinMuxSet(void)
1 g- E( d) S6 \  a: _{% D# S) a; A+ W7 g
        // UART2 禁用流控
) @2 s4 j) _' P3 ~% ]        UARTPinMuxSetup(2, FALSE);
3 o4 a; Y" ]5 C* U}
& I  s& y  g6 R7 K0 F+ B$ z8 h
/****************************************************************************/4 f# r* k7 s$ z, v* k
/*                                                                          */
4 F) v: T- R! H0 V- a/*              ARM 中断初始化                                              */
3 k' s  D, W1 J5 E% b# P/*                                                                          */
  M2 d. J8 y/ }; C) z/ n" _/****************************************************************************/
! X% e+ ~5 A) i, @void InterruptInit(void)
3 y1 ^  q1 _; J! I9 k: @/ L{
1 P- n' i( U+ w1 I7 T    // 初始化 ARM 中断控制器
8 P7 U5 T, T$ {+ k$ g! `, c    IntAINTCInit();
& l& S( }6 V# Z3 o) g/ ]" ~0 N$ {3 t; _
! ^3 m! |* k% W- a    // 使能 IRQ(CPSR)
8 v8 b$ S7 {' }3 A9 q& o    IntMasterIRQEnable();
0 A, S) \# _9 L) o* W0 F2 [0 `% i0 i. q# R
    // 使能中断(AINTC GER)
  E( _/ S! B, H7 k    IntGlobalEnable();
. g0 w; S0 g/ i0 h0 b- s5 Q2 p+ u( q4 O; v3 B
    // 使能中断(AINTC HIER)9 \& A) K" p5 U6 q8 I. g5 N- Y
    IntIRQEnable();5 E- ]$ r$ M0 r: o! W
}7 a! W$ Y( z* {' r0 R

& C+ C0 J" }& `# G. F3 r  ~& R8 j+ {" \/****************************************************************************/! u- U; |4 K* r3 B7 X% H, y
/*                                                                          */! y( k0 \" a% V4 ^# D( _% B
/*              UART 初始化                                                 */
- ~; G+ ]; I: Q- U  Z0 g/*                                                                          *// @0 H7 |' t+ }3 Q- u1 i
/****************************************************************************/
; v+ ^' k8 _! g8 k+ Evoid UARTInit(void)
1 T# U  v. S5 J4 w- u3 I{
; ]& c4 F& @8 v' K2 o" q        // 配置 UART2 参数# r1 r1 h6 x2 L4 s9 j! ~/ K+ @9 ~
        // 波特率 115200 数据位 8 停止位 1 无校验位
) z1 i. m9 B$ v# U" U7 ~    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,- r' z  j( g3 Z( j; l& K
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
. U& ~7 ]; ^4 e/ ]        // 使能 UART2
2 z0 R5 P6 a8 B( Y, F, X& d        UARTEnable(SOC_UART_2_REGS);3 U& X. d2 {  d0 t  A9 z

% b3 g' I2 I- x( A1 y+ ?  _/ q    // 使能接收 / 发送 FIFO
2 S; v! U" `7 |- P% p+ h4 I    UARTFIFOEnable(SOC_UART_2_REGS);* Z6 i( g9 w( e) U) ]9 k$ W+ k7 I; {

6 |! o( i1 V- T" [3 X* p    // 设置 FIFO 级别5 {9 P; t( D; W6 Z3 f
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
! G1 G0 ]6 ~7 l' Q& j+ v4 S* e& [  {}
  a2 t/ {- ]1 i0 I. h' A( f" w
! v, O3 o( i) f( J7 g1 U/****************************************************************************/! k) `1 ]2 {' O0 w) z* Y+ _
/*                                                                          */) w. b3 w/ \9 c' s0 @- g8 u8 x
/*              UART 中断初始化                                             *// X. d8 a* X* {) Q* v
/*                                                                          */
7 K9 a+ `/ J+ H! r; l0 P+ Y/****************************************************************************/, n- ~' v8 J0 Y/ \! S
void UARTInterruptInit(void)1 W6 T5 M3 W1 Q
{4 d: C4 e  t/ V# E; S" g
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
( X: \, ?, o  S& F! t, U        IntChannelSet(SYS_INT_UARTINT2, 2);
' }2 X- |7 Y9 f: s6 X7 W; ]" U% c        IntSystemEnable(SYS_INT_UARTINT2);
- h+ D# n. e+ H  G1 l* `+ w
  v# ~( F& }7 i        // 使能中断
5 r9 E+ P* |1 `% |8 j* o        unsigned int intFlags = 0;, n# v  g! y$ h% R* }5 l
    intFlags |= (UART_INT_LINE_STAT  |  \+ Q: X; [- ?, m4 c! l
                 UART_INT_TX_EMPTY |    \, a; R% V2 R0 _: b% c9 }4 B; u8 o# j
                 UART_INT_RXDATA_CTI);7 ?1 O# _, C3 q* n0 V/ b; v$ ?- t
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
0 a' r. T  t: \6 l0 b7 N7 p$ `}
) }* @( y! \" i# u! E) G* e. A4 ~0 F
/****************************************************************************/5 \9 l$ R0 h2 T( R1 I
/*                                                                          */
0 H+ h: S5 {' H( r- Z5 X6 ?/*              UART 中断服务函数                                           */
( m4 V! w: J* w& u/ W7 S. E& u/*                                                                          */: X) T: b; P3 l7 a. _' o
/****************************************************************************/6 Q5 r+ y* N4 b3 Q
void UARTIsr()
( W& ^0 Y6 h* I2 N{
6 p0 R( }( Q  F+ ^5 j& l    static unsigned int length = sizeof(txArray);' j! `2 N7 V8 m( m" s$ \. n! [7 k
    static unsigned int count = 0;
9 y8 E2 m% y8 e- O8 O4 A8 ~    unsigned char rxData = 0;
, T6 T" C9 S7 G# W    unsigned int int_id = 0;
5 E4 D2 P% s7 e3 |! ~8 E* t! u0 |2 T; W1 x+ _! o$ `9 p' X
    // 确定中断源5 b* l' G/ P, F5 y+ _4 O: S: _
    int_id = UARTIntStatus(SOC_UART_2_REGS);
+ b5 |1 y+ m. J! M" Y9 I- o; Z$ K+ w$ p, h! o7 R
    // 清除 UART2 系统中断
; G' \/ H8 A9 Q; x4 l# E* }1 m    IntSystemStatusClear(SYS_INT_UARTINT2);
( s: F" p% g9 I( j- s0 G
7 g' m" r: }/ O+ d. J, M    // 发送中断6 m& R: p7 T8 ?
    if(UART_INTID_TX_EMPTY == int_id)7 n. D$ @0 |  l/ f2 K
    {" ]) O; ]- y0 @. {+ \
        if(0 < length)/ Z0 t# H# `* w" _2 J( F
        {
! L5 _+ a+ \$ {6 X; k2 ?- U& u' ^            // 写一个字节到 THR* H/ ?$ |# z# d% e
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
8 ?2 |2 S% ^9 O( c            length--;* ]+ f% P# I! e* m  C
            count++;# k% `3 A# J* x* }) G
        }
; ~8 }0 \- W0 A' c( P* U        if(0 == length)
' f! m3 v( J. Z" Z        {
+ T" i; b: X( v* T9 V6 p            // 禁用发送中断$ B' N9 F& s" r  p7 h
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
1 b9 R: y% y2 F0 M4 H" e        }
$ D1 ^$ W* n" I: x( ^     }9 C0 `& i& ~- a4 f, Y3 E( m+ t- F8 ~, ]
' D$ ~2 u. L' Z9 ^
    // 接收中断
1 F& H* x& p' G. e    if(UART_INTID_RX_DATA == int_id)- _( R0 P. \$ f# h0 l# [4 f5 j
    {
$ K! T9 ~+ a3 @/ O7 y8 `+ |0 D; q3 W, c7 d        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
+ R2 |+ o! t: Q1 P& T3 p0 `8 U8 s/ |- {
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);; N7 O; K3 ?/ {1 Q
    }
" i+ I$ x8 X' V5 H& m' |$ y% C2 @/ b& j; o8 h
    // 接收错误  N( m- @4 B+ G, c0 P2 M) T7 |
    if(UART_INTID_RX_LINE_STAT == int_id)  X6 V& i. _5 t4 C' O
    {: D) s$ }  H1 ~' i" B) }8 c
        while(UARTRxErrorGet(SOC_UART_2_REGS))
' v6 W$ g4 M+ Y$ K( Y        {( C* D- I. y& W) r( C! o, H3 ^
            // 从 RBR 读一个字节
. j" x0 E- d& A2 C            UARTCharGetNonBlocking(SOC_UART_2_REGS);2 @4 b" G+ p4 r; d* V( F7 _
        }
- L) h' j- A3 I3 m  D    }
7 V7 g+ D6 \" e   
( L, R* ]- o* r8 G& G, s    return;4 p" M/ i& i' ?' X" L. D) C& {
}2 `0 q& Y5 O7 e+ X; c5 a

作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25
  T# B$ d9 Y8 Z  u. s如果其它设备快速给你发送串口数据,你这边能正常通讯?
% G4 `; k' v" g7 n
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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