串口发送中断触发条件 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8684|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。8 x# Q4 T5 I8 S5 }0 p( `9 r

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

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

) [! `6 ]5 j/ ]#include "TL138.h"                 // 创龙 TL138 开发板相关声明
- y$ R: m- U; t) q& g' i$ Y6 w% i2 f6 U6 E6 k
#include "hw_types.h"               // 宏命令
0 J6 {( d. M$ j+ m( s# V3 W#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器/ u/ P. D. F& ^: o
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
6 n5 P( s0 v9 x* r0 O' M2 x& c, {* E1 E3 d8 c
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
) b9 ]: o8 k. N: {#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
3 D' l$ i" H2 B! O# j4 U#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明1 ]1 Z7 m5 g9 {5 g2 W: ~% B
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义; B( g. F/ P! I2 y$ j6 `7 f
; `% H; @0 |6 E$ A  A
/****************************************************************************/
- {# }  Z0 F( B+ t/*                                                                          */  `# u/ R3 \2 ~' Z& c
/*              宏定义                                                      */
4 H& v" `  v' t) {1 M! x/*                                                                          */' }9 R- c) S* W, y3 z
/****************************************************************************/
& ~; h* Q& U. a% w4 W( t! P// 时钟
% T9 o, |' T' o( ?2 b3 h#define SYSCLK_1_FREQ     (456000000)* t& ]% \9 T7 G& U3 r& X
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)+ D& ?$ L7 X+ A
#define UART_2_FREQ       (SYSCLK_2_FREQ)) T' R4 m; C  ?) z& N. V( W1 w

$ N+ M9 U$ y6 L7 }1 l/****************************************************************************/% v8 S3 ?5 h2 C
/*                                                                          */
: N3 Q! x( U& @1 `% w6 y. e6 _/*              全局变量                                                    */
6 Z: {, N$ i& I/*                                                                          */7 t' ^6 w4 _4 `, L# c. W
/****************************************************************************/
& u& ^: u, w0 r$ Q8 J6 Tchar txArray[] = "Tronlong UART2 Application......\n\r";
9 w* ^, R) Q/ I" F3 S" W0 |4 u( d9 d* V
/****************************************************************************/
( F7 @5 O) u: z2 d, d4 j# z) g/*                                                                          */0 C5 E2 _5 F% K: W9 p1 Z
/*              函数声明                                                    */: t# h1 t( ~0 ?3 g0 a- ^' }; M: l) c
/*                                                                          */
. `+ L( W$ f0 v5 F% [7 t! G/****************************************************************************/
. Z4 L% L8 Y1 ~' Q% A* }* M' w// 外设使能配置( d0 R$ M2 \4 ]$ J& q5 U& J6 r
void PSCInit(void);
% m8 R' Z  Z9 ~3 c: ^8 q0 i2 G3 k- v  B
7 ~1 p) w7 `: J! J! ^// GPIO 管脚复用配置5 T% g. J: P. t5 T
void GPIOBankPinMuxSet();! s2 n# D1 ^' ]7 f: m0 e5 C* c; p1 v
5 w& |9 x$ V' j
// UART 初始化) c8 U" w1 g) u2 f8 ~$ m; N
void UARTInit(void);
( r- u' q6 I% m, ^% \// ARM 中断初始化2 P, S5 Z9 K- j) u+ A: E
void InterruptInit(void);: R5 J* A" B" {) b, _1 A
// UART 中断初始化
" e- ~$ ^3 Q( ^* R3 Avoid UARTInterruptInit();
2 S4 u1 A9 e. _# @& E0 J: v$ t// UART 中断服务函数
+ M8 @/ i% d3 O4 v4 p8 Y* ]3 Wvoid UARTIsr(void);( K* c. Q9 i; \- l
+ Y4 v: f! [+ N/ N( T9 Z8 m
/****************************************************************************/
, p0 X+ H. X$ a. w1 V) ^/*                                                                          */
: {2 @& Z) y. h3 s/*              主函数                                                      */$ r1 H! o- k  T
/*                                                                          */6 q- D3 I' [& X0 p" Z$ `
/****************************************************************************/1 T* u( m: \1 u7 K" J  p9 R: |8 O
int main(void), q! c# ~5 C3 ?
{
* ~% _6 ^" G8 D+ X3 Z/ [        // 外设使能配置
) Z5 I+ V  `  a  |        PSCInit();0 G9 e. U% G) A7 X
          X# j  x+ y+ V# |6 }( l$ S9 }
        // GPIO 管脚复用配置
7 R  u( o6 \1 H# D2 i$ Z        GPIOBankPinMuxSet();  b+ C1 f9 ^! D- v4 m2 g0 z% _

9 G- x7 m" Q  B! i' U        // ARM 中断初始化# B7 M! M1 Y! ?1 P* Y3 F
        InterruptInit();
' S: w- J. i+ o& e& r, i! H: E% D# R3 K: h& \
        // UART 初始化
; S: H1 L% J% n' S        UARTInit();' H2 k' \$ ^' w" i6 C4 }
; P9 }9 b! B' g8 Y4 ~9 N* s" o3 i
        // UART 中断初始化8 D4 i+ f: a0 F& M
        UARTInterruptInit();
  ~' y$ K6 t( E+ {" l! {' I4 D0 I
' `, x3 q  E  m# l        // 主循环
% k3 n% O) V7 ^        for(;;)
3 M( d3 n8 c! Z8 w9 {$ w5 T; J        {( g/ `( K) @: h. ~0 ~/ n

4 `6 K/ ?: u8 D; y        }0 m' a$ E' E" s! `
}( V& e: l$ r/ e& s: [* n
, m+ M9 E: Z# i( l
/****************************************************************************/
! O. h4 g) g) k/ f/*                                                                          */( q  I8 \; l9 K* P7 o
/*              PSC 初始化                                                  */$ z- z$ |, v/ u3 ?0 y+ o
/*                                                                          */
/ v" S$ n/ S, \+ N: y# \2 Y- Y/****************************************************************************/
- ^4 a2 ^7 T# f' P- i+ Avoid PSCInit(void)$ U: ^7 O9 u5 y. c
{* i. }' F$ Q$ g/ j
        // 对相应外设模块的使能也可以在 BootLoader 中完成
2 [: L0 K/ I; I    // 使能 UART2 模块# H) I; l0 l% a+ s6 [1 D
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);5 M5 ]9 X9 S  ^. v
}
. N  G, E) P- I. n' U2 Q0 C2 K! Z2 M: f
/****************************************************************************/
0 k4 ~! t, d% o: ^3 k/*                                                                          */9 H) s  q! I0 Z
/*              GPIO 管脚复用配置                                           */; n/ Z8 t: P& _  |8 P/ _  h
/*                                                                          */
* C5 [6 o; B8 }6 l/****************************************************************************/4 g0 ^7 T- Q/ u
void GPIOBankPinMuxSet(void)
6 ]( ?4 k6 n' E, A{6 c$ g6 a; q2 d! p1 T9 f; J. H. I
        // UART2 禁用流控6 s7 D" r* n' E: W- x8 Q
        UARTPinMuxSetup(2, FALSE);, V% I# v, m( V- M( K) E
}
6 d- N3 H( X7 i* `4 `
- a  ]. ?! }5 p; W$ O- W/****************************************************************************/' {- C6 ^3 }& Q. C; w6 v( A! o
/*                                                                          */+ I2 }* C1 i1 X- ~6 b
/*              ARM 中断初始化                                              */- C" X" _9 i( p7 j' s/ z) ?1 l
/*                                                                          */2 G# t+ Q  V( Z& L9 t
/****************************************************************************/
/ b8 s/ L6 L& a" \+ t6 y& l: Uvoid InterruptInit(void)
5 g1 g6 \1 y/ [9 e+ C7 |+ {2 b{. j: f5 V1 l$ g' R* g& `
    // 初始化 ARM 中断控制器
# W) M7 B$ g- F3 v. |" O. h6 B    IntAINTCInit();$ a9 g' P5 G/ D( _/ h( P
3 F% h$ z1 ~9 ~. ]% S
    // 使能 IRQ(CPSR)
" {$ I( s9 N; W1 X    IntMasterIRQEnable();
3 P2 |3 \" x; Q; c' D$ t  |$ |
3 _% P/ b; Z5 ^    // 使能中断(AINTC GER); z9 ?$ ^/ }$ z* }; l* J& y0 X
    IntGlobalEnable();: Z8 E0 x* c4 r2 ]& W9 l% O3 X

6 g5 j3 B; {* ?; C$ q    // 使能中断(AINTC HIER)$ \2 X8 x3 t- C
    IntIRQEnable();& E; @+ A0 K4 f* g6 d
}
9 w0 R6 v$ W+ \: X% |# I' H& K, p% Z$ G+ C
/****************************************************************************/
5 T/ U& s- ?; U$ k/*                                                                          */
% Y; n$ A% g( `- a/ _, H' s/*              UART 初始化                                                 */+ H+ W: @7 s! e4 D
/*                                                                          */) p8 T9 c/ S( F- L
/****************************************************************************/) a3 v/ G0 ^( N0 J& f3 W$ W
void UARTInit(void)
6 A0 m! _; M4 i; H4 n  J; Q{6 L+ Q/ S# P& S9 V# ^. g8 \8 z5 k
        // 配置 UART2 参数
8 {8 c6 ?: R1 N) j        // 波特率 115200 数据位 8 停止位 1 无校验位' w( l4 W( z* f7 _! b+ V
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
) Q5 s( m, o% n/ }; ]5 @                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
: e9 B' P& \4 [1 w+ r        // 使能 UART2
  c& K5 F; K% r        UARTEnable(SOC_UART_2_REGS);/ u8 k2 Q/ V1 S+ l: f
8 a& h9 o( p  T; L0 ?
    // 使能接收 / 发送 FIFO
: f- b. L4 C. ?5 }' u/ s    UARTFIFOEnable(SOC_UART_2_REGS);% m9 V$ A$ b& z7 h- ^* x6 I

4 Y; V: i4 L# W/ w    // 设置 FIFO 级别
  U5 B9 d; H( j3 _6 _    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);% n; |+ ]: y( Q
}
, T6 ?  ~* C& w5 F3 _3 s: W: v6 H7 b' Y/ W- s
/****************************************************************************/
, ?/ `, F1 ~: F% a7 d/*                                                                          */# M# \! }! w# c3 N  k) K% {
/*              UART 中断初始化                                             */2 k7 O7 [2 h' S0 E9 U" m& Z" \- _
/*                                                                          */
0 `4 l6 b9 o! E0 v/****************************************************************************/
" t" }$ y7 V. tvoid UARTInterruptInit(void)3 N8 ]+ W9 `# Z+ L- O2 G; b% O4 Q
{" l% x6 X' i1 H9 u4 c1 X
        IntRegister(SYS_INT_UARTINT2, UARTIsr);1 L2 }5 K0 N9 Q
        IntChannelSet(SYS_INT_UARTINT2, 2);4 o  k; X# G. s
        IntSystemEnable(SYS_INT_UARTINT2);
: F/ B# j' g( B* A8 z7 L% A( T' d, H. Z5 E1 B( t
        // 使能中断8 d9 A. M$ M, j+ i
        unsigned int intFlags = 0;
, N1 {' z$ o) l- _8 ?. K    intFlags |= (UART_INT_LINE_STAT  |  \
9 d- G: ~9 y2 E+ [4 ], Q- U                 UART_INT_TX_EMPTY |    \4 r7 {+ d9 ~/ v+ l+ J
                 UART_INT_RXDATA_CTI);: @* w& ], h  w, S" E
    UARTIntEnable(SOC_UART_2_REGS, intFlags);2 Q1 D8 p7 f, G% j, T& f) f
}. n4 A$ R# @  F3 s8 T5 E

/ V2 A6 p9 ~& U" r, D+ l7 m& S/****************************************************************************/: ^4 n" q0 x( O- S
/*                                                                          */* K6 P$ q# U1 [) a
/*              UART 中断服务函数                                           */9 t  f6 t6 R+ T# {
/*                                                                          */3 w# i) R1 Q1 n/ \
/****************************************************************************/
; [) a$ U2 ^8 zvoid UARTIsr()' E  N8 \5 [8 f! F$ R
{
( f( C8 ?$ i  |) m2 f    static unsigned int length = sizeof(txArray);
- C6 d+ A5 Y# l    static unsigned int count = 0;
3 O# C. m' x4 g+ p6 |    unsigned char rxData = 0;, I+ u! ^$ ?8 U. b
    unsigned int int_id = 0;
  l& T: w) M7 h. V& ?, A
3 t. ~5 J  {- P1 ?' F1 [" ^    // 确定中断源
; S. v" O, e, L    int_id = UARTIntStatus(SOC_UART_2_REGS);
. f3 ]( w# x( f1 S% F' A9 t5 E5 ]: Q3 P( r) `2 W5 g) A" r4 A, G7 L
    // 清除 UART2 系统中断
' o. S! u: ^7 i# b" n, ~) G    IntSystemStatusClear(SYS_INT_UARTINT2);
" b  O$ L$ l) ]9 }2 W/ a) X9 s$ F( _3 O/ Y( S/ m9 {1 P
    // 发送中断. t. o5 E$ d# M3 N9 ?- _, S" U
    if(UART_INTID_TX_EMPTY == int_id)
1 f* m' D% Q- y    {
( w  }4 R9 t; \6 C        if(0 < length)0 f7 p% @' [* h0 e5 o- B
        {
7 i* {& A7 z1 s( m            // 写一个字节到 THR
) x7 H# ~# h# Q. F0 _7 C            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
$ }( Y& ?8 i0 [4 \! H, M            length--;, A) N8 ]0 C  s+ j- b9 K, r/ B
            count++;- z) ~8 x6 S- w& J& A+ ~0 P! c
        }7 H+ G: O9 J% u5 Z. c) \2 _! M' C
        if(0 == length)
+ L- ?) E! f. T& D' f! u        {% z' M* _* k0 d1 U
            // 禁用发送中断
- X& m* z% V" t- ?3 J" E( a: V            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
- j( ~8 p. `* l& v5 a1 u        }
( X8 ]. q, g4 I4 S  O     }
: s+ ~2 c0 b- N7 R. w6 \( o0 C2 ^8 j# r1 G! m+ I
    // 接收中断
5 I9 P7 b* b9 z; G: f6 T# z+ L8 C    if(UART_INTID_RX_DATA == int_id)/ `5 H3 P9 _/ `) l# R7 H; r
    {# m+ F9 h; N4 S) U: g- B2 Z4 L
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);% E" |$ n  o8 h5 a0 s( |
3 I, C" ^" r0 p% v: Y
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
' t* _2 n0 y& z2 G: d. g    }9 [3 u6 E, M3 G9 [# \+ G  L
3 q/ `0 |6 j5 e
    // 接收错误
* l2 |7 S" D5 a# y    if(UART_INTID_RX_LINE_STAT == int_id); T& x& L: p3 z) Y( a8 i+ I' g) f* V! P
    {0 e2 n# Y4 I5 U( R/ f
        while(UARTRxErrorGet(SOC_UART_2_REGS))
, `: H) m7 p* p, C+ l        {
4 v' t9 p1 O+ j- I1 S            // 从 RBR 读一个字节
' p& o7 n; X) @2 p7 ?            UARTCharGetNonBlocking(SOC_UART_2_REGS);
0 E5 b$ {( M8 }) _, ^5 ^/ P, f        }
1 H2 J+ _( y. W    }. }  p+ @  ]! e$ x- O
    8 |; z+ h. ]3 ~+ V, v
    return;$ {/ |+ n* s. {  n0 W' L8 I
}
0 d5 s* B4 z2 R
回复 支持 反对

使用道具 举报

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:253 o3 N0 z& u2 B
如果其它设备快速给你发送串口数据,你这边能正常通讯?
9 ]# s; }: d, K2 X! B
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-3-30 15:36 , Processed in 0.045015 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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