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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8265|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
& t0 h6 U9 W( \! N- p

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。7 z5 W  Y$ v1 m: k3 b, Q" K) U2 L

+ j: ?' w. W4 X; U. y#include "TL138.h"                 // 创龙 TL138 开发板相关声明
# h9 O" p8 y( Z+ V8 J
) h8 V3 `+ }) U; ^2 ^  v! o#include "hw_types.h"               // 宏命令
2 R* U, c* S- _* ]8 Y& d* k  f#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
+ J: A& J+ C8 f0 M/ }#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器, j1 v# \/ |1 b7 ~

+ S2 o: A5 X8 i) ]0 j#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明+ p: A% v% y, x
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明7 a! H4 p) u3 I* V( a
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明. M) h4 y) k7 i5 j7 ~
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
9 a6 c8 v' e/ u- M! O, f, I
7 P7 N" m" V! a& ^% z: k/****************************************************************************/
) P; D" K. t4 Y1 y/*                                                                          */
9 o7 \/ |& `/ N- S7 r. k/*              宏定义                                                      */  a+ x/ e- @/ _6 K: s
/*                                                                          */
  G) W0 Y: W6 h/****************************************************************************/. x; ?, H1 x( }) G3 G
// 时钟; r; t9 N7 |6 U8 N9 O
#define SYSCLK_1_FREQ     (456000000)4 U: n6 a8 h6 s
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2): Q3 ~( M0 O* B& p6 L; @! A+ T
#define UART_2_FREQ       (SYSCLK_2_FREQ)0 C) \+ _: D* R' }: H/ g; F' K
& Q& e! w6 f1 I3 C3 ~$ P
/****************************************************************************/9 K  r$ g* T  t
/*                                                                          */$ b( I; f. L/ u# N' l
/*              全局变量                                                    */
  D" M+ @0 ~, t3 |' H8 q/*                                                                          */( x0 x* p6 g: f, R3 S' ?/ S
/****************************************************************************/* x: G( ^3 Q& i4 ~( S
char txArray[] = "Tronlong UART2 Application......\n\r";7 e$ v# T0 X7 g( Z

! c2 S2 q1 a& Q/****************************************************************************/: U2 S- J' {4 ^
/*                                                                          */* y1 f9 E% C' F( M' H
/*              函数声明                                                    */
' [1 k5 C5 \2 [( W1 J8 w/*                                                                          */
! i2 a( X: M$ F2 o& N5 {/****************************************************************************/
  V: \) U, Z6 I5 l2 y// 外设使能配置- `. I/ o: E* L$ ]5 t! V
void PSCInit(void);1 t! A* i5 j: j% y9 J4 J: \
+ D4 o% ^) X5 v
// GPIO 管脚复用配置/ P% I# |+ K3 r, ^
void GPIOBankPinMuxSet();
" r5 I5 \- @+ P: c1 d+ z* p- s: p4 s8 D: |+ y* j3 @3 w/ C- B
// UART 初始化
4 H; F5 ~( ?1 v$ n$ ~5 ^7 gvoid UARTInit(void);
% ^( S2 Q6 H# e! K  ^* i- h// ARM 中断初始化9 t, Z# U" n! V0 ^# T
void InterruptInit(void);1 b- u* X, h4 T" N/ r2 g0 E
// UART 中断初始化
+ O7 V/ @5 Q# H% S) p1 n; dvoid UARTInterruptInit();
. C% x6 C3 d8 w2 {7 Z2 b+ f; W// UART 中断服务函数2 `4 e" X0 i# u4 V
void UARTIsr(void);: B0 ^* B8 ]5 U/ F+ J' ?+ r
6 i8 _& b0 v# w% L
/****************************************************************************/
" \& j3 o; n6 ~0 B7 e3 D/*                                                                          */5 r! C+ c7 l0 j' _
/*              主函数                                                      */
0 K6 D* d. B" x) K/ j/*                                                                          */
% w  u1 J/ X5 ~/****************************************************************************/
3 j6 d' z' J- l! w, cint main(void)  g8 r: d7 j: n8 I$ N/ b; X1 ~7 x8 F+ U
{
0 s1 R6 {  @" Y. }* c4 m        // 外设使能配置8 l, e  u! X, p: N  p1 i
        PSCInit();8 f& K' P4 b6 T! Q0 u
       
' _; Q3 G  }: _& ~; J( S. [        // GPIO 管脚复用配置
3 u$ z( y6 Z) K3 ?        GPIOBankPinMuxSet();
1 Z% u6 e& ?5 T; E# L8 B/ E: J
& C2 l& C& q; Z' D4 c$ S( d        // ARM 中断初始化; u1 C* R4 X9 O" J
        InterruptInit();" b/ J$ `* c! k0 A( Y1 m% T
/ `5 L6 ~; a, v( i! r! K$ Q5 F
        // UART 初始化. t# e/ F+ e1 C6 \( q/ {/ o  D
        UARTInit();
' w1 g! p: L) d1 r) ?; V% I- V% p1 c# ~7 O! ?/ R! t5 ~
        // UART 中断初始化! r7 U) H1 r) a: u0 o9 c! z5 s
        UARTInterruptInit();
  Q9 s7 i5 i$ M2 t0 F* z* N, r
: ^. e$ A3 s* q( g        // 主循环4 t! F- D8 f& b" I, b
        for(;;)
! z  D7 i! t; ?        {1 N; W) `; \- R9 ^  B% P" ]( z7 y

. H7 e. w2 J, w' c5 z        }: e4 [6 O7 b% _8 v) Q
}
) d8 b) D& N9 V& @3 R; ]
0 k, e- d3 o  i9 _( D/****************************************************************************/; h- Q, t9 d% i8 M8 [
/*                                                                          */5 }$ t- ]8 c% q# Z4 I7 `
/*              PSC 初始化                                                  */
5 I4 R9 G3 C  f$ J8 m/*                                                                          */
0 c, v6 \& i0 L5 |4 p) q# w1 T7 ^/****************************************************************************/
' L+ H5 z  w4 g, y+ G5 Fvoid PSCInit(void)
$ V$ @5 S' X) y" {/ o$ w2 \{+ n/ ^+ O8 b; m
        // 对相应外设模块的使能也可以在 BootLoader 中完成
! k% p5 N4 c  Q: b" Q    // 使能 UART2 模块0 a9 P! Z1 U# T- S3 c, r
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);/ N% s* {* y% ?  R! ]  H
}# m; Q1 B4 j1 {; S

- g" C- i3 A& I, Z/****************************************************************************/
) Z9 l4 }7 i  a; z7 [9 {- a/ }/*                                                                          */
+ c! n8 @& P; f8 M3 g$ I/*              GPIO 管脚复用配置                                           */9 {1 X# y' @2 h! T' M2 S. L# _
/*                                                                          */! V: e4 M- J: d7 O* H1 q- n
/****************************************************************************/
( r! J/ O- y4 cvoid GPIOBankPinMuxSet(void)
9 |4 d2 q  }0 y{# \" S5 [8 F' w5 q9 ~4 w) j
        // UART2 禁用流控
# T. V( l+ t& U  y5 x9 V        UARTPinMuxSetup(2, FALSE);
# J$ ^+ J6 m6 i7 G$ O7 Q7 r/ W0 t}
3 B4 H2 v5 `1 g  h- {9 y0 ?  h0 o8 i7 e) b+ Z/ H% R# |3 Y4 R1 E$ A6 V
/****************************************************************************// H4 a: s' W5 h) {
/*                                                                          */
! C0 c5 m' T1 n* D2 D7 x/*              ARM 中断初始化                                              */
7 q: y9 d9 T- L* n+ E. |% U+ P2 u/*                                                                          */$ {* m; s; }, {+ Y# E, [
/****************************************************************************/; I2 }( {; o3 P- t
void InterruptInit(void)9 Q+ m3 N$ y8 F% E2 F% [
{+ F+ h$ ]# A* R# f8 s- y
    // 初始化 ARM 中断控制器. l" }& S2 c* V- z- p
    IntAINTCInit();
" U) y1 h! _) D1 R8 e
% I2 n9 l8 ~9 X# |& M    // 使能 IRQ(CPSR)) R6 j3 p3 u" G* B/ f, S/ g. o3 h
    IntMasterIRQEnable();/ y1 p! H" N( i  M$ U% C5 R

, Y1 n+ y# ^7 c$ p* I' x6 l* ~    // 使能中断(AINTC GER)( ]9 K7 V/ j) S
    IntGlobalEnable();
* s3 L8 g3 B( O3 O0 D
% q8 ~5 e8 O2 T; w2 `3 m% Q    // 使能中断(AINTC HIER)
4 k' M8 u. v1 @+ N    IntIRQEnable();
: Y& Z# |! h3 C' }}2 E7 J/ }' G1 p5 c* u% w
- c- Z+ P$ E2 c$ K  E
/****************************************************************************/; ^( p  e. L. Y* n* C
/*                                                                          */
; }9 k. B3 t1 F" ?' Q& D- d. Y% E* Q/*              UART 初始化                                                 */& b) ^* L- ^* c7 ~5 @, L! S, v
/*                                                                          */
+ q' I9 `" J, t$ q0 m# l* c  M6 J: t/****************************************************************************/
8 X1 w- V- e% |( svoid UARTInit(void), K+ l3 V. j2 H
{7 q9 _" C) }: f; ~# m4 \% W
        // 配置 UART2 参数
8 I0 h: s) I+ Q. o" ^; O* [        // 波特率 115200 数据位 8 停止位 1 无校验位
) J0 b' \) V: ?! Y* L/ c; u1 f- ]/ D    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
0 i9 W/ V$ U5 T- E* s  r5 }% _3 S3 q: N- S                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);1 q1 d1 s- t, D2 Z3 _- T% W& Z7 _
        // 使能 UART2- X! C& ]# p* i- X$ K
        UARTEnable(SOC_UART_2_REGS);
7 q6 H  m* F; c8 P  q& x0 p2 ?4 W! S
    // 使能接收 / 发送 FIFO4 r: N; T) i, A" ?' ]# K
    UARTFIFOEnable(SOC_UART_2_REGS);0 c4 u  O8 E# A5 j1 v! B

. H) U( S; z$ S+ s    // 设置 FIFO 级别
8 H( Z8 d  W' q    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
+ C  w3 x% A/ j" K}" W) _  N: V3 k9 P5 }2 @0 m' O5 X
2 q& A2 a* J- y1 c# e5 i; [* N6 C! k# o
/****************************************************************************/! H8 w% s; o% x6 M" k3 b, V# a
/*                                                                          *// C8 a. H8 p6 `" Q4 I( d
/*              UART 中断初始化                                             */' b" R" K3 M! t  l2 r: @
/*                                                                          */
2 N% ]( ]6 ^% W; _/****************************************************************************/- A- R+ c1 u1 k$ D7 B" k' N: D
void UARTInterruptInit(void)
7 R& L  v# F" M{( \, x  i/ r2 U7 W
        IntRegister(SYS_INT_UARTINT2, UARTIsr);# s6 j7 l6 D& e
        IntChannelSet(SYS_INT_UARTINT2, 2);- m2 E0 ^" N8 K
        IntSystemEnable(SYS_INT_UARTINT2);
+ r8 c( {6 ?  J: A' J& o& t( X9 C7 _
        // 使能中断) f. i# O6 b, K( O
        unsigned int intFlags = 0;3 G) x. H8 T2 v& r* q$ U' R- u
    intFlags |= (UART_INT_LINE_STAT  |  \
- g3 M: t2 `* {  Q6 n                 UART_INT_TX_EMPTY |    \
7 u, M8 a/ ?& j                 UART_INT_RXDATA_CTI);
' H+ e; I- [  |4 Y0 @    UARTIntEnable(SOC_UART_2_REGS, intFlags);
8 J! H' v0 c  R}
; r% v- t" y: s2 c* q8 [' W- j9 D3 S. S  j
/****************************************************************************/
! b, d1 R! {4 M8 o/*                                                                          */  C* l% {" U$ r' s' Z' j( }
/*              UART 中断服务函数                                           */: U: H3 d) t0 y) O5 k' ^
/*                                                                          */& W0 A- L/ j  H7 W. E3 j
/****************************************************************************/5 H6 U9 `1 R0 i9 n# V/ x: F
void UARTIsr()
; o8 E: }9 }2 S& ^& S9 F1 h{
9 y% ^1 G7 M9 O) l0 b4 O' |  z    static unsigned int length = sizeof(txArray);
4 Y3 o' a" r  _; N    static unsigned int count = 0;' e( j) i$ H1 E/ B* L/ u$ I
    unsigned char rxData = 0;- T" U( c. X1 I+ l) Y3 r
    unsigned int int_id = 0;+ n  y9 j5 K$ [" _$ r3 Y

  ~  a; T5 q' j1 R    // 确定中断源  m& X4 d' i/ K/ A
    int_id = UARTIntStatus(SOC_UART_2_REGS);# `. J+ \9 ]$ g
* T# c' P4 E6 f4 A2 n% G
    // 清除 UART2 系统中断
, o  ~, Y6 P* ]    IntSystemStatusClear(SYS_INT_UARTINT2);7 N# ?; \2 F7 T( z2 B& `5 P2 _
) P/ P" w0 F" N* r7 M! y6 U
    // 发送中断
2 v; |2 F# ~( v+ q/ c    if(UART_INTID_TX_EMPTY == int_id)
8 c, r7 X( z" i" U: s    {; u+ c4 c& P8 L. H) ^$ I  @
        if(0 < length)
# Q- A3 k# p" P        {
* g# j) T# y3 A& Y- a            // 写一个字节到 THR
' U! v& x8 @7 O, s4 T, z! M: ^            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
, S- ?2 S. `' Q& t            length--;
: [' W: c0 x6 x2 u! J5 f8 X2 O            count++;
, t* @. a* }5 K        }- z' z1 K) x- ], p' H* c5 b* d# n! p
        if(0 == length)" \) V  j* G& T; p
        {
4 ]# L3 M+ f' A' V, U            // 禁用发送中断# j! i7 B( g+ j
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
( P! [7 {" u1 e        }, U) R& |; f& n. J$ b
     }
# u2 [' ?! t9 D# [7 [( d; y+ |; e& r9 g  W3 q+ z
    // 接收中断. Q! n& w8 y7 @( l8 S  ~( w
    if(UART_INTID_RX_DATA == int_id)7 r" M; Q' k1 v. Y
    {
. C. f3 Y+ j$ d- ^% Y% g        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
6 F7 T' g& W2 {8 e# g
( B$ V5 @; E. \- a/ W# ?! W        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);% Q$ Q$ n$ [" Q" t- S; L. x
    }' g. r3 E% J) I) @; F
/ D) w" i- P1 q* i
    // 接收错误  j5 a! n. {; P1 z
    if(UART_INTID_RX_LINE_STAT == int_id)" f) b' \. |! j/ E0 }
    {! {- r7 i( \, i8 r
        while(UARTRxErrorGet(SOC_UART_2_REGS))
; P* A+ n5 E" O' N: [        {9 K& T  K/ G4 W. r% X( h4 o
            // 从 RBR 读一个字节
+ u6 G: R( T; s3 S) a2 [" r            UARTCharGetNonBlocking(SOC_UART_2_REGS);
/ t; @$ {8 ]2 t9 `' [        }. D% d( [( N$ Z  _# ^/ l* R
    }
7 g2 a0 S9 T# c8 V8 j    ' M" X8 i" b4 y4 f1 S3 `
    return;9 U6 J4 W. \! E3 S  ~* v* Y7 j$ ]
}( I# _5 q1 S6 C
回复 支持 反对

使用道具 举报

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 u$ h- }2 ^3 T9 I% N
如果其它设备快速给你发送串口数据,你这边能正常通讯?

! W7 A. z% e# u) T* G' a谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-15 02:00 , Processed in 0.046827 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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