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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7261|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。" M$ t2 L3 U5 L

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
地板
 楼主| 发表于 2019-5-5 22:36:34 | 只看该作者
785235014 发表于 2019-5-5 22:25
; l* J8 h& g/ C/ T" D: k7 s9 _如果其它设备快速给你发送串口数据,你这边能正常通讯?
& z, ~, o: G% J: u
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

1

主题

5

帖子

1034

积分

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。/ t; ]- t2 E3 k4 g7 u
; N1 \+ ]2 E8 Y. |& w* z3 E0 B
#include "TL138.h"                 // 创龙 TL138 开发板相关声明% k! q: j% I) E" x

5 O2 e3 \$ s# R/ b) y#include "hw_types.h"               // 宏命令
7 \4 I3 C5 k7 Q& E#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
! v+ Q& T* ~, t0 D' w8 d+ Z#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器, [3 U. ]9 B. ?2 C$ \: r

" ]/ V5 g5 j) I7 E$ f) ?' Q#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明1 A: R2 Z$ ?3 u
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明7 ^8 u' k) v0 s0 {7 ~$ M" W
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
1 z- {+ f& c' e7 I#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
$ h  K+ e. u/ C
6 v) t7 {' X+ y) h/ _+ q/****************************************************************************/3 o! L1 h  ~4 f# b4 T4 p
/*                                                                          */
7 K& q. k4 K; r2 o. k# T6 i/*              宏定义                                                      */" z% E( ?( ?& o8 A  Z3 Z
/*                                                                          *// u2 J9 h; J! H7 }
/****************************************************************************/
' @2 ~# y# a: v, P$ w0 C6 B// 时钟2 n. F2 k) |5 V% N
#define SYSCLK_1_FREQ     (456000000)
& a. G/ N' ~- k' \( K$ b#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)* l) w4 ~+ X3 h: c1 H# o8 _# }4 y: ~
#define UART_2_FREQ       (SYSCLK_2_FREQ)
* N9 \/ X: n5 f5 `3 P. a  g3 Q' V+ w. C$ V( l
/****************************************************************************/, D3 Y) [) \. h' R) }2 b
/*                                                                          */" Q  W: D# S" |4 g/ h
/*              全局变量                                                    */8 r  Y2 u% o: R' K
/*                                                                          */
( p1 M  f" `: x9 P, M. o( B/****************************************************************************/% J$ a) L/ p  [$ Y1 z6 v5 Z3 [
char txArray[] = "Tronlong UART2 Application......\n\r";
, i' t/ \1 ]1 h" t2 k% c6 f' r8 ]
/****************************************************************************/
$ C7 t. C' d  k: N4 x1 }6 t7 k/*                                                                          */
1 _/ X/ f" m1 Q+ W$ Z( x/*              函数声明                                                    */7 ]/ Y4 v# Q3 x/ A$ S0 Z
/*                                                                          */# b6 X3 k) U, {/ V8 Q+ g  q* s
/****************************************************************************// `. p& J/ B3 h- r
// 外设使能配置2 ]% u$ j3 Y* [! ]7 @* ]! j
void PSCInit(void);0 W0 N; d2 w: r4 o% `, c6 _) G

8 T5 u# {) @$ O' Z& W3 }; F9 l// GPIO 管脚复用配置( R9 U. Y3 [( B
void GPIOBankPinMuxSet();
- o- v4 e$ c% d, @
7 _" N0 I: n/ c- t+ g1 a// UART 初始化4 ]# H( C& w' F$ |$ W  A6 F3 D
void UARTInit(void);
# P4 ?" h1 I6 u// ARM 中断初始化: w6 f2 G; S* `0 y3 f; }
void InterruptInit(void);8 T% C7 N- q) \5 o7 B, C% |/ _
// UART 中断初始化
1 g$ O2 s0 b% j, g# Xvoid UARTInterruptInit();. x9 t# y% R1 B' t* @& w
// UART 中断服务函数) ]6 p" |' m1 R5 t  I/ }( T) N
void UARTIsr(void);/ |0 c! g/ y$ L" ^  I

1 l- O1 o' s- Y3 H/ `/****************************************************************************/. i( x" c5 B, W! \! |
/*                                                                          */
1 c! K; o* N* B( B1 G/*              主函数                                                      */
( `% i$ z: @+ t: }8 n1 g/*                                                                          */
) T8 c, N3 H1 T2 d  q1 K/****************************************************************************/2 r1 r5 T$ ]. f+ H/ r, P, Z# v0 e+ B
int main(void)
5 a" E- \! }* N{
; W! w) n6 \$ q: o4 ?9 d, \        // 外设使能配置9 s8 O  v3 i4 t( d0 J$ k
        PSCInit();  K$ _3 b3 C% `; d
       
# m1 x: Z( `6 s        // GPIO 管脚复用配置9 J. E* o7 N$ A) E+ f1 A+ [' {
        GPIOBankPinMuxSet();1 C  C' }8 g& L/ h7 q5 n
# H" Z3 e; `0 r3 d7 h# Z$ Y
        // ARM 中断初始化4 [0 v& V8 G5 C0 k
        InterruptInit();
+ |$ ]3 [5 H* g
4 h9 d" P$ i( E3 z        // UART 初始化% X# h% ^* I% a& b
        UARTInit();
, U6 M, d" @3 V/ m# ~6 M& @- Z1 q0 U; X$ B  v7 ]7 M7 s3 q/ V
        // UART 中断初始化
& c* T: j2 e1 N) _" I( V+ m        UARTInterruptInit();, r7 Y& L5 K! Q- D

1 q; |% _* p( x( U' h* m: @7 X% |        // 主循环
* s5 x; L) W( x4 l7 j& ^        for(;;)5 c$ K( F, t5 y( S2 z% B
        {, o$ N3 i  s/ A

* C" ~' Y7 w& }        }) v" M4 U" N9 I, A4 ?" _- e
}  V1 P+ l* p6 D4 ?! P
9 P$ p- L8 R. A) R
/****************************************************************************/: I  B% K6 Z% I, @2 Z
/*                                                                          */
6 _6 c- I$ n6 v$ v2 E9 `5 ]8 f, w/*              PSC 初始化                                                  */; ]0 ]9 D4 G3 d/ B
/*                                                                          */* a2 ^% e6 H* b
/****************************************************************************// B# e$ Y) C2 h
void PSCInit(void)3 l7 k$ m# Q; ^! @" {. ?8 V
{' f! V, _3 v$ @' V" ]6 m
        // 对相应外设模块的使能也可以在 BootLoader 中完成  S3 T0 u6 u6 x' E. ^
    // 使能 UART2 模块
$ t; w8 }/ f% X* B7 \# N, d/ t. v    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
; D8 U7 P# X1 a) }}1 R; @7 d) v! Z) P1 X0 T
: z- {. q) D+ Y4 W! i
/****************************************************************************/
' Q* a) G: w' g* v/*                                                                          */2 e7 `" s+ b( l# {1 T' n2 e% X; c
/*              GPIO 管脚复用配置                                           */
; [8 L$ G5 W( y1 T6 J* {4 \/*                                                                          */% F2 }# {+ E8 f+ z5 q8 u
/****************************************************************************/
# E+ ?4 M3 `  {. |# x" r) avoid GPIOBankPinMuxSet(void)$ R- h7 Q2 V5 ?# {- w4 D( r
{
! ~5 o1 {$ ?7 o+ m* n        // UART2 禁用流控+ s9 r# H! }2 S" p5 F* |& E
        UARTPinMuxSetup(2, FALSE);6 Q3 }3 E& x; q
}( w2 m" W; k0 D3 i7 G" G
/ j1 Z3 S% g1 c. T
/****************************************************************************/
& }! l. R2 _/ C0 R7 C8 D3 @7 ?9 d/*                                                                          */: A7 ~  ^: L* S  {/ S
/*              ARM 中断初始化                                              */2 ?2 }& j( f! M7 z" {5 I6 ~7 h% d
/*                                                                          */$ Q/ f" V9 G: [) `  V
/****************************************************************************/
" ^* p7 F$ ~6 W( U  ]1 H  `void InterruptInit(void)
3 q+ m! g- \+ j4 H# y' W. B) E2 R% c{& K* e2 [/ O$ z4 N: ?6 Z
    // 初始化 ARM 中断控制器$ C' r! |9 a0 L7 p( r+ q
    IntAINTCInit();6 q# P* ?' M- ^% q! n; W  ?) U
3 }! a8 Q$ Z9 X0 C" _/ _
    // 使能 IRQ(CPSR)' \& @7 G' B1 s9 K0 }$ E
    IntMasterIRQEnable();8 e, k8 a/ Q2 A. Z$ ]) j1 z0 X( h
" W: }2 n6 w9 B) B8 F$ Y; }$ G' p
    // 使能中断(AINTC GER)) Y1 P8 i, ]# ~, s( @% [: N
    IntGlobalEnable();, {, L$ }7 L: L2 l: R7 ^  a. A
# @2 m& Q( o7 `6 B5 I5 \
    // 使能中断(AINTC HIER)
1 ]" i- c/ Z& h8 D* _/ D! `    IntIRQEnable();
8 B# U/ v' D7 E}/ K" y* B5 e. T9 k0 W7 H

. f5 Z9 h8 p& K7 A6 i  G/****************************************************************************/8 F! @, O$ j* ^, M& Y9 j2 u
/*                                                                          */
- p& R4 n& z# \; X/*              UART 初始化                                                 */
  ^2 i8 \% U% O- J) p8 ?: ?% s/*                                                                          */
* u* T- y# Z9 j1 A! c/****************************************************************************/( r, \1 ^  z8 _* C  M
void UARTInit(void)
. m; N5 W( M  L{) e9 t- D& ~& V& C
        // 配置 UART2 参数2 I3 |) [7 x$ L7 m
        // 波特率 115200 数据位 8 停止位 1 无校验位
7 Q- Y( d% ^; I  t* E. A+ O/ c    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,3 k8 c- K5 T! Z  [1 S0 ?1 H! H' l
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
  Y. [" M- e5 l0 Y        // 使能 UART2
$ b; ~$ x% |4 |$ s6 x: J( a        UARTEnable(SOC_UART_2_REGS);
- B! W9 h9 g9 Z5 R
  G# D/ R( W1 }0 L0 O    // 使能接收 / 发送 FIFO
6 h6 y7 R( u8 _8 J- O6 k( |/ I    UARTFIFOEnable(SOC_UART_2_REGS);# w- n" N; s% s& F

' O' e" P6 G4 A4 C2 Y6 q    // 设置 FIFO 级别6 F& \, y  P) M) g/ u# `( O
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
1 O: W, V6 N( V* D; E& E" }}! L' Q3 o& M+ S5 ~9 Q" _2 ]& Y* e
; \- R2 I9 o: V5 }0 M; Y* z9 ~9 Z% A
/****************************************************************************/
2 \" n4 |; V7 ^" B5 |6 Y$ A% \4 M/ [/*                                                                          */6 w! o, `" U% Q8 x5 z
/*              UART 中断初始化                                             */. R! h; \, {/ t: ^: j
/*                                                                          */
& I. F5 I2 ~  a; N& F+ X3 H1 K/****************************************************************************/* p6 o( @7 h8 V. o
void UARTInterruptInit(void)
9 e6 E4 t$ e5 c8 k( A9 M{
0 b* {! }" h  I9 S6 E7 T        IntRegister(SYS_INT_UARTINT2, UARTIsr);; K9 G4 M3 O+ R  o
        IntChannelSet(SYS_INT_UARTINT2, 2);
" A' _5 n" M# D+ v' t; v( K        IntSystemEnable(SYS_INT_UARTINT2);
* Q, Z+ t2 w1 C/ Z9 P
" P4 {! e2 x9 D+ b4 b' p4 t% I        // 使能中断5 j; Z3 O% E# A- P& U4 r
        unsigned int intFlags = 0;, ~# R* e6 a6 L' @+ X$ e  Y3 v
    intFlags |= (UART_INT_LINE_STAT  |  \
/ o6 Y  T' N% v: i% n; i                 UART_INT_TX_EMPTY |    \  V: I$ n) g7 _" ?7 ~  A
                 UART_INT_RXDATA_CTI);
. r+ p/ ^) k- \! P, L! U) w    UARTIntEnable(SOC_UART_2_REGS, intFlags);
% G; J% v  }4 X6 z$ d. z}
7 i! f  L" b+ n: s* t4 C/ ~( j- V  L2 m2 d0 R/ q* T+ `
/****************************************************************************/
- n4 w! x- q% A% ?- M5 T9 ?/*                                                                          */
) x$ d. |2 I9 L/*              UART 中断服务函数                                           */
' k3 S/ Z4 X9 G! e5 M0 ^/*                                                                          */6 i6 L$ G" w# K, N
/****************************************************************************/3 G  R$ U" s& P8 W! [6 Y  R
void UARTIsr()
' H! R4 p5 C8 e{7 e6 ]. b1 _9 S  \6 U0 N+ T2 B( c
    static unsigned int length = sizeof(txArray);0 v9 L  H7 ^4 P# z" H
    static unsigned int count = 0;% g, ^4 U' i7 T  _; C& F; U
    unsigned char rxData = 0;* a. O# S/ h1 R# j. h6 C3 k
    unsigned int int_id = 0;
& O1 m1 i4 h. Z0 s0 h
  z+ N, J+ H# j' e    // 确定中断源" ?- o1 @: M0 Q. v
    int_id = UARTIntStatus(SOC_UART_2_REGS);% w4 p; O5 f3 j& I  W1 u  D
, R0 k, @+ T1 R( F) f! L
    // 清除 UART2 系统中断
1 `2 x+ [5 y$ J) m- l3 Z    IntSystemStatusClear(SYS_INT_UARTINT2);
0 C$ W) e+ O0 C+ X8 Z. s; j9 Y. e* h
    // 发送中断
6 M+ o) W1 \: A6 ^$ J7 V1 O% a    if(UART_INTID_TX_EMPTY == int_id)0 h/ m2 z. c8 h  z
    {# h" q; f0 o. h/ Y( @4 W( P
        if(0 < length)
# b' j. J2 Z- Y/ m        {
' ~# b$ C0 `  E3 Y1 h! S            // 写一个字节到 THR
+ \+ C* R! N- y. P4 j: C  z$ H            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
' f* _/ R. p7 M! N+ W            length--;
. a% C- I( C( Z* G3 s  \" B+ t" j            count++;% E" @% u# H! A5 v: Y
        }, P8 i9 J- b, m0 x( k  n& [0 n+ `
        if(0 == length)
# m$ Q0 B) W, z. V0 o3 O. E# T8 W        {
4 {: ], z7 C3 C! L            // 禁用发送中断
- u  B2 Q5 v* M9 F( l- j1 W2 c$ ]            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);& l( z! f+ w7 L
        }
$ d: X; x* @$ [     }" t2 Q4 @* x; l( u, [
) W+ k0 f0 ]% h' `$ v) p; d/ I
    // 接收中断: u' R9 ?! T$ H+ f+ v; F7 O  _. J
    if(UART_INTID_RX_DATA == int_id): |* t4 m5 d1 K3 I( h3 X1 p
    {
& m8 P, I! }1 T0 a5 k8 V        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
2 M3 v: _6 x* `: x6 ^, S* U  ?
) ?3 M5 V' ?9 A0 @        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);3 N9 }4 K7 \. v  k
    }# ?2 P) Z0 Z) k

" V# y' K* b& U    // 接收错误
8 ^; b% K6 V, }* V: c3 ?    if(UART_INTID_RX_LINE_STAT == int_id)& _/ m% m0 B8 T' I7 x
    {8 u$ _- K) ~& m. l! E9 H
        while(UARTRxErrorGet(SOC_UART_2_REGS))
  S9 J) V  o% o& D1 m' v; K        {  C+ D) D* F9 w0 q. S
            // 从 RBR 读一个字节5 v; w8 b; e. Q' N% n% o& L
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
, N6 T* \( q( ]3 x) m7 k- `        }  Z* j+ @' i+ g4 Z& Y
    }  ^7 N6 @* @4 ]$ W- L3 O/ f9 \1 g/ ^
    * C& Q$ _3 r# K$ J: I# D5 ]* C
    return;0 L  p6 p/ O# N; Y6 F' v* z
}
1 v( Z, g. o8 d0 J
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-15 09:21 , Processed in 0.040504 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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