串口发送中断触发条件 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7398|回复: 3
打印 上一主题 下一主题

[未解决] 串口发送中断触发条件

[复制链接]

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
跳转到指定楼层
楼主
发表于 2019-4-30 18:00:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问omapl138串口通信如何进入发送送中断,如图是官方例程,我参照这个程序,初始化使能了FIFO,在主程序里使能发送保持寄存器(THRE)为空:UARTIntEnable(SOC_UART_2_REGS,UART_INT_TX_EMPTY);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。7 Z# B6 T& B' W9 V. Z8 ]! h6 r

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。5 j& N3 h. I; q5 \7 {* O
0 c4 s. N) z: u9 _1 }
#include "TL138.h"                 // 创龙 TL138 开发板相关声明" p5 B1 I# W  S
# j" S' Q" r! g( v
#include "hw_types.h"               // 宏命令
6 t7 G7 w- l5 q% d3 r" p#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
5 |7 Y3 y- Z0 o$ R. f$ o, K/ k#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器5 a7 y  H5 y2 T$ t3 [
- a- Y4 o% D% w1 Z8 {! v) E
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
1 w# L  p# N1 G5 m: L#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明: k; B9 ]1 K  s8 m
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明  b% m. P/ K$ t. g+ P6 w
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
$ t1 J2 |, n4 G" C# W' o' Q5 v% z# Z
/****************************************************************************/
( N. k5 `1 _) d; g. B- v/*                                                                          */7 r" g1 |1 X7 F6 E4 P% Z7 r
/*              宏定义                                                      */
9 Z! y3 P( p- U7 t/*                                                                          */0 D' K  x) |) j" L; Q. ~( T) O( V
/****************************************************************************/& N2 ^+ c! R& r! P+ B% _7 C  Q
// 时钟1 s5 ~  g, U5 u. R3 D- h! Z2 T
#define SYSCLK_1_FREQ     (456000000)) J" B& k/ ^% V+ P$ D
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
0 _/ j; w' V7 x8 C5 Z#define UART_2_FREQ       (SYSCLK_2_FREQ)
) Z9 n9 n8 |! u" R. y4 |! o/ W; {0 \* N5 s1 Q- r% `
/****************************************************************************/6 Z* z; }4 w$ s( e0 N
/*                                                                          */
0 B4 c2 t) C9 o6 q* m. `) D/*              全局变量                                                    */. W% |0 ~/ T4 P5 {8 V' K
/*                                                                          */
! G' J2 s  b& A* m/****************************************************************************/7 b- `  q% Z" t: t
char txArray[] = "Tronlong UART2 Application......\n\r";
. @, G* a) T8 U1 ?- l4 }. r" ?( p! ]" f
/****************************************************************************/
9 d3 w8 T2 g! V4 h0 m/*                                                                          */- D$ K/ B9 G, p& c) y
/*              函数声明                                                    */: q' |1 i2 C! }* f$ T
/*                                                                          */  }) y7 c+ p! R$ V$ s, L
/****************************************************************************/3 L9 C: b# i, n4 W. O/ W
// 外设使能配置
  S5 X- p0 c" a5 b" Avoid PSCInit(void);
, h2 [. y+ S4 F8 C. W3 T
+ ?  {7 G' ^1 W0 {8 C6 D, |// GPIO 管脚复用配置7 R/ P% C1 X% `, x2 ~* B7 r0 {
void GPIOBankPinMuxSet();
! ]9 k8 v) a4 U+ E" r
3 g, L, R, i+ w; k" n// UART 初始化
' a5 ]( p( ~/ ^# jvoid UARTInit(void);
& a) {; d" ?! G// ARM 中断初始化$ K& L/ F% Q- C
void InterruptInit(void);9 V5 O  B  u( d$ q, u
// UART 中断初始化. V7 \# g4 v9 t! t& q( ^: o
void UARTInterruptInit();1 I- |$ g) [0 m5 n4 o$ W+ y% h
// UART 中断服务函数
( ^+ C! M) O; N* qvoid UARTIsr(void);% x6 m& ~0 f! L( X: ?

0 _7 ]- K+ }2 S; s; l' R2 P/****************************************************************************/
9 I4 e: I7 B1 f: {/*                                                                          */8 l9 ^* x& w; v$ A% d
/*              主函数                                                      */3 V7 }" z1 J4 g3 w) g$ }
/*                                                                          */# ], Q0 ], E6 j
/****************************************************************************/
0 ?7 Y; N. W, Nint main(void)# ?1 m$ r7 N# O5 I3 p6 ^7 H8 Z$ c# t# O% p
{( u* q: w& n5 P. @/ K
        // 外设使能配置8 p" N5 L6 R7 e# O$ |( `
        PSCInit();
5 h8 V# x4 c7 S% A" W. X        9 G: {* h" y/ \# r) b7 c
        // GPIO 管脚复用配置4 G+ Q9 U+ z  I  N( n
        GPIOBankPinMuxSet();
" ]  X) f- r2 h" e0 u6 E0 w9 b  c: r* ?# }. j! {) |
        // ARM 中断初始化
5 [% w7 S+ N2 \( u9 _        InterruptInit();/ Z' O& L# {% c

3 Y  u7 Z. W" I0 w4 w        // UART 初始化
1 b4 A6 g* k  n        UARTInit();
" B7 l, S  U. C. b" `+ q: M. A2 ]$ l' q: Y) c# o% g
        // UART 中断初始化/ V& [7 t) w, y8 X2 ^
        UARTInterruptInit();
: v6 X  U# ]! d( t6 J! B, N1 h! x- B+ z
        // 主循环; }2 b$ A  {4 Z) C  f
        for(;;)
/ ^' |5 ?2 K: J' q6 C! Y        {8 ?2 c& B5 |: ^& g( y* ^$ a
# V2 k. E+ t! w% q$ M
        }# l- O  N2 u5 z1 b$ K
}% R" z: u% s* H% t

6 g0 h0 r5 @; R8 Q# y" @# A/****************************************************************************/7 K" t8 l' @3 N/ v- Q
/*                                                                          */9 K2 p* i! f1 D! H2 R2 O
/*              PSC 初始化                                                  */3 c' Y8 o0 |' h; N9 l/ s9 ~
/*                                                                          */
8 I7 `% |* s; b+ O  e. `' V/****************************************************************************/
% C0 C; e$ g7 i: c! m8 Nvoid PSCInit(void)
2 h; g2 ~$ Z9 Y7 ~; G/ L3 w( s{
7 y: V  G6 v" B4 T        // 对相应外设模块的使能也可以在 BootLoader 中完成
8 Q$ I, u# a  I3 K    // 使能 UART2 模块
; h; l7 G4 `' y1 r5 a. R    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);5 H' w$ B" ?, W% ]2 g8 Y& A1 Z8 u+ K
}
0 y0 K3 p4 h/ N' [" i% d" z) Y
  X' J  I7 o4 M$ [/****************************************************************************/
7 b" a7 N# [) [9 b8 c9 T- P/*                                                                          */
5 U% `/ ~$ A0 z! R( b/*              GPIO 管脚复用配置                                           */) m. x1 G8 F( l  D9 N  |7 }
/*                                                                          */
0 s/ m& J' x  J* d+ d/****************************************************************************/& z& [; X  o' H% [, [3 @
void GPIOBankPinMuxSet(void)
9 \* p" b) m3 j7 }, w{
; r1 g3 ]( |  ?  Y+ T' g9 Z        // UART2 禁用流控6 U6 s4 y8 h9 v
        UARTPinMuxSetup(2, FALSE);) l  J" t1 B. Y5 q
}
7 m# t$ ~5 E  h
& c7 K: |: Q- P# h& o) i" g/****************************************************************************/% r2 h' M/ y1 l$ V0 Z
/*                                                                          */
+ s1 f7 f. q7 g3 N0 s/*              ARM 中断初始化                                              */4 O; r7 [. [& A$ h5 y
/*                                                                          */9 s# |& |4 W+ `/ D/ T6 e( u
/****************************************************************************/
5 g2 R+ y# y0 X% N. Q( nvoid InterruptInit(void)
5 g5 F! r/ z) h. G' Q  }{
) N8 l- y( x+ z& W" m    // 初始化 ARM 中断控制器
3 q6 N7 C+ K- g! m! U2 x    IntAINTCInit();9 c( Y( T. m8 W  j: ~3 n, w- _- M
! e% D" l  n6 V! `
    // 使能 IRQ(CPSR)
9 U- c" y6 R( D+ o    IntMasterIRQEnable();
+ f# A% {3 j) }2 Z9 {, t0 o3 n/ l$ Q( Q# T7 F; t. N; J, C
    // 使能中断(AINTC GER)
* A% b8 S/ U2 \    IntGlobalEnable();
; Y( W4 w% @# ?/ @
+ U' H# ]3 N4 k    // 使能中断(AINTC HIER)
: O2 u" P2 w, N    IntIRQEnable();7 [2 [% m  Y" g6 I" ?
}. |% p6 [9 K3 s2 S2 v1 N
+ e! q0 u* a/ c1 w  P; ?) z3 x) v
/****************************************************************************/
9 G# h9 d! _% l" O! K# H' V6 D) j) A" R/*                                                                          */( V& e4 x: o7 C- c- Z' c
/*              UART 初始化                                                 */
! m6 v6 U$ C( w* }$ ]/*                                                                          */
, `7 T1 U- m3 r- z' w/****************************************************************************/* h0 v! \9 M; {+ x% O3 K
void UARTInit(void)6 B! L8 z' g; b- d1 Q2 Z2 l: l4 U0 I4 O
{3 N2 z- e  c: c) O7 ?+ w5 y
        // 配置 UART2 参数8 W7 b' c' T' p6 U) v' O! n% u
        // 波特率 115200 数据位 8 停止位 1 无校验位
3 F! G3 m4 W( x. @4 P' f2 @    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,/ ?* |# b6 q  o* l( C2 N
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
# ~4 Z- V* S' Z+ J$ C3 v        // 使能 UART2
" \, V1 X' J3 E) y        UARTEnable(SOC_UART_2_REGS);
9 `: Y! v3 b: b, ^
1 k5 N% s4 }7 V# W    // 使能接收 / 发送 FIFO
. B' w1 e" b, n: V    UARTFIFOEnable(SOC_UART_2_REGS);
' L1 b- D: }8 m8 x8 X% A7 }
# N0 M1 J" m5 i. u    // 设置 FIFO 级别! B/ z: q) f9 \. G/ x% A( U0 J
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
7 D  r% ]5 K) @3 p" O}
2 e# S. h( Z' @0 p. F3 d' g
3 E7 w, y" D0 x6 P5 d* a6 ]0 X/****************************************************************************/: L7 m3 X: W# S' R0 d3 q% |' u
/*                                                                          */
0 D# L+ P0 |5 @: q! H; a/*              UART 中断初始化                                             */* r) C% ]! I1 ]; _+ D
/*                                                                          */
0 p, o% J9 f- e3 r8 q2 v9 W/****************************************************************************/
3 G  N* U2 U: lvoid UARTInterruptInit(void)
& [- J' P) G0 f{/ b/ S7 g- c3 v- L& }. f
        IntRegister(SYS_INT_UARTINT2, UARTIsr);8 S( b# W: _! ^  K
        IntChannelSet(SYS_INT_UARTINT2, 2);" e% N  w* b. y" ~& Q% J
        IntSystemEnable(SYS_INT_UARTINT2);
/ \' n9 V/ C: a; F0 I1 r/ Z! @7 Q% g1 O% g
        // 使能中断
, v- @) l' t+ R& c+ h) O3 |4 h6 g        unsigned int intFlags = 0;) T, D" \8 D- {+ p  D# ]/ Y
    intFlags |= (UART_INT_LINE_STAT  |  \* m  I& c; H9 t
                 UART_INT_TX_EMPTY |    \; S( ]! Y% e1 f: f
                 UART_INT_RXDATA_CTI);
$ @8 C, C6 Y* Q    UARTIntEnable(SOC_UART_2_REGS, intFlags);
7 c- z& f7 y. p* R3 {. a}2 L' Z5 F. q1 c5 j

$ i7 k4 s3 w5 R/****************************************************************************/1 s, |) x- T/ T' H+ i7 U7 Y
/*                                                                          */) B% s( Y7 c! s3 g. w4 }$ S
/*              UART 中断服务函数                                           */4 B  M; O' |; d( z
/*                                                                          */
* ?7 W2 ]7 [  }6 }" [6 M' Z/****************************************************************************/
% V- a- o5 S: [" f: \void UARTIsr()0 d: u' p* b: |: i
{1 ], H% w3 A5 P0 c5 X: q$ U
    static unsigned int length = sizeof(txArray);/ v/ ~5 i5 }' I
    static unsigned int count = 0;
. ^7 U1 ~' A# E1 Z2 v9 P5 }2 C! G    unsigned char rxData = 0;
0 W- }( D- [, V+ t) p% ~    unsigned int int_id = 0;5 _; ?9 P( J: C9 C+ M6 C5 x, K; i" q

7 v4 z  k+ `7 j    // 确定中断源6 j' |1 l; ~- u5 J
    int_id = UARTIntStatus(SOC_UART_2_REGS);
  w0 J1 o8 R8 Y1 H" o8 t+ X/ b( @) A- c
    // 清除 UART2 系统中断
5 p* R  I  x5 `- F1 ^    IntSystemStatusClear(SYS_INT_UARTINT2);+ ^. j. N% V' Z" u9 B5 |1 q* t

0 l2 J+ a5 O- P9 F2 a    // 发送中断
" t; g# ]# q4 d& I4 p4 P    if(UART_INTID_TX_EMPTY == int_id)' f3 t+ |. _* z( O4 y: i8 |. C
    {6 I/ V+ n$ P+ r
        if(0 < length)5 W" t+ T* [5 B& }; w
        {
3 U0 a! V  {+ w% u9 G            // 写一个字节到 THR
2 e5 s! e. [7 P( c$ V            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
2 U) q' r1 ~: P' d2 c. G            length--;" Y+ n3 M0 m" N7 m. q7 V
            count++;9 H: i6 ~3 H9 ^
        }$ V6 ]: O. B7 B# E4 t* Y2 y& i! K
        if(0 == length)
& T6 G0 a, q- w, [, r) Y, W+ V        {* }- L3 e/ J8 ?8 }. d$ C# r; |4 |+ s
            // 禁用发送中断6 i$ J4 j3 h9 Y" g7 n( M7 o0 B0 p% c
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
9 y  n7 b1 B( w% a& f! a- g        }
, e+ U8 ~9 a" T( q& S* g* ~+ s6 ?     }
3 V: x: p$ S2 y- v1 {: ^: w) w* P3 H  r
1 n( X  S# Q. {, r' N- z    // 接收中断; m, }) r& D$ Q9 S! w
    if(UART_INTID_RX_DATA == int_id)
# @1 ]: \* P6 L& _2 e! T! X    {
- z/ v" V2 u9 o+ {- Q, g        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
6 h' k7 f- p  ^9 E2 q' P1 j5 e% x: d$ {# B: a9 p
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
& F% t2 i; K7 A1 A6 O2 j( R6 U0 g8 \    }. O) a( `% D6 z$ q& Q

/ G: R, t6 D& r/ d5 f- X- U; H  z    // 接收错误6 n1 t2 d* \3 g1 y: i2 Z- K( x
    if(UART_INTID_RX_LINE_STAT == int_id)% V; Q8 c3 O, K! v& N
    {  Z8 D$ J+ H! s/ M* T
        while(UARTRxErrorGet(SOC_UART_2_REGS))
" y  a5 y9 `; p. n2 V6 O, q4 f        {8 X# T* g% C% x0 r3 i! A; o6 i3 w
            // 从 RBR 读一个字节
- A' D3 N& j5 X- E; F0 S4 Q! p+ O            UARTCharGetNonBlocking(SOC_UART_2_REGS);
' B4 B! G  a# T' E& O1 S% V" x        }
! V$ h; S  S( u3 G! `% T    }+ y$ Y2 Q  t! J# ?( ^$ A) z& {; i
   
/ L4 g) A' g% p% u. G    return;
6 ]+ `/ ~" O; b& a* o}
# T% Q9 p: u( k9 f3 V
回复 支持 反对

使用道具 举报

1

主题

5

帖子

1034

积分

金牌会员

Rank: 6Rank: 6

积分
1034
板凳
发表于 2019-5-5 22:25:37 | 只看该作者
如果其它设备快速给你发送串口数据,你这边能正常通讯?
回复 支持 反对

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
地板
 楼主| 发表于 2019-5-5 22:36:34 | 只看该作者
785235014 发表于 2019-5-5 22:25% w8 L$ A( O& l7 B: R: _* _
如果其它设备快速给你发送串口数据,你这边能正常通讯?
# f2 m, {1 r6 `& [% K7 F
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-7-7 07:43 , Processed in 0.044275 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表