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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5640|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
! M8 s' Q3 T1 x  P% O9 `. [

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
8 K) M9 H! D5 T1 C3 u* d2 \! e& W" K: N8 ~7 R# ]0 G. A
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
8 N& O9 [1 s( `5 g, I) v2 e7 H- m* W2 R
#include "hw_types.h"               // 宏命令
1 y. Q5 W6 m) g' G: [% F#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器: u, B' ~( B3 t6 e  k7 x
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器4 ]& Z+ ]$ C" S1 h3 F: ?2 Y" P

# p% Z" w: K* [- s1 i. K: H" j#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明4 L. f' Q- `! _- J+ Q( C
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明& `$ V/ l% S& s. @3 b% J
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
* j) ]' S$ \: o* t#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
& ]+ Y# g& Y2 E8 ^* S3 d! i5 E$ i$ x8 B+ m6 Z. k
/****************************************************************************/$ m3 N1 P4 A7 m: R. s
/*                                                                          */: c5 z0 j& W6 x0 |0 x+ w1 u
/*              宏定义                                                      */
3 [" o% j9 T' e" c, \/*                                                                          */
6 k) w8 U' P" J) ]/****************************************************************************/
4 B5 M" d, t' q2 H, ~% J* P// 时钟3 K2 _/ E/ |5 W; P
#define SYSCLK_1_FREQ     (456000000)) V& C$ c. B& i3 y
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)* E8 }1 [( C1 F# i
#define UART_2_FREQ       (SYSCLK_2_FREQ)
% R3 Q7 ?* ]' a4 V! p5 p* v8 c$ L" V8 |( c$ D7 `' O
/****************************************************************************/3 ]- h" N2 N/ l1 Z  Y
/*                                                                          */
% O. R- k3 v) u# C3 m  l) }% q/*              全局变量                                                    */8 J( y) g$ W8 c( ^6 J
/*                                                                          */$ Z7 z/ x: ^9 J
/****************************************************************************/3 H/ l% B. u8 C3 }6 t$ z
char txArray[] = "Tronlong UART2 Application......\n\r";
/ _% j" B( N; F8 |% z
3 ~8 q( |0 n+ C7 K3 C; p/****************************************************************************/: p9 n9 O5 L+ E3 t% i5 [" y
/*                                                                          */
4 N2 w# x# P; H" T, i1 J2 ]. w/*              函数声明                                                    */7 {. M, s/ h( F# ^# G1 O: b, Q
/*                                                                          */
+ v1 c& A* n2 [" n% g* T& m  E+ k/****************************************************************************/
/ t! y( z& o# R. n: _  x6 t3 t. i// 外设使能配置
3 G- R5 i3 \0 uvoid PSCInit(void);
, t9 n9 P1 u" h4 D. n% \. d3 d& U
4 q& o! [$ X2 \6 V+ \) o1 t# h  K// GPIO 管脚复用配置
: V1 v5 A7 e& N0 a& pvoid GPIOBankPinMuxSet();
* }" c1 ~- n8 M! p1 I- R
7 J% V5 p! Z( ^' U// UART 初始化0 @+ Q* d1 _8 [
void UARTInit(void);* q' G* j% F  W7 h+ F9 o1 U' Z( K
// ARM 中断初始化
9 d1 b0 t4 I7 u" J+ [void InterruptInit(void);
3 w1 a2 X8 ]8 O2 S4 T9 }& c0 |// UART 中断初始化
' U$ H: x: j2 K6 @  O0 evoid UARTInterruptInit();
! M2 c7 s$ ?& G/ L; D// UART 中断服务函数
5 m5 U: b' ]. U& \0 z9 kvoid UARTIsr(void);0 F$ h0 z% W, I% v! I6 [0 p# s  {. T
6 Q0 i5 n3 l" h4 x% v8 S) F
/****************************************************************************/. E/ e/ {" M5 @& v# j" q" K
/*                                                                          */, {% g+ M' i* ?, s$ V, j
/*              主函数                                                      */
+ ?9 y) A3 M" D: W0 t% {1 x/*                                                                          */
6 A+ D7 _9 B2 d  c$ c+ L/****************************************************************************/
2 C$ m7 ?" D5 o! Sint main(void)' C, |( u9 \2 r
{
. X7 t  Z' W! U% n        // 外设使能配置1 q! D9 o7 L9 @/ A( L0 `
        PSCInit();
0 s- k+ F! ~4 J1 C  q: _: m; ]1 z        3 @! o/ b2 j, g; q  g3 ]
        // GPIO 管脚复用配置7 K: d. D8 x& o7 N# A2 Z
        GPIOBankPinMuxSet();
1 C" N/ @. J+ y+ o4 J; K' q9 K& r: m
        // ARM 中断初始化6 O2 u9 p  o9 y5 i3 d
        InterruptInit();
4 |2 x! N. M. k
# y; n( E8 W1 a5 V4 e        // UART 初始化0 e3 l% v2 e; Q' Q7 i+ G0 H
        UARTInit();
1 C# S- [* \$ R3 U- G9 w* x5 Q5 _8 {* E0 ]  @) O& h% d  ?
        // UART 中断初始化+ ~( D9 z; ?8 e4 c; S# q8 F
        UARTInterruptInit();) f. X, T9 \, }. }# p2 G

3 O8 h2 H& c1 Z! O% r        // 主循环
+ n! ^- K% {) r  V7 C* o1 Q' C* G        for(;;)
4 y& {  e; b8 z6 v; G) p# b9 @        {
( W7 Z: b$ N7 f8 e5 j6 G
8 Z& \! s+ E0 s6 G) P0 Z! [: f" y        }
, f5 m. t8 ?6 z. Y}
$ i6 X! V& g5 M2 v+ e8 i
; h9 J# z& c; V) l1 g  W/****************************************************************************/
) v) d- x  ]1 ~( ^$ E& X/*                                                                          */
0 ]& l5 e" c& O( P" Q2 [- a+ \/*              PSC 初始化                                                  */
( [  S% Z, V# Y  _/*                                                                          */- ?3 a6 h2 \0 D# o- P$ _  l6 J
/****************************************************************************/
$ l: }; v8 ~5 X( C% o7 c5 evoid PSCInit(void)
! H3 E# ^, c% `; M6 @% @  `{
$ `( P$ y% K  J8 o" t        // 对相应外设模块的使能也可以在 BootLoader 中完成
3 k: v1 @& [# a: s/ P" ?  W    // 使能 UART2 模块
2 \5 Q9 k, N+ l    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);; @+ x# r! a2 R5 C) b
}
1 i, W0 s# J* A) ?, R( M: K7 `7 U. U3 P# G
/****************************************************************************/4 K- V8 z  L5 y& ~4 X2 ~7 _
/*                                                                          */( W! r4 D8 [. f- T3 D) A
/*              GPIO 管脚复用配置                                           */
4 x0 _' {9 k6 z! D, ~/*                                                                          */8 c( T1 P" ~" p( }5 t
/****************************************************************************/
3 J& `# q0 E$ J7 H8 ~void GPIOBankPinMuxSet(void)! K9 u% ~- c: k: q& _% l
{1 B; P4 ]# k6 T( F) Y3 ~% N
        // UART2 禁用流控! Q7 p# B  @9 U+ G* ^% }
        UARTPinMuxSetup(2, FALSE);  T6 }: ?, D* S/ U
}1 l6 Y' Y* |8 T3 N
8 }/ [  ^7 s$ m8 D6 [8 m
/****************************************************************************/3 {& M2 d, S! z; j) i/ Q. f
/*                                                                          */
8 t, _, e3 z% ^# z. X/*              ARM 中断初始化                                              */- J( N5 b/ o; H1 N" S
/*                                                                          */& c5 R4 ?" M* t
/****************************************************************************/
0 \( x: y$ O5 {. D5 hvoid InterruptInit(void)6 M$ p0 n# ?" a2 M
{
4 L% n, Y4 F8 G9 P    // 初始化 ARM 中断控制器
$ j' X1 D, Y+ O- F1 e8 a    IntAINTCInit();1 w- {, P# j! M2 }- t/ ~3 A
" b* Z8 A+ ], s6 Z( _
    // 使能 IRQ(CPSR)$ ^9 H3 N. `5 Y7 h. x
    IntMasterIRQEnable();% N0 f, W& D& h3 J, W/ Z
8 M' B3 U& U& p' n* O
    // 使能中断(AINTC GER)
3 q5 p" G, O( v    IntGlobalEnable();
1 |+ q+ I" @& k( f9 N0 j, Y# V
: ~- {; M% l) R) |% T2 v+ ]    // 使能中断(AINTC HIER)
) d3 H% t, s* W+ Y0 \4 y# n    IntIRQEnable();
7 N: `" M9 @% C1 `* ~}* h2 {' N' O2 I7 T* t
/ _/ A6 j& q& {! h# |0 N, E7 K
/****************************************************************************/
  f2 a2 F2 s  s/*                                                                          */3 x9 i2 S: [3 }. D" w* z( K! {3 z: B
/*              UART 初始化                                                 */* h4 g7 M3 z1 i  n
/*                                                                          */# r' N6 g' t( [' }4 u( U
/****************************************************************************/" i$ I% Q& E) p( R3 w7 \$ w
void UARTInit(void)
5 D) D" D& v8 T. D  p{; K  p0 O) @/ w
        // 配置 UART2 参数- H0 _0 h3 l; r7 |3 z
        // 波特率 115200 数据位 8 停止位 1 无校验位
0 P' Q; [# j& Y1 K" h6 U0 ?6 E    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
: @3 Y  f- z1 A. H/ P                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
, w- C# G2 A8 K( t        // 使能 UART2
1 H! P, N3 \" Z. y7 G2 s/ X* A        UARTEnable(SOC_UART_2_REGS);6 B0 M/ P% V; Q9 {; N
& n7 U( V1 p2 F
    // 使能接收 / 发送 FIFO$ O# i/ l  @2 v% @
    UARTFIFOEnable(SOC_UART_2_REGS);0 K; e2 M0 ?0 ]8 Y
6 r. G8 I0 ?9 z1 _" j
    // 设置 FIFO 级别: V8 w/ m! ~6 t" x
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);8 q% |5 o5 Q! R  P
}% u2 H+ F! O7 m$ G0 X* c

- {( B4 @' L, T/ [+ u/****************************************************************************/) l9 ^0 l" }# F8 v0 }
/*                                                                          */
. {$ d; s/ q' L: V2 O& z6 d# D/*              UART 中断初始化                                             */  s/ n  s& \( L  |1 Y
/*                                                                          */
( b) G4 {+ ]5 a0 h( U9 M; h/****************************************************************************/9 H. n" i/ V0 z0 h% R1 C- P
void UARTInterruptInit(void)
# W2 l& u* q4 |+ }- x{' o5 I+ \, k! Y8 x
        IntRegister(SYS_INT_UARTINT2, UARTIsr);$ i6 x, j/ L% I0 ?1 Z3 `
        IntChannelSet(SYS_INT_UARTINT2, 2);6 A+ w& v) E# E# O- T8 C, C( e$ y# `
        IntSystemEnable(SYS_INT_UARTINT2);, {/ C$ q7 b3 |7 {

, Q% ]& o/ l: l0 t        // 使能中断" J5 U( f4 _3 X5 G. O4 R5 m
        unsigned int intFlags = 0;
7 q: M/ M* D4 v* u8 T& N) G# H- e3 ~- R    intFlags |= (UART_INT_LINE_STAT  |  \
5 h  n3 Q  K2 \6 h                 UART_INT_TX_EMPTY |    \3 I: L! @5 `  [6 r  g8 M
                 UART_INT_RXDATA_CTI);: A6 _9 }( d* l$ @* w6 f$ {
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
6 @3 M& {  {9 o) x. ^}6 }$ H; T! n. R& z

: n' z: u: K: {2 F' h/****************************************************************************/; m4 Y1 p* `+ I4 o. u5 s
/*                                                                          */
. t: E' X! b$ I% S% J( N/*              UART 中断服务函数                                           */
- A  h3 Y- V$ {$ q: v$ g$ F$ m/*                                                                          */
- Y" T, T' C' {0 u9 k5 }/****************************************************************************/
2 S6 \6 x- N0 E+ v9 u1 f8 }( }void UARTIsr()3 G. G9 c3 A4 _) m5 }& \2 h
{7 B/ P8 x9 o* `$ `: t/ C1 ?+ U
    static unsigned int length = sizeof(txArray);  S5 G8 @+ F9 P& L+ ]
    static unsigned int count = 0;
! G: l4 P8 t4 r- D" t    unsigned char rxData = 0;8 X2 h, M3 [7 }! l6 k
    unsigned int int_id = 0;# ~1 Y- O9 W4 k* e3 h
% U1 S/ h+ W  A) @! s; _0 s
    // 确定中断源9 U9 t3 A- g9 _& G
    int_id = UARTIntStatus(SOC_UART_2_REGS);
. i1 `8 T9 p- b. n, S4 o- i$ F; y& l6 H% ~- c% @* ~- C
    // 清除 UART2 系统中断0 [' D  w9 c8 G/ s2 a" m
    IntSystemStatusClear(SYS_INT_UARTINT2);
  H( Q  o% E' o3 e/ L$ X
3 \6 W& A( n; p1 q& N+ b9 O" A: p    // 发送中断' G% M8 ]2 R$ I: l6 S2 z9 F' L
    if(UART_INTID_TX_EMPTY == int_id)
4 Z. d- z) k( \3 _- }0 a! b    {, D" P. l: W1 ^- q
        if(0 < length)
9 v( F5 B8 ~5 y' }+ ~6 ?4 B" J        {; g5 l7 }! {! ]. L) j
            // 写一个字节到 THR
' k. w3 O7 `+ B( j: g            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);1 w* S  C9 W" Q. w0 E
            length--;; @0 b0 ]$ a6 q9 X5 |% ~
            count++;
; V0 l: d6 F; A1 ?        }
- q$ u+ I& ?9 v' ~! `        if(0 == length)
) y5 J! J$ a1 L* y3 }- ~' b8 O' _9 E        {
7 h0 u7 [  J( Q4 v7 r" Q. r            // 禁用发送中断
: w, f$ k  ~2 i2 {% Q% B7 g            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
0 d( S  ^: P: z$ m2 O        }& e* C0 Q: q) t& ~6 X  ~
     }: U: y# N1 P9 ]

7 C6 N9 B) u" G" X5 J3 O: D    // 接收中断
5 H* @2 D1 \3 q6 N    if(UART_INTID_RX_DATA == int_id)
: A- ?) c, S5 r5 i2 u; T    {3 ?. P: c+ p1 W7 ?7 W4 `$ Z
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
  O* M5 Z, U- p) a
1 R1 F: C, H; R/ P2 N        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
/ t4 i7 l& O" ^' n0 j3 }    }4 `* |6 }: ~6 s  I
& Y  Q( [7 R& N2 s3 F
    // 接收错误
" B1 [. G/ @4 [8 v4 i& T, M. D    if(UART_INTID_RX_LINE_STAT == int_id)' S# \. b3 I7 i4 J& ^
    {! F4 e( t' ^' ^2 D
        while(UARTRxErrorGet(SOC_UART_2_REGS))- e: G5 S2 v/ }* c7 A
        {
0 r0 b+ s( y- `. k            // 从 RBR 读一个字节
1 w9 M1 G' x) a/ X2 f* }; N            UARTCharGetNonBlocking(SOC_UART_2_REGS);
6 W1 C6 a* f5 r( z* j        }
, A. S8 r+ k* y( D+ @    }; A! G/ t8 C& W4 k+ u
   
7 O( M# D5 b4 g! @# H6 N; Q/ e" O2 h  i    return;
, h$ G( C' W& V& w' O}% `" t& {1 `+ h4 D
回复 支持 反对

使用道具 举报

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+ w' t; t" C& g  N5 |
如果其它设备快速给你发送串口数据,你这边能正常通讯?
8 y3 k3 |( n; n6 V0 T4 q9 [, ?' D
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 17:53 , Processed in 0.045921 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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