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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8632|回复: 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* u$ Z* U  M

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
% u3 p9 k( D. X3 {8 u/ ]2 a+ s- b) F; H7 ]2 F* w
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
& _4 \4 R5 B" O0 `8 w
3 l0 N* Y( O% P: V#include "hw_types.h"               // 宏命令
# ^. t) Q) N% t7 X/ I#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器5 t9 c" {- h) k& `$ I  E
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器/ V9 L+ u/ @5 b7 }7 @

3 h3 ?, ]$ H, }- r% s#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
; b; C+ Q0 @: h2 o#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
; f. [' V& F* v$ B- c#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明9 N9 W% I/ Z% h9 R1 A
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
; ^% Y% W8 w: ]- S' U- c2 P
0 M, B; f0 Y9 i" b$ d2 r8 t/****************************************************************************/5 W8 v4 G/ V" i, C/ r  e, ^
/*                                                                          */
" F( N" E9 W* k/*              宏定义                                                      */1 a9 p' p& V& I0 G" K4 m
/*                                                                          */
$ L4 A. X0 B; S3 r7 q/****************************************************************************/$ ~. Y+ c- ?  E
// 时钟
9 M; e8 Q4 K3 Z; Q  Z3 t$ j#define SYSCLK_1_FREQ     (456000000)
3 X, v. i" r( {8 f; C' p#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)" |- _; `$ u; Z& Q3 N6 X
#define UART_2_FREQ       (SYSCLK_2_FREQ)& h5 s& B: F) x$ b4 C& H
# @/ g4 P  L5 `( b% O
/****************************************************************************/9 f" S! c$ ^' W: z& n. [+ ^: U4 k
/*                                                                          */
( N  C1 B' ~. z" f/ {2 g& `2 H6 @/*              全局变量                                                    */
0 U( @" W1 P$ [' S4 d  {) |# o5 c/*                                                                          */, p& Q. @" A/ J2 U
/****************************************************************************/
% B  R" e. M. tchar txArray[] = "Tronlong UART2 Application......\n\r";) f3 j  C9 ~5 h9 s( {

" P0 E# R* X" Q0 b' L, w/****************************************************************************/
# b$ j* j; c5 c/*                                                                          */
3 x3 J' b9 e4 Q" e7 b  R$ z' j/*              函数声明                                                    */+ `8 a6 l5 e' Z4 }  W
/*                                                                          */
( H- K6 w* F7 v* G' L4 M/****************************************************************************/: n$ A' I5 N, P
// 外设使能配置  |0 R% D0 v! G( s
void PSCInit(void);
9 }2 q# C) D0 R- O: Z4 B9 l, F* D
// GPIO 管脚复用配置0 v9 S' E, y3 }/ H
void GPIOBankPinMuxSet();# L4 Y4 ^* t- s3 }; Z, O7 u

) p7 B, Y4 Y5 I" y4 x6 G- J) L" O// UART 初始化. H% H# n% Q& K3 z1 x- Q% W
void UARTInit(void);
: x9 U0 D" x2 J! B& a" {// ARM 中断初始化
1 Q4 t* P+ d: C% J0 P" a# W" qvoid InterruptInit(void);6 [* M/ j: d/ k' i; l
// UART 中断初始化% H1 B! |8 O5 J; F2 `7 z3 X/ p4 G/ x
void UARTInterruptInit();
. J- S! s+ X5 |) S' T) x// UART 中断服务函数
, b' X( {/ Y( O0 }5 ]void UARTIsr(void);
/ y& T+ W0 w4 K* @; E& s$ n. Z, C  ^" x4 M
/****************************************************************************/
4 \$ I# k' u( u( @& i* g" B" r/*                                                                          */- X/ A/ _4 {9 F+ M5 ~1 P( T
/*              主函数                                                      */
* R5 y3 K' W( ~9 Y4 c+ l& ~4 i/*                                                                          */
- g  v# S  J6 _* g- I/****************************************************************************/
9 I  ?2 ^0 f6 _int main(void)
: [3 w& k4 `5 J{
* ]* J7 L( A! s8 l  T! k        // 外设使能配置
% B  a9 d, @) T; e$ n$ Y% S! [5 X        PSCInit();
2 c/ s! z+ p$ X* E3 @& e7 q! j        . Z) z6 L: w, J9 e1 n
        // GPIO 管脚复用配置9 Z4 y. o. i2 i2 M9 j( S) X' F
        GPIOBankPinMuxSet();
* o0 b  G% J7 `: N& k3 `+ S1 @: F  p
        // ARM 中断初始化+ z0 T9 D% ]4 f. C& a& v
        InterruptInit();! m1 z4 [7 v" M' ^7 g9 ]

9 F7 R4 e5 |" r, Q/ g        // UART 初始化: J0 s' E# M( c5 _1 A! {& U
        UARTInit();2 Q: X! l3 D% B' T3 a/ P; N

/ g; {1 n, e$ G  @7 [7 ~/ y        // UART 中断初始化3 N. `4 s$ G2 z4 a6 ~% I
        UARTInterruptInit();
$ z0 @4 R+ Y) j! q7 w4 Z: k* F' U& B0 _
        // 主循环
  t$ z4 M  g; J' {        for(;;)
: I8 O& r* x4 H  X        {. ]: q. C! l8 Y: \
/ M7 m2 Q/ i' {& w1 f( b
        }9 |# Z) m; E& B) y, Q) S, y
}2 R( B: d4 V# C! O7 E2 T

( \' g; S% y2 {" b% l/****************************************************************************/" p4 V1 ?9 w' ^: U3 `/ C
/*                                                                          */  d& ^: y4 |7 N( {
/*              PSC 初始化                                                  */# A+ i- a0 @! k5 K' j% F( k/ C2 s' e
/*                                                                          */4 W3 I- \7 U7 i& U
/****************************************************************************/
: @1 {7 n, U' t; l! P  Avoid PSCInit(void); n& ]& }1 T0 H2 m5 ^/ s
{
) ]# b! z$ |( N7 G. w2 M        // 对相应外设模块的使能也可以在 BootLoader 中完成
* B) j1 V4 t. `. f; A    // 使能 UART2 模块9 T2 d( q: D- |" `1 B0 @2 n
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);' E2 i0 J. M) _- z# I
}9 b( ]( E" p; ?& [
6 ]; I6 ]2 u5 k. c4 n
/****************************************************************************/) Z3 }% v3 d' s9 O& H, ~- P
/*                                                                          */
4 m$ O. V; _/ @6 N3 }/*              GPIO 管脚复用配置                                           */
- f  Y+ \9 ]& D" d+ o$ v$ A5 o% @- o/*                                                                          */! F  Q* C) N' u) z/ d
/****************************************************************************/
. `% z6 E- a* Hvoid GPIOBankPinMuxSet(void)
6 x9 H- U  r& u: C{
7 l# x6 O. ^8 G        // UART2 禁用流控
' d% {; x( `3 |        UARTPinMuxSetup(2, FALSE);% y' D2 b% ?% Z5 G' i. S4 I* K; z
}
" ~* v4 j% G2 `5 t; `6 _+ ]" N9 n) e5 ^  e
/****************************************************************************/
( f8 ]* _  b# |7 w/ ^. h( M9 `% X2 X/*                                                                          */
. e) f! P- c7 b' e) u0 `/*              ARM 中断初始化                                              */  B; A/ C# q) Y) {$ X' m* X
/*                                                                          */7 G; ]& o; x2 n8 j$ f$ Y" s
/****************************************************************************/
! u9 ?- |" U) {/ mvoid InterruptInit(void)& s2 {/ F4 W0 H! ?2 \! K
{
- [2 L1 h8 U- I7 H/ f8 u! k; Q    // 初始化 ARM 中断控制器4 ~! }1 |3 L) Q) t, j( d( n
    IntAINTCInit();
% A' d% c9 q- i% F) Z* r. y+ G; I. U6 j& M" @8 ]0 r0 m) W
    // 使能 IRQ(CPSR)
1 d( }, c7 b4 i, G# S/ U2 {. V    IntMasterIRQEnable();
: v! z2 f% r1 {0 I7 p) G# y
# }% Z5 G2 H" D: h/ T& r2 p    // 使能中断(AINTC GER)% C9 v0 W' o0 o
    IntGlobalEnable();; t6 w" K* k: O' p( ]
- U  Y3 O4 Q4 T, p. R
    // 使能中断(AINTC HIER)
; b& n/ `% Q, K# a; p* a, W0 Z    IntIRQEnable();
. N" A, r% q5 ?. v' t9 L7 \}1 k1 q) y" b0 d

6 f+ |- B7 ^( b- K# ^/****************************************************************************/) O9 i' v- O$ T$ k) u
/*                                                                          */
- _* u; e. V8 Z4 u1 O0 n4 `6 ?/*              UART 初始化                                                 */
9 m5 A! G3 D7 ~  C/*                                                                          */. L4 p& G0 x0 _
/****************************************************************************/
* e" t; a% {# u& N% _2 jvoid UARTInit(void)! p8 _- }" o/ P
{
. f4 v+ n! G/ N% Q( m! Z9 s        // 配置 UART2 参数2 g6 e/ |3 v' I2 ~
        // 波特率 115200 数据位 8 停止位 1 无校验位# E8 E4 ~/ L; |6 s, \
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
7 H: C7 k" @/ X" ?6 n" r; \' E                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
" V# i; _! m: P( h8 @1 i        // 使能 UART2
2 y  Q5 i  @) N/ ]        UARTEnable(SOC_UART_2_REGS);
' h, t1 I$ O/ k: c) G9 d/ [$ G. E
    // 使能接收 / 发送 FIFO  H6 n: H0 ^9 `7 i# i$ o
    UARTFIFOEnable(SOC_UART_2_REGS);9 @. ]  H0 G' f" A# w6 X- g8 R
. r; e& Q) H, g1 k
    // 设置 FIFO 级别, I7 ?+ n( s. R' T( b  Y
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
, Z) a2 l5 T, }  ^- Y* e}
( \  I3 w  N: }* F5 U$ e7 @
& H6 e- m& C/ ]3 K+ k: W1 _* Q- H/****************************************************************************/
/ n- U1 H) C1 |# w, r9 g/*                                                                          */' p; W/ z. r* x8 [% L8 F" |
/*              UART 中断初始化                                             */; p8 |9 Z( \& ^2 ~
/*                                                                          */0 F9 j6 _3 c9 A# D9 i
/****************************************************************************/
4 g9 ]1 b" b, r$ [. @6 _7 Gvoid UARTInterruptInit(void)7 [) }; ~) C1 h  u' ?) K0 @
{
( \% U. n6 j- p9 u" G! H+ Z% B        IntRegister(SYS_INT_UARTINT2, UARTIsr);8 j$ Z" R8 Y/ v% o( @
        IntChannelSet(SYS_INT_UARTINT2, 2);1 u2 x0 Z; t& B9 V! J% J- Q
        IntSystemEnable(SYS_INT_UARTINT2);
8 I8 k4 \. ]% W- g5 b! s( H. z& g4 x1 v9 i; R
        // 使能中断
5 y; S) u4 S( y  E1 r  K        unsigned int intFlags = 0;
9 R+ T/ H3 q8 r5 n8 ^( C    intFlags |= (UART_INT_LINE_STAT  |  \0 i$ P9 l. b+ ]5 n. ~, v& t' M
                 UART_INT_TX_EMPTY |    \- A5 N, g5 z# L! ~7 y
                 UART_INT_RXDATA_CTI);
+ x8 v7 |/ R" S- _    UARTIntEnable(SOC_UART_2_REGS, intFlags);
1 C9 _; }! S% x0 B% |9 R/ Q}7 j8 O  u% Y! \$ L% F2 r
( d8 `& K/ @' r/ C$ x
/****************************************************************************/% P3 H$ W8 {  n$ L5 g" Q, ?0 B
/*                                                                          */
( [$ S! _) e& q/*              UART 中断服务函数                                           */
6 r" N+ h- S6 W' A" |4 w& \/*                                                                          */
0 K) f- }" q' E  F1 U0 c/****************************************************************************/: U# p/ U' S: q+ L$ e' e$ `7 x
void UARTIsr()8 L! h( C+ Y  l# o3 w/ `
{7 N" V; y" q2 _0 T
    static unsigned int length = sizeof(txArray);
" n; ?1 b) [4 w. J1 W, H; N    static unsigned int count = 0;6 Q# _/ u$ c9 Q  G: J3 M8 z. v+ Z
    unsigned char rxData = 0;6 Y, H' x% p9 H6 m! p: e
    unsigned int int_id = 0;  L1 B3 G) H  u- @- ?" l8 i% E( s6 h0 U
6 f+ o/ ~( N* m# O! T7 k8 R
    // 确定中断源
1 F" {2 @" u4 Y$ W- N    int_id = UARTIntStatus(SOC_UART_2_REGS);
1 A  K, V# k+ n# s
# @) E/ e( @/ [: K    // 清除 UART2 系统中断
8 ^2 y6 _/ c9 Q7 Z1 ~- q* C! c    IntSystemStatusClear(SYS_INT_UARTINT2);% \* C/ U. s; e& `# ^
3 k- N6 ~2 N6 c) Q9 A+ b6 J1 |
    // 发送中断
& M: f0 u. h5 ?5 N6 ~) Y    if(UART_INTID_TX_EMPTY == int_id)
' H9 s$ U& \( u- h4 |. l% I    {
! D9 e4 L1 b7 k4 Q        if(0 < length)
! f% h0 h  i8 T+ A* b& L( r1 K$ F! w        {, X" q6 X* X2 f
            // 写一个字节到 THR: ?- {% E% |7 L9 v; ^$ s0 o( y
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
9 n8 A" d* W, L( h% U0 v            length--;; d; ~% X3 w' s% A5 H. a1 G* t
            count++;7 P: ]  H  q: B* T1 ?
        }) B3 o/ w: F8 m* z. i; V
        if(0 == length)
" R/ R# ^& J( x5 _1 z8 h+ E        {
! D* |) |& @' [7 o: B) _, p* h) x            // 禁用发送中断
& y" n  X' f) R) {: Y            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
5 K' n9 W! D9 s( {1 Z        }7 x* e- I4 b; B+ Q) a9 g- Y: N
     }
4 t4 r: U; Z, f7 @4 V0 g% J1 S$ c% h5 s1 d/ V5 Y% k# u
    // 接收中断
; t8 Y. M# \2 q$ b! ^, f/ \+ f    if(UART_INTID_RX_DATA == int_id)
; T/ i9 k5 _9 |" F    {
: v( B1 r  X% v& I        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
1 H: m- l  k! Y2 N1 y" l- t5 B- O3 z: X
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);; X( j; t5 L+ Q9 {5 g# Q
    }# ~9 q- u5 {0 W% `& V& [  {, p
$ z) Q* J# U% D  a0 I8 ]
    // 接收错误
8 p9 _3 O/ c8 M6 c% |' u    if(UART_INTID_RX_LINE_STAT == int_id)
$ c) U0 X% N- S) `% y4 |" `, R: ~    {* o9 W, r, ~$ H, S8 H7 X
        while(UARTRxErrorGet(SOC_UART_2_REGS))
6 j, E0 R7 s6 S9 Z$ t$ d( i        {
  r: y: w6 f7 G( P2 u            // 从 RBR 读一个字节
( O5 G- }( r- s4 V            UARTCharGetNonBlocking(SOC_UART_2_REGS);: j* P* u2 c" Y$ ]
        }
5 c6 x2 d# S' B& _; K% x9 {    }
9 |4 u" O0 z" F3 h* u$ ?   
9 _8 J2 L: ^! x& h7 U    return;$ y# \; G. m# q6 |1 V
}6 I7 K" }) W* n! S; 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
" S& I" E6 u$ ?2 j/ n( q+ k8 |如果其它设备快速给你发送串口数据,你这边能正常通讯?
) ^, W* u4 }2 }1 E& T
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-17 04:01 , Processed in 0.047455 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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