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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7822|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。: @; R1 c/ k6 K. H9 |5 O

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。: j1 H, G/ w/ P

  I; m( @9 a' S1 o$ c0 V$ c; {#include "TL138.h"                 // 创龙 TL138 开发板相关声明
2 G' e6 t+ ]# b& W1 _
. ^/ b/ C* }" d, a0 {#include "hw_types.h"               // 宏命令
& P5 @" C& p* X8 t* e3 N#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器4 T2 ?# p4 t1 o( K. D) [' L
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
$ k; S/ @7 ?2 }) m+ a9 k* H( P' A- d9 F4 T
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
3 h) V/ f4 c, T$ ^#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明% n5 X$ U; [* V. g7 L8 z
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
- @& ~& N. f  Y' ^4 y#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义1 Z/ Z0 W* M5 N
7 h. U; u* g+ x3 a1 j
/****************************************************************************/, A5 o" t/ V( L# m2 V
/*                                                                          */
0 `; w3 U  K+ C( t8 N" b; ]/*              宏定义                                                      */
4 M. T% a$ `3 c0 D/*                                                                          */
$ ]* ]3 r3 t6 n7 _2 l/****************************************************************************/, s; F! M6 U9 {$ t+ m' x
// 时钟+ `8 E+ n* @1 z
#define SYSCLK_1_FREQ     (456000000)
& f8 Q; U- u6 N# k' R) z: e#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)9 i# b8 k6 C: Z: M8 W* a1 b; B$ c( Z/ W
#define UART_2_FREQ       (SYSCLK_2_FREQ)
' w9 u! ~1 L: N& o2 U! x+ b5 o3 [3 V9 M1 Q# @% l
/****************************************************************************/" F& a* B9 k8 c! N9 M) e% z
/*                                                                          */% t( i, E+ q" G. H; S
/*              全局变量                                                    */7 @4 @  N$ K6 f% i/ L, K
/*                                                                          */* C2 y6 D$ J  S& e
/****************************************************************************/
4 p4 `. z& _* ?5 u5 i  echar txArray[] = "Tronlong UART2 Application......\n\r";
" p4 O0 Y1 M! o! Y9 U% j8 `9 z4 K/ y- o/ J9 P' s  \
/****************************************************************************/
  F$ n! n9 @2 f6 Y/*                                                                          */+ w- _0 ]  X! R0 J; v/ K& n
/*              函数声明                                                    */
" y9 F7 ~+ u# g' R3 w, ]/*                                                                          */' @# I: u8 g' [0 S  R
/****************************************************************************/
6 I. ~4 Z4 `7 \- A( y' J// 外设使能配置
+ b3 |3 U: W7 g' n) n: V* ^void PSCInit(void);9 S. ?8 X: K% h; D# L6 d7 b
# q4 R9 h& X: w4 {
// GPIO 管脚复用配置
# o# A0 a$ r0 r5 ]4 i2 F: g5 g0 Avoid GPIOBankPinMuxSet();- I( L' c7 J& u! d1 J
5 X- K$ }  B3 w2 G' o  j
// UART 初始化
( T9 k1 |5 K4 D, m  qvoid UARTInit(void);
2 C; s4 o2 p0 S; p// ARM 中断初始化
: z  ~8 X1 d5 ~) e% ^7 @  ~void InterruptInit(void);
: _0 t1 w* A$ Z1 L( \' D// UART 中断初始化
9 c) r1 x# c7 p6 s3 Pvoid UARTInterruptInit();
) `* O6 [$ o0 V# X* Y// UART 中断服务函数# R  D0 h4 W4 D! z7 J9 W& R! M
void UARTIsr(void);
1 L! T) l: W6 p' _- @; s0 o: n2 h9 a% v
/****************************************************************************/
8 Z! `+ t# P" |4 x( I/*                                                                          */7 y$ x7 N  `7 \/ j9 d% p
/*              主函数                                                      */
' Q. r1 F6 [! c/ T& {/*                                                                          */
: w0 a7 z. g' d8 ^/****************************************************************************/) W$ C- e% a1 K2 a
int main(void)
6 R' q2 [8 t+ g7 i{1 {7 L; V/ W2 E
        // 外设使能配置. B6 ^4 S$ T0 u& }, g/ r- O2 L
        PSCInit();; ]" u6 ]8 p+ Q7 a, v! y
       
0 P. P  q/ d' }2 h        // GPIO 管脚复用配置
# I) n. c4 q  ~' Y1 D  ?. @" o9 a        GPIOBankPinMuxSet();" t! p$ T9 X0 A* j# W3 E8 S
1 |$ t: A9 ?4 d; s; M. @0 {
        // ARM 中断初始化" u' V4 W6 G6 w  @4 `; l6 |
        InterruptInit();
7 W( T* k" N& ]1 m, W
% ~9 `' K. @4 ]( ~. n2 |; C) \* _        // UART 初始化
% @7 M, |- G2 M5 O        UARTInit();
( N% a; V& @7 @
. \9 I8 Q8 ^" u: m1 S        // UART 中断初始化3 Y7 ~+ E5 F0 p
        UARTInterruptInit();
4 O' m" u' A1 o! e
3 ]% v! v' J) r5 ^        // 主循环/ V+ Q: _/ |" I0 U. y
        for(;;)7 i2 u& V$ x/ I; W2 E
        {% Y% x9 R" a1 p8 [8 u3 X$ j
7 }  V  A( b$ N9 }- i
        }3 i) M: }( ?( }5 [$ |( L
}1 t4 |/ [; g7 ?& A: G6 n+ U! T
7 W, S. d: N8 H* I& Z5 a+ A
/****************************************************************************/
# E0 _2 q- f" a' H, N# G/*                                                                          */
6 ~, \# D( l! |% O4 ?/*              PSC 初始化                                                  */
! i, N. |8 A4 s/*                                                                          */4 ?2 F* ^% U4 E! v# P
/****************************************************************************/
/ Y& T0 ~# M2 Fvoid PSCInit(void)3 p7 L) i5 N: y6 k" ~9 c
{3 p* _+ e! _% l) G
        // 对相应外设模块的使能也可以在 BootLoader 中完成4 G# O; \7 \# [' a: B
    // 使能 UART2 模块/ u" F% O- M& C: U8 \
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
. U* Z4 T( O9 D, w) N2 V}: x' P4 }& E+ a9 O* h
' A; ]: C2 @* ~# C( H. j
/****************************************************************************/
* y: A: j3 C1 X) V; r$ @7 \/*                                                                          */
) h1 a( B3 o! |# K- ]2 Q/*              GPIO 管脚复用配置                                           *// K% I6 b5 B, ?9 j
/*                                                                          */4 s& B, l3 [! ^4 _+ a2 S
/****************************************************************************/
. b$ ~* i8 M# Dvoid GPIOBankPinMuxSet(void)
! e* E3 Z& s% F' X1 k  D/ }2 s- X7 S2 M{
0 T1 B! r. O# S* |        // UART2 禁用流控# `" h8 q: ?* l* |
        UARTPinMuxSetup(2, FALSE);
- C! M7 c# Y! [2 p}* X) c$ p/ N& L- ]. e- L
  N% z* A; b8 @* e# d% K
/****************************************************************************/4 o  W+ Y7 q. U3 B; G
/*                                                                          */6 P3 D8 G& `7 @' I6 V' J8 T: N
/*              ARM 中断初始化                                              */
! ~; E5 j9 L8 |/*                                                                          */
' z! }7 A' T+ n2 l& V; U' x$ ]- G/****************************************************************************/. ^% S4 k1 Z3 p: k- d) u: v/ m% k
void InterruptInit(void)1 V4 B7 i: S- B3 e# v
{5 ?: {8 w' `; n
    // 初始化 ARM 中断控制器
, Z* V' e1 T8 W8 Y4 U: w* o    IntAINTCInit();" y# ~% k# R$ j" v
+ j) R7 F3 ~4 @" B( a) j
    // 使能 IRQ(CPSR)
$ b3 u( F7 p# u. ~    IntMasterIRQEnable();
( F/ O3 F6 C; U* e! f+ S
. |0 v4 b  c2 I4 J8 C0 T    // 使能中断(AINTC GER)2 I' ]6 V* o6 N1 [7 ]3 n, ~$ B8 G5 A
    IntGlobalEnable();" @9 c$ W8 q! r/ \) d0 V
! K2 S1 j& B7 P- ^. l' E
    // 使能中断(AINTC HIER)9 o) `1 m5 c( z
    IntIRQEnable();, p) O; i, h1 e: x; M
}0 c4 l9 _* N1 G7 [
; V5 S" L. R# {9 A- b
/****************************************************************************/
* ~0 F8 M& d7 t" n+ d8 A/*                                                                          */
  L! N" R; j3 R% I4 B/*              UART 初始化                                                 */
1 S( B. X/ l' w" [/*                                                                          */
# O- I: Y* R- K! m3 G/****************************************************************************/. D" G: T, A" v2 r
void UARTInit(void)1 }* n- G: D) q& Y9 w" Z; [  y, D
{
2 x$ k- o# ]8 e; D# g        // 配置 UART2 参数
' F, @+ z- r. i4 L! a        // 波特率 115200 数据位 8 停止位 1 无校验位6 E* w9 k: g0 s
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
7 F/ N; l3 P+ b- N: m% i                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);6 @6 Z8 A) @+ V- \' ~' V
        // 使能 UART2
" v$ @1 Y  S8 a( y% w% _; r        UARTEnable(SOC_UART_2_REGS);$ C0 F; ?& s4 X

, S" ^! \1 N5 U% \9 w    // 使能接收 / 发送 FIFO/ C$ E" P* C: F( P: o; c! Z' P
    UARTFIFOEnable(SOC_UART_2_REGS);
. c/ p, m# W0 @8 ?1 c/ b
3 l) u0 H9 s& h, Y" T" J: L  X    // 设置 FIFO 级别3 }- w* S# D$ n
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
/ |7 }2 q3 P1 L& x9 g; w8 D' x}
. a! R- K! f" r
2 C6 O! ], p+ W8 x( X" X/****************************************************************************/
$ ]4 o' D: |0 ]/ A" l1 J2 `( \2 E/*                                                                          */" _: A+ u$ J5 `. }
/*              UART 中断初始化                                             */
# G: H2 ^* e9 ^9 e5 \( r/*                                                                          */
; N' I+ a* {" [& Q1 C  }/****************************************************************************/
! N8 o" }2 g* s" [, u# g+ z6 I+ q8 rvoid UARTInterruptInit(void)! {; g. q5 l. [/ |3 Y! x$ v
{3 @& F/ ^5 h+ y6 {$ A' G+ S
        IntRegister(SYS_INT_UARTINT2, UARTIsr);  B* }! r7 x9 }; w
        IntChannelSet(SYS_INT_UARTINT2, 2);
. U7 [: Y: n2 c* ]& i) k$ N$ ?        IntSystemEnable(SYS_INT_UARTINT2);3 a, I' X$ L5 L, D
3 k, A! [( R: z
        // 使能中断
  y: r: \% T0 t9 z% o4 V( R: X- V        unsigned int intFlags = 0;
. e$ ~# N! m5 S5 I) u0 z    intFlags |= (UART_INT_LINE_STAT  |  \
4 R: U+ M- M, V2 W- W: C                 UART_INT_TX_EMPTY |    \
- E9 z8 \& n' c7 @                 UART_INT_RXDATA_CTI);
$ ?$ p8 C' w5 ?4 k    UARTIntEnable(SOC_UART_2_REGS, intFlags);
- V8 I+ \+ \; n3 T0 E4 g2 w9 @}. O7 ~" U6 K& ?6 a' u2 d* Y

0 F$ J$ l8 j! S$ `# H) J2 K$ Y1 }& Y% A/****************************************************************************/$ F0 k# U2 n$ i
/*                                                                          */
/ b7 }( m' ?5 N4 J5 N# d/*              UART 中断服务函数                                           */0 N* u( D6 [8 r6 l
/*                                                                          */+ F9 s$ H/ j; G3 a( r
/****************************************************************************/
1 A8 l! i+ y( R6 W7 |( |' Y1 C6 ^void UARTIsr()
& ?& T8 E9 o, _7 k{5 P" B6 k0 j$ R, ]
    static unsigned int length = sizeof(txArray);
8 y( O3 x+ g1 c% \( k6 G    static unsigned int count = 0;
9 x$ |) v* ?. T- t    unsigned char rxData = 0;
; ^  C. o( B0 F$ C) I. \    unsigned int int_id = 0;/ x" `  a+ i2 F" @# _! `2 ]1 S

* f4 Z$ i! ^8 p    // 确定中断源+ z5 T0 Q6 B* o$ u6 c: I2 J0 w+ U
    int_id = UARTIntStatus(SOC_UART_2_REGS);
7 V5 x# u/ A7 G5 D* }$ ~9 v4 V  Y$ v9 h+ K1 N& K" k# ]4 ^
    // 清除 UART2 系统中断" Y) C% d+ F' N* f- [' [& O4 V
    IntSystemStatusClear(SYS_INT_UARTINT2);
% d  @  _8 j4 _2 W- b
6 Y' t5 L( a8 R* Z  U    // 发送中断; E! d) F, R( w, d; b  r1 h. K
    if(UART_INTID_TX_EMPTY == int_id)
4 f& E# T+ t3 B' c# ~+ c    {2 I( u2 Q, x$ {# y; X0 M9 U
        if(0 < length)$ _) H* {$ n  c" b% O  B( s
        {
: n% j2 H" O: G4 R7 t            // 写一个字节到 THR
' [0 [: e( J$ d6 X            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
$ Z. Q5 _6 l8 N6 i2 A: n4 \- U            length--;
# I* Q, f/ J; U3 ?$ q1 }+ z6 y            count++;
* A. X, c3 g+ Q3 n+ t9 _8 \0 P        }6 V6 g5 G* R) z# M$ ?; A6 k3 Z
        if(0 == length)
) m8 y6 x" T5 ~' T% X# o        {
3 I6 N" D: q" `            // 禁用发送中断
1 Z; Y- [; k0 q            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);9 o7 k' r" M6 a
        }
2 G4 q$ M5 w1 _% H" {  E     }! J/ |4 M& c  ?2 a. F  a
* e) u% t% R& A- d' Q7 H
    // 接收中断
, L. n& N+ f: r1 Y$ h) Y+ E    if(UART_INTID_RX_DATA == int_id)
- A: i/ ?5 `. E6 q) I8 A    {
) E3 h1 L# Q2 f3 u1 b: l- S+ @# v( p        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);& }' ^. q' R, e

5 u' L* ~( S7 x4 J# H4 ~        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
# s2 l" w1 c4 V4 V/ L    }
4 X/ [8 U# G/ \, T
* [8 |+ K& Q. ~5 Q8 S" g, Y; R    // 接收错误
) I" J* g* g# q! x( u    if(UART_INTID_RX_LINE_STAT == int_id)) T8 b; |9 t$ J1 V4 P" H
    {
4 ]* I, t3 p/ X. }( V        while(UARTRxErrorGet(SOC_UART_2_REGS))
8 g+ v6 L2 r2 ~        {% _  T: o/ @' j- v1 Y
            // 从 RBR 读一个字节
3 A4 {1 r0 ?. z9 R9 t7 R7 V            UARTCharGetNonBlocking(SOC_UART_2_REGS);* e# x' b. w" h
        }
" F# T% x; Z! h! Q) n; B9 Z    }4 z+ T" D- a1 p6 W
    " w. E9 a* H" J& U, o7 n. K
    return;1 ^& z& j2 _9 F  _  D' r
}( F! Q, o7 Y7 r7 P$ W3 A6 Y8 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% a8 s6 Q; Z! y6 `% I6 s! G
如果其它设备快速给你发送串口数据,你这边能正常通讯?
0 i* g5 w: j! {% s: B' p5 F- B
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-19 07:31 , Processed in 0.043162 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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