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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8389|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
9 a2 q9 A- V  h/ Y: O/ V

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
: T4 G8 q  l& q6 x& U: t% r
5 W# o/ W: U$ [/ y" J6 }#include "TL138.h"                 // 创龙 TL138 开发板相关声明# T! J) p6 G+ A( Y  n! _

( W. x/ }3 C, a2 H" @( }  c" d7 _9 g#include "hw_types.h"               // 宏命令2 |8 d  B* S  j
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器/ v( ]( I" q) @0 ^. T
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
( n  B* i& b) O
' J& T7 j/ z; Q  M#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
5 A" G' q$ A; y% m$ K& |& w# C# Q! q; w#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明$ q- m- F# [" Q( x& Q" A  }8 T4 U$ f
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明$ B% ]/ w& D- K2 V+ W
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
7 ?& k  S- ]  c- ?4 A+ t2 N) T3 A  ^$ l; {
/****************************************************************************/
3 l# i5 [; ?! [7 y4 v( d& a/ I: X/ A% ~/*                                                                          */3 B3 v  d: s' P' O- h
/*              宏定义                                                      */$ d8 d+ \/ I4 I& X/ A
/*                                                                          */
  ?( t  e6 g5 J) d. ~; k% w/****************************************************************************/
5 }2 B1 X3 l0 c# b$ C: X4 ?// 时钟9 K( H0 T; H5 r6 U7 i5 m
#define SYSCLK_1_FREQ     (456000000)
( M" [' w! C' }( O  T#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)+ P8 p, |+ I1 T' ~" U$ L
#define UART_2_FREQ       (SYSCLK_2_FREQ)
: E. I* N7 f: b* q6 Y+ \  d, ]$ O  b; {8 v, ^+ y$ P
/****************************************************************************/
4 V* \/ ?; f- W) d4 P& U* a/*                                                                          */5 O; P% b7 @; }+ ~$ W
/*              全局变量                                                    */8 ]* K  m" e( }0 K" W
/*                                                                          */) ]) z/ c6 G1 x# }& P, Y
/****************************************************************************/9 z5 T( I4 [% x  I! A1 K! R
char txArray[] = "Tronlong UART2 Application......\n\r";
+ }( h; Z9 P# O# d& a
. R8 N+ r: o2 D- X9 r) S( W/****************************************************************************/1 l8 p- S6 }: X0 M
/*                                                                          */
4 ~4 z2 M$ Z  `7 ]( T/*              函数声明                                                    */. L! g3 B3 B9 e3 h
/*                                                                          */: b2 B; s+ E, [
/****************************************************************************/
1 }  n' I* w+ Q( b- ]+ t: @; g% j// 外设使能配置
& P) N- R4 w* x  Jvoid PSCInit(void);4 C3 R- z4 w; v" `% G+ t

: r4 [% V" Z; B3 h2 h7 W, }' W// GPIO 管脚复用配置0 m( v3 d1 U6 w. X
void GPIOBankPinMuxSet();
: k8 ~7 R( V( r7 _. k( W+ Z* }/ \0 ?0 `
// UART 初始化. Y2 ?4 D7 Z! V
void UARTInit(void);
( Y* V' j: k, b* p! z$ S& ?' w  y0 U# q// ARM 中断初始化
7 Q1 R% s2 E" I& |) v- [4 ovoid InterruptInit(void);6 Q, t2 M- i3 J+ g1 ~8 J
// UART 中断初始化8 ~; Y9 o8 a3 w
void UARTInterruptInit();
; D( U; E8 E* t: Z: \7 o' ?5 |// UART 中断服务函数
1 U+ ]* F/ H4 [! z3 z0 jvoid UARTIsr(void);0 e* y( J- W" w8 c4 x/ I

- S' {- i  Y* T' J& N( j, E3 y" K/****************************************************************************/
4 k2 U/ L1 u) ]! G' G7 f  z5 m/*                                                                          */
# W5 Y8 ^" Q2 x1 k8 C) K/*              主函数                                                      */
, u6 z) F9 n9 k8 e9 E9 E) j5 _7 h/ p/*                                                                          */, |5 ^- d( w+ ?8 b0 d. X) @
/****************************************************************************/
& ^, P1 u$ ^& ]5 u4 r, Aint main(void)
  }/ M# r6 H. L{
) a4 e4 H& z, d3 V        // 外设使能配置1 o3 E% W7 C7 p. [
        PSCInit();6 [+ \5 Y5 W! b" q9 x. Y! I9 K
       
, \3 S* M* F# u0 d: o        // GPIO 管脚复用配置8 G' e. R- M7 \, J
        GPIOBankPinMuxSet();
2 i7 `  ]6 [" E$ p/ g) N0 h
+ A; `; e* U/ K) |# E" l; C        // ARM 中断初始化
8 V7 P2 y! c5 I2 z        InterruptInit();
) n! U; B8 F: d( c9 [1 p/ e
' K& `1 o3 s! E5 X. M1 e        // UART 初始化; V( O7 D9 c4 n3 ~3 ]. U
        UARTInit();3 N% v4 R; T  f- Y% ~: C

, e  k. d% d1 N; Q/ T3 U        // UART 中断初始化
& p1 x/ d% n8 c" b9 h7 ]        UARTInterruptInit();
; w( R' X- W/ C  \; p4 x* Y5 N7 C
, Y* a" G: x- ~! c/ J% Z7 {7 e        // 主循环% u6 E; ]3 @8 m3 r: g
        for(;;)1 X# [. K3 Z; {: {% }: `2 \
        {& t8 ~$ G- r" L( R! p/ ]
& X. Q. a6 N+ T& `2 M
        }7 g- y7 F1 @! Y" w
}
0 g. w  o  F( K9 @  o. l& H. H$ j  x+ J
/****************************************************************************// X5 o5 R& ]- P* [0 z1 J0 S8 w
/*                                                                          */
+ L" x! F! u1 L3 S4 ~/*              PSC 初始化                                                  */: C; Y. R" w1 G. k( P' T: l: y: i6 D
/*                                                                          */
( J' C) Y9 a- L# L9 i+ g/****************************************************************************/% I6 P7 m. Q5 h* v7 C  @
void PSCInit(void). K- K$ _& y8 X4 ~5 o, W+ ]% s8 o
{
0 e& ?7 L# v* z" O9 X0 L" D8 y* \        // 对相应外设模块的使能也可以在 BootLoader 中完成; l& m6 w% o2 }4 g
    // 使能 UART2 模块
( W  l: P+ B1 U- X% X  @    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
# f: {; C. \  G2 [& R2 p}! m8 h% d% ~5 g4 _/ C( ?6 `. W

, {2 ?& b8 H/ s  `9 J/****************************************************************************/
9 F& _5 {: h8 H; [) p: _5 ?5 E5 B/*                                                                          */9 Q+ Z& j& ?8 R- q7 A) v% Y
/*              GPIO 管脚复用配置                                           */. s3 r# r; Y/ d9 d9 f! F# `
/*                                                                          */
' w% j3 d" K+ `( S* K/****************************************************************************/( \; v- V3 F$ A# p
void GPIOBankPinMuxSet(void)6 p4 N! O- c" \
{
% U; ?( X, {, O" x8 _+ X1 [        // UART2 禁用流控
6 C4 u* G' z. R! v% C: F1 m7 l- b        UARTPinMuxSetup(2, FALSE);
" ?( |3 Y# e4 s7 K9 {: M) C}
% g: H5 O$ U4 N0 S; i
$ m1 \- k5 K# ?4 P/ E  v( d/****************************************************************************/
; d9 E; G" |# A5 ?2 C/*                                                                          */) u7 ?# ^! o6 Y" a2 O8 p
/*              ARM 中断初始化                                              */
' ~0 z6 P, u  @$ ^& o/*                                                                          */
5 m: n0 K( B8 Z5 Y% r/ ^/****************************************************************************/
* S" P4 ^  o* dvoid InterruptInit(void)# b" u( s0 k+ c9 M
{
+ P1 v0 J$ ~# G    // 初始化 ARM 中断控制器. u2 C+ r4 u3 R5 }- d
    IntAINTCInit();# O' b3 E* P2 {

1 C' y8 ~3 _! M  U8 T5 Q    // 使能 IRQ(CPSR)
& ^0 ?, i1 l; c4 B" S0 F9 y/ Y. ~    IntMasterIRQEnable();
$ h9 ]7 Y' G5 `; P0 V( S( a
! i5 k8 |* ]4 v$ p9 r5 v( Z    // 使能中断(AINTC GER)
) C& o) K# a4 n; n8 j9 h9 p/ H3 b    IntGlobalEnable();
; K. ~' g( c% P! M  p
5 M$ \9 P8 l5 V6 V) O0 Q+ Y: f    // 使能中断(AINTC HIER)5 `" h5 t) @0 L7 _, p/ Y' W
    IntIRQEnable();
0 F0 h" W4 \( ~2 g0 s& Y0 s& q}
3 a1 b/ _( q; T
, I% M& o& T7 d; `/****************************************************************************/
/ Z. F" u" W" F- s8 L; q1 R6 r$ x  |/*                                                                          */
, K& M0 \# q# P' o' ~$ P/*              UART 初始化                                                 */
& V2 o- U# S& G/*                                                                          */
  U0 E; l. U5 N# u! x& i/****************************************************************************/
: I/ D! [& m  |! b9 V, A/ E% svoid UARTInit(void)
# l! A0 L7 w$ W+ K# _2 r& P. Q{# o: Z& Q/ e) b$ A
        // 配置 UART2 参数$ }" s$ g( I! g# z7 g# I
        // 波特率 115200 数据位 8 停止位 1 无校验位) B# n0 c; S" Y2 d% F) \
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
, G4 a! Q3 N. O$ o( S4 A/ u& l# u& r                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
* l2 M1 o; [/ F3 U" H. W6 e9 m0 _! A        // 使能 UART2" T/ l, X! P# d0 \* m. g
        UARTEnable(SOC_UART_2_REGS);
; a6 I- j( [. @5 B0 F/ `% n5 y" k* M/ n1 H8 N; Z$ ~3 p
    // 使能接收 / 发送 FIFO$ i  ^# v, M5 K. P5 i  C
    UARTFIFOEnable(SOC_UART_2_REGS);
+ c' Z3 U- ~' K3 f
- b/ u) k* D2 p6 w; U2 {    // 设置 FIFO 级别
0 u8 {( X: y$ p: P: E    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);3 t9 e/ x: ^! J: q: S
}
! W7 @" [- D( r
$ ^% }$ O% k5 J& u$ C" O1 f3 w, o/****************************************************************************/$ {8 t4 y) g) |6 V
/*                                                                          */: j. _9 n* X6 @6 L; Q  Y
/*              UART 中断初始化                                             */; G1 I; x% }4 y4 }' F3 P
/*                                                                          */  O* ?% R) Q. e2 e3 d
/****************************************************************************/% `+ {" Q  R* j' |$ `! q* X* o! \% o
void UARTInterruptInit(void)
/ e/ }* _+ T- v{
& ]" Q+ n  g8 K' A        IntRegister(SYS_INT_UARTINT2, UARTIsr);
% B/ r0 ~* D/ {5 h0 j        IntChannelSet(SYS_INT_UARTINT2, 2);9 m# l# z0 D3 b0 [" N" _# h6 j
        IntSystemEnable(SYS_INT_UARTINT2);: Y! J5 b- p) P  ~& ~: n. Z
' ]% B3 w2 O8 D# ^3 r& g
        // 使能中断
6 q1 u8 I  c* C( Z, \        unsigned int intFlags = 0;
: A4 L6 {8 M1 v# E. O* M    intFlags |= (UART_INT_LINE_STAT  |  \4 ]8 |% `5 Q. n. J
                 UART_INT_TX_EMPTY |    \
6 G5 ?+ C# d) N3 R/ ~                 UART_INT_RXDATA_CTI);
# O! x/ _2 J% Q% h/ b    UARTIntEnable(SOC_UART_2_REGS, intFlags);7 ?7 f. d7 Q: \
}0 A$ b) k* o+ d( O1 X

8 q$ F9 R7 U* v$ X/****************************************************************************/1 _& u7 K, i+ N2 x& B& N- u
/*                                                                          */7 K) l, E$ `. \' q
/*              UART 中断服务函数                                           */# l( o1 e9 Z3 J/ E3 g" s
/*                                                                          */
  b8 X  l( p$ ?1 Q! v/****************************************************************************/% ~! X6 L% b! r
void UARTIsr()
, B- r& Y" Z- _# B{$ X3 J2 q& K- y- t
    static unsigned int length = sizeof(txArray);
) F6 a* ^2 X: C, l# [* X8 x    static unsigned int count = 0;+ {& ]6 `/ L$ d8 e
    unsigned char rxData = 0;  A4 d! P: A5 S: y5 f1 y
    unsigned int int_id = 0;
) c8 D0 ^- f5 \+ T8 p9 S( H1 t4 k3 D  C- ^6 \3 E
    // 确定中断源
( ?0 w0 N6 k) k' d; y' [) x    int_id = UARTIntStatus(SOC_UART_2_REGS);7 y8 C" A9 ^3 Z* d; c4 d9 @

2 m# c: m7 u) g; m+ v0 R2 c) h    // 清除 UART2 系统中断2 W( l  }9 u, g. b' L- W6 D- A
    IntSystemStatusClear(SYS_INT_UARTINT2);
" w4 e! s& Q: ^* I, Y0 M. |2 F) `9 q; R
    // 发送中断
5 I0 [( N5 x/ R; [    if(UART_INTID_TX_EMPTY == int_id)
/ D* ~) n) S+ h4 \    {7 f; K  C2 m8 c8 M: X% U9 `
        if(0 < length)
* }! x1 |* @+ g& x* v        {
/ ?8 Q# ~1 j1 e: m            // 写一个字节到 THR
. F, ?' V$ H7 D* t* ]+ @. i            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
  d" T, f( K' H) U. q! A; H            length--;% d; J* \2 K2 m3 f# Q$ K* x, T
            count++;
% n  r; h$ w1 {9 s$ v        }2 w2 Q" k" h8 p  Y7 g
        if(0 == length)
0 r- k2 U' c! V& b5 i4 R9 z- j4 c        {
# S5 v3 }0 w$ k1 F* d. }( r* L            // 禁用发送中断$ o3 v  q5 Z8 Y2 l# T
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
& `4 M8 X$ s3 q7 K        }7 g3 q( C" o& h# D
     }# _' q3 h* s+ Q; T1 d- y6 l1 V8 _$ Q

8 P3 M& y; m4 F% o! o! \6 J    // 接收中断
5 }$ m( \. H5 u# N/ j    if(UART_INTID_RX_DATA == int_id)
' ^! f) e8 x2 q5 T* S4 i+ q    {
+ Q; Q( w! z& X8 v        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
( @2 w2 d: h+ J3 f( r+ @# h  Q: w1 }/ f
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);& |4 Z9 }* [9 M0 u6 z
    }8 i3 o- z" j3 k$ q- w2 ?  ~5 v
5 _  c( g; [) t4 D
    // 接收错误1 J5 D' I" N2 c9 {
    if(UART_INTID_RX_LINE_STAT == int_id)' r# x# Y6 @  v& T) v
    {- k) a% {7 \# m/ Z
        while(UARTRxErrorGet(SOC_UART_2_REGS))
/ z6 F  l5 j: I' X  V! u( B1 V% w        {
2 d, B& ~3 {3 n% r9 {) c) x9 r            // 从 RBR 读一个字节1 U, t8 t# b( [; t
            UARTCharGetNonBlocking(SOC_UART_2_REGS);2 b1 j& E5 C; j
        }& w% u# Y: t! Q( ~3 e  l" l/ ~, z) m  g
    }, w" X+ E4 _7 x6 V; n
    0 D( I) ?$ p* u% G' r7 E+ ^
    return;
: o4 u' r2 L, @) Y" t}
3 f  I( }; e( ]4 {: L( U9 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:25
8 ]4 T( t* i2 \' T# K7 H如果其它设备快速给你发送串口数据,你这边能正常通讯?

' ^' S" o6 U/ G0 C谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-22 00:01 , Processed in 0.043688 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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