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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7385|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
$ u  H; f$ n. k0 o$ Q

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
. c0 [  y9 S1 `9 X, S; J3 u+ Y; v. ~  G1 H+ A1 n+ H. L
#include "TL138.h"                 // 创龙 TL138 开发板相关声明) y, J/ M+ x, f/ S
+ G6 X1 D# u$ G: P( s+ _" e+ G
#include "hw_types.h"               // 宏命令9 ]" w. f/ ?8 X5 {
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器: H/ R. \4 _7 ]( l! I
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器& t9 L) W& h& F7 g, {: W
) E3 Z, y( @9 e- R9 m" D; o4 J8 Y! E
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
' u1 T4 j- W, o  Q#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明; B! [: P4 l; p! n2 w* ]
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
" j9 m1 s: b- ?$ k0 {6 q#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
% U" x4 Z" n$ j' u+ \4 l& ^+ \/ _# e0 w% c, k! o0 F, `+ R/ F
/****************************************************************************/
/ ^) o) x2 l( S$ p/*                                                                          */: |; N( e. j  r  z
/*              宏定义                                                      *// q* U1 M5 x" I% y" V6 M
/*                                                                          */
- O; Q/ u4 b2 W* }: P% k7 x/****************************************************************************/
2 x; M& V# f+ ]4 b// 时钟
7 R+ y) y! p* s' ~6 l#define SYSCLK_1_FREQ     (456000000): x# z6 e5 r4 s/ F% q
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
. G1 ]! p5 j5 Q#define UART_2_FREQ       (SYSCLK_2_FREQ)' r5 n7 `6 f3 X* o& P3 Q
$ s; D/ k, s3 u3 P; O: S
/****************************************************************************/
$ `  K; i$ K1 g. {. i/*                                                                          */
3 t$ s; j2 l) V! |' V/*              全局变量                                                    */! p1 F3 v4 h, v8 V" b$ j
/*                                                                          */( K% p$ C+ I% |" N7 T/ f  I
/****************************************************************************/
% k( P. r1 }8 @* O) _char txArray[] = "Tronlong UART2 Application......\n\r";
5 I3 N4 X3 |, X% R
6 {: z% c' ?& B# L/****************************************************************************/' R0 a/ [9 S( V8 o
/*                                                                          */$ H9 P4 Q) u$ B
/*              函数声明                                                    */
" ]) Z8 l) i# }$ J/*                                                                          */
6 A# v- q3 e# l9 O5 q% u' ?/****************************************************************************/
6 t% h1 J. |( m3 d2 b// 外设使能配置, \* Z& [4 s% v3 ~% G  n0 R# Q
void PSCInit(void);
7 R; H: i  ?1 r# b0 r* w9 h! ^# L5 p, _, G
// GPIO 管脚复用配置8 \1 m$ L& N/ f  W
void GPIOBankPinMuxSet();% [$ B- u3 ?! G1 b8 A; T. q5 u
( e4 P* u7 F! h- `; c
// UART 初始化. }( B7 A* p/ ]. B# g$ M
void UARTInit(void);  O9 d+ v: t9 P2 N0 h
// ARM 中断初始化3 U3 x7 w" K. [7 o7 t3 c! D
void InterruptInit(void);7 y: W7 }) D3 E
// UART 中断初始化
5 a/ Q4 x0 b* t& n( evoid UARTInterruptInit();
2 X- |( P$ R$ m: q6 f// UART 中断服务函数
5 N: y; o% O9 h: A( f) u- r1 vvoid UARTIsr(void);6 [# z8 j! d9 B6 f; l  x  a

+ w, v! V9 Z9 ?7 }* F/****************************************************************************/# d3 c" U* Y3 m
/*                                                                          */
8 G6 J/ ]% D7 o4 X9 A/*              主函数                                                      */" f/ O/ x, h  M4 p8 Z
/*                                                                          */
2 ]  o' H/ U1 Z. E2 h3 m( O6 L/****************************************************************************/
8 d  F1 `3 ~1 z! l2 \; B& nint main(void)1 X: j" S  W- b0 T$ W% {8 p
{
8 W/ G' X5 j1 o6 {+ x- K        // 外设使能配置
8 `+ b2 x& W" ]4 i" ~5 X        PSCInit();
2 M0 T5 T% k9 Q6 V2 d2 ?5 f( @       
& l3 Q* o5 a( k" L! j$ Q        // GPIO 管脚复用配置) G9 Q/ z, O/ T+ _
        GPIOBankPinMuxSet();
4 U8 a* Y, p$ h8 I/ U4 N7 G
4 [: n$ g5 \0 c1 ^& r" |) T        // ARM 中断初始化
7 Z+ o6 D4 }# l% q' L* ~! z        InterruptInit();0 V5 g4 Z- I7 w3 O

* `) E" O- S# q! {% y" U) X        // UART 初始化
' `  v1 b; G, c% W0 v        UARTInit();" R$ X' C- `  `% x2 n
2 J0 k- ?& Z, Z4 s
        // UART 中断初始化
  E' B# ?: k1 W& F( K3 m; |, M) v        UARTInterruptInit();
8 q9 J+ h; L: S; C9 ~) K  V
$ z+ O( Q/ D: s' T& k8 m        // 主循环# Z8 g; M- B0 a; z
        for(;;)
) y- W2 z. b3 B" ^        {
* y* K4 o1 v, ]- V# j8 D0 v) f! y2 O) W  j( k: |5 ^
        }
) I1 I6 F5 |$ |+ z}) K' m6 R" b/ D. o: U( l
5 R9 P3 Z6 E+ k
/****************************************************************************/( p0 m6 j* R" o1 ~
/*                                                                          */& R( ^, ~" f7 P( q
/*              PSC 初始化                                                  */. C  G, \+ W7 N/ t1 t, l
/*                                                                          */! L" L9 G7 d0 I) P
/****************************************************************************/: J8 f6 ]4 p- }7 }7 p1 S$ ^3 \
void PSCInit(void)
& q2 ?/ l; l/ P) G  o9 [0 N# Q1 T{. E7 y+ t& ^+ }+ S1 n
        // 对相应外设模块的使能也可以在 BootLoader 中完成/ J2 f% g+ n' U% ^8 Q6 k% H' U$ P$ G
    // 使能 UART2 模块, R* L- W. J5 [2 }
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);* z- k9 t) n# [+ N0 u: ]' l) B
}
( k4 H1 X" @  e" ]
8 e, ?  _! Y( q/****************************************************************************/
* l& X; K  v" V1 g. y/*                                                                          */
/ Z, q$ ]7 r* L: O" h. D/*              GPIO 管脚复用配置                                           */* d" W  ]0 O2 R# Y! P! a" K, V
/*                                                                          */3 F: i3 }% C( ]* P% ^' c
/****************************************************************************/1 A, `; \1 `4 O# s
void GPIOBankPinMuxSet(void)
1 o% ?2 \4 C& _8 h+ F+ q4 x4 X& S{3 x+ Z' x# S1 b8 {' J
        // UART2 禁用流控) ~; b9 B. P$ u* o1 v
        UARTPinMuxSetup(2, FALSE);/ @2 `0 a. S. l! c  G
}
# [( j, ?9 I0 l! w  y: U: p
4 t6 J# n, R( m: v, O/****************************************************************************/6 _+ p: Q% z+ E" F  l6 C- I: _( p
/*                                                                          *// v4 |7 ]2 E+ y9 ~! [1 C
/*              ARM 中断初始化                                              */6 `+ J# r2 n% [" u2 p8 ]( M
/*                                                                          */- m7 Q' U+ N" c$ j: d5 T7 @0 L
/****************************************************************************/* q7 x4 E: [! ~
void InterruptInit(void)
% Q) C6 l3 b+ L* Q{
  O: s, q# v. p& ?    // 初始化 ARM 中断控制器
' z) `8 A- h2 X& O    IntAINTCInit();9 k8 c9 F/ R# m2 d' _

# y) A, s" Y, G6 r% ]: e    // 使能 IRQ(CPSR)
9 s1 t2 h; F1 i. K    IntMasterIRQEnable();$ T8 |' Q! ]; t, L

* B1 X4 E+ k2 }  Y+ U7 j    // 使能中断(AINTC GER)
/ T/ d# X% \! I2 U. J0 ~# y    IntGlobalEnable();' d( B8 `! z5 w/ z# a9 @) U
  `! b5 \/ v3 O) n/ t) F
    // 使能中断(AINTC HIER)( U6 l& W! A0 e/ Y- @- I
    IntIRQEnable();
8 I) D4 {0 f. {& w4 [# F7 O7 k}
- M% P& d6 w, i  N) ^
6 ?% W5 `$ h4 R- E5 }1 T/****************************************************************************/
& N7 ]* r8 e$ Y5 P  `! U. X9 I/*                                                                          */- @' l! n0 z9 t; p5 L5 Z1 f+ T
/*              UART 初始化                                                 *// T' B( z" ~& I/ M
/*                                                                          */
7 G' U" ~9 S6 _( ~* q; D- j( h  o8 H/****************************************************************************/8 P* o0 H# }- {3 o5 H! s
void UARTInit(void)6 B( T+ Q! {( b$ W  L0 O
{9 N0 k3 d6 Y. G9 m5 R2 f
        // 配置 UART2 参数
2 T0 ^/ H+ i* F        // 波特率 115200 数据位 8 停止位 1 无校验位) E2 t( F* [1 }  t
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
/ V% x/ X! @  n' ]7 i                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);% N0 P4 }: \6 ~/ F
        // 使能 UART2: E# R8 d9 i& m
        UARTEnable(SOC_UART_2_REGS);
. r1 ?8 A5 t( Q+ A' T' n: P" P/ v! \5 j! q5 o! j" q
    // 使能接收 / 发送 FIFO
! _; I2 R/ v. o% L# m, q' ]    UARTFIFOEnable(SOC_UART_2_REGS);3 T2 R# n! I9 M' S3 }3 f7 J) u
! t! W' P" D, K7 X: Y
    // 设置 FIFO 级别
( M$ N% U- u& s    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
, l! m3 d8 w) O0 H}
3 k& G, m; B* h& T) |. a4 g2 D6 Z# C( K) m# X
/****************************************************************************/* r' w7 V' ?+ L$ Q- T  [
/*                                                                          */4 T  c& R0 h1 ?0 Y
/*              UART 中断初始化                                             */0 C3 q5 O0 s  ~6 x4 _" l
/*                                                                          */5 U3 y* x4 F8 S' E& p2 ]
/****************************************************************************/
) a* ~1 l. d. dvoid UARTInterruptInit(void)" [* h' `2 u' i1 G1 I
{: e, l4 @7 _( N0 |  B, _
        IntRegister(SYS_INT_UARTINT2, UARTIsr);( z  r  v) ]  R+ I* k# I/ j
        IntChannelSet(SYS_INT_UARTINT2, 2);
  @* m# k7 r1 n        IntSystemEnable(SYS_INT_UARTINT2);
$ B, Y9 \- ~/ N0 w
) `" O' ]1 v; _        // 使能中断
: c5 s9 K9 S& E9 A( g        unsigned int intFlags = 0;
. H9 `$ R4 J" \' V9 c    intFlags |= (UART_INT_LINE_STAT  |  \9 U2 y( r. v& H1 N1 g( w( t
                 UART_INT_TX_EMPTY |    \
! t, ?2 H6 u; M                 UART_INT_RXDATA_CTI);
3 C& b/ B' `% j. X; K; [    UARTIntEnable(SOC_UART_2_REGS, intFlags);; J( T) ~' L# V
}5 h% T' ~) ], Y) c
/ p" G' r# u9 k  Z0 _7 k& C; ^% {
/****************************************************************************/3 p) s1 m7 A( @) u/ X$ n8 ^5 c- f. d
/*                                                                          */
. e& r: Q. T( G5 p8 _4 K- [: j/*              UART 中断服务函数                                           */
4 k* y+ @! N1 U$ y9 i! Z/*                                                                          */- }5 _1 S4 y7 u! d8 Z
/****************************************************************************/# q# n* l7 i- [1 R* L* X/ C0 T$ a8 e: s
void UARTIsr()
& z+ E4 x! @6 B1 h: y{
6 ^4 w( P$ X) Z' h5 x    static unsigned int length = sizeof(txArray);2 }/ `4 s& V0 n4 g4 o. c
    static unsigned int count = 0;
$ P$ c3 G8 k0 ~) h* V    unsigned char rxData = 0;
2 d5 [( S' O9 d    unsigned int int_id = 0;& Z6 i; _7 ?/ ^# m
! q6 \" H0 a, ^' b4 i" I
    // 确定中断源
. y: W; Y5 `. W9 v1 J' `    int_id = UARTIntStatus(SOC_UART_2_REGS);
! U0 m8 T% Z7 Y2 P* f# {- T$ }7 }, C0 S# D
    // 清除 UART2 系统中断
& [9 o: M' k5 b4 A5 s; \    IntSystemStatusClear(SYS_INT_UARTINT2);8 V* c% E* H9 x+ P/ n" Y( y% u* R

; k6 @  c# [8 v& U    // 发送中断
9 b# g! \0 G/ c# k/ G2 T    if(UART_INTID_TX_EMPTY == int_id)# @- |9 Y4 c; A! E
    {4 c& o6 k( }8 o
        if(0 < length)
" q6 g9 w. A0 e: u/ s' }        {
2 n% g  r2 j3 w7 u            // 写一个字节到 THR
7 [( }- U+ E: k$ M+ {            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);" b% k6 e2 @1 ]( ]* R& y! h$ p
            length--;9 j0 p4 P0 W) B" T
            count++;
! A' A% \' ?- G+ g        }
$ L) F- u: H) B+ T  y        if(0 == length)
  U9 ~# _3 q, `* E* R6 H! v& {        {' L& x- _9 v9 u$ e& C4 F( s
            // 禁用发送中断
/ q* L% P  Y4 \2 _+ ?8 Z+ {            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);* h( b  G" Q' K. T
        }
8 S: {4 f5 U: O8 O2 ?     }
0 w" r7 n# p& ~( S7 F7 X
* P2 \* i% M, A1 x3 G    // 接收中断
/ `$ }1 b" w1 c0 w2 c( p4 U    if(UART_INTID_RX_DATA == int_id)
$ k7 v  N# d8 L    {
- r8 m2 i) b1 y- r/ ^& a- A        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
$ R- M3 l& t! c9 J1 X8 P7 G1 `/ b$ e2 s- K' V
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
. W1 m" o* c+ J2 x4 ?; w# [% t    }0 h, }# V. [8 I6 b

$ F& O3 r( A/ T: G    // 接收错误
) o/ o6 `" k+ Z7 _) i( [3 q    if(UART_INTID_RX_LINE_STAT == int_id)
  r) w& L/ }  j3 C1 ^% S    {- k2 d# K% k+ Z( J3 W
        while(UARTRxErrorGet(SOC_UART_2_REGS))( q+ K+ e# O5 M% G2 K2 E
        {3 r6 T: Y) S/ n; K
            // 从 RBR 读一个字节
" P2 s8 _; Z8 k6 k            UARTCharGetNonBlocking(SOC_UART_2_REGS);
% w# d; h% t! R9 c4 ~- V        }8 g, K, n0 m' Z" d4 h8 ~0 N5 S' w
    }
" j( z' r" U$ B" I    6 i9 q+ w* Y. p3 w- }
    return;* r! |" W& g0 V. d' I
}+ q# x# b! c. M- [8 U
回复 支持 反对

使用道具 举报

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
" G8 ^0 B  U% b, T6 l$ @3 s如果其它设备快速给你发送串口数据,你这边能正常通讯?
: P6 {" L( z, D& |( u1 f
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 00:42 , Processed in 0.041675 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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