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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5587|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
+ p) [+ J' V# n6 y* Q3 |( d

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
地板
 楼主| 发表于 2019-5-5 22:36:34 | 只看该作者
785235014 发表于 2019-5-5 22:255 c3 Q4 z* j9 s$ ?
如果其它设备快速给你发送串口数据,你这边能正常通讯?
& p0 o2 @  e4 E! o1 I
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

1

主题

5

帖子

1034

积分

金牌会员

Rank: 6Rank: 6

积分
1034
板凳
发表于 2019-5-5 22:25:37 | 只看该作者
如果其它设备快速给你发送串口数据,你这边能正常通讯?
回复 支持 反对

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
6 L- `/ G4 D  u* d# D
# _0 T9 O$ ^5 p5 ^6 S6 l#include "TL138.h"                 // 创龙 TL138 开发板相关声明3 k: ?: C, X( q

8 ]8 X$ M3 f. J7 J: j; K#include "hw_types.h"               // 宏命令- k1 M5 O0 L" E; Z' ?6 K2 t
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
- I, p4 e+ t8 Y7 D( L) o; A8 e2 E#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器1 F3 h# j6 J; w' y0 N& D4 r6 Y6 s0 [4 T
& b  l4 c/ T5 A; {
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
! j/ r1 r. ]( b. A# R- r#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明$ A, [1 n/ R; Z6 }
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明+ D+ m4 R7 ^9 y  ^
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
/ v1 b. E& {( q
; ^! k' w+ V% v, t1 m- j( |/****************************************************************************/7 [' l0 n# v9 c, l9 T
/*                                                                          */
% i. x( ~. t* m: q/ T$ c/*              宏定义                                                      */* v5 @+ T) a# }. a7 x
/*                                                                          */
7 k3 E6 q* R, s% z/****************************************************************************/, x# V) k2 _4 f3 e; U
// 时钟, N& [/ x+ ]' G! m4 q( K
#define SYSCLK_1_FREQ     (456000000)) q, C, t3 c" ]9 g/ \
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)  D  |* T2 J% A( Q7 U% E8 P
#define UART_2_FREQ       (SYSCLK_2_FREQ)$ z+ b, @: K1 x: }% ]% j
8 m$ U" k9 F5 _8 W7 d' b$ h! O
/****************************************************************************/: _# o* ~9 [: x+ R8 ?9 z$ y
/*                                                                          */
" m) Y, K( n9 i. S/*              全局变量                                                    */
+ Y6 J! D6 w* H: u) P# I5 ?/*                                                                          */7 E3 Y+ j( G. _4 X% x) ~
/****************************************************************************/
: k# v0 d7 Q# t) N. |2 K/ w( r/ Wchar txArray[] = "Tronlong UART2 Application......\n\r";/ W( K7 h3 B1 b

$ V/ F/ G) P- r* f2 g9 e/****************************************************************************/* K) U3 J" @1 X4 C" x$ c
/*                                                                          */6 |+ @. g- d3 o  [  o. @. J
/*              函数声明                                                    */
( L( D" M  H+ v: j" S  _  l- s% M/*                                                                          */# Z: W' T5 `5 h( q7 H
/****************************************************************************/
0 w* P! R  O) _( b& r* Z// 外设使能配置) j3 e' y6 S0 `3 A- n
void PSCInit(void);! u# \1 |: ~: b  V6 ^7 ^. v

9 B5 I* `; Y$ d3 R: _7 E4 e" a1 R// GPIO 管脚复用配置
6 i! n$ r& n" [; Evoid GPIOBankPinMuxSet();' A) }3 a9 V. ^; q; t
& l; M$ {6 [. T$ _3 N* ^5 {* y
// UART 初始化
. [* g/ x( r# V) k! X0 G; b  y* _void UARTInit(void);4 z* F" s- f7 a0 `  g- x6 m* A
// ARM 中断初始化  {9 R6 p, c, I2 z: X* y
void InterruptInit(void);8 E  A2 \. e2 [
// UART 中断初始化
- [4 ^3 a% X, U8 y- |0 J/ `0 R6 evoid UARTInterruptInit();
2 k) B. N" s, \8 {+ h// UART 中断服务函数7 P& T8 X1 z5 v0 x
void UARTIsr(void);
4 F  a5 ]. Q: t% O0 I" x8 S. b8 o* K
/****************************************************************************/
* ?9 p* |4 L2 u: V9 ], P- }/*                                                                          */4 P3 w- f, Z9 Z  a" m, C
/*              主函数                                                      */9 n8 J$ I' `  H7 V
/*                                                                          */
" j% g) N5 r4 Q0 v6 ]! h/****************************************************************************/7 ?, b8 O# w4 N' g: H# O+ @/ i
int main(void)
* j  ]6 V3 s; r8 |8 t  A' a{  \! P/ R- r8 o: c- \; j
        // 外设使能配置
) h( G7 x$ B6 a$ C( D        PSCInit();. y) Y5 V( {/ r5 W: z% l
       
5 F5 q6 G" E0 `1 n6 x8 e        // GPIO 管脚复用配置4 `5 c- [2 Q  n2 C6 p' X
        GPIOBankPinMuxSet();/ x9 S9 K) t8 Q9 m9 S
/ ]9 S: A! Y1 t
        // ARM 中断初始化8 w4 I; H/ U! L  M4 t. Y
        InterruptInit();
% O2 K( I, ]4 F* G; i4 d3 ]- e
4 W' D: G: G4 x6 A  Q4 j% F8 \' i        // UART 初始化
4 H. p5 d5 H2 h" d% a$ v0 {/ p        UARTInit();4 B% O: z; g* H  P

/ S/ |* }# X! X9 r: A- Q% W; b        // UART 中断初始化3 V. Y6 Z  B1 O$ c" U5 A; o
        UARTInterruptInit();9 K: f! p8 x2 k

5 a, B4 Y6 j3 k" o2 A8 s# B        // 主循环
, H, F$ t' [1 w' ?, g+ t        for(;;)8 P! d$ X" p1 d3 N
        {
. i0 f3 f% d2 G3 j
+ w: \7 q* m  u3 ?6 h* o        }
5 R' N- Y9 x$ u. F2 @}
, P+ {* K! r1 Q! R' X
( |8 C: b- ~- {. w  G- C8 d) x' |5 g/****************************************************************************/
( b, [3 C: A% _  a/*                                                                          */
& d8 L6 F5 }( U) {4 }3 f% s/*              PSC 初始化                                                  */
# L+ ~7 c, C8 }: X/*                                                                          */
4 ~& X3 ~8 K* ]# N  T2 z. u/ s  Y" H/****************************************************************************/+ V: ]6 W/ `  k+ E: X. O
void PSCInit(void)- r- \- U% C! |6 X/ V- v
{2 P6 ^9 J1 L3 L: N9 \) V' j0 w
        // 对相应外设模块的使能也可以在 BootLoader 中完成
1 A! Z% N- }( _3 ^1 A9 R9 c    // 使能 UART2 模块4 k0 \: X: B! O' v# G+ W
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
/ }0 k) U2 _! U0 `}
$ j* u  e, v9 t7 {7 j+ o  q! f* {: l; L  a, E& l
/****************************************************************************/
6 X" k# x, t; f& F, ?0 H- ?! E/ U/*                                                                          */5 e# b# O9 p" i) L2 N; C- s' g
/*              GPIO 管脚复用配置                                           */. D9 b! N+ Q/ S1 o, z8 e" h/ g: R
/*                                                                          */
/ v" O$ ~. \* j4 B6 l/****************************************************************************/! J# [5 ]' b, @  l
void GPIOBankPinMuxSet(void)9 d5 x, o8 g2 \" V8 x' v# d
{
/ K; v' q) V3 {3 h        // UART2 禁用流控3 f0 y* E9 r- d8 B  A- h
        UARTPinMuxSetup(2, FALSE);" I* f- _/ Q, |" T% F4 R9 T
}
+ m) B3 J5 [. W0 W" T* E; Z$ c* _7 i8 N
/****************************************************************************/
+ y/ r! ~  ^& R, [8 @+ B# z/*                                                                          */& Y- ^; D* p5 X5 l- z% |* p; d" Y
/*              ARM 中断初始化                                              */- y- b5 n% O) M& r4 X3 g) B1 @" U
/*                                                                          */% X& p4 G* ]2 c4 D& Z0 i  c
/****************************************************************************/
  j8 Y% ^  f( s; z* svoid InterruptInit(void)
& U' \: Q2 G1 Q1 |{
3 J. j8 q5 A0 k2 }) C+ e    // 初始化 ARM 中断控制器
6 I" M" b7 J# n5 z# `    IntAINTCInit();) A5 v  M/ s# {' F% E6 x8 E

! d; U' _( |& c8 e1 I; r7 T8 }    // 使能 IRQ(CPSR)
8 W0 C* z& [; C. o) K0 a; @, N    IntMasterIRQEnable();
' F. r, m2 S; ~5 ^% h+ c0 a: c
0 }8 M0 _' f$ F, [    // 使能中断(AINTC GER)
  [. H4 y) N# o9 b    IntGlobalEnable();
! r% }! R2 S. e' W6 _- g
  Y4 Q2 [. U. D. \. [    // 使能中断(AINTC HIER)
9 R2 \2 m2 b5 B( l; }$ A    IntIRQEnable();
9 x3 a7 q5 h. `% n, d/ R}
" J, r/ F$ J8 b% i
, ]5 r. B& ^9 V/****************************************************************************/
' L  g% x  r; I( [0 k, H5 _/*                                                                          */  w' N- [$ v2 z
/*              UART 初始化                                                 */
+ W3 l$ P  l( {8 d, k  k8 X4 c/*                                                                          */! Z% g. s  Y" z. O
/****************************************************************************/
3 U1 i7 |/ d4 v8 |/ @# cvoid UARTInit(void)6 S9 r' E4 |+ h( e* t: j2 m2 i' U
{
: l  H  U- p+ R& p0 P' u        // 配置 UART2 参数
! X, |* h; e& K2 |. O3 [7 t" w9 f8 r+ X        // 波特率 115200 数据位 8 停止位 1 无校验位
7 J+ U8 A3 n/ @* t    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
( j) u+ d- \, P& A9 ^                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
1 T9 {7 l" x( u. f3 O4 z        // 使能 UART2' \) ^( W. j! u
        UARTEnable(SOC_UART_2_REGS);  u# ?+ ~$ e6 i9 g( m+ Q& W/ R% ~

2 {* a9 r! p) \' }" g; k    // 使能接收 / 发送 FIFO; Z) D/ Z# l2 Q. r& ~
    UARTFIFOEnable(SOC_UART_2_REGS);
5 T8 g+ [6 e# w% a8 |' r
! e. ]4 M; N8 R: B& Q    // 设置 FIFO 级别: m4 I  h$ T( e! h7 C8 \
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);1 ?6 E  R  ^' E4 w7 c' ?$ x
}9 M+ ?. q/ s0 K" Q: b
' L/ c1 p9 W- p' }3 Y: M
/****************************************************************************/9 t5 M  D% w0 a. ?2 g; U$ i, L
/*                                                                          */# Y8 L- H% K" w2 T) }
/*              UART 中断初始化                                             */7 S, W6 h& S  z0 r. A4 E+ Z
/*                                                                          */" {# l4 t" W. n! _' h6 A
/****************************************************************************/8 ?' G9 Q2 g; K  k1 L. W) S! G6 I" V
void UARTInterruptInit(void)
; l: l* {: k/ p$ h! ^  v$ g$ i{1 G! `4 U& k; f+ ?& B  _' D
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
: i7 f$ z1 F4 q, G- l5 S        IntChannelSet(SYS_INT_UARTINT2, 2);
8 K: z! D" q' q/ x, Z, s8 Q        IntSystemEnable(SYS_INT_UARTINT2);
: h3 ~  F! T) C4 o6 N) i- G- x/ A( ~& h; r
        // 使能中断7 V! z9 S* u" K$ X
        unsigned int intFlags = 0;0 S6 c. @9 k" r, e' e) W* q
    intFlags |= (UART_INT_LINE_STAT  |  \
, p1 j' t7 y$ R9 X                 UART_INT_TX_EMPTY |    \
. t/ O6 g& {; O5 {3 f                 UART_INT_RXDATA_CTI);
$ E+ v& U$ \1 Q4 ~' b    UARTIntEnable(SOC_UART_2_REGS, intFlags);7 f$ p  J5 F+ _7 ~% _" S
}5 `4 U& F2 b( {1 Q; o3 z
8 f% |, X- t9 `& ~; z
/****************************************************************************/$ @5 I+ Q) ]: f! d* a
/*                                                                          */
2 m" B- Q0 n3 e2 F. O9 f3 e/*              UART 中断服务函数                                           */
. s! S9 e" Q' V% @$ I6 ]: v" m/*                                                                          */
, x" r) i7 Y* Z/ m: `/****************************************************************************/
9 M) d, R' o1 @9 B* Svoid UARTIsr()
5 x9 H6 T3 Q+ I{1 F+ @  k5 E. M5 |) I. y9 s
    static unsigned int length = sizeof(txArray);+ j7 J1 x5 b/ u) s! @9 k5 R
    static unsigned int count = 0;+ P0 J+ e$ ~8 b1 |5 n# n
    unsigned char rxData = 0;+ I2 R1 h1 A  |/ A0 g
    unsigned int int_id = 0;
3 U5 |4 N3 |6 h$ p9 |6 k8 i# T2 g3 G& a& K( u$ p8 }% Y
    // 确定中断源0 g9 w" A. o0 p% u7 i. B3 y6 s+ D
    int_id = UARTIntStatus(SOC_UART_2_REGS);
5 d4 M9 @' Q$ O5 S- d% H( B) U6 Y7 w- s$ Z6 c$ [! a6 ~/ b2 E' Y
    // 清除 UART2 系统中断! ~9 R" J4 o' m1 K1 v# c
    IntSystemStatusClear(SYS_INT_UARTINT2);4 c" Z4 m( ]7 h5 P  B

8 _0 q8 i% F: d1 u% I& {0 w$ j    // 发送中断
4 S' F3 P0 @  h* ~. C    if(UART_INTID_TX_EMPTY == int_id)9 l' N4 T! ], T9 H* v. g+ a  b
    {# N% z4 K7 H" n1 Z. A5 o: M
        if(0 < length)- }- P- n1 d5 \$ j6 P4 R# X
        {2 {6 [& e) B  `& K4 f  ~
            // 写一个字节到 THR
9 P2 R& \* Y6 r" n+ j7 F( G            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);- \2 Q# s) v% g9 q6 `1 D
            length--;
, D* c9 }$ E2 m' P& z" D7 @            count++;
4 p* k; k5 _5 E5 T& r' P        }3 C# T5 j. |# S2 {/ ?5 J2 y
        if(0 == length)9 Q8 o! }3 k. [5 A8 g
        {
5 Y) D# L6 y* `% n            // 禁用发送中断+ a3 F) m) F( N+ z; [5 \) `
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
. {, N! D" l' x. }$ H% Q        }9 r3 d( W( x) x
     }; U" u4 Q, g9 B$ b3 X
/ |/ ]# Q* }5 h
    // 接收中断0 F% |( z0 L5 L: V3 |
    if(UART_INTID_RX_DATA == int_id)6 J5 ^/ r& u3 _$ t; Z1 y
    {! }( I% b: `  |2 W
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);  ^1 E7 G' n" V  H" \: h( K9 k
4 P9 U% r7 ?3 P3 M0 d2 u
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);( G2 |5 f* D) Y; q1 Z% z' t
    }
" i6 a( _' @/ v* G) M
) Q2 _, B( ?9 @+ n" X' n# X$ ]    // 接收错误
4 }7 C1 T0 L% p9 `    if(UART_INTID_RX_LINE_STAT == int_id)) r1 G5 e: W/ B% \0 R  c1 R% U  f* |
    {
/ @6 |; c) G9 E; Q- g7 g        while(UARTRxErrorGet(SOC_UART_2_REGS))3 Z0 ?  y  A$ P
        {" k+ H& M( Q; G& Q5 @
            // 从 RBR 读一个字节, ^9 Y* g3 K* P! ~/ q) e3 J* b
            UARTCharGetNonBlocking(SOC_UART_2_REGS);" O2 @6 ], H0 S& p3 S7 e! [
        }7 ]8 }/ \6 k+ B' P, G, i) }
    }
2 \! }3 n: ~. q# T" @& B1 Z& E   
4 k, j. S+ f$ @    return;
, \  G5 c3 ]. z}" z3 Z' F8 g$ y- z
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 02:32 , Processed in 0.042465 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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