嵌入式开发者社区

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

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

作者: 17390601072    时间: 2019-4-30 19:45
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。8 `6 A. c' l+ g' A

; C" |9 P1 T, Q#include "TL138.h"                 // 创龙 TL138 开发板相关声明
: n  c5 y9 T# c1 \6 `7 ~; ]: Q) E! A  x( F% F7 m$ {
#include "hw_types.h"               // 宏命令
- [+ t  ]- q6 j1 j0 Q#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
9 k: b: G  _6 m; {#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器2 R0 J  X; u* v0 N

/ l2 s" r6 p/ U: l5 O: ]" A#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
! w: O1 X2 V; A' U#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明% d% d; }6 z7 I- Q' I$ i) A
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明! ~0 {: k2 ~; z, I& p2 l9 x1 h
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义4 V8 W+ M  l9 k4 X( H4 G
7 ~9 P9 G& w% V; h7 m
/****************************************************************************/
1 ]. H& U# `" a( |* k/*                                                                          *// K( U$ _/ I5 O; o4 u( N6 F
/*              宏定义                                                      */& ?- B. @' Q2 `$ v2 ^: o( M+ |8 F
/*                                                                          */
' P! R$ `1 T, k/****************************************************************************/% f( s9 B' d$ Z; `0 E; Q
// 时钟1 t8 b9 a1 |5 c9 A& Q5 i
#define SYSCLK_1_FREQ     (456000000)
' g2 X9 S" N7 ~$ k1 }#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
# S/ ^1 D' `7 `3 ^#define UART_2_FREQ       (SYSCLK_2_FREQ); r7 M3 H0 a0 f- M( j

) N5 E1 ~8 ]1 D- b& ^/****************************************************************************/5 _7 m) [& f3 u6 e8 }% r- Y% a
/*                                                                          */+ r, ]" a# \( S6 l4 y! t, x
/*              全局变量                                                    */* h  S3 T  c2 Q$ @6 c2 K
/*                                                                          */0 Y8 L+ X6 u+ H; \
/****************************************************************************/
/ N8 M+ \* ]  Wchar txArray[] = "Tronlong UART2 Application......\n\r";% x$ z* f- c& ~
3 a1 q2 @% W+ N3 x3 ~6 M! u! k" r
/****************************************************************************/
% j. C, T' a9 O7 B3 `/*                                                                          */
" _0 ]: s4 n6 Z; ?) ?0 d/*              函数声明                                                    */
* c0 O  C5 {5 R$ R7 h5 ~* f& Q5 Y/*                                                                          */# d1 O$ R' C( n4 U$ A- |* k
/****************************************************************************/9 ^/ N6 @, `7 t" x) [) ]$ a
// 外设使能配置
7 k+ Q7 a7 S! Y! s7 I0 Cvoid PSCInit(void);0 A9 M- ~* o: K$ E7 G% u4 O. C
% {* Z; t" C0 c2 B5 z
// GPIO 管脚复用配置2 J2 S, P1 ]! _( G1 t; A: s' t/ A
void GPIOBankPinMuxSet();& g) ~: z  W. @$ k7 E+ F3 T# O! Z

1 B  Z- G% n) a7 {3 m* N3 V// UART 初始化. u( o2 W! ~/ a! N! s/ b! w
void UARTInit(void);
! h" m4 U. L1 P# h2 A) t) x3 v// ARM 中断初始化
' V8 d$ _$ s# ^" b+ ~2 g/ r& ivoid InterruptInit(void);
3 F* K1 h1 r4 ^- G// UART 中断初始化
/ u# i! {- ^. R2 U" U& g; z# W; Kvoid UARTInterruptInit();0 M7 I- ]1 B1 L1 {* z
// UART 中断服务函数
+ v4 r8 d5 z. \  w9 c7 v# Y7 }void UARTIsr(void);
* T- v3 ]2 G* i$ E  u% q
6 T0 V, g8 w7 [; w& D1 z/****************************************************************************/
2 `7 f' w# W5 |* {3 k9 _/*                                                                          */
4 i0 b- y7 n9 L) i7 V. N/*              主函数                                                      */
/ m% f) e4 T; V  D& O5 V8 }/*                                                                          */
4 [- ?( V( e% c2 j4 Q) c; A/****************************************************************************/
/ ^( G8 V4 V: yint main(void)
: K4 y3 U! _; P9 L{4 i/ N4 A; U6 i# I, o: e6 V
        // 外设使能配置3 Q4 b6 K4 o3 Y" G3 H7 d2 P
        PSCInit();* j0 v( i( t* N
       
6 d( }6 J  X: m4 S, ]        // GPIO 管脚复用配置
& {8 V! M5 P/ C0 O        GPIOBankPinMuxSet();
' V7 I; K6 L" [; @7 {7 Q, z1 o
# J, j' y) U) i        // ARM 中断初始化
" u5 R! N6 a! T; U9 \6 ^. k        InterruptInit();$ Z+ J6 u5 B" p5 ]) _$ w  P

4 J2 v5 Y5 {  q2 _/ @4 t/ r# U  O        // UART 初始化0 [9 f' f: K5 _. j! M* R
        UARTInit();, a/ e0 q- [2 g3 _
9 S1 a; r5 t. V) _
        // UART 中断初始化' x1 @6 h  W- a5 J
        UARTInterruptInit();) s1 ^: u  f9 y

- E# Y$ b: @* I        // 主循环7 {5 z' y. N" h8 }
        for(;;)
- Z# s/ G4 y$ i3 G: \        {
" A% W, N5 [- ~# S$ \: V! U2 i( q/ N, R2 [
        }( T+ F0 F: b3 l) `
}9 q$ q  p/ x& C- q& w8 I9 ?- A8 b9 p

* ^6 ]( q) @% f; y  w& q, B8 d3 V# t/****************************************************************************/: p# O9 K- @# c" i& k
/*                                                                          */: ^) D' A4 \8 t. B
/*              PSC 初始化                                                  */
8 \: O0 k' ?6 W; U' k/*                                                                          */$ I4 L/ g6 U; U  H+ S* T& }6 s
/****************************************************************************/3 P0 K2 v, R8 A0 D7 p9 _/ y; i1 j) ?
void PSCInit(void)8 ^$ q% F- F+ V9 A: t9 \
{
) J/ ?' m* _: I        // 对相应外设模块的使能也可以在 BootLoader 中完成; ~  B4 l: r  P3 a/ p! Q
    // 使能 UART2 模块3 q+ z* I$ u2 [. a( @" n5 |
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);0 [6 S; u5 m/ ?( K, G
}
8 w3 O4 H( {* A3 z8 i0 h* I( E" `, y( U
/****************************************************************************/, j* ^+ I" O: }5 S( u( V  M
/*                                                                          */7 c* P$ \, U; M! y
/*              GPIO 管脚复用配置                                           */
9 Y5 Y+ d; v5 w$ E/ ~. b# t/*                                                                          */5 ]- \: M% n8 h4 A+ K% \0 a
/****************************************************************************/+ k# G2 r# P2 q, @9 ~4 y. \& w, s
void GPIOBankPinMuxSet(void)$ u7 C. U2 Z1 P" v. I9 b- S! [! a; W
{' _' v7 E  {. G8 J0 y
        // UART2 禁用流控! }' n. F5 N8 v3 f# S2 ]
        UARTPinMuxSetup(2, FALSE);* S( Q+ [2 Y( t0 ?/ J8 Q) E. b
}
9 q5 q- c0 M/ N8 @! k5 f* S* i- B; @% \
/****************************************************************************/
+ _( O$ j$ C4 c$ p/*                                                                          */
1 P6 Q7 y, S. a3 B3 B6 _/*              ARM 中断初始化                                              */
; G% L9 I4 {; t/ J- G/*                                                                          */0 V3 C/ V* W' t7 D$ F& p  x
/****************************************************************************/4 ^  G) i# G2 H# e
void InterruptInit(void)  V/ w7 R  e) V. o) c$ I8 A
{8 Y$ a6 _& a# b+ e3 C
    // 初始化 ARM 中断控制器
0 {8 F/ c2 w7 G# C7 Z! {! d    IntAINTCInit();
4 w7 C! k2 e  ~; Z# O* j- {3 k% M5 P" B
    // 使能 IRQ(CPSR)$ j# O1 `! b+ ^2 u' \
    IntMasterIRQEnable();
- o+ T9 ]: J/ X4 Q
2 B& t$ d! q" B* Y- f3 t6 ~- A( X+ ^    // 使能中断(AINTC GER)1 D2 p7 E+ d- p0 t- l
    IntGlobalEnable();, o5 E: W6 y/ D: X
% o, O% t0 \6 I$ \5 d8 F" ]
    // 使能中断(AINTC HIER)
2 C2 M) \* s# r8 D4 h. ?6 N    IntIRQEnable();) C% t* Z" |9 \# f
}/ D3 |' M# F" e! Y! Z

% j. M% O) \% {! ~/ d, v/****************************************************************************/
" f5 g7 c9 L4 c, c: c- Q% a  `/*                                                                          */( O* ~% }; k& K7 d' B
/*              UART 初始化                                                 */
8 D5 s- }, q3 m6 f$ x( v4 ?/*                                                                          */
/ m: q  K% v' ]3 E6 C; W. Z! h/****************************************************************************/8 T3 r0 r; r+ `7 A
void UARTInit(void)) z" J9 z) Z5 E
{: S( O3 d# Y2 u% d
        // 配置 UART2 参数
9 x) G" Z9 Q4 X' y7 E$ u" |) m        // 波特率 115200 数据位 8 停止位 1 无校验位
9 d2 H8 s9 i7 D' e2 f4 i1 N' M9 P    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
' z8 Z5 K# [0 n+ A                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
+ i7 o4 b$ j8 E" ~        // 使能 UART2: n/ [+ e/ @* G/ z
        UARTEnable(SOC_UART_2_REGS);
' i* E: I# _9 C: K: B! G% `2 V' j# u" E( \! W+ w! }# k8 Z
    // 使能接收 / 发送 FIFO
, L' a& Q! a- t  t& I; T    UARTFIFOEnable(SOC_UART_2_REGS);
' J* K# N& [+ e: n# `: l
# k# Q( t; ?3 i7 F  ]$ N6 B1 }    // 设置 FIFO 级别  q( x. }( E/ K  W) b/ I; ~; d
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);2 o4 u# o3 R$ @6 o
}
! j# z8 p! ?( |6 a9 X$ w" [7 S# H. ~0 g& j. ?9 o6 V
/****************************************************************************/, z* q7 I! v* m/ w, b
/*                                                                          */
, f3 |1 q0 Q( _/*              UART 中断初始化                                             */, f- T5 n, X8 L, `& w) D
/*                                                                          */7 `8 J& G) t8 x" ?. L
/****************************************************************************/
  F( E9 B& h( B% V8 fvoid UARTInterruptInit(void)
6 r/ ]4 z1 F( P& i( n! l; r{
8 x- Z9 N' V3 E5 g        IntRegister(SYS_INT_UARTINT2, UARTIsr);
: i4 ?6 [9 {& A: w2 Q- K- c" M+ {        IntChannelSet(SYS_INT_UARTINT2, 2);
% [9 g# R$ g- U        IntSystemEnable(SYS_INT_UARTINT2);2 F; j" z: |0 \2 \3 Y2 e  w
# Q, _1 n: q/ s1 H8 A9 @
        // 使能中断
! l: G; W7 A8 e9 m: a        unsigned int intFlags = 0;
! N( f7 c' n3 F4 c7 m3 e: F    intFlags |= (UART_INT_LINE_STAT  |  \; K# Y! ~4 @0 e. `) g2 z, H  |3 a
                 UART_INT_TX_EMPTY |    \& f' k0 z( _7 q0 r" Q. S# s
                 UART_INT_RXDATA_CTI);3 g8 G3 V" h# \7 |( X/ }
    UARTIntEnable(SOC_UART_2_REGS, intFlags);) ]: ~! u: o1 O/ K" d1 H
}% ^/ ~" I1 ]' w$ e) Z# x& a
( Z4 }, Q0 b! e3 L( P4 C1 M: {& d
/****************************************************************************/
' k. o; ~+ k6 o% q  \# q/*                                                                          */
( X/ H( O$ v& m/*              UART 中断服务函数                                           */
: F6 x/ [8 f+ R# [, j: U4 X/*                                                                          */( A: a0 y" P0 z$ k
/****************************************************************************/
% U6 R( Z) S6 tvoid UARTIsr()
1 N( f) m- |0 ?+ v" v6 D1 I+ d{
+ l! ?6 Y: h' Y  m; _+ i4 v9 Z    static unsigned int length = sizeof(txArray);
# E+ w6 b  j7 Q  e1 j" F; }    static unsigned int count = 0;# f! m( X4 T+ u4 [% A* `9 |
    unsigned char rxData = 0;$ ^" z, c  r; @$ Y
    unsigned int int_id = 0;
9 E. v: v; b8 G9 v) w) r( k# }- l+ V
    // 确定中断源
+ A5 G; |8 b# e" J* g    int_id = UARTIntStatus(SOC_UART_2_REGS);, g; Y2 n/ V% \: i1 ^

! s2 [" x2 v0 q    // 清除 UART2 系统中断
2 N/ Z* v, B2 t5 S8 P' G" k    IntSystemStatusClear(SYS_INT_UARTINT2);2 s9 @2 {. M2 S& N8 w- E
: o( e$ a, ~( I1 I( w2 j1 `. g; Y7 m
    // 发送中断
9 Z0 H/ J8 h, ^" x2 E7 F0 h: |% ~    if(UART_INTID_TX_EMPTY == int_id)# ^- ?. p. ~, X% g9 D" K; k0 B; i
    {; s$ H' T& }5 c4 U) [
        if(0 < length)9 s% w3 g. x2 N
        {0 Q1 u; g! L1 ?
            // 写一个字节到 THR, G, Q" a/ V. c, Z- f" C
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
. p% [( h+ v0 Z4 R, f            length--;
  z1 I" j! @; c: z1 G- j/ e+ r. S            count++;, j. r6 _* s& ~
        }" l, G9 q: s# `# c3 f4 W
        if(0 == length)
" H- ], @! i) J9 {        {& t/ w7 n: o$ s- ^( }
            // 禁用发送中断
" S  [& T6 O9 {, a( C            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);' k* H, B- n9 g: D
        }
; E7 D+ I& Q# B2 R! L+ I     }- c1 b( v/ I- O$ @# Y

, ?) T6 z8 @2 f$ t( S) E    // 接收中断
1 f9 `1 ?6 T: V; s8 |    if(UART_INTID_RX_DATA == int_id): @  w0 `" r! W4 _" O$ A7 A
    {
, b: F( P8 E8 _* P4 n) @! u        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
8 u" k) L2 i9 ~7 \: I* s- U* r3 E7 ?- I1 ?0 @6 g
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);! l/ }; q6 p; T* \; z$ i
    }
3 {. L+ W9 ^' y- H- B
* ~8 g+ g+ S% I* [) m( g* }6 w    // 接收错误9 G# M' ]9 z/ v$ y' j9 x
    if(UART_INTID_RX_LINE_STAT == int_id)( `# B$ m+ Q* x: t  `; g5 m
    {
( M! e' p6 {6 V/ Q7 i" g9 P- k        while(UARTRxErrorGet(SOC_UART_2_REGS))
0 I: k2 ?& z& f! G2 O% d6 l        {
6 l  C7 M2 w5 c* k0 C; b1 v! Y            // 从 RBR 读一个字节
6 m. d& y. _# O8 `% R3 `            UARTCharGetNonBlocking(SOC_UART_2_REGS);
& ]" H9 P# C# E- l6 ]9 ?        }: a4 f. N+ b* e
    }& u: Y- t1 {9 N6 t5 B5 \9 }% D/ L
   
9 D3 a; z1 Q2 z& i: C; P* j9 F& A  F    return;3 ]7 ^- L/ P. W, `
}% s( v6 x0 O; ~8 R% X/ Y

作者: 785235014    时间: 2019-5-5 22:25
如果其它设备快速给你发送串口数据,你这边能正常通讯?
作者: 17390601072    时间: 2019-5-5 22:36
785235014 发表于 2019-5-5 22:25: v- H) ?& f/ N+ C3 D  E, g) L
如果其它设备快速给你发送串口数据,你这边能正常通讯?
1 g3 c# h& x. G8 |: N( m
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看




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