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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7365|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
' L- X9 S, k2 h# d9 c, g

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 显示全部楼层
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。1 g' F$ N6 ^0 s4 D, W3 H
0 Z# f; S/ H7 D, t6 u; p( [
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
0 ?* }- j) i0 ^$ @4 j1 K
: c8 n; ~" z# f3 O* d0 n) S5 n#include "hw_types.h"               // 宏命令
" t* ?1 |% f0 A! q# b  s#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器+ c% ~1 m+ @, E
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器% j, T/ i7 S" i" B+ _1 x" F
' L1 E, y; Y; C4 ^' H" j
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明3 K! e3 Q& ]9 z1 O; B
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明. i3 L9 ]: y1 m  l6 f) R
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明$ @% c! P% o5 ]5 R; W
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
, M: k/ K7 c1 l# e; b9 G' b4 `; u% T
/****************************************************************************/$ H8 p: C3 P, z
/*                                                                          */
+ \! I: {8 W4 _* @7 w! @; N; W/*              宏定义                                                      */
& u: W! M; V6 I/ A8 \. Z* U) ?* L) X/*                                                                          */
1 S+ o/ o& J$ I+ u2 _! D/****************************************************************************/
/ U$ ^4 e  l8 i5 @// 时钟
7 l$ N9 I1 o5 u. f$ F) d2 J% i5 E#define SYSCLK_1_FREQ     (456000000)
, L+ ~$ O- U3 `! A- _/ V#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
7 M& }7 |7 s) T8 [8 `#define UART_2_FREQ       (SYSCLK_2_FREQ)9 _, u! |+ x+ {2 K: p: o6 {
, Y# r% h9 l% W; n- F/ D
/****************************************************************************/
# f6 t3 T) @6 h: S0 M7 b: I% z, D/*                                                                          */. T# ]3 |) s* `7 e: o* t
/*              全局变量                                                    */, I. P: O& W: e' _5 e9 F
/*                                                                          */- I% M4 O/ F) h6 J
/****************************************************************************/
! v# n0 G, w/ b* j7 h* dchar txArray[] = "Tronlong UART2 Application......\n\r";
) c. G4 K+ e$ i: b* ]" y' Q  a9 v; \) [; ~) D) o6 S
/****************************************************************************/  t* T0 T$ Z' l: g
/*                                                                          */8 y1 }$ t- \8 E) H! n! l9 g
/*              函数声明                                                    */
/ D8 Z# p' x) V% W5 I/*                                                                          */
% r6 m" g/ ~% Z/ |/****************************************************************************/
7 }7 Z. T( y- c! }; t) B// 外设使能配置
# W% [* F' p; x& A' Y- l8 K7 Avoid PSCInit(void);
0 N8 f" V  p3 G& k6 r" d
) r) L$ G. J# }  B' C// GPIO 管脚复用配置' T2 B/ {, d& G
void GPIOBankPinMuxSet();
) V  x  G; @: r: k+ q. Y
8 R; W3 z$ k: J# e- G" t// UART 初始化
! b( f5 c; a. w( o7 gvoid UARTInit(void);& ]! L/ h5 H+ z7 F0 g9 G/ f# W2 @0 J
// ARM 中断初始化/ w3 J+ D& z: y) @9 G" q' t
void InterruptInit(void);, n& H+ e! c7 B% b0 r$ ~
// UART 中断初始化
# i" o/ |4 k* G  K1 Tvoid UARTInterruptInit();3 v* [- h# ?( W
// UART 中断服务函数
' P! k4 |( _+ o+ k! \+ C* y$ L3 ^; }void UARTIsr(void);
# N$ O0 [! B5 h$ g! Y1 h8 e! z+ `* n' ]7 t! U! i
/****************************************************************************/
+ G. V; B. m: R* I0 _0 z) h# Y4 p/*                                                                          */4 [: s/ P3 `. Q. {
/*              主函数                                                      */. u! T6 z, J" `, W
/*                                                                          */' o0 X/ T, K* w2 |; M
/****************************************************************************/! U! B" g' O4 b5 I0 b
int main(void)/ Y- u( g5 t4 V% b$ b3 \
{( E- \3 |& V9 a+ b) @: m) B
        // 外设使能配置$ t5 g( h7 j3 _$ L
        PSCInit();
, v. X7 o& L' a$ }- G; o       
& z" m" w3 I/ m0 V        // GPIO 管脚复用配置
: [1 V" ^% K8 v* X        GPIOBankPinMuxSet();
; r' F! p! j2 N/ I/ W8 T# ~  X
9 _* u1 {( ^! o6 j' a        // ARM 中断初始化" h3 _' \+ b9 ~& F
        InterruptInit();  e6 H; h6 y) z9 N4 g+ [$ U& X
/ Q3 B9 ^5 g7 |' m; W4 n
        // UART 初始化
/ p6 Q+ [* Q  m9 a, L& R3 Z6 K        UARTInit();8 k3 I/ Y( w+ o, u2 y

, G9 Z( O1 c8 j5 L) y; A        // UART 中断初始化
3 |! n, _0 e6 f: |        UARTInterruptInit();
( q, L9 i) Q: q; X; U
2 s1 p3 O7 g& C$ e6 }: T2 Q0 b4 x        // 主循环
8 P( e3 t  s2 C$ T0 c% Z        for(;;)8 w  z$ Z; x3 }, Z& H
        {
4 m4 ^( q! P- M9 d8 {/ q" U9 S; [$ o/ K* }4 [) n
        }
) B% c# P+ O3 F2 h" H}
# b" `/ b7 o5 |3 v" s( _8 S! d, I0 m3 K1 v
/****************************************************************************/
% H* E" [0 v4 h$ g* t, C/*                                                                          */* A4 r3 Y# _8 b& J' V! ~: D
/*              PSC 初始化                                                  */" E& q# F3 P( j
/*                                                                          */
) ~/ \* ]8 d5 E, L, M3 Q! B4 e; i/****************************************************************************/
* c1 Y9 J1 v: u  Hvoid PSCInit(void)8 P: u3 C* m  n# ?
{3 c8 a. J$ ?6 x& j1 C8 q0 D
        // 对相应外设模块的使能也可以在 BootLoader 中完成
, ^/ a1 F6 i, i1 ]$ O! n    // 使能 UART2 模块6 f- d- Z/ ]9 _& G, N
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);. {7 C" z  W- R- Z
}0 i! ?9 A6 |$ h( W( ]( M% L: z
# m3 S2 s  C) s1 T/ ?, r# f) ?
/****************************************************************************/
9 y# n+ e  ?6 u* |5 ~/*                                                                          */% D8 _, X) R4 j! s% G
/*              GPIO 管脚复用配置                                           */
+ L& q* Z5 h) T! L) B; d" |/*                                                                          */
9 n5 @% D+ S4 H$ i% i" n/****************************************************************************/) w# p# T8 ~% ?. `& U% E# F
void GPIOBankPinMuxSet(void); H' t1 [6 X$ O- P
{
  T: g* `* M- @        // UART2 禁用流控' @. Z  b1 n0 A+ e8 Y# \
        UARTPinMuxSetup(2, FALSE);- L  n5 \+ l: o
}& N0 W! O9 g/ x. r- C$ p( m! K2 [2 O
6 n4 l% v7 b7 W; @
/****************************************************************************/( s. Z3 c2 E# _& O0 c1 a7 l. o7 z1 c# G( j
/*                                                                          */6 l3 |5 d" y7 t
/*              ARM 中断初始化                                              */
: K+ ?' D: d; J4 h/*                                                                          */* b3 d: Q. K) X- A/ C9 J- z
/****************************************************************************/- A  G9 n% E+ T6 i( N( W& Z
void InterruptInit(void), n: L& D; @8 W
{
% U: t2 U& C- ^5 s  H2 ~' D& o    // 初始化 ARM 中断控制器
1 a! j( W6 s' h! g5 _$ x/ W$ W    IntAINTCInit();
- t# F( I: [/ C! k- o. {5 C. ?+ r  ^
    // 使能 IRQ(CPSR)( j/ |" ^& p' O8 V7 w
    IntMasterIRQEnable();
6 ^# P( R9 ?5 m' c0 N/ M
; I3 S7 W" I( g* K- A1 E4 ^8 Y" c    // 使能中断(AINTC GER)
) V+ E! x0 m% B4 {% a- }) |    IntGlobalEnable();2 |  N. p5 B& u

6 P$ v1 D+ T  c- Q, n$ H    // 使能中断(AINTC HIER)
. l- ^/ |+ W" g! S% U1 j    IntIRQEnable();
' H! C  K' D, C( m6 ]}: r4 g) `0 q1 X  P6 g
; o4 V4 w7 ]9 S. }, f7 |2 a
/****************************************************************************/$ Q5 h, a( b5 Y
/*                                                                          */: h. \1 e3 V1 r% j$ D
/*              UART 初始化                                                 */
7 H% n" V$ X. i  S* U/*                                                                          */4 L/ m8 u$ u# ?  ]. I
/****************************************************************************/6 i2 g* z9 H- c
void UARTInit(void)
, G: W( W7 R; ?9 `* e3 R/ M{/ u8 t7 i! V4 w# z+ P0 q& }- V# `
        // 配置 UART2 参数
3 ]* q: {4 ?4 a/ V$ s        // 波特率 115200 数据位 8 停止位 1 无校验位
. M" Q( N" @% X    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
4 B! I( q6 `+ U* Q" U; a                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
3 A! U$ l& W* W& K: }/ ^* o        // 使能 UART2( E) u3 C2 r# P$ _; q$ E
        UARTEnable(SOC_UART_2_REGS);
7 Z( _. X7 b& k& B0 z+ q4 ?6 c* ]/ X! s# P; J' |6 c( A
    // 使能接收 / 发送 FIFO
6 s$ o# s) I+ V# Y; |1 H    UARTFIFOEnable(SOC_UART_2_REGS);$ ^  }1 _: C2 i0 g
- ]& Y& {7 I7 d: U% g. F9 {3 v; T, `3 ?
    // 设置 FIFO 级别
& U7 p2 v1 f0 t2 E8 i$ s6 k& ]1 e0 E    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
5 j. i7 \. A/ [( g4 m* a}
- ]) J; |3 Q+ B2 c' L9 V9 {* }2 g6 x& n
/****************************************************************************/
/ y, M8 u( b& J  b3 X3 l5 I/*                                                                          */
! T  N' S0 \! d3 R2 J" ~/*              UART 中断初始化                                             */+ E+ T1 ~: G1 |" ~7 l$ x" h* R
/*                                                                          */' r+ X4 j% m' R1 u# A
/****************************************************************************/
& h/ s* T0 V3 S0 V- R' dvoid UARTInterruptInit(void)/ P4 q  k/ k5 W/ [" `; r; T
{
  L3 c+ B" ^$ v* @; O        IntRegister(SYS_INT_UARTINT2, UARTIsr);; c% N' f# N" J$ z/ [, g9 ^: {
        IntChannelSet(SYS_INT_UARTINT2, 2);' @0 T3 I! E: d9 I4 [' h" ?$ \
        IntSystemEnable(SYS_INT_UARTINT2);
5 y% Z" g1 M: }0 A4 k9 Z$ ?0 E& x, m5 Z- Y8 }, C
        // 使能中断
- W2 D/ p1 G# h8 l7 C$ _        unsigned int intFlags = 0;
3 D6 k: |' b' Y5 p1 y- `    intFlags |= (UART_INT_LINE_STAT  |  \
( \( ?8 L! O. ~8 ]( h                 UART_INT_TX_EMPTY |    \
6 e: W, d1 b' }7 ^  B* a$ K                 UART_INT_RXDATA_CTI);+ `6 I4 |3 p) n! @0 v8 a! R+ t
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
$ C: v* j+ }5 s8 z4 l4 J& }* Z}3 h+ L1 S5 _. ^4 L

, A7 j6 i  P8 Z/****************************************************************************/
! B) @+ H' A$ N: ?6 s7 b$ C/*                                                                          */7 _7 Q' t/ }. }2 Q
/*              UART 中断服务函数                                           */" d; U% t3 {1 v' }9 f7 n
/*                                                                          */! V& T; a# ?. R3 w+ V
/****************************************************************************/) T& v" B* h. u9 E5 ]6 c& N3 g4 C
void UARTIsr()
% [' @  a2 c/ U8 h1 \3 r{
& y1 t) l* J0 e    static unsigned int length = sizeof(txArray);
6 H( M0 o4 z  _) P  H; _    static unsigned int count = 0;
# W9 K# @7 N+ S0 U- ^8 m" {    unsigned char rxData = 0;' A4 b! {& N7 g+ B9 ^4 Z2 N- c
    unsigned int int_id = 0;
) E' ~3 |9 ]+ n# w/ z2 B6 ^$ k' U; e8 N; p* n; Z- M
    // 确定中断源8 u4 W/ f2 Z1 s7 S4 t7 g; q- N; h) ^: e
    int_id = UARTIntStatus(SOC_UART_2_REGS);$ G$ P; v6 t1 ]2 ]
" g$ D" K4 B' R9 b2 D
    // 清除 UART2 系统中断( `, L3 G% Q) W$ ~) K! P
    IntSystemStatusClear(SYS_INT_UARTINT2);
9 N$ g' Z3 P2 [% T2 J& n
! {6 U' ]8 I; P6 ^' U2 h% `; W) V    // 发送中断
; R' b' q$ h" F* s& p  r    if(UART_INTID_TX_EMPTY == int_id)! V) ~; x8 b: D9 |! g- Q1 Z
    {
6 `# d" L% r& o) m        if(0 < length)
& ~7 F4 m; B5 l) X: d        {3 r( ~) X$ t2 Z. E
            // 写一个字节到 THR5 w5 g, Y( c/ G: f2 c
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);6 D: O/ {5 t  O9 ~  u
            length--;
; A6 e8 a9 n5 _, d            count++;
# ^6 s  t0 b! h7 r5 q        }" l8 i% T# t) v
        if(0 == length)
3 E5 n9 E, @2 F- A1 V! x( l0 R        {
  h8 z1 D" w, R            // 禁用发送中断' c. D/ {4 u5 W8 q
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
6 f% h% w! K( w9 f% e        }: I" l, z  E& P. o5 D
     }3 q2 ^6 i! [  I( l+ O* a% q

: C1 i/ H; g4 v8 \- ^% E4 E4 R    // 接收中断0 y  A4 v; E. S/ D- n7 U# H0 i! J1 c2 e% C
    if(UART_INTID_RX_DATA == int_id)
$ n: ~% `7 s7 V) Z4 p    {* a6 U4 a' B' ?5 t" \1 b
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);: F& n! @( T% u+ r7 o6 `; i
8 B, I5 a; V4 z2 P) A$ z' M, k
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
+ d  l% f4 R- t8 q  a" y. R    }
5 T9 a9 N3 c" y- b
8 N! l* f8 A2 @) R1 ^4 Q' w3 p    // 接收错误
( b' ]( I' j  b4 K$ J/ x    if(UART_INTID_RX_LINE_STAT == int_id)4 ~- K8 }* S' ]7 c, ?
    {& \+ {3 Y* K" U4 E' m+ z
        while(UARTRxErrorGet(SOC_UART_2_REGS))' P6 B& M! u# F/ z. J; t
        {
! m4 q% E, m) y4 d2 O. K3 I            // 从 RBR 读一个字节
: G" s0 F  O3 }7 m8 J            UARTCharGetNonBlocking(SOC_UART_2_REGS);( P% d5 g9 x( b6 ?3 b
        }
+ P% `4 s( s  c! S) D, h    }
- ], p7 D( e1 I# Z, L, k4 f  d    3 X3 a8 T) R3 d+ G. m8 g
    return;; P/ `( V% X3 a, R3 K) ?
}8 D3 V0 A+ W2 T) b# m  z+ c" C
回复 支持 反对

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
板凳
 楼主| 发表于 2019-5-5 22:36:34 | 显示全部楼层
785235014 发表于 2019-5-5 22:259 a+ n: K* p# [5 W' b3 s( p
如果其它设备快速给你发送串口数据,你这边能正常通讯?
0 u2 [6 K  N  u4 B# J( s3 G% S8 o$ k
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 12:15 , Processed in 0.041624 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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