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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7454|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。* f9 \$ `/ b5 M' P

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
+ ^& x3 @) K- c8 ?- i7 @" ]4 }* e" A' A$ I) S  c& ~
#include "TL138.h"                 // 创龙 TL138 开发板相关声明$ g4 ~) a+ d7 h/ L  a3 j7 }
. P% I' ^5 A1 B$ c
#include "hw_types.h"               // 宏命令) `: H& }, |2 @/ \/ [
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
4 s* C# i- G3 s+ p" `#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器- P* t% b# I  M! Q
0 V! Y" c- @3 Y* s6 ~; ?* u
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
6 z3 ^) ]. }6 J& \6 h! Y$ `5 Z#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
0 b% }6 R: |% u7 d" G/ F#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明0 u5 C, Z7 S  C8 i# l9 r( u
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义8 y+ R/ y; i2 ?  ^4 W; o
6 \5 G9 M6 W2 [4 a; K3 W4 P
/****************************************************************************/
1 w! h$ ]5 Q' G) n7 y' Y/*                                                                          */5 P+ o2 f7 i2 Q+ Z9 j4 C& w
/*              宏定义                                                      */" x5 C: v1 H8 l# i- ^
/*                                                                          */
! {2 x+ z$ X) e% X2 X/****************************************************************************/
2 q3 x8 k0 \. J; X; g// 时钟
& ~+ {* {: i( ]/ I. v( K8 b#define SYSCLK_1_FREQ     (456000000). S- v8 d& D0 a" R: N& y
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
' z5 H3 g4 G/ M  N+ O5 e- z#define UART_2_FREQ       (SYSCLK_2_FREQ)) j3 b, y: Q7 M3 _5 ~$ R
! O$ d# c8 @- h. Q
/****************************************************************************/
& F  W* Q1 o' j0 m$ e# z  @& r3 O% @- ?/*                                                                          */
  J6 C+ O! z( P! ?7 ]! c/*              全局变量                                                    */
, N; \+ p/ w2 z/ G3 x5 v4 q/*                                                                          */
  w& F6 K% ?' s. L/ r  J4 m/****************************************************************************/+ L7 S7 K8 h8 [$ O: Q( k; C
char txArray[] = "Tronlong UART2 Application......\n\r";
7 H0 a/ i' {1 p) D, Q# M8 C6 t: I
, M( K( P: I, g/****************************************************************************/
7 z# H! E1 J! W7 s" b! M9 u8 O  K/*                                                                          */
8 N; o  L9 k& i/*              函数声明                                                    */
3 e7 k8 N9 K% l" s3 a4 b4 v( u6 E/*                                                                          */
5 g1 T0 {: j# k$ p/****************************************************************************/
; [, B3 f; N3 J' s' s// 外设使能配置
- G7 q5 U5 ^5 J/ i) S+ Z' ~void PSCInit(void);7 z$ Z" _0 j& S- S" V

! Y! {$ B) B' e& \) A* @// GPIO 管脚复用配置
- Z4 [4 [; [$ G  Q' Y& C/ ~void GPIOBankPinMuxSet();
! M; t) A2 p4 F; C3 G+ h
# r, E7 o" S# l. A/ @: }: ~0 T// UART 初始化& s! o/ Q! D0 }7 c& b5 ^. W
void UARTInit(void);
( o, Q0 d# {. @' t# B, I// ARM 中断初始化2 z3 d4 g# _3 L4 _( z
void InterruptInit(void);/ |8 u) ]; j9 l# I' E6 X5 _
// UART 中断初始化
: h5 l& X2 Q0 W: `2 f0 I, Avoid UARTInterruptInit();" c6 _7 G" O  U# C  c
// UART 中断服务函数: [/ v: U4 e# @& f6 w1 G% z
void UARTIsr(void);, x/ v; ]) y5 X& ~2 x

4 V6 d- {* s3 v  j8 M/****************************************************************************/
* q' r- y' z% H/*                                                                          */- W2 M* m/ q# p) e, N$ Q' G
/*              主函数                                                      */% p) A* G: o; o% g" y6 j4 K, \
/*                                                                          */
  n7 r$ E& r$ {! P* @& f- N1 h/****************************************************************************/6 j, s/ |5 N- `" _$ O7 n$ q
int main(void)% T* c! C, Y8 L7 @( X7 S
{
& @. I/ t6 [2 ?' Y" y- S$ [        // 外设使能配置- G5 k' ]1 \5 |* K7 L
        PSCInit();' h0 O5 \5 h) j- g. ^0 s1 e/ ~6 N
       
( y& D: ?& I5 R# I. H7 B8 K        // GPIO 管脚复用配置
, r5 g, O' x: q        GPIOBankPinMuxSet();
, B- P  W% [3 z3 f3 ?+ \% q8 r. ~  p, a$ _
        // ARM 中断初始化3 ]5 ]' Y1 E' F  d' y4 ~3 `
        InterruptInit();
/ |0 z' v! @! o* p' A7 m
7 `; r6 }3 ^( m7 b. b- r% T- O        // UART 初始化
7 n& `: J9 s  \        UARTInit();, Q( {- ]! M) U7 @# i7 _/ b0 Z

  T8 W6 \' {# k        // UART 中断初始化
, T  \. i) M+ F6 i5 S6 ?$ y        UARTInterruptInit();5 {8 x( \, C8 S$ I7 L: C8 [
2 r) n7 C  p- C
        // 主循环- @. l' V5 v2 e( {6 q
        for(;;)
7 V1 U* U! U9 K( r3 m: i1 A- o. [* h        {
( a) }8 B$ ]* [  e  Q# p8 y3 R- m9 h* t' ^+ T2 |; K; u
        }% z- x0 E4 n7 E3 r
}
) h$ u% c  D. M2 q9 N( w7 i/ s! K8 H, X& q6 N6 e
/****************************************************************************/* @: f5 p) v# Z8 V
/*                                                                          */9 O+ z% k1 T. l+ l/ c& n
/*              PSC 初始化                                                  */
6 e( P  y( q' s6 d) q- S6 P& k8 m8 ^, S/*                                                                          */
6 h' X+ h1 {* b7 ?" |4 d. A/****************************************************************************/$ k2 A$ |- y( L* i4 J# w6 a( I
void PSCInit(void)7 N3 v$ k  G8 M# r5 c
{$ E: U& K4 a. Z  y, V
        // 对相应外设模块的使能也可以在 BootLoader 中完成/ [( O3 }) D' n3 ~/ [- X, \7 C4 U
    // 使能 UART2 模块" [$ i* T  f( J  @- Y: E
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
, Y; a4 b# E- Z- t% ?}1 t# a; T% z  }2 q9 p+ I

. x8 J3 g: w% Z, q' S/****************************************************************************/
, V* ^) s* K, ?2 K: x" q) N& \/*                                                                          */
, y% F8 r7 ?8 ]/*              GPIO 管脚复用配置                                           */. k2 u; Y) E# M: C: [
/*                                                                          */
3 b9 \$ ~, h$ X8 v/****************************************************************************/
6 t; M6 U" D/ a' }void GPIOBankPinMuxSet(void)
- v5 a: G: y% s, u0 \; m{2 p5 x. w0 _* r( ^
        // UART2 禁用流控- _) o2 t' }5 i
        UARTPinMuxSetup(2, FALSE);% c* ^& B' Y" W, w, w6 [; @
}  Y9 V. y  ~: z! N! H

# Q) C. T) w+ {, Z/****************************************************************************/3 `0 C$ J7 n2 V' A) ], g6 q9 K* s
/*                                                                          */
. [4 A+ y* _& b3 D1 u5 [, a/*              ARM 中断初始化                                              */
! v, y5 R2 P9 t, r5 |) L7 a. d; R/*                                                                          */4 z+ u7 a7 @! ?) k; z0 ]
/****************************************************************************/4 l5 c1 H% H2 b4 }4 J
void InterruptInit(void)
4 I) a1 Y0 U; x8 e2 H/ ?+ x1 l{3 Y9 |% r( e7 V) x0 d8 s
    // 初始化 ARM 中断控制器/ L  Y5 @0 A) O3 _8 {9 m
    IntAINTCInit();
4 O+ ~+ _5 B8 W2 w: M* x; `* [$ e2 M4 e6 A* Y7 _
    // 使能 IRQ(CPSR)0 `( `8 J# H2 g0 c
    IntMasterIRQEnable();
- a  h+ D- t* H5 }  y1 w) F& s
4 W9 ~8 D. d* m4 v! |$ W    // 使能中断(AINTC GER)
: n" V: L5 @& ~" K$ r    IntGlobalEnable();
2 s$ k0 N6 z' a1 m4 K6 e1 C' C+ {5 _
    // 使能中断(AINTC HIER). d& t6 ~/ w6 h! j2 l
    IntIRQEnable();
: ?0 |& v  F3 ^" |}
# V" |3 s' u: ]3 o5 r1 X) E( U4 A# M+ v: |) l8 j# l: U3 t" l
/****************************************************************************/
3 t- T0 Z$ W1 t0 b6 X3 |) K/*                                                                          */
2 s& }0 P. u0 Q/*              UART 初始化                                                 */2 B) t$ v4 d9 v9 V/ V) P
/*                                                                          *// ~$ c! i4 a) _7 P) a4 p9 X
/****************************************************************************/  s. q. l, J$ A% c/ B
void UARTInit(void)
2 y; ?! W. k' }( g{8 ?0 I1 u# \. {" M% _5 A7 U  j, l9 B1 O
        // 配置 UART2 参数4 u# w! Q8 O2 \( e
        // 波特率 115200 数据位 8 停止位 1 无校验位. n* A& P  @& Q' S, ?) I& D' R
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
0 G& d" X- y, U- _% w/ Z                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);% c, P- |0 \$ \% r1 _5 H
        // 使能 UART2+ N/ D. L+ J9 L' f6 T! ?( Q
        UARTEnable(SOC_UART_2_REGS);
3 @9 m& R9 t+ g; `3 s7 }, s4 t; W* i& a2 K% ]0 V! t6 G
    // 使能接收 / 发送 FIFO7 v( h, z  r6 e! s+ R4 E
    UARTFIFOEnable(SOC_UART_2_REGS);/ ?) ]0 Y, Z! i2 K6 H* q
+ H+ \, J. X* ~
    // 设置 FIFO 级别' l( `% G1 z  W7 j0 D, i
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
, Q4 v1 s. E8 }) M7 p1 w& D7 ~}+ w1 F5 X7 W: N; d
( y( l! X+ H: x3 k; B: d( C8 S
/****************************************************************************/
# ^4 ~- B- b! z2 l* y/*                                                                          */7 j' |8 o& A# _1 A9 D8 K
/*              UART 中断初始化                                             */
3 A  E+ @8 S; }0 @9 u/*                                                                          */
. C2 N) L% i8 g. y! \: A, X5 n8 S/****************************************************************************/
3 \1 R4 S& d& Q' o* Tvoid UARTInterruptInit(void)' r- J2 x2 d& U/ s. D  G* n
{- o& u; T# p% v
        IntRegister(SYS_INT_UARTINT2, UARTIsr);; i- k. L( {* G, L% r# b
        IntChannelSet(SYS_INT_UARTINT2, 2);
! }4 ~4 a1 K9 B) K3 m        IntSystemEnable(SYS_INT_UARTINT2);! x3 l% b. f4 l; H3 s8 }- w- ~
0 t0 |& v; }1 ^7 V& A
        // 使能中断# A9 Q6 u: H9 h
        unsigned int intFlags = 0;
* t2 g4 P; {& l+ m4 e    intFlags |= (UART_INT_LINE_STAT  |  \2 W( x! v$ f  a$ T
                 UART_INT_TX_EMPTY |    \
% _- u: t. r& z5 y                 UART_INT_RXDATA_CTI);
# O$ b1 v$ o$ P0 |- H# }( L0 }    UARTIntEnable(SOC_UART_2_REGS, intFlags);  p6 _, }% X. w( D9 z4 m/ P
}
' k! C1 W; A) x1 v4 ?% a5 K; z8 a! D# v! O
/****************************************************************************/
/ N3 x* k4 _: ?/*                                                                          */9 e0 l& A/ N* q0 V$ M3 M( K, P* q
/*              UART 中断服务函数                                           */
% Y  D( v* X6 r8 D- x/*                                                                          */$ Z/ w. |0 `4 k" p! X
/****************************************************************************/
# a5 \" I# Q' r. f* t+ L$ Jvoid UARTIsr()
- C0 a( \" v1 L{
! p- W# ?/ G2 t# j  j    static unsigned int length = sizeof(txArray);
% C' L) f/ r! l& u' @    static unsigned int count = 0;5 R! N7 t% ?# j) d" z( x
    unsigned char rxData = 0;+ n9 @# r2 K5 g7 o) ]4 X
    unsigned int int_id = 0;
' S; B$ A) Q" R  u% a5 s) t
$ I! W. J: y2 @2 X( t# f1 p7 T$ a    // 确定中断源
; x1 a& g& d: W( H    int_id = UARTIntStatus(SOC_UART_2_REGS);
. K% f: r, B1 u* x$ r  X) Q2 Q/ X0 u& m) i7 v2 M3 m  h3 x7 J- s: m+ x) V
    // 清除 UART2 系统中断
+ O; l2 K5 I0 i7 ]+ W7 g% @    IntSystemStatusClear(SYS_INT_UARTINT2);
/ z4 F. |/ a$ e3 w7 I8 d1 @# i7 W4 [) L  r2 r8 @3 Y
    // 发送中断* t: M3 `' m4 z* @7 {: Y* Z" C6 {6 I
    if(UART_INTID_TX_EMPTY == int_id)# F0 U. o4 w, V+ \* U$ h; Y) s; f
    {4 u% X7 q  H3 J  f/ E1 i
        if(0 < length)/ B- O6 t1 i6 ]3 r' N% |! O
        {% l8 U2 c4 i- q: A
            // 写一个字节到 THR8 k: f% c- m9 E% ]
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
3 J7 W+ H/ i) W' l: ]            length--;
# h- |. ?2 S0 U9 ]0 ?; N$ u$ j8 A6 ^            count++;3 }$ O$ u1 T' A* @0 ]
        }) Q5 |) g9 N! M! _
        if(0 == length)
1 K; l7 f/ L- m% m( s! L( m* {        {
* g( _1 G# w6 t; M- Q1 p5 s4 _6 ~) [            // 禁用发送中断
: d2 b9 V0 O' k8 K            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
' P' x. o8 |4 E" `  p: e) L        }" a9 Y3 L/ q" y9 a+ @5 G
     }: l2 a6 a* ~2 B2 h6 Y! e. p
7 Z% \- }/ y& s8 f9 f
    // 接收中断! ?' C. S' x4 T2 L/ q
    if(UART_INTID_RX_DATA == int_id)  I3 x$ i) Q2 ^. O. i/ W
    {
7 m# i% a* d% ]: A+ U5 Z1 f  O) B        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
: G$ V0 C) V7 V' N" g. T+ y
+ @9 M6 `6 z) @5 v' Y; W# t        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
7 b& |1 `( d  ]    }+ ^# M. M) \. f* g" t

9 Q( Q2 q; A$ d% \5 t    // 接收错误4 p9 h& k& a/ @, a' J0 x3 t( j
    if(UART_INTID_RX_LINE_STAT == int_id)
6 j: ^  V: D! i% G# D    {5 V; S& W) Q; o9 d
        while(UARTRxErrorGet(SOC_UART_2_REGS))
7 J6 X# C/ W! s# p        {
' x, T9 ^# X" C* G- ]3 N! @3 y7 t            // 从 RBR 读一个字节2 U9 ?5 \$ v* M8 x, `; j/ G$ u4 N* `
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
: o- z) P( z! x0 I3 q        }7 |) J1 W$ o: d1 v# }
    }
" z$ ^8 [% [! H1 P/ e. U0 i   
; s8 g4 u+ k. y# C. m% l    return;; H* I! n8 ~* r
}
+ _, y8 S( p5 q7 t7 k+ }
回复 支持 反对

使用道具 举报

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:252 Q$ b' Z# }5 V8 Q: v5 H& _' k
如果其它设备快速给你发送串口数据,你这边能正常通讯?

1 K! F$ V9 w& T% v谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-13 16:33 , Processed in 0.043460 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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