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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5650|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。7 m; E( L& Q9 e- t' c9 E) s& g

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。: Q$ v/ A* R6 ]" ]9 b9 m6 D) ?

7 T- g+ O$ R  U; ^/ z#include "TL138.h"                 // 创龙 TL138 开发板相关声明
; C8 o8 f: V8 _. h6 }- n
) B. h7 o6 L0 O8 C" A9 k1 g+ Q#include "hw_types.h"               // 宏命令
9 f  j. B, I  W* e/ H7 M7 J& f2 E#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器3 g& m5 H& ^  c0 d1 Q1 w
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器3 Q9 _3 y( o- D$ q" l3 m

  U* c- |. O, f  n% s; M#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明) e1 _; w/ Q! x7 {7 z( q) R: t
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
1 e* W! b0 w: W! [6 i% F% A#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明) z( `8 h& S, {! v0 J/ r
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义- S- A- X5 @( z- q' V% `. E; A
4 b! \" w# O* ?' t8 j
/****************************************************************************/
$ l0 f9 I. M# p3 I  h/*                                                                          */! Z) ~/ O% x$ I" i" V$ e& O9 R' `
/*              宏定义                                                      */
1 r2 e  R/ V. @% j. q1 E8 |: ?) G/*                                                                          */
" ^) w3 v& A( F! J/ n+ L/****************************************************************************/
) h) G7 B- n) h. R- ^8 ^+ N// 时钟
8 _5 c# z+ c; t" V% p#define SYSCLK_1_FREQ     (456000000)/ x; s* c1 ?1 x8 }# l, G
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
- ~8 q; {; B" ^2 N+ g: R+ `#define UART_2_FREQ       (SYSCLK_2_FREQ)" a/ r; a. `$ L. j* B0 O+ b
1 q# {+ t+ ^6 b. t9 o
/****************************************************************************/9 B/ k2 u- p0 Z! o
/*                                                                          */
! `" n* b0 z8 \! Y- i. c$ T/*              全局变量                                                    */
3 `5 w' G; f; @, J' c9 x9 Q/*                                                                          */
5 W1 g! w2 d5 k& j7 ~9 s0 j/****************************************************************************/, s, }5 e, p- N, H% `
char txArray[] = "Tronlong UART2 Application......\n\r";
& ~$ z6 d+ |7 B% r1 T% p$ J. N# z( y3 o/ ^# C/ ]2 n! P, ~1 B
/****************************************************************************/
/ k/ r. f" r0 ?/*                                                                          */( E4 I5 l2 K) J+ J, ?1 I
/*              函数声明                                                    */
0 Z, ]9 P, I6 L6 v! O! q* ?+ P2 K/*                                                                          */
6 H, u$ G, F  a. n/****************************************************************************/7 \" R" X1 k& Y
// 外设使能配置* C2 a4 \0 Y6 V: k
void PSCInit(void);
& P, A0 b- p/ {) ?5 @! d/ b' R6 E
0 w( }: C+ M, T- L; J// GPIO 管脚复用配置
5 ~. ~3 v, \& q1 Z5 G& l. Rvoid GPIOBankPinMuxSet();
: p* i) `/ K( [% G: Z  C' a5 N! d
// UART 初始化$ ~, H* r) A0 g4 W
void UARTInit(void);
" \4 |$ P; u. i! O5 J  t& y" P// ARM 中断初始化# u7 |! D1 m2 y' n  X& T* Z
void InterruptInit(void);- ?( J6 Q% ?% k6 [7 D, ~2 |8 O
// UART 中断初始化! e+ j6 D) n# \9 t" f5 U
void UARTInterruptInit();
2 X5 O- W: e1 Z- J: S// UART 中断服务函数
5 `; f+ j" f- F) n8 s9 a  P3 G8 V/ Tvoid UARTIsr(void);7 {; W" V/ Q: g: Z

" `6 G+ A% m% k+ Y: ?; ?/****************************************************************************/; Q7 T5 V0 C0 h/ b& b
/*                                                                          */  |9 j# \5 v/ T% _( ?2 e. A; K# Q
/*              主函数                                                      */5 E7 P- @; f: m6 ^! O+ y
/*                                                                          */
6 @. |/ ]2 E( n/****************************************************************************/
0 m' M' M5 x9 m1 x" w, K. u$ U, Nint main(void)
+ Q( `! a! U* @( n9 M* b( @{
4 M/ ~! X3 v  t/ V        // 外设使能配置
6 D% C. K% p9 H! ]        PSCInit();
$ Q( X; K6 M, D( J; I       
' B( V$ h2 S0 }/ X        // GPIO 管脚复用配置: T3 E$ J6 p; F
        GPIOBankPinMuxSet();
7 K+ g9 k$ p. A, z3 e; z+ j1 U; |  f; ^- B' w; l0 [6 F
        // ARM 中断初始化# ]5 g, }# _' j, |) P
        InterruptInit();
& j! N& E: a3 `% I# [9 X) A  \' h& f# J0 s$ f
        // UART 初始化6 p6 F+ v) b' Q5 i
        UARTInit();3 l# z! Y1 a) U7 J- y* n' ^

9 ?! @) S$ ^' L/ C5 `! S! V" W# b        // UART 中断初始化
7 f+ B# x3 Z. f3 r2 x2 v, N0 c        UARTInterruptInit();+ Y, `) B; w  Q
& ?% X" A) a' p4 O
        // 主循环
, V& z  B( x8 i9 L7 k        for(;;)
; V7 R4 x0 V7 F% O) f        {- r1 [( i2 Z2 `. {4 U

( P9 U( f3 @+ _2 J$ r: l        }
# ^! V0 ?2 p& T0 P}8 N6 E7 l- J9 M8 H4 B* |

8 \  }- I# R! l6 v, x; ?) ]/****************************************************************************/
" X' J% Y1 w7 R/ L5 o. l/*                                                                          */
1 f5 F" Y$ }* }( D8 G# t, K) A/*              PSC 初始化                                                  */  b7 h1 N2 o0 K6 S, G
/*                                                                          */
+ e9 W- i/ d1 A1 ?, {/****************************************************************************/7 s) {5 F* O8 A* D' @7 @
void PSCInit(void)
3 K: ]2 Q1 y: M+ p8 R{# O1 j* E& m- z7 k: A
        // 对相应外设模块的使能也可以在 BootLoader 中完成
4 `1 g( W, f* h) x$ q, J9 V+ [4 ?    // 使能 UART2 模块3 j9 b; D! w# ^# R1 r: f5 z
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);; B. f) U( g8 x( x1 ?) |
}( `5 s" n* ]& y7 t" a8 H

+ }0 ]0 k4 t; W2 I/****************************************************************************/+ m2 |" z8 f6 t6 W  `7 i: o
/*                                                                          */' J9 L! D1 @( V! t" w
/*              GPIO 管脚复用配置                                           */
& _; g( Y6 M- w% X; R2 T4 o/*                                                                          */
6 k$ j8 {6 F, z8 [3 ~/****************************************************************************/
1 h" m8 @; K$ p( fvoid GPIOBankPinMuxSet(void)* e3 N6 N% W9 N$ k, b
{# K" ^" b: ^1 b( a( d( R' p( B
        // UART2 禁用流控
- h6 J7 o- `5 O/ Y* J. V7 H        UARTPinMuxSetup(2, FALSE);: ]. {% d9 p! s- O7 P4 J! o, E* g  R
}
7 S0 J+ t" N2 t: }
* [4 I+ @) O8 y+ g2 Q) X/****************************************************************************/
- y4 J$ T3 q. ~8 ]/*                                                                          */
( u9 z! Y5 Q' H/ G9 N, ]' M/*              ARM 中断初始化                                              */
8 J8 a/ Q! c6 u* ]+ L6 V/*                                                                          */
; o9 L1 d) ~4 Q% w: g( Y/****************************************************************************/+ i7 R. ^& N* p
void InterruptInit(void)
0 g3 N" w% _( b4 C6 z. J6 s{
9 u2 S9 ?& h6 \3 b2 [# n    // 初始化 ARM 中断控制器8 E7 @5 K& i, K9 c( H2 k7 Y' o, E* _! H
    IntAINTCInit();1 ~7 X; I4 U' B  T% B, r& g

* Z; O. g& r: i( r7 q9 M- M    // 使能 IRQ(CPSR)
0 ]8 d. m4 i9 D2 ?, ?3 q/ c    IntMasterIRQEnable();
) V% E# J4 Y: M! C# e( m1 q" |
$ C# H" F8 e( ^    // 使能中断(AINTC GER)
& m' c' q! n6 T/ P$ F, w4 T" ~    IntGlobalEnable();
  {/ i. B. n- B$ ~) b6 y- H+ X* F$ s# Y' H2 I
    // 使能中断(AINTC HIER); ]8 w% j! o+ D0 G, d* [4 ]/ g" P
    IntIRQEnable();: v, p7 }/ J- v$ s" a5 h
}
5 ]9 @- L3 y6 w: s- ]
* S, i/ l' F: M. }3 n/****************************************************************************/
' U& n0 j( A" Z, g' N/*                                                                          */" O4 C( B* O5 Z
/*              UART 初始化                                                 */* c3 T! t% Y4 v& y1 J3 I
/*                                                                          */
/ ~. s) O3 f) R+ P. a1 r+ G/****************************************************************************/
1 _/ }! U/ a3 tvoid UARTInit(void)
! ]; C5 j& X% S8 _{- e# v0 `  H4 }+ L) d
        // 配置 UART2 参数
* d& ^: V4 N8 @  Q0 ]$ ]& @1 F        // 波特率 115200 数据位 8 停止位 1 无校验位1 ~: x% x: ]9 p5 e
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,- F6 z% n# b5 x" X+ b5 m
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
9 x5 ~  F6 T  w; X1 T        // 使能 UART2
/ W/ ^' W' W! U- r  Q        UARTEnable(SOC_UART_2_REGS);" D5 g7 J& `) T1 v& v8 K
& o/ v+ x# ~3 [3 n/ A/ p1 e, z
    // 使能接收 / 发送 FIFO
( b9 y' t( S  ~2 Q8 X/ R    UARTFIFOEnable(SOC_UART_2_REGS);: r1 z: X$ ^, V
9 A' {/ X" o+ C5 t7 R9 }0 ~
    // 设置 FIFO 级别  F$ t' t- U, B1 A+ f# t+ [
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
* L; z8 Y! ?  [}
9 g  W- m) H  N" H% _) _: c7 _- ]/ I+ |/ @4 v* i( B
/****************************************************************************/
/ A- c( n& U, Q) G" `' U/*                                                                          */* f2 A' i2 G- J! t
/*              UART 中断初始化                                             */( i6 z+ U' Z& |, f+ x
/*                                                                          */
6 x# [2 Y) t- B$ ?2 }/****************************************************************************/
0 s  a9 m# B7 zvoid UARTInterruptInit(void)
+ M* ?% D8 b. U' n9 ]$ E/ p{
  [" Z( a/ l/ f: E/ {. n/ X6 \* B        IntRegister(SYS_INT_UARTINT2, UARTIsr);* ~; q' O: `6 J7 v" E
        IntChannelSet(SYS_INT_UARTINT2, 2);
2 T% `; g5 O' ~# s: R  H        IntSystemEnable(SYS_INT_UARTINT2);! ?8 O0 T( ~8 o

# y; f- Y" |# {        // 使能中断; [- z9 B7 `5 [4 E, Q
        unsigned int intFlags = 0;
  ?4 `3 I/ R/ c( Q( K/ o& y7 n/ M4 `    intFlags |= (UART_INT_LINE_STAT  |  \
! {* r5 Q& U$ b1 F                 UART_INT_TX_EMPTY |    \
4 z; b7 o+ _- F% c9 r9 h4 L$ x( {                 UART_INT_RXDATA_CTI);" ^! W- E$ r* H2 L7 j
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
+ p( ^. B1 A$ Q7 ~}
* ]: m2 u0 S% ]8 [$ Z1 x# s' o; k8 k: [" q) K/ q6 F" x+ A
/****************************************************************************/2 s# a$ B4 D& o4 \7 r  U
/*                                                                          */
7 L8 Z6 K# B* {/*              UART 中断服务函数                                           */
1 i( \' J" [! g/*                                                                          */7 o4 ]) A7 q- N7 h! l  m' ]
/****************************************************************************/. N& p8 `+ a" g( s
void UARTIsr()
% z$ g& H/ R+ [2 Q) Z. t{: i, A. T8 k# w; J# a
    static unsigned int length = sizeof(txArray);8 b3 J# Z* X( Y
    static unsigned int count = 0;
* Z4 D6 `: M9 j8 x1 Q    unsigned char rxData = 0;% H: c6 [: W/ S7 s
    unsigned int int_id = 0;, a' J$ U, p0 n: Z
- _+ {9 `+ M4 I- D* e$ x
    // 确定中断源+ }( M5 u$ @4 {& T
    int_id = UARTIntStatus(SOC_UART_2_REGS);
' H) Q. H& D3 J6 R! u; ^6 ]- ]6 Q* r: l
    // 清除 UART2 系统中断
- H' m1 l$ {' T    IntSystemStatusClear(SYS_INT_UARTINT2);
" L/ _6 T/ u" N) R" T0 R$ s, z$ G" q: l- t( F( y
    // 发送中断, _6 P, g3 P& `% d' R* I" G" p4 Q- S
    if(UART_INTID_TX_EMPTY == int_id); H2 ~7 V& m# X" S2 o, Q6 |: ~! ?
    {
2 g0 n* F7 G# M2 M        if(0 < length)/ c6 f9 \2 J+ H1 n% S
        {, Q, [# g% R, U% R, j. `# c4 Z$ c
            // 写一个字节到 THR0 _: L+ x, N: `' z9 n8 o3 E
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
9 D4 c2 i6 R  Y( _            length--;/ B+ i# n$ |! E3 u9 p  A
            count++;* _% O0 J6 l) R. ], I, W7 n9 |3 p/ Y
        }
. P) r. a1 L0 g- V        if(0 == length): d7 U* ^- U# ~  n" P. S
        {
& G3 s" i1 g% t8 j            // 禁用发送中断1 K% Z* a8 J+ r4 p* f  ]$ [" f8 G% K
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
. h# G  M# {3 T        }
5 f* ?/ ~5 @4 U5 g% o0 C$ n     }) z1 K. I% |% C5 z! L% S
" M+ ]( U% B  m1 j( G3 B
    // 接收中断% y0 J0 J" L% y
    if(UART_INTID_RX_DATA == int_id)5 }6 H! N. Y) g2 H
    {: O- M, h  t5 E. F4 d1 V
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);+ M2 `. Y# i  U- b# h" Q. f

) b1 a" y) l4 T        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);  r. g* K" B& Y3 y0 l9 z& C
    }
' J  b5 @; f/ m' p/ {' r6 B+ A( {0 {% K* c* O! |
    // 接收错误
: \2 |" q( ~7 Q; L2 }    if(UART_INTID_RX_LINE_STAT == int_id)% f) F1 S! e7 P8 Q6 m
    {! b+ W" d4 i- t6 E0 u
        while(UARTRxErrorGet(SOC_UART_2_REGS))
: i% N5 Y$ L9 Q- ?# {! ]4 f, ^1 a        {9 B0 X3 J  V$ k7 o
            // 从 RBR 读一个字节
3 K0 l! X( K4 M* k0 \6 w% R            UARTCharGetNonBlocking(SOC_UART_2_REGS);3 @  m: w7 ?* j
        }
5 L) v" q6 E% n5 n  p7 c    }  Q  L' z: L% |; Z
    / A" ~1 z* U) [5 @
    return;. c( f" }9 c& b6 a3 D1 }' K& x( E6 m
}) _; T1 ?1 P# `
回复 支持 反对

使用道具 举报

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
' ]- h, |+ u% X9 n+ u& Y如果其它设备快速给你发送串口数据,你这边能正常通讯?

$ M: f3 t4 \; c: z) L2 `谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 01:51 , Processed in 0.051846 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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