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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5605|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。. C% }# Y7 V2 i# A

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
6 J# u( U& W% n2 U* U2 l
  T6 j0 w% a4 S( t0 `#include "TL138.h"                 // 创龙 TL138 开发板相关声明  k' F5 Q3 D  @/ h, |$ g% M8 a1 e! X3 r

8 h" V: B' d, z% a. U#include "hw_types.h"               // 宏命令2 E( H6 s: T; f6 e' k
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器8 N0 j2 c+ k  W& i# Y
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器/ n6 R6 Q- `$ E

' r0 u* |) L6 L+ k) d  Q. S; }#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
1 U1 B% \/ r* |6 w% @#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明. }1 P* o" P; Q/ I+ a
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明- t5 |# V7 W- \9 g2 ^8 O
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义8 P# h$ j. x# v( Y8 O, u+ W8 n
) S! G" f) R) r; B* {: G2 W
/****************************************************************************/5 R/ [8 t( f, w1 E8 O4 L9 J$ U
/*                                                                          */
: m4 ?$ j, z9 t' n; I/*              宏定义                                                      */+ _+ z- y" C$ O% [) ?
/*                                                                          */
7 v8 q  `3 R& x: d0 f3 [4 v/****************************************************************************/
+ t1 d6 E% \& ?8 C8 q3 B// 时钟/ O3 |) }+ A. @" ]$ K- m
#define SYSCLK_1_FREQ     (456000000)! U3 I. W- _0 ^( v
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
0 n) F& ^5 A3 n' V' y- w#define UART_2_FREQ       (SYSCLK_2_FREQ)
; i# a, T* i  w
8 P& R, l/ r# g; f/ d# o6 Y/****************************************************************************/
, O" D0 l; X. H  V/*                                                                          */1 q! c0 P' v. Z8 r: b9 e6 Q
/*              全局变量                                                    */6 M2 c# ~1 v1 z# n3 f$ _, L
/*                                                                          */
5 i1 j5 H5 b4 B! h) G/****************************************************************************/
* }) f4 H" q3 y- I$ R4 {7 p3 jchar txArray[] = "Tronlong UART2 Application......\n\r";
) ]# Y# b# n& B9 F* l
* e- m; |7 r0 x. [: |, u& X/****************************************************************************/
$ }5 T- f* s$ m' b) S2 k/*                                                                          */( j; Y0 F" Q: I; s: {+ [- q: v- e
/*              函数声明                                                    */5 l$ h: N$ J- q
/*                                                                          */& e& b" |( d; ^0 d; g5 o  |
/****************************************************************************/
9 h& J% ~$ X* ~// 外设使能配置8 a+ I' ~7 ^% I* Q" f+ a
void PSCInit(void);1 m  Q: T. \& M" k
; z1 }, ?6 y, p4 R( K
// GPIO 管脚复用配置$ P3 W% H7 e9 P3 q6 b' z0 E6 @
void GPIOBankPinMuxSet();
4 G+ p+ a; [& }. z; E8 L  [1 |  R8 N- B  p9 s; q1 q9 m
// UART 初始化- }; E6 b2 P/ O: Y4 Q3 p
void UARTInit(void);
# g7 f& P( @; Y; t1 @// ARM 中断初始化  n1 J3 w1 k# @3 H8 h
void InterruptInit(void);
% G% O# W4 x+ b# z// UART 中断初始化& V& o+ G" E3 {! u
void UARTInterruptInit();- g% g  O) A- I, P& ~2 g! l6 d
// UART 中断服务函数. x0 `) |9 h) [9 x3 d
void UARTIsr(void);
5 f) B& N+ I" p
: K7 p1 b' `# h& ^! N& }2 B6 s/****************************************************************************/
; _" X+ |) z: C7 _6 {' `/*                                                                          */7 ^# o3 Q. n" K/ z9 U' T% n
/*              主函数                                                      */+ \/ ^- H" {% M# i$ g( D, g6 Q2 {
/*                                                                          */0 ]6 i* F& n$ o9 W: _; I  _9 J* A, w
/****************************************************************************/8 W$ x9 k! H5 E8 i, V9 O
int main(void)3 u8 v1 V8 S8 N% \6 A" ^
{
8 @2 Y: g. S% t        // 外设使能配置0 ~8 a0 K0 }- ^& C0 p# z- I# v8 {9 ^7 `
        PSCInit();
6 O% a7 r$ Z- _2 @2 c! l        # O- u. j+ K6 X3 B
        // GPIO 管脚复用配置
/ b. r0 b/ M  s4 P2 {+ D9 h& M( h        GPIOBankPinMuxSet();
) v! r1 }5 C4 l/ A% ^; U) B- \( m" v6 J+ N2 T3 Z" X
        // ARM 中断初始化3 u% c- ^$ i! ~: ?
        InterruptInit();
" w8 s' E7 ^+ {! c% z7 ^5 e# H7 r0 L6 _+ y4 t
        // UART 初始化8 Y- [) g& ?6 u
        UARTInit();; b2 E* }. Y! M/ O2 _; M
3 l( y* W3 t9 R5 w0 B( t' v
        // UART 中断初始化3 p0 I' H: K3 A, j1 Z6 w
        UARTInterruptInit();: Q1 U* H) X: p% t( m7 e

8 d. j& H9 C4 Q  F3 ^/ {7 B; b5 L        // 主循环
, J2 r0 U9 }9 ?. {8 R5 _. T% n        for(;;)
/ n  Y$ ~+ `5 c* f; n2 W+ i        {1 `# z7 z7 f0 r: a% s

5 y2 K; z, ^( u3 H- d# P        }
, f& h4 F1 U& V0 L- ?0 t5 S$ x}9 T% H- p0 u. }% W/ Q$ H
8 p" c0 C/ S2 P) G2 S2 Q
/****************************************************************************/
  b  }8 `4 _& x% [7 J/*                                                                          */
. I6 ?: m- b( _. \1 C$ I# ^) l/*              PSC 初始化                                                  */5 o. u2 K4 @& A8 ~: ^
/*                                                                          */* e/ C6 S2 ?& F+ k5 w
/****************************************************************************/
" _- b3 D8 z2 ~0 _1 O6 d5 H' R8 Y% L, Wvoid PSCInit(void)- \9 K% C2 e% y9 l: E7 _3 I1 I
{. D3 T/ n5 G! r' K) {9 _: E
        // 对相应外设模块的使能也可以在 BootLoader 中完成5 ^; S: W+ A0 j  O& X6 y
    // 使能 UART2 模块; h3 a+ H# n% q8 S
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
$ N: i8 q. N. |$ s1 {- ^}! s4 f' X, h( U2 c" y: G( C0 \
/ P% C, r6 Z8 c/ Z
/****************************************************************************/6 N8 u2 c) n; Z2 r  j2 j
/*                                                                          */
4 i2 p! f' b% E; C  H8 U+ a/*              GPIO 管脚复用配置                                           */
1 K/ K  @9 K/ A1 O- U3 o! G- N/*                                                                          */6 D8 P1 [8 i( |8 o
/****************************************************************************/
; z) p0 O& c; `8 xvoid GPIOBankPinMuxSet(void)7 k) j: W- ~) L# {
{: k# `4 L1 d/ J4 d
        // UART2 禁用流控) V; E. S7 w. Z% h+ N9 x1 I2 R
        UARTPinMuxSetup(2, FALSE);5 U- `9 C$ P0 T! y  t
}2 d+ {2 }4 W* ?( k+ @; |
/ d* r1 I( V) b8 N7 U; ^
/****************************************************************************/
, s6 R3 n# w8 T: f( q6 M# Y9 f/*                                                                          */
* g7 T: M9 a% O8 h/*              ARM 中断初始化                                              */
: L5 H# B. v% w6 _3 o# h/*                                                                          */% A) d( l5 F/ k3 ^% ?( A5 m* @8 D
/****************************************************************************/+ l' L3 m2 k& Y  u# o9 T" A
void InterruptInit(void)4 X  Z# `2 P/ d$ Y9 O- f
{
7 |% L7 g' _9 A" N5 m    // 初始化 ARM 中断控制器
( q& c1 V. J; {% X5 }0 y    IntAINTCInit();
7 `- N" ^: V9 g. r) o) f# \) a; }. p) z/ x! K& t6 j' R/ ?! ^# Q) @1 t
    // 使能 IRQ(CPSR)8 M' [, I# g3 v0 B" j
    IntMasterIRQEnable();
. e7 E8 ^- e. D' d1 Z# j3 f$ b& A; v! _. o$ k
    // 使能中断(AINTC GER)3 Z( @2 B6 x: A+ |
    IntGlobalEnable();
% J7 z/ M5 r& s# g7 @. H$ _7 k( q
    // 使能中断(AINTC HIER)
" K- \0 D4 m# |- M' `    IntIRQEnable();+ J; o( `/ ~3 E" P$ U  Y' S
}+ K- T& N2 t$ V
! H9 O' v: c$ P1 M  T  x* b
/****************************************************************************/3 @+ d$ n. A2 p- R+ f# n  s
/*                                                                          */
: k2 w2 K2 u: g& ^0 C5 y" e/*              UART 初始化                                                 */
' s2 F  Q' t0 ]: j7 X9 a/ S. m/*                                                                          */
, B+ y9 c- e4 [- M: l/****************************************************************************/. O3 m- w+ J! H1 M8 S
void UARTInit(void)7 s9 }: M; P, Q5 r2 F! `
{( Q7 v/ N1 r$ A, I5 k
        // 配置 UART2 参数
* D' ]% Z0 u1 c/ ^6 ?4 N2 M        // 波特率 115200 数据位 8 停止位 1 无校验位6 U' H! ~* y: A8 C1 F
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,* d  g/ @7 \4 b' z7 r" ~' y
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
4 u! B2 c$ K$ A2 W4 B        // 使能 UART2
+ }& n7 O/ m  \2 j        UARTEnable(SOC_UART_2_REGS);6 b( \$ I: u3 Q

, q* B+ Q. D* v9 z    // 使能接收 / 发送 FIFO
! K7 {# G! [0 ?+ g    UARTFIFOEnable(SOC_UART_2_REGS);
, C9 ?5 N1 K, x. v1 k2 w. C0 L+ u1 m6 [4 P4 e4 C3 B) K
    // 设置 FIFO 级别& Y& H8 q# O0 n- ]/ Z
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);2 h* y" m9 Z  p4 K. ~% K
}
3 y2 b" i6 a5 l! P
6 m! H+ u& M% p! n! p5 ?/****************************************************************************/6 W( Z) v% @7 J9 W  w5 |
/*                                                                          */5 g. C  K$ |$ A- m9 {
/*              UART 中断初始化                                             */
: v. x, B, j  y6 l, L/*                                                                          */
. ~8 k# R4 ]* R+ i1 o. I/****************************************************************************/* [  _2 [% u6 E' @# ^
void UARTInterruptInit(void)
; y, X6 a2 k6 K6 H{
4 j8 C4 }+ s- n0 c. W: {1 @. F        IntRegister(SYS_INT_UARTINT2, UARTIsr);
" S$ K8 P% r5 P. E        IntChannelSet(SYS_INT_UARTINT2, 2);: k. Z  l: }! i( M0 i$ X8 e
        IntSystemEnable(SYS_INT_UARTINT2);
+ D! a+ V4 F7 I" R
6 p* U/ j6 D- ~! t4 ]$ ~9 u        // 使能中断* i  S4 p( D. G8 b, F& b
        unsigned int intFlags = 0;2 @; k4 o5 x8 I7 j/ m
    intFlags |= (UART_INT_LINE_STAT  |  \2 ~; m! x% i$ b
                 UART_INT_TX_EMPTY |    \2 ?; \+ c/ x( Y3 Q2 T& f4 u5 o
                 UART_INT_RXDATA_CTI);/ a+ B. G6 x1 @# _' {
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
0 ]6 |7 i- g$ ~}8 q' B  n" C* `; L. K$ p! w

8 w; \; j8 r+ j9 J/****************************************************************************/
+ O+ i* x3 Q0 ~- K; k$ A1 Q/*                                                                          */
+ \) x- l: T! r  N+ Y: }7 P/*              UART 中断服务函数                                           */
1 V! L- j( N; [( U9 n7 H/ x( x, z/*                                                                          */
& l6 s/ h& E5 Z/****************************************************************************/
; N" l- o) i! ?$ u! Q; b7 Jvoid UARTIsr()
$ z$ l) ]0 ]* |, T  F# D{
! q/ t0 g4 V/ s2 T/ \) F& y    static unsigned int length = sizeof(txArray);
, R& S6 |9 x) O* K! w2 M. ^    static unsigned int count = 0;
9 q' F  P& q" F" i, I8 x    unsigned char rxData = 0;* O% m$ [$ ?: x# E3 p
    unsigned int int_id = 0;
2 n" ^3 \! M3 r, \1 F, P( z8 x( L4 g- N( I$ o5 J3 U/ [
    // 确定中断源" C* c7 y. X- O& b7 |3 Q# A
    int_id = UARTIntStatus(SOC_UART_2_REGS);
* _& W$ f3 g0 @$ b" v" Y1 S, d% |
; L$ M  [, K! u* U. Z    // 清除 UART2 系统中断! q8 j5 {* S1 R9 t
    IntSystemStatusClear(SYS_INT_UARTINT2);+ e5 i1 A- F% ?6 h0 T
/ u% U; ^  |; g9 w
    // 发送中断
  `; P, {, |9 j, `' A) X    if(UART_INTID_TX_EMPTY == int_id)
7 i3 G' C; e2 @0 [" D    {) J2 Z7 i4 ^1 E* \0 h
        if(0 < length)- {! Y3 g7 X# G2 k
        {
" g+ t1 U6 X' o+ x( D$ J( n9 [            // 写一个字节到 THR
% q+ N/ J# t: g9 i8 d) T            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);" z+ K1 z2 G+ @: m  e% f
            length--;
8 @! w2 F7 M$ D# r6 {' Y' ~            count++;* H$ R1 x; a! K6 j' m! }% S( t" a
        }& B- ]: U  g! G, M, `
        if(0 == length)
- g0 |( G* E+ Q  X" V6 g( P9 }" _        {
$ f; p2 J5 \6 q: R* g" C# q/ u            // 禁用发送中断
  }- ]" B/ [/ Q3 L( r            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
7 h& f0 V/ a# M, g3 P# j5 C        }
: f7 d5 x$ }$ z0 g) S4 R5 v     }# e( W& f8 L& U1 ]
' p/ p4 W6 {! C% _  g! R
    // 接收中断
& v" \# o  u+ c% v    if(UART_INTID_RX_DATA == int_id)
8 z: z' E( w& W    {
) u+ n( u# U. ~' T% j        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);  v& x. ]6 W- g% ?9 }! a6 u! [

+ Y$ U  ~: h9 Y) B, Z' W7 p* j        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);. L& F2 X* A+ ?" O
    }' c) x8 r8 N" a7 H! d9 K
1 T+ R0 K1 W, B7 ~& @
    // 接收错误
, G" s, D  R; r+ |. w4 n    if(UART_INTID_RX_LINE_STAT == int_id)1 G" S) y  a9 E; w% j
    {  }; K2 o  w$ p
        while(UARTRxErrorGet(SOC_UART_2_REGS))
* L; c9 J% c" n' v  a        {
* o; z, q" m# @% K8 g            // 从 RBR 读一个字节+ D$ w7 h9 P- g0 r6 b; f
            UARTCharGetNonBlocking(SOC_UART_2_REGS);+ O3 P4 u# Z" a
        }2 m; e, y4 J; p5 k8 t
    }) S; T% f. D: L& |
   
* {6 V" J% \  R6 i7 m    return;, z* T9 }5 M$ K1 s9 {
}
4 ?- M/ k+ v% R2 i
回复 支持 反对

使用道具 举报

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
  g! r. e; W& ^4 J5 Y( F1 w# R如果其它设备快速给你发送串口数据,你这边能正常通讯?

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-8 14:04 , Processed in 0.062779 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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