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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5528|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
2 _8 l2 x0 |8 M5 ]: L% j- A" G0 B3 P

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。: X) _* n$ x7 {5 b) Z& a& R

* Y2 b/ c1 a7 j#include "TL138.h"                 // 创龙 TL138 开发板相关声明
9 P' Z- Y$ N9 Z& e* R- _" I% h* D* D% i$ f3 r( g
#include "hw_types.h"               // 宏命令
0 e/ C/ u3 \; _" E0 k" y3 ?2 b, m#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
9 Z" z. d: t: v! l0 J#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
  \+ ]0 ]! I0 \  O
9 K1 M7 o- R2 Z4 A% @8 I# B#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
9 G, C* z8 z1 g, G2 F- D3 a#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
  p- [! b% e) u6 ?& g" j  L, X#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明- Z0 A0 N$ e( P& }" k6 ^
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义7 R5 B3 @" i- F  W$ y  k& C% G( Q

4 {( S& y% Q+ G0 Z/****************************************************************************/
" I! M- c1 _, ^5 t& C, H2 L) K/*                                                                          */
) u6 o% w6 p: T0 l' S/ U' Z/*              宏定义                                                      */
( d% ~0 U# E4 w. O/ o0 j, _: z/*                                                                          */
+ q- ]) K: Q& u% P6 Y  N; b- n/****************************************************************************/7 ^( s4 Z8 L9 M  o* P  f, _9 E
// 时钟2 x. y7 M' y/ k' i' o+ H
#define SYSCLK_1_FREQ     (456000000)
2 u' }! u) e' e# H" Z+ H#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
$ ^4 h, b$ s0 E' ~$ q: l#define UART_2_FREQ       (SYSCLK_2_FREQ)
* f0 c" a- J' k# Z, s
# h7 u! B5 i. a% ?' R$ M/****************************************************************************/
' O( I& u6 Y6 [7 M/*                                                                          */
% _9 f* O' A- l; j/*              全局变量                                                    */
0 m: a7 K- j6 \/*                                                                          */4 l" |$ g0 P, _
/****************************************************************************/1 }8 p, Y* ]* W; R5 }
char txArray[] = "Tronlong UART2 Application......\n\r";
: }, ~, ^6 x& M4 `; b2 }2 X+ o1 R( K+ b0 X3 f8 Y, g  R
/****************************************************************************/# |# c) H- u8 h  K! ^0 L
/*                                                                          */; M# J: J# V: ?$ R
/*              函数声明                                                    */
* l  `- F7 J. W2 z0 \4 R3 ~/ {6 J/*                                                                          */
  H5 F6 W+ ?, w3 x. D/****************************************************************************/- @) g# W/ [0 G' ^6 k' s7 n
// 外设使能配置
+ u: G- Q1 o2 g: ~- Fvoid PSCInit(void);3 A+ p6 p( d0 L. n

( h, I& N  M% X$ g( d/ w: @+ S// GPIO 管脚复用配置7 a4 G) `- p' D5 Z5 \) F
void GPIOBankPinMuxSet();, s5 {! n. u5 S! T: v4 Y3 D

* Y& f+ T: a1 O* v% f// UART 初始化
1 u( f$ T! S/ C7 @void UARTInit(void);
0 q5 C+ n* b; m& V6 g" M// ARM 中断初始化
4 O: d: S, K- _" _9 I8 b$ Vvoid InterruptInit(void);
3 p8 y; ]% A: [- Q4 K) U// UART 中断初始化
3 [! U- R& K  h2 ]5 l0 Wvoid UARTInterruptInit();3 Q; X- r% p( E' o+ Q8 n3 d
// UART 中断服务函数% P: K/ t8 [* b' R3 M8 V2 A
void UARTIsr(void);
$ ~' |8 G% M9 E9 N' n0 h- q  C. ^" ]8 f8 L2 o
/****************************************************************************/: s+ c: w. c' e4 V. c
/*                                                                          */$ Z/ L6 S# }; e! m
/*              主函数                                                      */
6 B1 ~) m2 q( R# r0 j" I2 d/*                                                                          */! h- I3 K6 j4 t  K
/****************************************************************************/
/ O% E# I) G4 Y' V" q" p) bint main(void); H$ x# p% ~0 t
{
( V' J% B0 p7 {) }        // 外设使能配置
7 S- u# p8 I4 h+ M2 g5 @: E$ _        PSCInit();
+ \% K1 W: X1 s2 y* O" [       
1 Z) u  Q9 c' C, w) G- \        // GPIO 管脚复用配置2 o4 Q- q3 Z5 x3 ^1 G, ]
        GPIOBankPinMuxSet();
1 w: e; `3 F" C
. J4 Y9 u5 C* R  j        // ARM 中断初始化$ b" S) ?1 U' |5 P0 }  d& q/ T+ j: G
        InterruptInit();, G/ E+ F. Z  C
$ g/ G: L+ G' G- u- q7 S
        // UART 初始化
+ j2 j; O8 {; u: j        UARTInit();2 o0 s) v  N; j7 _; j( D

7 V  {5 x* H8 l        // UART 中断初始化
: ~: P! Q: O8 E- P        UARTInterruptInit();- c. G) M( o6 J# n9 ]

& Z3 n- @5 K0 C1 [( c! W! C        // 主循环3 ]7 y, {4 G) B) T# E( K
        for(;;)' R+ z4 e# R. R
        {7 U+ d2 ]; }/ Z' f
- a2 Q* f8 r5 i6 h& u
        }
* w3 d( b& Q: N7 c8 c# _}6 B2 F1 e" A# a; E+ F7 M9 K, N1 J

4 f, m' ^  U& ~( S8 u$ w" h: `/****************************************************************************/
4 k3 J* q1 }; n% k2 b* M/*                                                                          */
4 e" r+ p4 e7 ]- ]! J! }/*              PSC 初始化                                                  */* H% B: j3 B% i( ^/ Y; ?
/*                                                                          */9 r& v, b1 N/ W- c
/****************************************************************************/
+ H. N% u% Z/ `/ o  ^void PSCInit(void)0 b6 x5 _3 ~& }- Z
{
" i* x7 W& R) x$ b        // 对相应外设模块的使能也可以在 BootLoader 中完成/ M# ?% B1 G! e; V- T6 P( J
    // 使能 UART2 模块2 ^1 f( Q9 ^# k$ h  Q; S5 i7 Z1 }
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);5 r4 Z! n; ]1 O) y) A
}3 L9 w# s+ N  d  o% @( T
, |7 }4 s8 u9 _
/****************************************************************************/6 x4 A* G! G& n$ }) I! |! b" g& `
/*                                                                          */
. Q% r3 T4 o3 ]( J8 n" b; q/*              GPIO 管脚复用配置                                           *// H' M, v  ~% [
/*                                                                          */
4 v, O: E# d$ \. s. P! I( j/****************************************************************************/
4 V9 O5 @" ^, A* d" {9 \8 svoid GPIOBankPinMuxSet(void)
2 Y1 L" V" R; N{
+ v/ I: H) O- J& b; L, H        // UART2 禁用流控
7 ]. J  J7 s: b" l: p# G        UARTPinMuxSetup(2, FALSE);& {, g* s) Q1 h- z6 z
}. g& d4 w- ~6 z; J
$ r: F8 n( V3 R3 m8 S
/****************************************************************************/
+ a5 d- E8 y  X6 v. E6 T" X/*                                                                          */2 C( y' x/ S' v- L  O& ?) ]3 N7 k
/*              ARM 中断初始化                                              */6 I( Y' M' V$ Y; e2 U: @! s
/*                                                                          */
1 P! D4 V( |3 l/****************************************************************************/
! G/ V, [8 [/ U! t6 y& uvoid InterruptInit(void)' g* K% n! K# {: Y& y) J8 j
{
3 |8 D1 V, _7 l" O    // 初始化 ARM 中断控制器
" B7 x& U/ A, Y( w7 s    IntAINTCInit();% b3 m* v+ K1 U. A, O& U
- c3 j, v! ]" U: V& X
    // 使能 IRQ(CPSR)5 A! T! i4 l7 }. @
    IntMasterIRQEnable();
$ ]% {7 }3 Q+ g6 `
  _. Q, W6 Y9 M    // 使能中断(AINTC GER)6 W( v5 l3 P9 q) e
    IntGlobalEnable();4 y3 |- M6 T" u  x

9 r, r) c1 \% A- U    // 使能中断(AINTC HIER): |9 U2 e: P5 _: z! [
    IntIRQEnable();6 M  i! R( A* V: T7 h+ Y" c2 G
}
0 I. O6 v& t0 d4 i+ [) ?4 `* L! j  F& p) r
/****************************************************************************/  y  q; p$ T! G3 l8 _- H2 @; N
/*                                                                          */
$ K1 d" e& X" S# w. Q/*              UART 初始化                                                 */
( V4 p3 A0 G8 h  J' E/*                                                                          */8 w, e& x( ~" }) @$ c# k) [5 u
/****************************************************************************/* a/ x7 x" q. U: |. h5 \
void UARTInit(void)3 h( m! C* |/ m2 s6 U+ v
{* c7 U) t4 t$ s2 z; \* m: \
        // 配置 UART2 参数  F5 k2 A3 P2 t2 x9 y$ F
        // 波特率 115200 数据位 8 停止位 1 无校验位
8 s* Z- H- N$ b# J# M& W    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
) d- C9 r; c4 f$ h; Y                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);6 q+ J& _# F6 w9 O
        // 使能 UART2
& l: a4 Z+ y2 n# l6 j5 O        UARTEnable(SOC_UART_2_REGS);
  X3 `: G  R" H+ c" Z4 [5 l- D; A  }& D# a/ {
    // 使能接收 / 发送 FIFO, r& R& s9 o. L
    UARTFIFOEnable(SOC_UART_2_REGS);
6 d2 P1 N6 x. c& s# q' Z4 k& h- v, r: X+ t" K$ n9 N
    // 设置 FIFO 级别( m' [6 v% K+ ]" B/ }8 m& [7 p
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
2 Z- r6 R5 i; V7 v}: i$ H/ v* d0 F6 O) T

7 [- A9 T  Y4 L# r% n/ o/****************************************************************************/
. Z( k- `! d' f) f* Y7 u# A/ F' f: I! J, r/*                                                                          */
$ g9 X' j0 C4 |/*              UART 中断初始化                                             */
9 {  I; q: o9 r/*                                                                          */7 v# r# D6 p5 x  q6 n7 a& s* l
/****************************************************************************/
; B, [# f3 n# L( _void UARTInterruptInit(void)
7 m( \0 z: p. ]9 X( [{4 a9 S# B7 C) h1 `+ y& p! b
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
$ \1 Z/ B# S- m1 S$ x1 i1 x$ |        IntChannelSet(SYS_INT_UARTINT2, 2);( ?* l9 a5 o# Y5 @& h# l- w
        IntSystemEnable(SYS_INT_UARTINT2);
# X9 \+ l+ O" R2 \& t! ]  e) E+ d; b  T- `
        // 使能中断! J. [0 Q5 J/ o" r$ d
        unsigned int intFlags = 0;
  x9 o. o1 n/ [# I- h: s    intFlags |= (UART_INT_LINE_STAT  |  \3 t* r' Q( t) y$ D/ m# P
                 UART_INT_TX_EMPTY |    \
0 b( x5 a- d) L7 D) _: i                 UART_INT_RXDATA_CTI);
1 P) G, A, l, L- X5 @    UARTIntEnable(SOC_UART_2_REGS, intFlags);
" F) J- ~2 y: ?; d9 K# h: |& X}* g5 G8 s& h# @- J# P  J
4 h4 v; Z$ K! a0 ]: `! p8 x3 D2 C
/****************************************************************************/, J7 h9 ~4 }$ g" l* v* G0 P+ O
/*                                                                          */$ H' d: v! Y/ l* j0 E0 V( M
/*              UART 中断服务函数                                           */6 K% U; g4 N; P1 f. K
/*                                                                          */5 l4 ?/ e% R8 u8 r, X
/****************************************************************************/
  e3 |2 H: c0 ]1 v% wvoid UARTIsr()* d, i; k% L" @; B' d1 \# L9 S! u0 P
{, ^; s# g' L" p# U6 B
    static unsigned int length = sizeof(txArray);+ O( Z2 Z7 Q' w% s' c" Z
    static unsigned int count = 0;
; X( M& ^9 ?2 S8 L; V, |    unsigned char rxData = 0;
/ f/ F" R$ \) B( o    unsigned int int_id = 0;( G7 L( w, I9 v' ]

. d; O8 f  x; Q' @  `5 k3 G% J. g    // 确定中断源
( r3 Y2 c) I+ S# y7 v6 }" A0 I    int_id = UARTIntStatus(SOC_UART_2_REGS);5 E3 y. {8 z0 s; m2 h

3 K2 @' P2 K& c% \* [    // 清除 UART2 系统中断
+ Y% z5 k1 x6 z4 R% s+ B; {' w    IntSystemStatusClear(SYS_INT_UARTINT2);
! {4 e; S6 h: y6 |0 S+ E: ^
9 d4 N0 W6 v% e, P    // 发送中断8 E" ~) x" e7 s7 U1 m. ?' q. t7 n- T
    if(UART_INTID_TX_EMPTY == int_id)8 c( {% @' o% G  u9 Y
    {' y: _6 t; N% e# A* B
        if(0 < length)4 q0 F  Y' L' |, w+ a
        {) m2 Y! c. A0 E
            // 写一个字节到 THR; J( P3 Y* a- h' _+ B2 Y3 i" n
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);/ z! ^  e$ k; ^+ F: N
            length--;
' f! v8 t# ?7 T. K0 J: c6 {) b            count++;
! W' E! p7 Q% W- m' j        }9 @3 N0 _4 m6 U+ H" V+ O9 B$ T
        if(0 == length)
6 w8 J' A' t' R# @) j  o        {
+ E7 q0 _$ z4 Y( f( N            // 禁用发送中断
1 j+ C1 R% S- d1 l8 n" \5 l: @            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
9 S  O6 r7 ]9 M$ v        }: x7 `! V/ V; F1 K/ E6 |
     }
4 `: ^! }+ M" U6 A0 S' _" `) J0 L, L! q/ T' F8 c
    // 接收中断% G9 n/ x5 \5 K2 @
    if(UART_INTID_RX_DATA == int_id)& b. X7 @: ]3 M" _7 ?" U
    {0 [( k+ Q, g. o6 C" X
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);! @( ~/ F, c3 ]4 u
- F( c0 y/ G) V7 E' `+ m, E
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
  J- D& X9 B: _- O    }
- C1 E3 e8 y9 P/ m0 ~8 G$ ?, B0 s
    // 接收错误2 q: b4 W, j; G2 P8 N1 _3 @
    if(UART_INTID_RX_LINE_STAT == int_id)
& b5 A2 T: D" {$ ]- G0 ?    {5 B- H% ^- Z) n- p9 @% u
        while(UARTRxErrorGet(SOC_UART_2_REGS))
; k9 Q, i. ?) u# y* r  c' i        {
" c* w8 a5 Q8 f8 N+ S6 [            // 从 RBR 读一个字节1 J4 A& ^- m3 ^7 l8 C, Z3 F% a8 Z
            UARTCharGetNonBlocking(SOC_UART_2_REGS);/ x* r; h: d3 s3 }9 e7 t
        }0 }7 ]* \$ l# ^) O  ~* b. X. K
    }
& \9 d) x) K: {9 T   
# \, N& L8 M! K' C$ s; X    return;
4 e% ~6 N3 x5 i9 ]) T4 v}
" M: u, i, H& [. S  P
回复 支持 反对

使用道具 举报

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
% ~, t% ?2 E$ u( J) K& G$ J$ y- U如果其它设备快速给你发送串口数据,你这边能正常通讯?

  L6 A. m* ~' }' m( ^1 N谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 01:26 , Processed in 0.041933 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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