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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5608|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。/ q% _3 q5 ?2 v3 s

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。( t( G7 o, n) K# p  e- i7 [

+ ^% L5 l4 P, @$ k2 V% J+ r#include "TL138.h"                 // 创龙 TL138 开发板相关声明6 `7 v. E& u3 Q1 R# ]' z
1 U8 S3 C! v) y$ @  Y# [4 e
#include "hw_types.h"               // 宏命令
. @2 R! O. N( s6 p, {  }0 p#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
( [- w1 O4 o3 k' Y3 f#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
/ y3 q# x* Y5 t  t/ O# B+ l) [  q% ^5 N1 D6 c; q& V6 @0 H7 q8 Z
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
4 u; ?+ y5 F/ [#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明' D7 z$ F% g% n9 |* j. k
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
( x2 F1 d3 Q1 R#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
* E. [/ \* o/ ^0 c" t. X
8 v! C% Q) ?# l1 d* \/****************************************************************************/# r, H& {- |) K
/*                                                                          */
5 p5 @0 F' l& I( L' C% |: e/*              宏定义                                                      */
4 l- ]4 {; y4 r, b/*                                                                          */, Z5 i  |' b( e/ ^  J5 v
/****************************************************************************/
- ]  _3 X9 H3 m6 h4 O// 时钟0 r) @: ~, h* D) f) a1 R9 p
#define SYSCLK_1_FREQ     (456000000)( O4 q$ P  h1 w- M* r3 @. L
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)' e$ g% s1 A, {% E% y1 y
#define UART_2_FREQ       (SYSCLK_2_FREQ)
) Z" ^  C7 h& l3 s3 T" a
. U1 d& T1 p( m7 a: J' A# c/****************************************************************************/1 k. L4 o, o; U- X2 C$ b( g3 R
/*                                                                          */  d( ?7 ]5 V* G. G$ i
/*              全局变量                                                    */. c0 G0 U! ]- Z- J9 @
/*                                                                          */
% h. O- l/ Q. q/****************************************************************************/2 G: d$ {# w' P
char txArray[] = "Tronlong UART2 Application......\n\r";
6 W# U; U, U, @' ]: q  V  ]" f) \0 X& b6 x; ^8 M
/****************************************************************************/4 g: z! l0 C; I( v- }; K6 U
/*                                                                          */
) V3 W- l  g- o0 _; ?% v( u% N; o7 V/*              函数声明                                                    */( v. T, w4 y% l) V4 g
/*                                                                          */# D1 p7 \2 n  f" m+ O' Z, ^* h
/****************************************************************************/
  f2 b2 j. i' Y7 |0 q% r// 外设使能配置+ Z2 I3 f( @8 M4 V# Z: ~% o
void PSCInit(void);
4 x) ]7 s4 P% m  j- J# W) M
& q; r( W9 O+ ?: H2 j! ]// GPIO 管脚复用配置
! s3 z7 y7 M2 J- J9 }void GPIOBankPinMuxSet();0 g4 l& s% K/ ]4 A) ^
; @  t6 ^& P/ o* H& v3 D) Z1 j# `
// UART 初始化
) j( D' a1 a  d! E7 j" n- L! D3 C& }void UARTInit(void);9 q' t8 K4 g& v! R; U8 C+ t4 B
// ARM 中断初始化
! r$ Z; g& R  r0 [void InterruptInit(void);& r' D0 S' `& i& B. k
// UART 中断初始化
' l; b6 p/ ^2 ~void UARTInterruptInit();
- F; q) }( p3 Z1 O// UART 中断服务函数
' S5 {1 K6 E  |# U; C- g+ J- s7 Q( J' }void UARTIsr(void);
; _( V) v9 S4 b" a7 m, _- ~9 ^: v& A9 Y5 O
/****************************************************************************/. y, R5 d. H) o8 w/ g
/*                                                                          */
- W$ o: A% E# O/*              主函数                                                      */6 G! o% J! H: N' Z0 F. l
/*                                                                          */: q0 E/ H4 ^. t) c
/****************************************************************************/
0 Y" S+ c1 L( b3 K* Z9 B2 nint main(void)
( G8 V: `( r: k# L6 S/ t8 Y{# e6 O8 }$ a& J  d- u+ t
        // 外设使能配置- ]1 L' l0 g. `2 h% R5 _: A
        PSCInit();
& C' M* ^# f- b: y- I) s       
8 \5 Y/ x7 Y  _1 n/ e. P: P7 s- i0 _        // GPIO 管脚复用配置
* E" L0 i/ ~* y2 a        GPIOBankPinMuxSet();/ p+ `7 x' c, {9 |3 c  c+ u: t

# g# k4 ?$ q6 y! r1 F  `        // ARM 中断初始化
. E9 }$ o. m$ l2 S) A. t( C        InterruptInit();; {2 |/ f+ o; x3 {

" C5 Y' W& q, z6 ^        // UART 初始化
" J6 g7 o  a, r        UARTInit();
* X9 b( J+ W( d& r  }- k$ u, u3 W
+ i) ^4 @3 z& A% q8 q# x* O8 j        // UART 中断初始化
% G9 S8 ]) v( j& P; O        UARTInterruptInit();
, Y4 U5 p  Z% G% s1 K8 i- L+ ^) V' T* p% F: @$ j6 k
        // 主循环$ L& M8 A) x- x1 f" |
        for(;;)# r7 T1 T  g7 i+ }' Z! N6 C
        {& x9 p5 I% ^2 }5 b( Q! h0 D
, C0 Q% w) H1 i; O. ^) T4 U$ m. D
        }
8 d- r) Q( S% b6 \}! L& e  h& z$ `$ m9 k

, T9 Y0 k7 |# q/****************************************************************************/9 h+ S' c  t* T4 ^( p6 }; M3 i
/*                                                                          */
9 Y: A9 u: p$ P/ `5 T/*              PSC 初始化                                                  */
+ V% d$ `) o$ w# J! c* h/*                                                                          */
5 m8 a) h! `; c. [' J$ s/****************************************************************************/
+ D/ R' L$ F& D2 K4 Hvoid PSCInit(void)$ A6 i! V! r6 y% L% P9 i( {1 B4 Y
{
# R+ F- [) I( Z        // 对相应外设模块的使能也可以在 BootLoader 中完成
( T7 K: I$ |+ C2 ^    // 使能 UART2 模块/ p& {6 v$ s% |4 H
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);" O7 i( W. S+ ]+ C1 ^8 v
}
6 N) C/ Q% E( e% S( a/ U2 f7 k. I8 ~. k
/****************************************************************************/6 J7 o5 ~. Y/ M. k4 J; S  F
/*                                                                          */# O+ `' p# ~' |
/*              GPIO 管脚复用配置                                           */
% X4 m& a- T( u: {, ?8 H* N/*                                                                          */
5 X% w% O2 u& y; s3 c" I/****************************************************************************/* D. ]& S, r7 x+ E2 }7 K/ c
void GPIOBankPinMuxSet(void)3 w5 E5 A% |' \
{
- ]0 J( ^2 Y% X        // UART2 禁用流控
( _3 ~6 d% W$ `( ~+ W        UARTPinMuxSetup(2, FALSE);! j, s, A& c+ k6 l2 s/ {
}- A/ g  T& ]9 R6 m2 v5 D6 m

% [& D# z" l0 s; _% ~  M/****************************************************************************/3 h7 c) P# e4 R$ C* v4 _! `
/*                                                                          */; A7 f) v- |  H. h- Y5 r2 x1 K
/*              ARM 中断初始化                                              */
2 \- c9 }; D! g/*                                                                          */
, i/ C5 s2 T4 Y& K9 D9 a+ k/****************************************************************************/3 L/ e6 V: M7 d* i8 E! m$ Y
void InterruptInit(void)* A) G8 ?! n: p) ~; y
{
" J/ ]% C* s2 D$ i3 {! L0 c    // 初始化 ARM 中断控制器# w( Q  o% C; {2 r
    IntAINTCInit();
, r6 y, x& R) H; t" h) Q
4 K! d( P1 d! X7 \, s+ `    // 使能 IRQ(CPSR)# w9 G3 e0 S' H2 T
    IntMasterIRQEnable();$ {/ ]$ S! `) ]

5 c* E/ ~$ _9 \( c    // 使能中断(AINTC GER)
8 e+ c& J- G7 z& P% q    IntGlobalEnable();
, {$ @: |7 E4 f# J/ A' p& ]  |8 b) ?3 Q" }7 ]5 I
    // 使能中断(AINTC HIER)% V, d+ L% [! R2 K- q' e
    IntIRQEnable();
, T! z, j' W+ R9 Z+ G# u' d, B) M}+ h. x8 |9 J+ C+ c

# m$ x7 T* a4 U$ j+ V) B6 B, d5 r- y/****************************************************************************/( u/ g! d7 m/ ~! Q7 r8 Y: ^- q
/*                                                                          */
; b$ x! E. E  a: [  g, e/*              UART 初始化                                                 */
: n5 z, u- w  g8 H  r4 t- e/*                                                                          */3 V* d# W9 Q6 s5 @: X  r1 h
/****************************************************************************/
, a& y1 \5 S9 x; Vvoid UARTInit(void)
( q0 v# h8 T' I% @; N) q- d5 r4 _5 S{
/ N1 _+ x8 ?  v        // 配置 UART2 参数0 j& B3 R/ N8 m$ E" ~1 l
        // 波特率 115200 数据位 8 停止位 1 无校验位
( p: u; P/ r. X/ S( Q    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,9 N" w5 _  l0 Y2 U7 p! o
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);3 c6 @3 s: c; A0 h  r4 B( f# K
        // 使能 UART2
, |& F: d" D- L' c6 h. e+ X        UARTEnable(SOC_UART_2_REGS);) n- U' x% @3 H# h# c

2 I- P4 J" A4 m, E# g. N& ]    // 使能接收 / 发送 FIFO
! F* X' ?  U9 O9 K$ G( [7 ^' I    UARTFIFOEnable(SOC_UART_2_REGS);
7 u2 T8 }. s  H4 i: L% U4 R  S7 p) ^0 z
    // 设置 FIFO 级别
, u. Q0 u" K# ~- }* u& Y' a    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);' u; h8 L. |! y2 a! N! {& Y0 a
}; G; k' C  M9 w/ P8 G  C# a( i
! l) }# ]: U6 U5 m
/****************************************************************************/
7 h5 y7 A* w0 d( L2 c3 o; N/*                                                                          */8 D# ~8 U( V. M) }
/*              UART 中断初始化                                             */- ], X$ F$ o6 W- b
/*                                                                          *// d3 u  u' T+ G* G) K
/****************************************************************************/
% Q" U! g+ U4 X) nvoid UARTInterruptInit(void)% R4 z7 }2 Q1 u: Q' Z
{3 T: ~0 P& z* y, Z6 W
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
1 |* L+ H! c/ Q1 d( M% |9 }0 Q8 k# J        IntChannelSet(SYS_INT_UARTINT2, 2);
8 d1 i' v, P0 ?6 `        IntSystemEnable(SYS_INT_UARTINT2);4 b% {/ H) C  M) G8 M4 a

- Z9 o+ J  o1 Y% i% i9 J8 v        // 使能中断! |: ]0 i$ l: ]0 ~" ?/ m% J
        unsigned int intFlags = 0;: Z% G, D' @7 Y7 @! g
    intFlags |= (UART_INT_LINE_STAT  |  \
5 {3 X# J: {( O% }0 x                 UART_INT_TX_EMPTY |    \( T; Z1 i9 P& N0 n
                 UART_INT_RXDATA_CTI);: J# M$ I, V; [  w
    UARTIntEnable(SOC_UART_2_REGS, intFlags);: x4 n0 N7 }0 c# ^3 D4 A3 j
}
+ t' q+ j. B4 f* u1 S
0 C# D) a3 d6 K4 p/****************************************************************************/% }$ `; r! _( b! [- l' B" `
/*                                                                          */3 M, V& x* u& i/ W, X3 a: d. z
/*              UART 中断服务函数                                           */  R1 X8 P) Q* @1 h* X
/*                                                                          */
2 |. X7 |; h1 l% r/****************************************************************************/) O" U/ g9 n1 J. w' {' ^$ K  v
void UARTIsr()
: |/ p) Z: G; K% x2 \7 h7 f9 P{1 v! \! G7 r; p9 E. o$ ]2 S
    static unsigned int length = sizeof(txArray);) K1 ]1 W, J5 N" v
    static unsigned int count = 0;
0 O1 ?. r3 }4 l( c4 t; d    unsigned char rxData = 0;; K! ?: }: c/ I3 c
    unsigned int int_id = 0;3 X( M" e8 x1 d. o4 K; d
6 S; H& f/ W& Q& ]# a, p
    // 确定中断源
: m" j0 u) f6 b) \    int_id = UARTIntStatus(SOC_UART_2_REGS);+ j$ V2 U* B$ X
* y0 B/ @1 h1 X: M  a2 q
    // 清除 UART2 系统中断7 f# h6 h2 S5 O
    IntSystemStatusClear(SYS_INT_UARTINT2);
5 U, _9 K+ Q+ O& ?
8 F. H; K( \0 r8 A! M6 I- y. U    // 发送中断
6 d6 V  O" R& l) a: U    if(UART_INTID_TX_EMPTY == int_id)( h$ R3 M$ r7 R2 o
    {
) x& `/ E9 u+ W        if(0 < length)1 w  b, p8 Q' l9 q+ }5 a  y3 g$ x
        {% r* C, |1 F1 _& `3 x
            // 写一个字节到 THR
5 e" _- Y1 r5 v! {            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
7 \+ }9 a$ r5 r% @1 n$ E            length--;
& i6 V3 n3 ~+ x            count++;3 Z! }$ }) G) K( J
        }
! u4 F# X& j5 H* P9 f; m: i        if(0 == length)( ?, S2 ]; c. }1 U, w/ h+ F: a7 O
        {
8 h* C2 R  z& h/ h  O* B) e            // 禁用发送中断$ R' u* X/ G0 P0 ]1 o
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
, ]1 }* ^0 b# c; N8 c' e        }
! _; F( l: ]9 I6 d     }
8 L/ X& H# ?% `! i& K/ y2 A; `) O$ t6 U# B& W
    // 接收中断
( \6 M+ V5 K3 M    if(UART_INTID_RX_DATA == int_id)1 l/ \, s7 \" x" E  C2 }6 M2 @
    {9 H5 A6 d6 A+ l$ g( N  B
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);( i0 V( t. \5 V1 Q/ _3 k& B6 d
( ?6 F' x" |; Q6 U5 c/ z
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);8 N* |1 k6 E! ~" d$ {! q
    }6 x' Y# |7 ]6 F/ ?" ]# ?5 D

: d6 O6 U1 Y: d# R    // 接收错误  G' x& X0 K0 o$ u  A, y) ]% a6 v  R
    if(UART_INTID_RX_LINE_STAT == int_id)
7 N) m! @. H. J/ [    {
4 x9 k& m8 O$ r, f9 H        while(UARTRxErrorGet(SOC_UART_2_REGS))* X4 r7 m0 a' R7 g0 X+ f) a
        {
) D" b9 h; J+ B            // 从 RBR 读一个字节
+ ^4 ^: ^0 ~' C) i1 S            UARTCharGetNonBlocking(SOC_UART_2_REGS);
. E3 x0 h" w+ H6 N5 C: E2 A/ s( i        }
6 K9 I+ S4 _, z    }& d: k; N$ i4 s& q
   
" r; y+ e, e- e0 Q/ A, P1 U    return;; H, f  ~; _( h( M& |
}# ^1 L8 g$ g1 T- d7 q/ ^
回复 支持 反对

使用道具 举报

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
3 @6 V/ O  X+ K9 [* E如果其它设备快速给你发送串口数据,你这边能正常通讯?
; Y6 g  R, P/ k
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 06:37 , Processed in 0.043458 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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