嵌入式开发者社区

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

作者: 17390601072    时间: 2019-4-30 18:00
标题: 串口发送中断触发条件
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。[attach]5022[/attach]
. A- L6 J8 W; r1 w/ Z  t. c5 [
作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。5 n$ p! }6 s/ l
2 b8 @1 Q% S% D! S* q
#include "TL138.h"                 // 创龙 TL138 开发板相关声明  D; o6 ?2 i  i

8 b4 h* j1 c- ~* ]* q#include "hw_types.h"               // 宏命令
( ]6 v) v. R3 Z2 K6 ?) G+ P8 }#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器; H& p% \/ W! R  s' ~/ S2 f
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器4 ~; T* L$ k/ }8 ^
5 N+ o, ]5 m' l0 m# C- R
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明9 r2 l% Z! \$ ^8 k7 \* ~( J1 `
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明) i! v8 U3 E: ~0 n5 [7 x
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明( k+ u4 J, {/ p! k# Z' x
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
5 Q* m$ u5 H; v1 C$ f& R" v' W4 l: B9 ~- \5 M
/****************************************************************************/
; w/ U+ e  q, P. f/*                                                                          */9 u7 p- X7 X- G9 v" n3 `4 b
/*              宏定义                                                      */
- G/ w7 n. Q# g. U0 h6 j! v/*                                                                          */
+ A( h8 c+ C1 B, ]- l$ L$ p5 m0 p/****************************************************************************/
: p5 C7 A4 V9 K3 `+ ^// 时钟  M, b7 ~: |* s8 s5 B( Q
#define SYSCLK_1_FREQ     (456000000)
# L5 H; N) }1 d9 e#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
6 }+ n7 z3 t# B( A4 S! q. d8 z#define UART_2_FREQ       (SYSCLK_2_FREQ)
! R# S4 _7 o8 A1 S; J  E1 ]% G
, F: ]8 d* O" S  G. I/****************************************************************************/
& F0 `0 d0 _1 H' P( p/ d7 k8 `) X# o/*                                                                          */. ~! J1 v, z# n, C, V4 i9 t; ^
/*              全局变量                                                    */
/ a3 v: h  n, }( L: C0 E# d7 `/*                                                                          */
. R/ ?+ b* Y1 V- s4 b/****************************************************************************/+ j8 t$ Z4 O; B1 [, Q4 a* h5 @& |
char txArray[] = "Tronlong UART2 Application......\n\r";# W4 f) @/ I  c( y8 O

  a. Q- N; z1 D3 l, P/****************************************************************************/
* G; ]$ q- Q7 m' F* p& Z2 A* L) v. Z/*                                                                          */
2 Q# g  v) I- c3 Z7 b, Z/*              函数声明                                                    */" ?, ~6 f6 M8 }$ _* M' `, H/ D
/*                                                                          */( E: k* L; S- P) ~: E
/****************************************************************************/& U3 R6 `& n- r5 g/ b" ]
// 外设使能配置( p2 ]0 E# x" l) |7 `; y0 H$ a* k
void PSCInit(void);, l" C$ R( d. ?4 e
% y) Z6 x9 z0 _; Z& p* z/ M& \
// GPIO 管脚复用配置' D3 X% ?0 \! l' L
void GPIOBankPinMuxSet();+ g' ]# S$ H1 k$ J0 h( A
/ y" t6 V% t- p5 i0 G" Y0 V+ Y
// UART 初始化
0 ]6 D% |7 D  {" V9 _; Cvoid UARTInit(void);, \" s( h  p. ?7 }  h
// ARM 中断初始化
2 r4 b2 {- P% r" _  [void InterruptInit(void);1 o7 N# y) F4 M0 V3 O% r* D
// UART 中断初始化; e: @4 N# i. n7 m) c4 M
void UARTInterruptInit();
: f! {4 }8 ?) I, a- ~// UART 中断服务函数: _! Z9 k! i2 ^
void UARTIsr(void);
$ }8 A, M+ V5 K0 ]& ~) x
8 I0 w7 ~2 ~4 f) \  W4 E/****************************************************************************/
. Q) s, z/ ~( p8 O8 Z' y  ?* z) w: b/*                                                                          */
) J  {( G9 d' C" A( Z/*              主函数                                                      */! s3 @2 t3 s% V$ [5 h3 o
/*                                                                          */; b! s8 e& z" Y/ E2 b- j, G. x0 V
/****************************************************************************/
( {7 f8 W; V7 q* q+ q. wint main(void)
3 T9 i0 J2 ~* ^( M2 D7 K% @1 [{- ^9 p( c1 X, q; @/ }* h+ ^4 I
        // 外设使能配置& l4 o* r. M% n7 N. u( \
        PSCInit();7 `4 |1 v5 B& i( C  _
        * `; _  Z% Y$ U0 ~: l
        // GPIO 管脚复用配置
. r% d  N* b* g3 f        GPIOBankPinMuxSet();
& s* w% S1 U9 d: @% ^7 Q2 Q) Q) [8 S5 Z% ^0 T/ ^5 H8 K# y
        // ARM 中断初始化$ J* n+ {0 S- W& _
        InterruptInit();
# z. F6 W* Z/ H8 h* F5 H- M. X0 [! r, P" M$ ^
        // UART 初始化
# O" c9 Y5 q# u$ C        UARTInit();
% b. V- ^" {. T- ]: J, i7 G; r) A6 I  P" f( z
        // UART 中断初始化
) b' A2 Q5 Y) Q  |- I1 M        UARTInterruptInit();
: m% I, \  r' b& j5 r
- N& O+ x: ~# K. O2 T2 E( W+ f; A, v        // 主循环
5 W+ r8 g) ~. v! E- w$ W8 J        for(;;)
" R% W5 R) Q; F0 @/ {. w        {3 _/ w: w7 b! w+ p/ ~
- N% z: c! Z9 g
        }
3 j; z7 U! ~5 O) g6 {}- p% Z' @8 `  L$ \1 B9 a; z6 ~

) c6 x5 ~" k) \, A' }/****************************************************************************/
0 t: n  z. o- N5 v' F. Y! U: z/*                                                                          */6 z, N) y% M3 u. Q, P: Q& [, R. R
/*              PSC 初始化                                                  */
. }# u, {9 N! R: q" e! Y/*                                                                          */
/ P- A+ c) j3 m( H/****************************************************************************/0 u, S8 N! z# W
void PSCInit(void)
1 r5 n8 O: l" w6 A{
  n# t! T' |- `5 x7 W        // 对相应外设模块的使能也可以在 BootLoader 中完成
5 W8 w7 ~# J* t1 G    // 使能 UART2 模块
( S, e: c8 @: V$ W. j' e    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
- M6 v9 n2 J4 y4 X7 N}' Q5 ~  _. @% c: R+ K( x
: K$ w3 M: Q/ {
/****************************************************************************/
* s0 k) h$ v9 h  n# }6 n' f6 i/*                                                                          */: ~% o& \2 A) w: |, `5 Q  [( b
/*              GPIO 管脚复用配置                                           */( j8 g5 E  F! \
/*                                                                          */1 p2 z) h+ Y1 ~& s/ [
/****************************************************************************/
6 {) w8 h5 n$ F! J4 F0 i! ?0 G0 `void GPIOBankPinMuxSet(void)$ T6 j7 ]! o# Y
{/ g1 f0 C. U/ g7 L
        // UART2 禁用流控2 T# ?8 T* N9 W$ U
        UARTPinMuxSetup(2, FALSE);6 V/ q& C: u  I: @# @
}
& o; O2 m) p: P9 y& o0 N
; ~6 {9 z, }' ~; g" ]* X& F/****************************************************************************/
3 ~, d6 Q) B9 d- E" M5 g+ c/ H/*                                                                          */% Y  q" S# Q0 J1 l+ M
/*              ARM 中断初始化                                              */; f3 k0 _4 g+ t& `; a
/*                                                                          */3 K: A" ^0 l- d3 B, Z: j
/****************************************************************************/
/ E$ ]- |5 D" E' {6 B/ o4 ?void InterruptInit(void)
' C0 c3 l3 [& S, \4 I4 C+ \- ^; o{
  G" K3 O* o( a    // 初始化 ARM 中断控制器' }7 [* w4 o2 V9 b4 T! d0 j% h& _6 {
    IntAINTCInit();
% H+ A' X/ {/ j9 P5 {8 j' s) r  \" ?# n* n# {! O) Q$ t: I
    // 使能 IRQ(CPSR)
" R* I, o* w1 c- g+ _! e: ?    IntMasterIRQEnable();
1 t' ~) ?( J! ]  _; p/ n* M  s
  E2 a% ^* V. i    // 使能中断(AINTC GER)$ v1 z& d: W8 b# ]  [& \, _( Y
    IntGlobalEnable();* i& }9 s* ]1 P( d9 k5 ?, ~  B; Z# O

2 L( O& a# l  x3 ?    // 使能中断(AINTC HIER)) _9 `) o1 ?5 e+ J6 H' [7 [% Q
    IntIRQEnable();
# u1 x* [, a3 q( o7 N}
( r6 F$ ^8 g+ f0 B- s% C9 V
- k" A- y3 X5 g% Q6 ?+ @5 V/****************************************************************************/
: E. G0 L+ ]+ M, d0 ?. Y8 d# [/*                                                                          */) c( a; c. g& R$ o; F/ ?. x
/*              UART 初始化                                                 */( T! ~6 U$ E; U* A  z: \) ?+ n( C
/*                                                                          */+ ]& K3 [; f3 l* h( C; v: o* U
/****************************************************************************/
9 w* }, E" a$ _) a$ P% \+ Ivoid UARTInit(void)" \$ ?% \) N/ Y8 e
{2 K3 t$ x1 K5 r' Q" C) ?
        // 配置 UART2 参数
0 g* K- ^: U5 ^9 q. L        // 波特率 115200 数据位 8 停止位 1 无校验位
/ G0 \7 [+ e( n- d    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,6 K: e# b- e6 A: X# w- Z! j
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);% d% z6 j* q8 ?! H. V6 [
        // 使能 UART21 |$ J/ V: w0 L- c+ o
        UARTEnable(SOC_UART_2_REGS);
3 `( f- W, a/ `: N0 i
5 @! l9 \- U  [1 k) r% i    // 使能接收 / 发送 FIFO
' x! i( s2 M' f/ U    UARTFIFOEnable(SOC_UART_2_REGS);
4 h& M1 y3 [# a9 S( [1 Z, S3 @  \; p. S  d& ^& t" ]
    // 设置 FIFO 级别
; l- |- a1 i) P' p. y    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);% c3 R- e8 d5 C' r
}' Q; s' \0 m6 y

2 \: M1 e% V- \+ ~9 P- R3 W( X/****************************************************************************/
2 Q' z8 g  r+ s7 }: b9 e7 V/*                                                                          */  \" G$ `' V9 \$ X
/*              UART 中断初始化                                             */
7 f1 a7 }: T& H" a5 f. ^9 i/*                                                                          */
: \6 I  e6 g/ T7 F; ~/****************************************************************************/& I  A* M4 X# ^* N: Z0 G
void UARTInterruptInit(void)& J5 O' @) m- n6 u
{$ z' }2 N) {1 r
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
3 m8 v, x: N) Z4 n( j  a        IntChannelSet(SYS_INT_UARTINT2, 2);) H& C- \# N3 g! a8 V
        IntSystemEnable(SYS_INT_UARTINT2);" e* |# [5 j# H2 B# K% b
9 q1 V/ b  {5 Q# g: K* m3 b
        // 使能中断
9 |7 Q1 `, [  u, u6 W+ b: i        unsigned int intFlags = 0;
. }+ u9 d4 {+ y* Z; H( L9 {! O    intFlags |= (UART_INT_LINE_STAT  |  \  r6 c6 V4 }- \  Y$ ?, K, j" Z
                 UART_INT_TX_EMPTY |    \
6 E2 k+ i1 r$ f5 g3 Y6 F1 N                 UART_INT_RXDATA_CTI);$ }4 k- j* r: M$ k; p' N
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
/ K: o# v+ H3 z! D: @}: ]6 j" r8 }, P" R! ~; N  v

" z! M: S( E, m0 M# k# o! J/****************************************************************************/
& Z7 K& z3 o  o/*                                                                          */  E# a1 r: e5 M1 f: j  J9 R3 k
/*              UART 中断服务函数                                           */) x0 w1 k. P- z" G- b
/*                                                                          */& _; t  y* s6 h: f+ y; I
/****************************************************************************/" q1 _2 T+ R* B+ i
void UARTIsr()
9 i9 C- S. |7 V8 p9 ^7 i{- q" W2 O& H1 E. `+ h  `  y
    static unsigned int length = sizeof(txArray);
6 L! z* `& O; a* R  D5 e6 D5 \8 l    static unsigned int count = 0;
) a) G. @2 G, _+ u- y+ x    unsigned char rxData = 0;1 `' H( ~  l( u/ f* N: ^9 ?/ h
    unsigned int int_id = 0;0 ?! V* I/ Z* }+ x

- L% \3 A3 u$ u6 l( R  W    // 确定中断源
+ B& P9 ]/ F% T    int_id = UARTIntStatus(SOC_UART_2_REGS);% t# O& r6 M4 g  M, s

, K' a1 ]0 x  o" x    // 清除 UART2 系统中断6 U, c" r$ w1 b
    IntSystemStatusClear(SYS_INT_UARTINT2);" p7 X3 N( s) u* M' l) b. ~0 }

5 [5 C9 m9 y0 y0 m    // 发送中断
) f9 j' @4 ?# W1 y9 q6 ?- v! ^    if(UART_INTID_TX_EMPTY == int_id)- k* N7 ~/ W! ?0 I% f
    {+ A4 W+ K5 k; [. V
        if(0 < length)3 L8 I8 S+ l. M2 S, ]: {
        {, q2 N: E4 r3 f' H" [! s
            // 写一个字节到 THR7 h: k' m: _: d  K+ h
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
- R8 d& b" G: d3 l) f( ~* f  a            length--;& V4 Y" V% m( j
            count++;4 b+ {8 U( p+ T3 u6 Y# P9 L
        }
9 r: b& `$ s9 m& O( ~0 Z        if(0 == length)
" {$ b/ G1 \) |        {
% W! s4 l3 f0 r# R7 x: O            // 禁用发送中断
+ h! \' S2 W: p3 Z            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
3 ]. N6 z8 H% R, R5 Y+ P  ]9 {% J2 K        }5 _) Y7 Q( P, z5 S: Q4 H
     }
: T  ]  f3 M" |6 Z( y7 C7 v0 G( X
    // 接收中断$ f* [. O: y- ~# W
    if(UART_INTID_RX_DATA == int_id)' |) H: R* W' h/ Y' B
    {4 d# F* I" x9 H
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
8 t6 S9 x3 U) }! e: Z0 N, k3 m1 U8 g: U0 E
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
  t* B  Y, X* Z* Z- k6 x    }6 i' z7 y0 p3 J# r+ w
1 a. ^+ o- {  H/ F/ w6 \3 l7 e' d
    // 接收错误
: V7 L; d1 k  B* z    if(UART_INTID_RX_LINE_STAT == int_id)
- \4 B( F* c  ]% X, q9 {1 [' N    {( t) n3 H& G& {' \' x# j1 N3 e
        while(UARTRxErrorGet(SOC_UART_2_REGS))$ a. o1 ^  _, t6 v4 l3 J3 M' Q
        {$ L  h; u2 B- z& ^' _
            // 从 RBR 读一个字节. d# y% O5 a( p. O3 W
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
5 p( x' T) [/ q, D        }
! J5 p& _' E! L; m    }% }- l- b: F5 P2 C% @3 Z7 d* K
   
% d" A9 M7 Q+ T  M8 ~5 a5 F- `    return;
5 v4 r# `: s) m+ i! A- G}
: i  v2 o1 J. A- G$ \7 m
作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25$ p6 w8 S; s- g! p
如果其它设备快速给你发送串口数据,你这边能正常通讯?
) Y( b9 y/ ?% L+ q4 E
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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