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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8277|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
$ k1 @: ]" k0 H: E

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
( y( j* w7 v0 L6 P0 O4 i: `: P3 X; v: ]0 g' ]- n
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
( V. a: \% o% E0 B- X
9 m* n2 N  z* d  {% J5 ~" J#include "hw_types.h"               // 宏命令; J( ~) R: I- {1 w
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器# f" u& l7 V# l% Z# Y
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
. `1 c4 p( d/ U1 T. O6 Z/ g  f) Y6 f# r$ I" F- k! H$ L1 Q! l) Z
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
5 h- d  X! x9 ^#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
% t! l% g$ k& p5 k#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明) y* r2 D! q6 B. r! t2 f9 {! v& l
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
3 D  p9 H/ |% r' F4 \7 }0 [) N/ \
/****************************************************************************/1 E: o* T; }: g& k( ?
/*                                                                          */
6 ^# `, [9 M1 [! _9 C5 Q/*              宏定义                                                      */1 K0 u5 F5 y0 r% H& x
/*                                                                          */
4 j+ t1 u  h: i/ W3 m8 Y/****************************************************************************/
2 p# k' U& F& n$ O/ t- K// 时钟
' N" f8 v$ o+ o#define SYSCLK_1_FREQ     (456000000)
1 p# t2 C, }. s; F5 ~#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
. e& x4 _! I2 ~4 s" c- h* o#define UART_2_FREQ       (SYSCLK_2_FREQ)/ H# @3 b* d* k# H

2 \5 z, }7 h/ O& u6 m3 a8 R6 C3 k/****************************************************************************/
) Q, M" T. Y/ S! `( @: X( Y/*                                                                          */3 ~/ p: W' N- F. n7 |, Z
/*              全局变量                                                    */
1 e2 t. i. S2 c# X/*                                                                          */
1 s: ]. |# n' m/ D$ r/****************************************************************************/0 P$ w  M5 `- l! \. H
char txArray[] = "Tronlong UART2 Application......\n\r";
; m& O+ n6 e. }: S! N' e6 v% ?& v' U5 }/ t' j# a
/****************************************************************************/
( n6 h- U' p0 d# d( k/*                                                                          */* x+ r2 B5 R* |- o" W. s
/*              函数声明                                                    */, A. d$ T, c) ~) r& ]0 j* u
/*                                                                          */
) b  @2 p7 A/ L% F) w/****************************************************************************/0 c  H7 L8 F4 C7 p+ M
// 外设使能配置" x1 }8 j2 W+ i1 R7 @
void PSCInit(void);+ z/ ]: \" n9 U7 \

  p' v' J6 P5 `8 }# T/ e7 q7 Q// GPIO 管脚复用配置
3 u) A# l/ G* S9 M, O9 Q0 ?void GPIOBankPinMuxSet();
9 u/ ^7 p. p" M3 Q% _; x1 r
! Y( {7 O: Z+ W3 I// UART 初始化0 _! \) f  b- Y$ c  [
void UARTInit(void);
9 z8 E/ w; A& s& r2 Q; N8 U// ARM 中断初始化
$ u4 Z% a3 ^( v7 U6 @* Zvoid InterruptInit(void);/ ^; G6 I& T/ a! v: n
// UART 中断初始化: U9 y: d2 l$ y! t/ t% x
void UARTInterruptInit();
% ?6 r4 K/ V+ g0 T: v# T5 K// UART 中断服务函数/ V2 M0 M0 F9 ^) o
void UARTIsr(void);
& `, i0 g- `7 E1 }6 T% q0 z
( w0 V  I" y3 Y) ?& {/****************************************************************************/& c& v% O. f3 o+ `5 e( ], y
/*                                                                          */
6 }0 ]. D5 i1 s! Z1 K2 }( n/*              主函数                                                      */
4 o. t$ ]% M. I0 t) D9 ]/*                                                                          */0 D+ Y) |/ W4 g2 b2 A; [
/****************************************************************************/
' x3 I- g- o9 M2 D8 Bint main(void)& f+ s/ C# a% O/ z& o9 o
{
' P) o& A3 ]4 V        // 外设使能配置
- n/ V: |6 y9 C  @        PSCInit();( d# b- j/ W# ~
        5 U$ z" \8 y  J! o
        // GPIO 管脚复用配置
( H4 m7 [5 E" C2 X+ m        GPIOBankPinMuxSet();
1 s" R. d5 E5 _% ^* v2 z
% `- h/ y8 m! X4 t6 I# D        // ARM 中断初始化
" P4 q1 a6 u! I8 ]- N, T3 l        InterruptInit();
& D+ }; {3 w. W+ z! C( D9 {# P* |! W
        // UART 初始化
) C+ {% E  ~- N/ w/ Z% A        UARTInit();, p& _+ X+ }8 c* O$ N1 c* F1 ]$ s
6 N1 |1 G! |5 \0 ~9 g  s. Q
        // UART 中断初始化1 M# u" d8 E4 ^& I8 K
        UARTInterruptInit();+ [4 o  D0 A$ g
7 x, J6 d# e, z
        // 主循环. O! X4 D/ z! O+ w3 M
        for(;;)
1 ]  K7 I2 ~  Z7 o/ u5 _        {
6 s0 V8 k0 u0 r8 S0 N/ n1 m4 B1 o; V. o3 m
        }
1 D. n5 [/ j) r' p' ~}
, w  X: V. s- S6 [
# M( S9 T6 J( q/ ^/****************************************************************************/# m" c7 `" e+ _% ~, ]/ u- _& r
/*                                                                          */
3 L2 B/ w1 C) v% L1 H0 V/*              PSC 初始化                                                  */
8 I. ?: O% u1 w6 g) g) ]6 M8 ]/*                                                                          */4 x, ]* c& Z5 S7 c& W0 Y4 w* s& F
/****************************************************************************/
( b- A9 c4 Z% Avoid PSCInit(void)9 i! z' Z+ r/ L/ H" g1 N/ ^1 I
{! W/ K; H8 _. D% @9 g- Z. s
        // 对相应外设模块的使能也可以在 BootLoader 中完成* ?, I: I. k  X; q
    // 使能 UART2 模块
1 w  [/ u' u1 Y8 ~    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
, s1 E3 x& U! z6 ?7 A}, Z5 h4 `2 A: X! I$ A

* y9 ~7 g" ~& @; T/****************************************************************************/
- |4 g& Q  v( P/*                                                                          */" W( g0 `( J& p3 i( V
/*              GPIO 管脚复用配置                                           */
- w) Z1 @4 M, J+ R- E/*                                                                          */
# a7 M" i/ g' q3 Y' a/****************************************************************************/
! \9 L( w! ]! x- w3 lvoid GPIOBankPinMuxSet(void)
: W- O* b1 j, s{7 k- Q: m% o, @3 z; Y5 g( G- U
        // UART2 禁用流控
6 f: T, h6 j) h( W% m        UARTPinMuxSetup(2, FALSE);7 _5 }" o& I" J4 w8 ~
}
# s: ]- V5 p" v) r  _: q* O1 w* L# P
/****************************************************************************/
. z4 f  Y  }& G/*                                                                          */
! ]5 L  v0 L, e1 ?/*              ARM 中断初始化                                              */
0 B; n: F, g- j$ R/*                                                                          */; i. R* f9 w7 y0 X) s2 N
/****************************************************************************/% z+ f  s1 Y% I8 a# Z& C
void InterruptInit(void)4 m: ^" v9 O; V  b* P( x
{
. j7 p% N4 F9 T' K6 f    // 初始化 ARM 中断控制器5 T8 Z% m) G; o( O  a
    IntAINTCInit();  e0 G3 L3 }# Z" |* d

, D( E4 D% H% m  A    // 使能 IRQ(CPSR)0 n- J+ b8 ~; g% A+ K5 N+ F$ n
    IntMasterIRQEnable();4 i7 u+ B5 {/ c. T6 K* W# e

! n6 R1 E" O  p    // 使能中断(AINTC GER)' E2 H9 Z8 b8 I$ m7 J8 N
    IntGlobalEnable();" x2 }% _) w  h- u3 U0 h: c5 M
3 r0 _3 a; G" w2 Z
    // 使能中断(AINTC HIER)& n% S' F0 m; p4 s: h& i( c6 U
    IntIRQEnable();- E' p: J; ^9 }  y. v  X+ M
}; b" l1 ~( c  c/ x

1 d! J$ V% B  r7 r/****************************************************************************/2 Q% _$ L( x' x( d; H
/*                                                                          */
6 O* F* D9 Y3 n$ N- A; I3 W) Q/*              UART 初始化                                                 */- R+ ~! X1 D/ I8 h2 L5 i
/*                                                                          */& |. ?/ N  o; k
/****************************************************************************/; Q; y1 s0 O) G( k
void UARTInit(void)/ K) J' l7 s& I& ?0 m0 ]
{
3 q' w; b4 ]5 ^7 o$ ?; g        // 配置 UART2 参数/ n6 L) i/ F8 x, g: r
        // 波特率 115200 数据位 8 停止位 1 无校验位
1 d; B5 V2 e& z* o& F' E    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
( |/ r$ k. J8 Q7 M/ {2 P                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);/ g, e6 l7 |; X6 |4 D. f2 K  ^
        // 使能 UART2
: m4 g: k' k5 I( u, |        UARTEnable(SOC_UART_2_REGS);
. Z, n% S+ t: q0 M/ @7 Y8 v1 o1 L# K( K
    // 使能接收 / 发送 FIFO6 H/ [) @% g$ g1 A) {
    UARTFIFOEnable(SOC_UART_2_REGS);
5 c. C6 z, A6 I+ I+ h
3 @2 s) O$ S) u    // 设置 FIFO 级别
' S: W4 g. m1 A" f# N" w2 f    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
' j+ B& S: p  V% w/ z) Q}
, e% n/ }0 R3 C0 V$ Y0 o
- h; a; h/ @" J) `! J# h* ?/****************************************************************************/
; Y9 h7 a  A- \/*                                                                          */. y1 N+ p4 L* y) f
/*              UART 中断初始化                                             */8 ?3 y) Z% ?/ \: [, ]  Q1 B1 v
/*                                                                          */
. l) j, D0 T" S1 T/ I7 w& F/****************************************************************************/
+ ^  T; b1 D5 E# D, y9 X( C' `void UARTInterruptInit(void)
/ S9 ~7 G8 k+ B  x7 V# U  ?; T" Z{
, U! B- ~2 L" K7 l! u" E8 b        IntRegister(SYS_INT_UARTINT2, UARTIsr);- w* ?  [/ t9 J/ ?
        IntChannelSet(SYS_INT_UARTINT2, 2);
5 J5 B! v2 c, p" \# ?: I% \( z        IntSystemEnable(SYS_INT_UARTINT2);
* v3 O7 C* b5 c0 R/ f3 J2 A
; A0 r+ R0 D: O( r5 \6 N6 T        // 使能中断
8 J* T+ H. U4 l6 f" H& `) `        unsigned int intFlags = 0;3 ^! E3 r9 f- m
    intFlags |= (UART_INT_LINE_STAT  |  \
0 q! B1 F: G  }  a- n4 W# x                 UART_INT_TX_EMPTY |    \0 ^6 ]1 k" L' k' i; y) g# F! \
                 UART_INT_RXDATA_CTI);$ Y0 G+ L% u& s- r% N% T
    UARTIntEnable(SOC_UART_2_REGS, intFlags);: N( G. J" X& E5 t  B( Q
}
+ C2 ~& N0 V0 @: v; X( H4 I( A% M+ y$ B. c2 i7 {
/****************************************************************************/7 y! |' ^; U& U8 ~
/*                                                                          */1 |3 P- E5 `) c: b# D
/*              UART 中断服务函数                                           */: Q8 n- X" |+ r2 J. m
/*                                                                          */3 W. M  \# O3 R( k" Q
/****************************************************************************/
; Q  K) E- N6 Q( W7 Dvoid UARTIsr()
" X' w' |7 @5 X: D; ?{: J- X8 k: O3 I- a( j9 ?6 [$ a) V
    static unsigned int length = sizeof(txArray);
4 L# o% O4 w& q9 b% z0 U    static unsigned int count = 0;
: g6 |8 U& }* O; m" Q    unsigned char rxData = 0;
. K5 V# ~7 h3 }/ m    unsigned int int_id = 0;
' ^, y1 S- m+ I  ^0 b* K9 Y' t; U
    // 确定中断源
9 m; m: k7 G8 p5 Z/ T) g( t. U0 e: m. n    int_id = UARTIntStatus(SOC_UART_2_REGS);) k3 f$ U" h6 U" R! z

% j8 y  i, k: z! M/ t; d    // 清除 UART2 系统中断1 L7 x; z( n9 f+ M, T5 J, {! r
    IntSystemStatusClear(SYS_INT_UARTINT2);' @  k) d5 c" r; N+ X! K1 W8 x! [
( Q: Y' n: A9 p
    // 发送中断
  @9 e9 q' Q8 A; Z5 ~    if(UART_INTID_TX_EMPTY == int_id)
* q( T1 `. j  b$ }! u7 U# t' V    {
8 |$ n+ p) ]8 K; ^! N1 B7 ^        if(0 < length)2 g0 D) k/ B( H1 {- X
        {
: {. \- k5 t2 C" x            // 写一个字节到 THR
$ A* [* [/ t6 D            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);8 F, _2 X! ]  {1 _) f
            length--;$ a- j1 I( r+ w
            count++;
* N, `' Q/ Y. A$ Y$ {7 E& D        }
8 i; J5 d. ~+ w; ?. k8 n9 p        if(0 == length)
/ G" O4 ]9 l$ T$ Q7 X        {! J  X: X0 @  r! O  H
            // 禁用发送中断
3 s  S* D& S& Q: ^& l& o1 |            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);* r5 p1 |4 e- {5 y* q* N2 [
        }! q* k) k; N/ l6 I7 E
     }
1 z7 a% @/ U* Z- n* w; c! r- b0 N4 X/ I* P- p; _, t
    // 接收中断
1 H& J- }: p. R0 p    if(UART_INTID_RX_DATA == int_id)
" W# w4 @1 N6 g2 T: m  O2 F, l    {1 g& H1 n0 h2 K" J) r8 `
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);; q& b4 R7 H! h2 C

- N* ~1 \" i& {- I+ H* A        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
" ?9 {0 A4 T( _! }5 y    }
' U; n0 e0 B6 Q" A$ g; ?/ k4 q2 A7 Z" x- {5 l
    // 接收错误
! Y: `# g. J& Y; _* V4 }) w    if(UART_INTID_RX_LINE_STAT == int_id)
* ]9 r0 |. P/ J) B- ]8 t' z    {) O; z" Z) Z' b$ t# v/ R
        while(UARTRxErrorGet(SOC_UART_2_REGS))7 z4 p, \% e  S% W; @/ i
        {7 p! p: m. U6 c$ [! n+ F
            // 从 RBR 读一个字节5 l2 M% U& d2 S( X
            UARTCharGetNonBlocking(SOC_UART_2_REGS);& ~$ H1 Y+ ]2 }0 A8 Y( O! S. }
        }
  e8 N6 a. F0 Y1 A7 o- f3 ?. r    }2 T, H9 ~& @/ x4 c) T$ r* j
   
2 M( O. K7 v9 Y$ T    return;
2 u- l# ]" Z5 z8 m$ [}
; g4 P# h7 u2 C% l2 ~8 g
回复 支持 反对

使用道具 举报

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
  K& u% u8 D( A+ I, P2 J如果其它设备快速给你发送串口数据,你这边能正常通讯?

3 Q: B9 W8 q) I- l+ p9 x, ~% [谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-16 12:59 , Processed in 0.041939 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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