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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7478|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
9 X& e/ v2 v, x# j' m! Q/ e

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
' I1 E3 i5 g# I6 g% L7 P/ d) V; ?/ M$ C
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
, h3 h) x& d4 U8 C; s- q" H) F2 W1 x' ?
#include "hw_types.h"               // 宏命令
: m- p) t% A1 A5 a) _: Z#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器6 J. P5 k% n3 D) X/ |
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器! o8 A# n: q( j" U1 J

, W2 ~# t+ ]- S9 E#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
$ N2 U5 t  d4 D# j  K# y, V#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明- S" D4 D5 ~$ `3 ?, u$ R
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
6 K  I/ K1 ?9 o3 \9 w2 K# L( d#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义8 e7 E( k& f1 Q+ {( k

# v% v# d# @* g6 w  e/ Q$ D) P1 K/****************************************************************************/5 n4 T# d0 w6 K' ]5 r8 S+ |
/*                                                                          */
. M" k" u. O, x1 Z% w  v" b% o3 e/*              宏定义                                                      */
: Z. q( R: Q$ z- u* u$ P. B6 ]/*                                                                          */
" H" _5 X4 k/ H% {* A; x1 m; c/****************************************************************************/4 s) l$ N$ U2 o+ _3 t
// 时钟  ]; R1 F, P' m( C6 n6 _! c; Z
#define SYSCLK_1_FREQ     (456000000)% _5 E, N( h: J; U% b
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)( q( M* u4 S5 Y* ^
#define UART_2_FREQ       (SYSCLK_2_FREQ)
4 k) q! U+ a$ Z" [
. o. M' }. V. P. n: x: f# c7 L/****************************************************************************/
, K2 E( [2 l: y1 h& g, y/*                                                                          */
/ ]. J3 e! p* ^8 z3 i/*              全局变量                                                    */2 a9 _4 \2 D' x0 y
/*                                                                          */8 g3 A  i, P' N6 q9 J
/****************************************************************************/* _9 W: F/ f1 w% g
char txArray[] = "Tronlong UART2 Application......\n\r";
* p6 B7 ^& z/ s) j5 O' H' b2 u
/ j( _, o+ H2 }7 A/****************************************************************************/
/ {) P+ q2 Y+ z7 ^/ }3 X/*                                                                          */: P3 m) s# _+ U9 z! \3 l  v( N6 j
/*              函数声明                                                    */
' P1 l/ W& [, z8 N/*                                                                          */) H* a; v4 S0 }$ H* P
/****************************************************************************/
& ?  n! p9 |' o7 t  H1 d// 外设使能配置) N% O/ O( f% h/ A: [* `
void PSCInit(void);5 I5 I4 O' j; w! L/ M
0 X6 y/ m/ Y; U& w% k/ _  u
// GPIO 管脚复用配置
9 ^3 h; m. w9 |3 s* p2 wvoid GPIOBankPinMuxSet();
; ^( r* {) z5 {/ e* H. R. K+ z5 H& e" f6 }
// UART 初始化
# V7 f. K: Q' U6 P. ]' mvoid UARTInit(void);
- n; B, [" q4 S. S8 e6 b- [// ARM 中断初始化
6 }7 P# n/ `. s0 P: P2 Fvoid InterruptInit(void);
% c6 }* u7 V4 [7 |9 s// UART 中断初始化
% z! `- z& b% G7 a) X% v% `: Uvoid UARTInterruptInit();0 W" x! H( @$ i' n& L  Z
// UART 中断服务函数7 R  ]; l1 I3 o, q$ }: Y
void UARTIsr(void);
* I8 A  V; \; j4 l
3 ^( T& Q, W! m) f) H4 g0 u4 V3 F/****************************************************************************/
' _7 W" K. j; U$ b, k! u/*                                                                          */7 @& @& l# _) i5 C) a
/*              主函数                                                      */
$ Y3 o$ m/ v2 [" Z( y/*                                                                          */6 A4 |+ M- a# N* k
/****************************************************************************/
) u! J/ J, p) k6 N& f. Eint main(void)' U, @5 A0 p* I- l6 ^! l/ Z
{
/ @7 }; i, w! w: a8 u, o# c        // 外设使能配置; ?( V( B+ k! R8 g7 P9 m
        PSCInit();
" a" W0 q. [) ~. j: ?       
" f# v( r4 |- U! s        // GPIO 管脚复用配置
9 v- b8 H/ \/ v$ c/ u% V        GPIOBankPinMuxSet();* @( M# m( a6 C, U% s, E

% b; A& u9 Q/ t        // ARM 中断初始化
9 J0 d( F$ Y" y( q3 t        InterruptInit();
$ f3 U( n3 B2 s2 x# g2 A1 e) s) ]
( X+ M/ }7 D5 p- I1 `. Q$ R6 D0 y        // UART 初始化$ L2 R* I- e3 S; o# F3 n& n/ b
        UARTInit();, M4 ^( r' F6 r& }
% T: ^% k) ?- P, E) _
        // UART 中断初始化* T& t3 @. F: J4 Y9 b
        UARTInterruptInit();& Y: f/ ~+ c# U; }* [) K9 l1 N
% A% p. \2 f  N  J0 Y4 G: w
        // 主循环
4 |3 T0 ^1 ]* k: T3 y0 p        for(;;)4 s1 d- M1 ~  m) K
        {
0 I! ]; x5 h5 @* H( Q1 y
8 F% N* y" G$ R/ G) U1 K6 }& s        }+ O/ b) k- E) X7 z* ?
}( F2 K# Z; U  A) u; u7 }% V7 ?' T

- d- Q$ N: \6 @2 s6 e0 Z/****************************************************************************/0 `+ |  Q0 R1 d3 b9 ~* t
/*                                                                          */
2 B4 T9 x( b% K) U- i/*              PSC 初始化                                                  */
( e: S% e5 U/ G( N! r1 `" O/*                                                                          */# j) T7 |- q: I. B. r4 _& L
/****************************************************************************/5 X( j5 k5 \9 |# n5 h4 f
void PSCInit(void)0 o, P) n- A+ Q$ \7 d& o
{* k  I1 Z! x; A
        // 对相应外设模块的使能也可以在 BootLoader 中完成
% v) r/ o5 G. ]    // 使能 UART2 模块
/ ~( R: o6 z4 {0 [    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);) a* U; r) a0 W2 ~* R2 X5 [
}! Z3 o* n) i. b3 k: }
! l1 ^; k( i9 [+ \/ g. y
/****************************************************************************/5 D7 X2 ?. [  D7 B3 q
/*                                                                          */# v8 }/ T7 M" U! T
/*              GPIO 管脚复用配置                                           */
+ }  L5 w2 }4 W& M2 R+ t+ a/*                                                                          */  c9 F9 l, z3 E# P$ e
/****************************************************************************/$ ?2 W4 ~  g  t7 M2 u: p" P, n4 m
void GPIOBankPinMuxSet(void)3 k' u; A; _6 X, t. G  c+ ]( I
{6 v7 @! N$ E$ H/ T1 Q& ^3 z3 ?
        // UART2 禁用流控
3 |% d+ F8 d, t/ E; V, m        UARTPinMuxSetup(2, FALSE);) L5 W4 L% W8 m+ O
}* p# D, U* I; Q: V0 A; Q2 P9 p

; t- n1 X* D( M8 [/****************************************************************************/
9 D4 E4 ~) ]4 m- ^, O, ]" p/*                                                                          */
. u. b+ m3 L# }$ l! R/*              ARM 中断初始化                                              */' f: O  \: ?# i# \' ]' b/ M
/*                                                                          */7 R$ K8 v% c1 f0 ~, B5 e
/****************************************************************************/# j+ _1 b$ [+ p( i
void InterruptInit(void)' f& M+ u, u4 n8 G. [  q
{
9 D" H9 u( S# f    // 初始化 ARM 中断控制器
& \+ @$ t; [  n# Y. ?  n8 |; z* x    IntAINTCInit();  Y& F; N; |( G2 T  r6 C$ L

5 M$ P: [9 d) a6 L) b    // 使能 IRQ(CPSR)
9 c4 @7 j% o2 P- R! {- V    IntMasterIRQEnable();
/ L9 i# }' }+ t, l  a8 Z, }) q$ L, n: Y4 P3 q. z, y
    // 使能中断(AINTC GER)
3 b) C  j$ h4 z    IntGlobalEnable();6 H, C& k/ e$ W  m
: O: o" m+ n/ y' L5 c, J! z
    // 使能中断(AINTC HIER)
+ s* D& N8 n1 U' M% D    IntIRQEnable();
; I# J/ V3 D1 u+ l3 H' E- q}
: b3 e# K  R) D! v2 s' [1 [1 ~% R1 V! m( T
/****************************************************************************/, E+ J$ i5 a6 S5 a
/*                                                                          */
1 \7 |* O7 X: a, I/*              UART 初始化                                                 */+ J% Q) V/ ]; \" Y& Y! C& s
/*                                                                          */9 T# u. |" J7 W# S: Q8 @! j
/****************************************************************************/
7 \. I  Z) M/ M) ?8 a2 m0 T0 n, @, A% kvoid UARTInit(void)4 d$ p5 l: L+ m! b- K* q+ O
{
( B1 i' W* ^7 _  A: F" ]* ]        // 配置 UART2 参数
& X  a0 |% d  a8 i2 h" d        // 波特率 115200 数据位 8 停止位 1 无校验位
. l3 z% @5 X% B' e1 b8 m. `: U/ x    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,# p& m( q: @% p) Y1 F+ R9 G" c. ^4 p
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
9 H; d1 p/ m0 S/ i        // 使能 UART21 `, S8 r5 Q' t2 @4 s8 j' ]2 e
        UARTEnable(SOC_UART_2_REGS);
$ G' N! {' T9 _) X4 F
; i7 G; j. x1 w3 u* w( m    // 使能接收 / 发送 FIFO, A) |, H, D+ d
    UARTFIFOEnable(SOC_UART_2_REGS);7 V! Z0 E& o5 `9 B3 O

, Z6 Y9 @  ~7 h    // 设置 FIFO 级别
5 t5 S8 ]# w8 j  N. F/ W    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);3 p% Y2 K/ [8 z, l- a$ z
}
# }# t  r* n- z, o: u3 F4 z0 Z0 {) D" z: y; K  [8 X# m
/****************************************************************************/
. b, `9 A* o/ B3 ]$ A$ \' B% @. N8 X/*                                                                          */+ V) |  `; Y. Y# g  h8 R/ @) j
/*              UART 中断初始化                                             */
( ~3 t+ ~* f; P' @* G, ]/*                                                                          */: y: t. D9 F  e" A
/****************************************************************************/
# C/ o& i* ?; m5 c$ uvoid UARTInterruptInit(void)+ c0 |3 k2 d" Q* e) v* g* @6 I7 o
{
" @; J7 V! j4 [, f( t9 p        IntRegister(SYS_INT_UARTINT2, UARTIsr);
" H. P; k- M. H8 W        IntChannelSet(SYS_INT_UARTINT2, 2);/ ^* Z  M+ {. r, Z1 J) D9 ~
        IntSystemEnable(SYS_INT_UARTINT2);
1 j, X, S* A/ w9 C0 K3 G6 J4 v. C$ N, {2 E- o7 d
        // 使能中断5 f- o% O* c+ ?' f/ `+ o, K
        unsigned int intFlags = 0;$ y, ^1 {3 u2 n4 ?4 N5 ^
    intFlags |= (UART_INT_LINE_STAT  |  \/ ?. j4 K9 x5 y) E3 L  c
                 UART_INT_TX_EMPTY |    \3 r' K9 y/ J$ R
                 UART_INT_RXDATA_CTI);  j  m/ J: b5 n% o" s  O
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
2 X+ m. x5 ?0 u}
9 I) h3 b3 p. E9 l4 v' O- W: i2 D. Z+ i+ q: }: _1 {
/****************************************************************************/5 s0 Y  E/ S) T
/*                                                                          */0 d, q9 k( z. M0 p/ S+ |! F2 Z
/*              UART 中断服务函数                                           */
5 F4 \4 k# h3 J' X% ]1 }9 N/*                                                                          */
3 u1 h! H" \. P2 D+ X! ^3 |/****************************************************************************/4 R( |. R1 N; O( B6 I
void UARTIsr()1 a: x4 ?' f; y
{
% P& q9 M; N/ Q, n6 M' {3 i* M" V, T/ }    static unsigned int length = sizeof(txArray);
1 ~0 V+ w. P7 R) Y    static unsigned int count = 0;# a* P* D1 ?& t4 q; t1 n4 {3 y
    unsigned char rxData = 0;
" p& x( _( e3 d    unsigned int int_id = 0;
  I4 {+ o9 Z( v7 q- r
, P: r  `* b- w5 F    // 确定中断源
! n( Z, F* h& r8 @    int_id = UARTIntStatus(SOC_UART_2_REGS);
8 v; ^2 o9 g9 E5 A
! k2 _" R, J& A    // 清除 UART2 系统中断/ |4 Q. W: a- {9 g5 E
    IntSystemStatusClear(SYS_INT_UARTINT2);
7 u" q2 m* \9 ~8 T: L& C5 R7 N% s8 ^2 i/ T
    // 发送中断
# U* N5 E7 K8 J    if(UART_INTID_TX_EMPTY == int_id)
) q+ B4 h  e% i- f- B    {8 T  M+ W/ S% {- h: {
        if(0 < length)
# u: ]: y2 \% k, T( ^( w/ W        {
$ I" G8 [# Q1 a8 ~. t( Y            // 写一个字节到 THR
' u" I' ]2 [1 R& j            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
) B6 p  W" @) j5 F% H            length--;
! e* W3 O; v/ N; E            count++;
- y8 u3 F  ?0 K3 S+ I        }5 E' x4 ?; i% W* J
        if(0 == length)
$ `$ w: P* L" G) D3 j7 q, \        {
, h* [. S0 x5 q2 t! O" d            // 禁用发送中断
# h, s+ P! \3 W2 B            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
' k; W, N( y4 ]9 ]2 ]        }
% y! T4 g9 Z: a2 D: o     }
- A  H( T7 e, F1 [
+ x7 z  \# {! y4 @+ g    // 接收中断) h2 e) W4 h* c' V, g8 J$ Y
    if(UART_INTID_RX_DATA == int_id)
% R4 t3 Y5 x9 g9 v& Q    {4 f# B$ G  ^% \
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
8 a8 e' i8 f9 C4 x! w
3 W; }9 D" o& u) X        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
) H% K9 H2 a; j1 C% ]" k    }7 w# j# q5 E. [: ^% K& ^

2 f* I, J3 i0 G7 j( A6 M    // 接收错误
* f# }7 Y, Z9 M7 L% B! m    if(UART_INTID_RX_LINE_STAT == int_id)9 m. v9 r% u4 l" j2 D
    {$ T5 U2 {7 b1 Y' X: G
        while(UARTRxErrorGet(SOC_UART_2_REGS))
5 f8 v7 r/ R9 k1 v9 z; L        {
! D( ]! v8 q3 @& f4 v3 O            // 从 RBR 读一个字节$ v+ J! P5 ]+ b2 W
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
! Q7 H# i8 F! o1 E        }
- }4 o! b6 {% d9 s; |    }
, n0 ^2 _( o  ]  @3 C& R    + o9 ]- n0 K0 X7 i& S/ e
    return;
4 J* h3 Q& F: h' ~/ t) \% g, T, P, s}
8 p; D2 Y! o- U( F5 Q( j) C
回复 支持 反对

使用道具 举报

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. Z1 f7 _( y. Z7 G: w; l
如果其它设备快速给你发送串口数据,你这边能正常通讯?
, @$ S, H0 O9 p
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-16 04:39 , Processed in 0.041736 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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