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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7369|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
. B/ K: a: Z( {7 l0 I6 q

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
. m9 ~6 _' _5 [- j# T% F* x
2 g/ j/ n6 g7 u) U( ^#include "TL138.h"                 // 创龙 TL138 开发板相关声明
8 C' }* }, M& y$ Q' Z! C- `% r3 {- t/ l/ m' G, I
#include "hw_types.h"               // 宏命令; I) e7 r+ |0 {1 ?0 H9 G! W9 a
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
! b/ ?3 j6 U; F* M#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器" S0 p2 m. R, q& G! b" x

+ r- H* v. V. f- y/ o8 Z#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
* o  y7 l( w* @2 A#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明6 w# P  w. ~3 k1 X
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明, X; Z5 k! W2 f: V" o; ?! P
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
2 j& w. D( \* e( M  u' j* d7 J7 M9 P8 Y( `
/****************************************************************************/
4 G( G, y$ ~$ K* C9 M( j+ C/*                                                                          */
6 D7 X: u# X9 \$ H" \/*              宏定义                                                      */: V; J% l) n2 q" t
/*                                                                          */
7 T5 U( b/ A/ R% U  B+ K1 X7 z/****************************************************************************/
  Q' L; r8 U' R6 V; j) Z8 z4 e// 时钟
# C- s2 Q# |1 E3 G- Y: s9 G- e#define SYSCLK_1_FREQ     (456000000)
/ U6 m9 ?7 h9 r' O* {% e8 v#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
  P( k. ~9 a6 F5 f) S#define UART_2_FREQ       (SYSCLK_2_FREQ)
! A- l3 J8 U# t( r
4 Y) f; {6 {" X/****************************************************************************/- Z" K2 E0 o* Y0 E1 f- G8 J! V. a
/*                                                                          */( ]- f& R- x* d9 O- l
/*              全局变量                                                    */
- J6 e2 ~# w! ]7 Z& B4 S0 l: X) u& M/*                                                                          */" `  G' S. T6 W2 [! B/ ]9 a9 q
/****************************************************************************/1 X0 l" ]8 D7 W1 V0 I4 o3 b  i4 \
char txArray[] = "Tronlong UART2 Application......\n\r";) m  w$ M! m& L" g3 J
- [; K& }, q1 ^* ~" c/ {
/****************************************************************************/4 t" n- \$ v  Q
/*                                                                          */+ C0 J; [% ]5 M2 \2 [) I. E
/*              函数声明                                                    */( O8 Q% h5 y6 K/ Z2 `/ ]2 E- q! @
/*                                                                          */
. T; L. Z% z, b; T+ f4 F  B9 S/****************************************************************************/
: T6 l! s# v) F7 i; a% Z: e// 外设使能配置& o0 u+ u6 M' @! f
void PSCInit(void);
, Y  F9 b4 n% f# M- I6 k
6 _4 V4 M$ \$ `! D, i" H, U// GPIO 管脚复用配置
; ?7 i5 M  J; n  z% Gvoid GPIOBankPinMuxSet();
0 c; x. Y3 A1 k) T+ e2 i$ f5 [# x/ x  [: f
// UART 初始化4 m. M0 C, i. m9 A
void UARTInit(void);; Z* Q, L! T* S! D6 ~# F! u
// ARM 中断初始化
' _; @4 L0 e( L; ~+ [void InterruptInit(void);7 d7 o) T7 j' i6 A9 A5 I
// UART 中断初始化, G" }, G+ b8 ?/ x- F7 L3 p) h
void UARTInterruptInit();5 ~' ^, p) B; P) A
// UART 中断服务函数
* `6 X1 k( o$ d, v! N, Y- ]void UARTIsr(void);) I! u# m6 J2 f0 L6 w2 {1 u5 [0 y

3 ]2 S4 f* Z. q: ^  z# _* ^( @/****************************************************************************/3 G5 G% `4 j8 b3 O( Z
/*                                                                          */& s. u& C3 ]% X' @6 [/ b0 l
/*              主函数                                                      */* R& e" O9 o" E% @0 U
/*                                                                          */
, t8 [! R- D9 F: \/ g6 ~* r$ [# ^/****************************************************************************/
+ d2 c1 d3 t% j( ~8 b) {int main(void)5 [0 N, C6 x5 s, N0 B
{2 ^' K$ y" N. W# ~2 S
        // 外设使能配置" f  I* }2 c- I0 ]/ S! l
        PSCInit();
# _  Y# w) U1 z( q9 {        & h8 c" O* H0 Z7 \+ x: w& d
        // GPIO 管脚复用配置
( r; p! a# I: P' d        GPIOBankPinMuxSet();
( z4 p- A( y: v1 T' L- {) ^) H$ O8 w* r8 U1 v1 v
        // ARM 中断初始化0 m9 w/ O/ V& D! q
        InterruptInit();: g/ O: n. R( T
$ A) V  V; n9 a1 P! R9 a7 B: P
        // UART 初始化2 q% w! U5 X: q1 U! F! g
        UARTInit();
2 [- l  ?1 L) I9 `5 ?- c" q5 p0 l& ^3 m/ F7 L) z
        // UART 中断初始化
  J/ F( P. B1 q- ^        UARTInterruptInit();
& h7 s2 Q  I4 P8 S1 ]* r% E+ x2 y
8 F$ j# v9 x8 i9 u6 ~        // 主循环. Q( p) i( h# g, x
        for(;;)
* P& |. M8 R  m! |: [/ Z1 d5 t6 i# I        {  d  ~; l0 e2 X8 F2 }

# a6 w6 h" o2 A% W) E4 c        }
/ J; d' \; x+ ?}: e0 d3 h1 z8 Y, G% X' [6 d

# e; S+ N0 r1 S: q; l7 g; J0 V/****************************************************************************/
" U2 E7 d$ p/ n1 l8 c( K/*                                                                          */( O; n2 Y5 X# t9 {8 ^
/*              PSC 初始化                                                  */
* ^* d9 r& @+ n: s  O* ?. I/*                                                                          */
& k! V  e2 @' R; Q: ^& R1 S/ `; o( T/****************************************************************************/
% x5 K, f1 J" ]& hvoid PSCInit(void)
1 \& i; w5 K5 @/ x% a{, T+ E) T. E6 n  a6 a
        // 对相应外设模块的使能也可以在 BootLoader 中完成6 U' j4 \" C  j/ z( K+ I
    // 使能 UART2 模块
- \  {$ g: H0 q8 z1 \" b7 z    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
* C0 ^. M2 v& ~* `( e5 x9 t. n}3 i& S% f0 V/ n6 F; a! y  l

9 B% O7 {+ M- b" i$ P/ E/****************************************************************************/. e4 n6 R6 ?3 [. [2 I
/*                                                                          */0 D3 x$ j9 i" h% _" i$ [
/*              GPIO 管脚复用配置                                           */3 }% r& ~' \$ G- x* K- T
/*                                                                          */! {0 G- H& t% T7 u5 {
/****************************************************************************/, G5 ^  \$ \& g
void GPIOBankPinMuxSet(void)3 m- P( B) O) d+ @9 K, X% s
{
2 q& T9 C. _$ K; _; D6 i        // UART2 禁用流控4 G) o9 Y; @8 y! z4 A+ \
        UARTPinMuxSetup(2, FALSE);/ `+ m1 e: I$ b# f7 l: u
}
4 h/ _2 l1 {3 t; h- f+ M3 Y# H& Z% u8 r; a1 R& V+ o
/****************************************************************************/
, C& a3 F8 P8 O- S: w1 l/*                                                                          */" S4 ]3 k. \' r0 r1 `$ s9 j
/*              ARM 中断初始化                                              */& W- X9 o; o) k' n1 i# u
/*                                                                          */
3 g$ I/ P  l  R) Y2 }/****************************************************************************/
3 T* j9 `$ r; n! @7 F' e  Uvoid InterruptInit(void)2 [2 k$ }" e( ?- O- ]/ z$ ]/ w
{( a% L% t! G: t) I
    // 初始化 ARM 中断控制器- y( U" X4 g" t$ p6 l
    IntAINTCInit();- s( L. H0 O( j# `+ g6 m
0 P. H6 }0 V3 N, W) c) v
    // 使能 IRQ(CPSR)
6 w( m3 N4 x$ a9 K) A, V. `    IntMasterIRQEnable();$ d9 Y" F4 W5 ?, o

' S" e9 h( u/ ]8 L! |    // 使能中断(AINTC GER)
) n$ q0 w* D( R2 \$ o: ^    IntGlobalEnable();5 {/ {2 y& e1 |  j; W
( `- G9 y* I0 V) }2 D$ ]4 _" p$ H( P
    // 使能中断(AINTC HIER)# c. B0 P3 r3 u$ v& `4 I
    IntIRQEnable();! d5 |9 N" c% a; L3 o* o$ |1 U
}) k3 ~7 n2 a4 i5 `: T) F

& J4 j/ N' h9 R/****************************************************************************/6 W% g8 k0 y  K7 l1 |3 I! Z2 w
/*                                                                          */+ H' d+ D; S& N" n& k: Z6 F! y
/*              UART 初始化                                                 */$ c" b% B, ^8 h" k- ~, D8 F
/*                                                                          */
+ a1 E5 \7 K7 i$ R3 |6 P/****************************************************************************/
. H, v- c; P: c; Y$ z1 Tvoid UARTInit(void). q7 F- `5 x& i, N0 t& q2 ]& E3 g
{7 b# ?! |  ?; o3 c% I
        // 配置 UART2 参数- l5 c' R' E$ Q( C+ I, @5 L6 @
        // 波特率 115200 数据位 8 停止位 1 无校验位( D( Z/ Y7 M% Q" O* b. \9 Q- t
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
% h( L# t- s- J; G& i0 l; i+ Z                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
5 x. l9 r' s8 ?5 f( s6 X        // 使能 UART2/ {& g) [  ^- K7 m" X. ?* j
        UARTEnable(SOC_UART_2_REGS);" i2 w) l# |+ [1 f

/ M, o* B" v5 R    // 使能接收 / 发送 FIFO
+ B. @( v9 r/ B7 z! {! V' a    UARTFIFOEnable(SOC_UART_2_REGS);+ D8 F, v% R5 k( o
/ M, m# p) |" L% j' A) c# w4 f
    // 设置 FIFO 级别
" v+ G6 U4 _. b- w0 d7 L# j    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
9 F( y9 Q; C" ^' A}" [/ O" ^* m  I8 y

  U+ I8 B1 F( U, `/****************************************************************************/1 x! y6 t0 {8 [. p6 k" f5 R
/*                                                                          */. X2 W: }" u+ B2 t1 y  T
/*              UART 中断初始化                                             */5 ~9 \7 M. S! |) u8 ~$ N2 Q
/*                                                                          */) s7 I2 c( W2 P( a& R) C
/****************************************************************************/
* r2 I0 d3 t5 E: \void UARTInterruptInit(void)$ m9 W4 k" [- y5 A, ?/ F2 d0 Y( Q8 k
{
4 {# U0 G  V  w        IntRegister(SYS_INT_UARTINT2, UARTIsr);: c+ `" V4 T. a* c
        IntChannelSet(SYS_INT_UARTINT2, 2);7 b% h8 L0 x" k1 \, O  g3 S$ q
        IntSystemEnable(SYS_INT_UARTINT2);
/ H2 E4 a5 u. o' m; e8 E  O5 T* D
        // 使能中断! N; G  X- S8 P
        unsigned int intFlags = 0;2 W' O9 @' c; ^" G
    intFlags |= (UART_INT_LINE_STAT  |  \! u' E( J+ n; H3 i/ p% E' ]2 S
                 UART_INT_TX_EMPTY |    \
' |2 a' F- u; a! O$ q7 p: P1 w                 UART_INT_RXDATA_CTI);
" x; J) c6 N6 z; ?1 j* Y3 K    UARTIntEnable(SOC_UART_2_REGS, intFlags);# T* c0 u3 N7 X, m
}
; e1 y; K- B& j8 u! M7 Q5 ]
4 M& r: J" O0 B: N9 ~: L/****************************************************************************/, p# P/ o8 _6 ~* g$ T6 b
/*                                                                          */
' K" O' ~! n: l& l) p/*              UART 中断服务函数                                           */5 r0 Q+ _7 M0 H+ l1 A
/*                                                                          */
/ |' i" r$ X' s% c$ n/****************************************************************************/
3 W1 L, y& h: k! m3 i" g* ^5 |0 z# g9 [void UARTIsr()- h& M+ @5 J+ h( E$ H! s. u4 c
{  y; |4 u! I6 h4 K1 V# c
    static unsigned int length = sizeof(txArray);- b9 U7 A+ x, H; [- N
    static unsigned int count = 0;
4 B# P- ^9 [( u( l1 q$ D8 @    unsigned char rxData = 0;/ k1 y# X( R3 O* g
    unsigned int int_id = 0;
. O; V  j& I$ n4 D# r, F; h1 t- d9 m6 x- g9 O
    // 确定中断源
4 {: ^+ x8 O# e% }* t  ]8 k$ y    int_id = UARTIntStatus(SOC_UART_2_REGS);9 C$ n! v" O5 }- P) e  A+ K9 G

, U$ k- M+ x: V% D- F, n, D* a$ d    // 清除 UART2 系统中断
0 n- Q# p) j. y& ~$ Z7 g( N    IntSystemStatusClear(SYS_INT_UARTINT2);! I% h3 S6 C% Q- d

0 I' w# S+ V6 W$ g; c) V$ T3 o1 ~    // 发送中断
! D" T5 |* t8 ^# ]$ u, `- n    if(UART_INTID_TX_EMPTY == int_id)3 o" N  p8 k# q( ~3 e$ J
    {9 n5 o' B* B& X! |
        if(0 < length)
/ y# O- s" y1 i! @        {
" ?5 b. C, S; l, z. `            // 写一个字节到 THR
; |/ _( G" e. }$ g' O2 _            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
( l7 d" R( e1 P% D, L# g8 ~            length--;
/ B4 D  C2 Y) u. Q            count++;
# f0 R1 B1 G6 F$ K: _        }; O/ i; p  ?. \
        if(0 == length)- Z& l2 D  L9 r* P0 C5 p
        {% Z/ @& l9 m: H4 b0 ~/ A" L9 Q
            // 禁用发送中断5 ~& H; E3 y# S0 C4 a
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
% H; v* T4 L3 M        }+ ^- ~+ a( M7 o: Z2 m8 I
     }
9 t. I( ~% N+ X7 u) \0 `7 T4 o- `, U# X0 P5 K- B9 w
    // 接收中断/ n3 b0 t3 n: K" @: M/ I# O
    if(UART_INTID_RX_DATA == int_id)& N6 _  m1 n- m% J# v, o0 Q
    {2 y3 }2 k2 Y  L1 \4 S3 x7 S
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);: y: O9 k4 h4 U3 E4 o* D) {

9 P1 c- u4 w& C. A9 `2 x        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
2 M% u; U) n1 A8 q. A$ G    }% A" r+ h; Z) O8 Q& v

  _2 [. F  u* m3 x) _, L' V    // 接收错误
4 i$ Q) N# H  U5 u+ l1 @    if(UART_INTID_RX_LINE_STAT == int_id)# q1 k4 U( ^( _8 I  m; v
    {& ^7 J# A# }2 e: Y
        while(UARTRxErrorGet(SOC_UART_2_REGS))) {2 E; E- q% X
        {( A9 ~& F+ h' l. }( d
            // 从 RBR 读一个字节' k9 |$ q" F( s: A+ q6 g5 \4 ~
            UARTCharGetNonBlocking(SOC_UART_2_REGS);+ ]& j9 J# t% e# n; u1 B* n* {: _
        }
% W8 f% M, ~/ N) K# u% R! {    }
; U4 Y0 ]) Q2 D# I    ! h$ X" `9 A6 b# t
    return;
& S+ a3 S0 q. H}0 A. Z7 Q% @% B. 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
5 _  z) [: H0 K- Z. C% ~+ ^) V如果其它设备快速给你发送串口数据,你这边能正常通讯?

+ Q3 J3 U, I/ m) l( x/ X谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 18:32 , Processed in 0.042121 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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