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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7260|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
- V. S9 Z" U0 V' [9 I* n/ ]

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
8 m; i1 |  P( K  ^- Q
- [" \7 q8 t3 E' m" q5 w) \#include "TL138.h"                 // 创龙 TL138 开发板相关声明
: y, q4 x  ?% r
4 v0 v/ q; {6 H& a- P% X1 y3 G! j#include "hw_types.h"               // 宏命令! W6 w! ^% Y. \& ^9 _) C
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器- t, M$ K, _2 i0 }8 l+ v
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器7 c' o; ?, N8 C. d% A) _

/ K# @3 Y4 R& |8 x# M$ e: w2 K1 l# ?#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明0 L. S0 x/ J" p/ ~+ K5 h* D' d
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
  B" o1 m8 q, r' M' w! x#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
. R# H9 O, C/ V% T. d2 G2 A#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
7 B  h1 g* f* u2 T
0 N* c5 h* Z* N: H! ]3 A/****************************************************************************/8 ^( X: n6 {1 |9 _: H+ \" n
/*                                                                          */
& [" ^9 O% X4 S) R' h; h/*              宏定义                                                      */
: f; I# H( k2 G1 L+ z/*                                                                          */
' x4 f$ U( ~' M) K  q/****************************************************************************/
* b3 ]- {2 r: a& G- v- M// 时钟  l; f; c: }! ?- `0 ]
#define SYSCLK_1_FREQ     (456000000)6 H) X; G* ]- i: k
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
1 k) Z+ F% a& A+ p/ g$ s$ k5 d- a#define UART_2_FREQ       (SYSCLK_2_FREQ)1 h! c6 ~1 E7 b# d8 y. D: U

/ \! z  H; n; I. c. n4 M" d/****************************************************************************/
# V" N8 m# ~# y5 M/*                                                                          */
3 S) b' e5 s( O+ T$ t8 M/*              全局变量                                                    */
' G# W" t/ m$ c0 e, J/*                                                                          */
9 b7 ?9 r0 V) |" V% ?( |9 o/****************************************************************************/
* V" V5 _! [  rchar txArray[] = "Tronlong UART2 Application......\n\r";
8 o- I" a4 V8 x- M( i( O. }  U, t; y- f7 j0 v+ N; _
/****************************************************************************/
7 p( l2 M( Z7 U( m8 l/*                                                                          */7 r) Q8 l3 s" c$ K# {5 v; v4 _) ]3 w
/*              函数声明                                                    */3 g& ?( p9 o+ U
/*                                                                          */
0 H' r; h# O% X- G) d9 c6 q/****************************************************************************/
2 }, @2 w9 \$ m// 外设使能配置# S' n  U$ T- M  i3 g, w: U5 s
void PSCInit(void);+ h6 M8 Y8 K+ D$ A, m

8 x: G9 E+ x- A2 t* [9 z// GPIO 管脚复用配置
7 G7 t6 S7 u$ _3 jvoid GPIOBankPinMuxSet();4 F! ~7 [9 Q9 D( T5 s, y9 D) D1 w

/ M; J0 k* V& ?9 C  f8 d// UART 初始化
' Q/ ^& ~1 W" b2 W* Gvoid UARTInit(void);
  q9 Y- o+ @2 `) Q6 x- u4 G5 N// ARM 中断初始化/ ^2 i  f, `, p" F$ t, S
void InterruptInit(void);
; X7 i3 h& v* b! I4 o+ I// UART 中断初始化
8 a3 z. A: T& svoid UARTInterruptInit();
: C$ K4 N& C" |$ y+ M// UART 中断服务函数
5 o" i' Z* i+ gvoid UARTIsr(void);
& Q! `6 _: K; d3 U3 N; w3 E( o+ G( N. U. P! p' |0 S
/****************************************************************************/
' {$ s& e9 y4 t1 C3 q/*                                                                          */
- k, y' P" G" h+ ?& k0 n0 X; D/*              主函数                                                      */' Y1 H- L" w) F  l+ s% A) ~( Z8 h/ F
/*                                                                          */
" o2 t  N; ^  G: J% Z/****************************************************************************/
5 x$ `! b1 n6 f! S/ |* c8 H; ]9 Jint main(void); n4 @9 ]9 h! p# O' u" }# `& H
{
3 I! A+ H% t$ B" M  u  [" O        // 外设使能配置/ @! Q" V2 ]0 ?. k- K; J& w
        PSCInit();+ |/ A' Z' @1 E* c
        ' f( q: l$ W% p: Z7 H: r
        // GPIO 管脚复用配置' Y" x* W. F. `1 G4 G
        GPIOBankPinMuxSet();
. S, }! l7 I# X2 _( n. t+ ]6 V* v' H4 \( _& H; j6 F( R, q
        // ARM 中断初始化
8 h# @* V4 `' X  {        InterruptInit();
' `& S8 X  ^. ~- S6 Y: |; b% l) G7 s6 s6 z
        // UART 初始化
+ e; C2 O/ M( c- P: j7 X        UARTInit();% N, o9 b: \6 ?" R" Q. |
/ H5 O$ |% w7 [3 v/ d
        // UART 中断初始化' m6 G1 n6 ]+ d4 i8 Y9 @
        UARTInterruptInit();" U0 y; P! l# ~* F7 `! C* M

* t" H7 ]* h' H: z$ f        // 主循环
: q& X1 L6 y  _  P3 K        for(;;)9 U5 j8 y6 N  b
        {
5 _9 ]+ q3 }) q6 V9 F* A" l9 o. l5 \. t" I+ ~: n
        }$ }! {$ _9 K2 E
}# Q5 K' m" r, T9 |

) a. f7 `& T3 f/ j1 o8 `/****************************************************************************/$ I( P' r' m: N" j
/*                                                                          */7 E# m: S$ }- k# {' F# A0 W4 \  X
/*              PSC 初始化                                                  */
9 v' H' y# M# N7 B! H3 f7 h/*                                                                          */1 j5 D9 U! L* l) G* k* @
/****************************************************************************/9 U$ `9 w/ I- G  R4 B, Z* d
void PSCInit(void)
& x- s! l! |( m5 U' a& q. Z+ F  T{
# c+ t+ q7 _) B& n+ p3 h' @        // 对相应外设模块的使能也可以在 BootLoader 中完成: G: _7 |/ E6 G
    // 使能 UART2 模块9 j9 a4 t& R% T' `
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
# {, A3 F7 A4 Y, r+ g}
* V+ Y7 ~1 Y$ D1 Y( s! V% X: |" y9 ?( Y- H5 c% H
/****************************************************************************/
: U' ^+ ^; ]; @. [8 o/*                                                                          */
  }) A" `6 w3 @, Y: y/*              GPIO 管脚复用配置                                           */
  S* i1 A; {$ }' G$ k4 {/*                                                                          */0 g! [, P. f5 ?
/****************************************************************************/
3 b. ^! n+ X% n2 ?. yvoid GPIOBankPinMuxSet(void)8 K8 f7 x+ C7 W
{, k) M% ?1 n; I9 |- t$ G2 P. F
        // UART2 禁用流控& T+ f# E1 V: g3 x6 O6 @
        UARTPinMuxSetup(2, FALSE);
5 Y0 o% H+ y& K, V# N, ?: }. h: `}4 B- e/ A6 e& N) l  A: |
' ^- K" {# a5 Y8 K) `) q
/****************************************************************************/, s% i. l/ j0 Z5 N& G( R3 Y
/*                                                                          */
. ]. i+ @6 x2 T+ W' R/*              ARM 中断初始化                                              */
" [1 w7 s  f5 B. F9 W! ]" E, u5 T" [/*                                                                          */) C2 n& e4 _- N# G% H% i( |
/****************************************************************************/
, l8 E3 z0 e3 b; {void InterruptInit(void)4 Z9 X% }, H( |# g3 g
{# u6 d, |/ r  M4 ]( K8 P/ B
    // 初始化 ARM 中断控制器
6 Y% e  m' Y0 G/ I5 q7 }6 C* X    IntAINTCInit();7 J) z- o) X, \2 B3 |
( v( s: o* X" T( B& J( |
    // 使能 IRQ(CPSR)" g. u: D6 D( K5 h3 U2 V5 }- I6 |
    IntMasterIRQEnable();
. K0 R8 }& Y. F6 s) U/ h
, |; ], }+ N& R9 r0 U. y    // 使能中断(AINTC GER)
% _4 K' P& J0 m) d# {! B- h+ G    IntGlobalEnable();3 r  a4 X) {+ ~, A- r

% |# e7 t( u, A2 O    // 使能中断(AINTC HIER)# [4 w* x# D( ^( A- Q
    IntIRQEnable();9 ]4 N* M/ I* S2 B
}2 L9 I4 N4 ]# V( `1 ~
9 ]9 k5 E" d( i+ B! i, P
/****************************************************************************/$ E. Y/ |/ V) F2 o) @
/*                                                                          */; W0 \1 Z7 k6 t6 G# l, o2 b
/*              UART 初始化                                                 */+ y5 F9 ~5 I* W8 p2 G; L" N& I
/*                                                                          */
/ n* Y! [3 P, q$ I) X3 H7 i/****************************************************************************/# q) E, _$ _% ]& }$ k) C
void UARTInit(void)9 R& V* K4 u) @
{$ b2 j: H7 B: u3 n1 `# s
        // 配置 UART2 参数
, B$ ~; W* b' t) T4 l4 ?        // 波特率 115200 数据位 8 停止位 1 无校验位* Q% D% t7 P0 C2 }
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,3 f3 i# i/ X5 y; j6 n
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
0 _  I0 D9 c1 t* b4 e        // 使能 UART2. ]- [3 x% j1 l  ]# p
        UARTEnable(SOC_UART_2_REGS);0 D1 |" l2 H. W1 e* z
, K( k, y9 ]+ q
    // 使能接收 / 发送 FIFO
% {( b. M0 O' r9 X    UARTFIFOEnable(SOC_UART_2_REGS);# D0 t4 c% A$ c; {" g+ X" P! t/ r
8 X' i: M9 S# P8 Y9 |
    // 设置 FIFO 级别
7 `/ Q, C7 M' C" j% w; Y; K4 o# L    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
  c& b* Y! ~. V+ d0 [$ f, \}
. C1 Z0 m! z9 I8 \6 `: X( R7 J8 [4 N3 A) V0 i
/****************************************************************************/; L  a2 }1 M- m; U
/*                                                                          */
" w6 r4 t% I* w* I, u0 Y0 `/*              UART 中断初始化                                             */
2 z- A+ T! q  |1 L2 L/*                                                                          */
9 `0 _# K* D  J0 d$ b% _3 e0 B. g/****************************************************************************/
; q( E7 j) l% ]' G5 O9 ivoid UARTInterruptInit(void)' |) F% j7 f: `4 {1 z+ q, A% x3 u! _
{
8 w4 H* l/ t3 [* p, I        IntRegister(SYS_INT_UARTINT2, UARTIsr);% N, y  N$ [3 @! _* g1 G. u3 H7 x  B
        IntChannelSet(SYS_INT_UARTINT2, 2);- ]6 `  ^3 O3 ~8 \5 c' N4 `# A4 \  x
        IntSystemEnable(SYS_INT_UARTINT2);" p( a) q8 f: r, h' |

8 G0 ?3 \1 Y! J        // 使能中断
+ @* A& e) b* i3 R1 N4 O        unsigned int intFlags = 0;% N, [" x+ e- m3 M' `
    intFlags |= (UART_INT_LINE_STAT  |  \& N# `/ \# c% L4 I; P
                 UART_INT_TX_EMPTY |    \
, t3 U* K5 ~( d/ |+ P                 UART_INT_RXDATA_CTI);
* C. F+ s% s5 f" q    UARTIntEnable(SOC_UART_2_REGS, intFlags);  c. B/ {- B/ k2 ~, B
}
! e1 v7 s8 m- [( U9 p6 e& k! E6 a1 x0 U) z* u2 c; g
/****************************************************************************/
4 f& @3 D; ~* W, K0 i/*                                                                          */
0 F/ X' V3 S4 ^, \/ k/*              UART 中断服务函数                                           */
4 \# T0 C' U( q1 S; N' ~! `5 B/*                                                                          */
( `% Z: u4 q$ u! j) D( C/****************************************************************************/
) m2 p$ [1 Q/ A5 B' K9 `void UARTIsr()
+ ^6 m% y; ]0 f{# p8 y; Z8 }3 a
    static unsigned int length = sizeof(txArray);
/ n3 K' @' C; w6 K6 t6 u    static unsigned int count = 0;; }4 ?. Y( x, l1 r1 Z( K
    unsigned char rxData = 0;
4 y2 w. Z4 U# t    unsigned int int_id = 0;0 V6 {  `# {- W( h9 O  ^! H- k

/ g: H* k' u7 w2 l    // 确定中断源
/ l+ S4 m' b9 v2 Z, w+ k    int_id = UARTIntStatus(SOC_UART_2_REGS);
5 l+ O, ]9 @& W" w* ~+ w$ N0 E8 F: J5 w. N8 _, a) f5 i9 M+ x% [
    // 清除 UART2 系统中断1 }5 s: E) X5 d  v9 R
    IntSystemStatusClear(SYS_INT_UARTINT2);6 U7 h: Q) O. E6 r
) m, I5 \# R8 z) P0 s$ N
    // 发送中断6 C2 L, u7 ^- \7 \- `9 ~
    if(UART_INTID_TX_EMPTY == int_id)
$ n9 j8 T' @2 u  b" B    {
- o( T% ^7 d/ H2 f# L/ n        if(0 < length)
" q9 T/ E! x5 g" o; _        {7 @" h3 e6 V$ m+ E
            // 写一个字节到 THR# @5 |) |7 n; o$ r4 x7 a) @
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);5 H/ x/ K; Q- L  {  i
            length--;' t# S) h6 b+ c9 W6 t
            count++;
9 g! C" P3 _8 Y% V        }
% n( s( X+ X- h3 E2 D        if(0 == length)
! T  g6 ?5 T+ |) @3 i        {- E1 J0 M; @6 x4 q* g6 \! s
            // 禁用发送中断
" a& Z( x, Z. Q1 d7 q4 S) a            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
' \) L8 [8 R3 K' T0 F. b( a        }
( R  b% D& f/ n% V6 r0 I     }+ K9 @% u+ ^7 I+ e
- r6 M/ E5 e- o8 K, Y7 A1 D& S) x
    // 接收中断
7 d- J5 m9 }* ~2 `- \4 X2 [    if(UART_INTID_RX_DATA == int_id)
1 x. y: H* q- |* m- X$ i    {" w" S/ L& m3 H/ |
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
  Y, X! b: H, c" R1 c* F" k/ A" W8 ^( C+ r) d# F( k7 j. r! U
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
: y# w" \6 K* i9 |    }5 K' W  E; U& H9 f
8 d% q( U, W" [! z0 Q, s
    // 接收错误
; Z+ ]0 |, }4 \# V8 R2 x    if(UART_INTID_RX_LINE_STAT == int_id)
2 d8 C6 f3 G( c/ U" P8 p    {
8 h% ~2 c  Q1 V$ j        while(UARTRxErrorGet(SOC_UART_2_REGS))
$ d1 n2 N4 M( R* ^7 ~1 k* ?. r, t8 [        {
3 u+ A, @; u3 B" C9 h( u0 l2 D            // 从 RBR 读一个字节9 a/ P5 a$ w9 m" i' s
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
1 a) r5 \0 r4 [9 b/ `8 K3 N7 l        }6 k* y, @9 y# M* S  m# M
    }
! p2 v9 {5 s' J& ~) D) A% V1 D3 Y    3 e' g  y# L% R& i
    return;$ ~9 k& a; V9 H- Z/ @% ]( q: l$ P
}
; D6 Z8 ~# G* E8 |. O  F
回复 支持 反对

使用道具 举报

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+ f7 n% a6 G: F$ j7 n- W$ z1 w
如果其它设备快速给你发送串口数据,你这边能正常通讯?
. E  H9 T" I9 [& h* A
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-15 09:11 , Processed in 0.041220 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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