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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7445|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。- z9 c! Y) k$ f6 C% V

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。1 G% V2 X) @/ Z+ U9 L( T' l

+ Z9 J, A4 F5 U0 S+ t#include "TL138.h"                 // 创龙 TL138 开发板相关声明
: K/ _/ \" Z; N3 Y& P1 O. W; \: g$ J
#include "hw_types.h"               // 宏命令
+ X9 R6 I/ f- y- T#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
& n8 P! r' g2 k& x. `  \) s" z#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
$ y/ y* C# i8 l8 A8 l7 ]* u
- i9 i% i- _" s: {5 e4 \#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
% P% R1 U( ]6 h+ p4 W/ z+ ~) ?#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明. x: ]7 g* _" L- c, O
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
0 G9 z. [- [/ I% Z) B  v#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
; R, C6 n8 x) h0 z; z* h( G  U! B) ], w0 M: h
/****************************************************************************/: W5 _, m' u6 w5 M* [
/*                                                                          */+ D, x  Z8 B- j$ S1 Y1 j3 T/ I; m' l+ t
/*              宏定义                                                      */
$ q3 T- W( }  v2 t/*                                                                          */
! p3 q4 a- Z2 u; ^4 b: l/****************************************************************************/
# N3 s1 w0 ]/ [) b8 @// 时钟) ^9 L- h2 e7 t& m6 A/ J0 \
#define SYSCLK_1_FREQ     (456000000)) w  Z0 d! G3 C! |- B& S
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
" n3 Z  g& {' l6 C$ J2 I#define UART_2_FREQ       (SYSCLK_2_FREQ)! t) |" B7 y- z- L0 G

0 ]7 a& Y) T; k# ~& p/****************************************************************************/2 j. D+ J: n( G* f4 q" `
/*                                                                          */# D  m' O4 b$ ]: d
/*              全局变量                                                    */
/ U* @, [$ x& [% V% U( @5 R) ^/*                                                                          */
2 [+ C9 d& b+ S3 u$ ~* e/****************************************************************************/. Y5 g( G9 _' Z( i4 }
char txArray[] = "Tronlong UART2 Application......\n\r";
( o6 e# c" `3 l1 J6 A- X5 |- X: l* ?- R2 `5 }" ^4 F; K
/****************************************************************************/% J. B/ Q2 ]& \2 u* D" d
/*                                                                          */0 l2 s) w+ w; p% _
/*              函数声明                                                    */0 `; b1 u" ^) h+ J3 v7 ^7 |- A
/*                                                                          */7 i  T. s" R( i' N  i: W
/****************************************************************************/1 J, B" g( L$ i& A" t9 b
// 外设使能配置
. D( Q, Y# Y+ C9 K" E# ]& mvoid PSCInit(void);9 p3 s% n4 n2 z* n0 ]9 W
* {5 E+ u' ~2 J# L! w6 H$ \
// GPIO 管脚复用配置8 b1 ~" H8 k% y8 T# [
void GPIOBankPinMuxSet();
( s; K! E5 P3 N& y( O+ D0 v0 l5 f9 h  [+ G5 T5 P
// UART 初始化! e, Z8 b. h: ?4 w* L' P; {0 g
void UARTInit(void);1 y9 i- y* F6 P
// ARM 中断初始化# c& ]1 {1 y; L, n: ]+ X
void InterruptInit(void);
- g; @" B+ Z- D& C" X  Q: D- c/ c// UART 中断初始化
9 P6 `" f4 L7 ]# |void UARTInterruptInit();
7 {  K3 E. X4 a4 o9 F5 S, l( o$ f// UART 中断服务函数
  w7 m, _, f* x9 G. ?: Z. Tvoid UARTIsr(void);
, G) ~& ?. f/ s) u
6 X! }5 x; s, l6 C0 H/ I5 C/****************************************************************************/) @3 j: b1 a4 ~/ W8 l7 i
/*                                                                          */$ s/ A+ Z% d8 t
/*              主函数                                                      */
; P' E2 p1 E5 W1 X9 s3 e6 E3 z/*                                                                          */# S( [9 y/ z  h, Z
/****************************************************************************/" Q% ^. h1 n. _1 ^8 f8 m
int main(void)8 b1 M( ~$ x3 {, A
{* a) q, o/ }) m; R8 s
        // 外设使能配置" A2 Z% ?. b* y- k- O6 y; T0 B
        PSCInit();
- j8 k# }- c9 U5 i6 Z6 K5 y" R       
+ M. V4 M9 E, l        // GPIO 管脚复用配置
' p7 k" E6 U7 p/ u& a6 q        GPIOBankPinMuxSet();
0 A# {) H) r) l" }- l
+ I9 |' c* L( t) q. u        // ARM 中断初始化" Y" ~% Y5 w- b+ p! Z6 ~6 ]
        InterruptInit();
9 i1 o; b! ?, n& u8 B2 j. F4 ~" O" l3 `& d9 d9 j; J6 |/ d/ Y0 q
        // UART 初始化
) r6 t9 i* {; [0 c* f9 [. W" X        UARTInit();
) I& F* C" C4 s, B
5 k& j) a3 x4 C! R        // UART 中断初始化
' [& x' X. y) o9 X  R/ G/ m        UARTInterruptInit();
; U/ l8 t" u5 M; y
9 O! Q0 ?% i; {. c3 b5 V/ e2 d- u        // 主循环6 x$ i0 M" O3 J2 G: O8 K$ O
        for(;;)- ^# e% k) V$ D% N5 g# ]
        {
+ ]! Y, S; {0 Z4 o) e9 J+ l+ q2 X2 G. M1 T
        }+ W: c" A- x3 @# b' f' L
}2 A+ g" i4 d4 s8 ?! P4 r2 k+ S2 I
: X8 ]& ]: I8 q; {5 Q# i5 w
/****************************************************************************// D8 l$ v/ a- f3 j; e
/*                                                                          */
- E4 o/ T8 A/ T3 h# l( N" K, Z, b/*              PSC 初始化                                                  */
# \- E2 s" N3 `  f) W. A6 E, X/*                                                                          */
5 H! A8 _. q5 ^4 a+ K- I/****************************************************************************/
/ a. ~2 V: E+ G. d6 w8 H4 `- V8 ~void PSCInit(void)
. Q7 w: k$ l/ L, N( |4 W{6 |) N. L% i. X
        // 对相应外设模块的使能也可以在 BootLoader 中完成8 D% Z/ v1 [4 A% S8 E+ R
    // 使能 UART2 模块! Q* h8 c# \% ?; R3 T! S: y
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);6 V7 j- C6 B" ]! B  Y: F3 z
}$ @) `7 @! Y6 Y4 e7 D
- U3 }( _! i+ i( Z
/****************************************************************************/
5 _4 u. j) r/ J* M, m/*                                                                          */3 \: P8 L2 f6 q! L3 ^  `4 K, ]
/*              GPIO 管脚复用配置                                           */
1 B4 k7 g3 [/ ~7 p9 P/*                                                                          */
! D' F  t4 W4 t$ }/****************************************************************************/* m! p# D% d' v
void GPIOBankPinMuxSet(void)" G3 v: U  N3 ^6 M
{
8 C! o6 [8 M, ^9 y% W* X7 V        // UART2 禁用流控' z. o+ D: @5 ?" h. L
        UARTPinMuxSetup(2, FALSE);0 F$ F& X$ B1 B4 Z0 t
}
$ [$ ~2 H" n7 P) H8 P" ?' L8 c6 V1 ]3 _3 T: O3 r0 F
/****************************************************************************/1 R  N$ F) L- M9 ^" ~1 |
/*                                                                          */3 E( x/ n. C7 s  v
/*              ARM 中断初始化                                              */7 R3 ^, v1 ?  ?+ ?  N$ N
/*                                                                          */- ~" E2 @. K7 t& I: O7 z1 B; Z1 \
/****************************************************************************/5 G- z2 J; j* j8 t1 P8 D* W" o3 V
void InterruptInit(void)$ n' ^( v5 v7 h( ~, q0 c2 R% S
{0 Y2 p* ^. o, f
    // 初始化 ARM 中断控制器& e% d2 N. c6 A" r  m) ?) F
    IntAINTCInit();
$ F  p  O+ d2 l8 _( R
+ A/ a% V' J9 }; p/ D% x/ I1 G    // 使能 IRQ(CPSR). r1 n; v7 D/ y2 I0 m$ s  ]/ {
    IntMasterIRQEnable();
7 J! y/ \1 Y( k# y# I( k9 u$ V* [. _: D3 Q9 ^
    // 使能中断(AINTC GER)
9 a2 x3 g- a+ P: G* i1 e3 X    IntGlobalEnable();- u4 d- P0 h; l8 j
. D( X; T% p" |; \
    // 使能中断(AINTC HIER)
# _& F; f0 \, d* O( K: ^' Q    IntIRQEnable();+ B$ `. G& L# i. u9 `" @' D$ [
}
: Q# s9 h  j# t& x$ t; E8 N/ A9 T5 g
/****************************************************************************/
6 o* f+ O; X2 g6 W- R- U4 ?( h% L/*                                                                          */
$ ~+ m: N0 m: Z/ |/ `4 L/*              UART 初始化                                                 */
: D  P6 n7 R$ W" u; L; a/*                                                                          */0 v2 s0 `8 ~9 G2 X9 O8 M3 ]" Y
/****************************************************************************/
/ ^" D0 \+ W8 {! Gvoid UARTInit(void), P6 [) a" e& v. _8 t8 z
{8 @1 n2 D+ d$ b  _) T4 z
        // 配置 UART2 参数$ {2 _# n8 N6 {9 e9 {# y
        // 波特率 115200 数据位 8 停止位 1 无校验位8 O. V) b; E+ R. b$ R
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200," n: n5 d- C9 @9 a" @% U
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
; ~7 _$ \' N* g0 i4 F        // 使能 UART2
' L, Z$ o. h; a2 g8 c        UARTEnable(SOC_UART_2_REGS);: h9 C9 D3 I  t5 l
9 _& U. }( {, @
    // 使能接收 / 发送 FIFO. l# w8 j  |, c, Y
    UARTFIFOEnable(SOC_UART_2_REGS);0 q9 t/ `/ A% P  {5 b, W0 f6 w

: M7 Y' v& {0 F% N3 s    // 设置 FIFO 级别% n* A0 M/ Y; H6 Y
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
& j) n3 q/ V. w& x6 o}
( T3 k9 v$ O( y9 [2 R
, D( E: T" z1 O# G+ x) s9 x/****************************************************************************/2 o8 a; I9 @) g. N
/*                                                                          */
, r$ T' ^; k# M4 Z% @/*              UART 中断初始化                                             */
6 k( ~- y1 g# B% C' ]/*                                                                          */
/ z; {- X- b, H" L' U  [& }/****************************************************************************/. B/ F0 n0 w* `' C0 H$ _' A+ [4 f
void UARTInterruptInit(void)
# I4 H+ D' h" b" b7 ?{
# ]) m1 L/ i( q7 i  f5 q& w        IntRegister(SYS_INT_UARTINT2, UARTIsr);
# m  O9 l0 V9 F0 w6 b2 O- e% l        IntChannelSet(SYS_INT_UARTINT2, 2);
8 |2 `+ M' j, ?7 v/ o5 P3 l5 e        IntSystemEnable(SYS_INT_UARTINT2);
0 I, U$ W6 U" f. U& k1 s+ T/ y! O. ?1 R
9 }: L2 [1 D, K& B5 l. u  ~$ f        // 使能中断
2 t+ a/ A* H  @* J$ {        unsigned int intFlags = 0;
' ]1 u% ]+ h0 f5 ?( e    intFlags |= (UART_INT_LINE_STAT  |  \! J1 l! V9 F# T( M( G
                 UART_INT_TX_EMPTY |    \
. U8 h3 x/ H! ]+ t9 w                 UART_INT_RXDATA_CTI);: w0 V9 I8 m4 J
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
) W) y) j3 f5 \6 `  W}
. s& d. }8 I' \  N" w0 `! V# ]2 ~( Q
/****************************************************************************/
+ y: N) n5 E! Z, [/*                                                                          */5 s8 M+ d. G& r. A0 O1 p
/*              UART 中断服务函数                                           */) \$ a' W1 w" L
/*                                                                          */
4 H# B2 C# o  k/****************************************************************************/
) L! ~- C4 @- S* Rvoid UARTIsr()
: {/ f/ u- e" A* e( }: {- I{
1 c  M' f3 t$ o( `0 z& s    static unsigned int length = sizeof(txArray);
- G& h8 Y% l4 j; ]9 V    static unsigned int count = 0;
! r9 d8 A5 U: K    unsigned char rxData = 0;" Y1 D5 ~- I2 ?" l
    unsigned int int_id = 0;1 k" i( l( c; p( U

# C; u$ G3 \) a1 K2 U9 @    // 确定中断源- N- ]( j, ]. U- [0 k
    int_id = UARTIntStatus(SOC_UART_2_REGS);
- K4 a& n8 `  i$ a! [5 u
1 Q: N4 o8 [0 |; U    // 清除 UART2 系统中断
8 x4 k# N1 [8 Z& ]. t! M3 d    IntSystemStatusClear(SYS_INT_UARTINT2);
" C! X) ]. `. h8 ?& M% A% y+ I7 y
1 t0 A2 x! Z! ?) i# Y    // 发送中断
0 A3 ], p. `! j: |% j8 P# |    if(UART_INTID_TX_EMPTY == int_id)/ B& G$ M+ K, e* u
    {# G% C( z8 V/ U+ Z7 b1 P! u
        if(0 < length)) k  V7 k. M& E, m9 ^( ^
        {: ~% j$ G4 e& L8 {: l& j
            // 写一个字节到 THR4 b* d3 C6 X% H. x- X$ E/ \( r8 K
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);: O4 P6 z+ ?- U7 g
            length--;
- t0 R1 {; i- {6 @  V8 N            count++;
) f& F% r9 l/ R1 C/ N' q6 Q) D        }
/ e$ K# v: C- y9 q4 t% S        if(0 == length)% ~: E2 z$ E  S" K0 O, m' X
        {
8 J4 [  L# y  w( b. g- J2 z+ q4 t            // 禁用发送中断4 ?) u1 L# O8 @& Y+ K8 M: P
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);$ M- G( U+ x6 e0 i0 @
        }5 K- u( d' g. r0 B
     }
4 [- u0 N1 x" q$ _- N* i: Q. E7 c& G' B$ ?/ L" W* ]
    // 接收中断
- M' Z$ L6 x  \: Z9 O/ k/ a0 B    if(UART_INTID_RX_DATA == int_id)6 r! d( W$ [0 Y
    {3 t$ U9 h2 H3 L$ @4 Y2 k. i
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);3 g# l7 C2 d6 @1 g
/ _/ R8 ~/ D( K. a/ X" D  D
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
' ~5 S3 @, |8 f! @2 J  v! O    }
* v$ z4 C9 T7 Q$ Y, a/ @; x1 F: j# G5 f9 e2 G2 i
    // 接收错误/ ?: f1 B0 u) f0 W' j
    if(UART_INTID_RX_LINE_STAT == int_id)
2 `' L. i2 {: _+ q% {- T    {& v/ d) G% O$ G4 l* E9 D+ D
        while(UARTRxErrorGet(SOC_UART_2_REGS))
+ E/ I! Z$ I" s1 ~- u! U* A        {
& @" \9 |5 h% }: ?) i) L            // 从 RBR 读一个字节
, D7 k  c8 p% l& m7 ~+ t; B4 c/ y            UARTCharGetNonBlocking(SOC_UART_2_REGS);
9 u& H# \) `1 T4 F        }
% W* Q4 g# W2 U9 B0 O0 l    }8 }; j9 T9 X4 i% U5 |$ G" W# o
    & ?3 y" T( U" D, E$ L
    return;
" q! x' I+ _2 K" G}4 z6 U6 ~2 z7 A" J5 Z$ N4 O" }/ ~
回复 支持 反对

使用道具 举报

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
* C! {! V3 ?/ h! g$ s3 E, t5 h如果其它设备快速给你发送串口数据,你这边能正常通讯?

7 l; T0 B" d; m8 x. D谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-12 11:15 , Processed in 0.044416 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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