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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7262|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
3 p+ P) z' c% H* I! X  p: }. i1 a

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。  p% `: B* |( E5 P$ G/ a. F
% c1 |% [* G& c  ?! f2 s$ w, |
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
6 h. S% B4 S& ~1 J* T. ]* H( y$ v6 i& L3 ~3 u5 p$ M- d2 y, y9 e
#include "hw_types.h"               // 宏命令
3 E# J4 J+ \' X#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器2 @0 r- E9 Z7 ]+ m; ~" V, Z
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器; ~* V3 e( v+ q* T, u
- i+ s3 z% V; b% E% H
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明( U- {- ?" P9 q- F9 |
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
9 w$ y2 @: I* G" Q* x#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明% }5 V$ K8 Y+ d! u: s% a# R7 B
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义; f7 F- u0 S/ K- n

, W( k4 o. S3 z% P& k  [" C9 Y/****************************************************************************/0 C& u! L+ d$ C
/*                                                                          */
: c) L6 t& M) N, ^2 w/*              宏定义                                                      */2 i% q# F/ E6 T; ^
/*                                                                          */
4 w: Z6 H3 d/ E/****************************************************************************/  `1 [% E: P7 ]
// 时钟
! V, ?0 s3 W8 Z7 u  D1 g#define SYSCLK_1_FREQ     (456000000)! U+ X: y9 k6 x' W/ F  ^: |
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
4 O0 D* t; P  T" d# L7 `+ J) q) G#define UART_2_FREQ       (SYSCLK_2_FREQ)
5 }9 z- C$ f4 A; y# }$ b+ Y4 n$ q( ^& [, f, ~
/****************************************************************************/+ ?$ N: J. G& y+ D# I1 s# \
/*                                                                          */' R7 e; G8 e$ e
/*              全局变量                                                    */+ N# f8 n' k1 _2 B: _/ |' m% ?
/*                                                                          */* T/ P" V9 ~; k' r) q- V! q( a
/****************************************************************************/
: r+ n7 B) U3 B, lchar txArray[] = "Tronlong UART2 Application......\n\r";
! D, z; y/ p$ `, w1 \# K; I9 ]. }. Y) H. u1 r" G
/****************************************************************************/5 w- I$ |% Q, \9 J+ O( u; q: e2 P
/*                                                                          */
- w( a! `- m2 N1 b1 L/ `/*              函数声明                                                    */; q3 ^: H* [9 u! W/ E+ c
/*                                                                          */, q% }& K; s. N8 v0 `& T
/****************************************************************************/5 I- b; l6 {0 k+ \( M4 E
// 外设使能配置
2 F, ^) j3 e6 v" pvoid PSCInit(void);1 v: X4 W* a) p( H1 ?2 j6 N1 O
) [  Z+ j- j' h( ^2 c
// GPIO 管脚复用配置
1 j' b4 |" o4 F; J: t$ `9 qvoid GPIOBankPinMuxSet();; i# Y& n3 n' q. T1 x: A  F; V5 S
5 r: O% s" ^/ l
// UART 初始化, C: ], P/ S5 Q& P! ~
void UARTInit(void);8 j) S9 N& |3 `9 T6 L0 B
// ARM 中断初始化9 w6 V8 A* ~- k* S
void InterruptInit(void);
0 ^  B) I" z7 n3 O/ s// UART 中断初始化! I) U6 y3 f! V8 |; z
void UARTInterruptInit();
7 @; {; `2 x6 L// UART 中断服务函数
1 ?2 Y9 R, t1 X$ s0 h. Q6 _8 g) nvoid UARTIsr(void);
% E# Q( o% A$ d& V& J* |. d! L# }- b  g) u6 T( _# h6 ~
/****************************************************************************/
( e- H' Z- b- C. ~8 D/*                                                                          */
$ G) _5 n* P( z$ O4 R, _* {1 r/*              主函数                                                      */
, T9 k$ Y. n( Q3 N/*                                                                          */- S0 G. [* [* e1 p2 S( @6 z
/****************************************************************************/: ?( h5 u6 ]' l8 n, i+ e0 o
int main(void): ~" _' O% A8 V5 g8 o% s
{
/ }2 k$ ~; U* i- e9 H5 s        // 外设使能配置% A# C9 V' t- {( b. T: n# E: s
        PSCInit();7 y% ]6 ?' _2 A
        ! D$ s( j$ l: X& Y& n5 H, F3 f
        // GPIO 管脚复用配置
: Y: Q2 o% }0 L" Z& b- f; o3 A        GPIOBankPinMuxSet();# z$ z0 {5 |! a) b8 X! N2 s
2 c. S. g8 i3 i6 h, ?. w+ h! x. b
        // ARM 中断初始化8 N* L, w2 E  j6 z1 h
        InterruptInit();; h0 `% M) i. V' \- }% B5 L( J0 K
0 n: M( {2 g5 n& ]
        // UART 初始化
: }- S; j- G* O* l        UARTInit();
# t0 Q( U% V8 s( c) C8 }3 {# M
6 r5 g" K: u* Y0 w6 n! X7 [, }        // UART 中断初始化+ W. ?+ q7 U$ c* k
        UARTInterruptInit();% F! Y( w3 S3 X0 W1 q. ?' F" e
6 X9 c, j$ i. Q1 O2 @! W: t: p, H% d
        // 主循环' n8 V" v- i- A- ^1 v6 U
        for(;;)2 E  ^9 M8 b- i" z0 B! F
        {
& @" S# ]" |# n  i; e' M% ^* H1 ~' z% T# u. A. g: k) B
        }: S$ V. }, p. d+ u9 [( d
}" a4 W7 f5 g9 d* B8 I: J
! B0 h$ z) E. C; a) P' \  i3 L
/****************************************************************************/
3 z/ V# `4 s9 C/*                                                                          */
. I+ x, @, _& n& n. _& |/*              PSC 初始化                                                  */" j  B: c2 u0 c" R
/*                                                                          */
# U/ r: _3 x- h+ k3 y1 B& q/****************************************************************************/
- i5 F6 G  Y+ R" J* a) w  ~void PSCInit(void)
5 |" Z5 j" R+ _" _' e- x( Z. N{8 I3 V1 d% I5 `' ~
        // 对相应外设模块的使能也可以在 BootLoader 中完成
8 Y4 z9 f1 `9 z& L6 L    // 使能 UART2 模块' m; b. |/ S8 v
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
2 O7 H( J4 r+ G: B}
  ?' X; r% R4 ]4 s6 T. M
' ?) ]" p% f5 z/****************************************************************************/2 \4 M  R& F4 D. d0 Y
/*                                                                          */9 N7 c- Q' Q, d* Y  ^* t
/*              GPIO 管脚复用配置                                           */
; X. i* p, K8 D  J, g  C) M' B! u/*                                                                          */
7 P/ s5 P& U$ Q8 g2 \3 O* q8 k/****************************************************************************/
7 F- {8 z+ K; l7 |  `+ L. e$ _% ~void GPIOBankPinMuxSet(void)3 h* w& m7 G3 h9 y2 O% m
{
4 h- C% [: I" s/ |        // UART2 禁用流控& V' L1 ^# Z. F6 `
        UARTPinMuxSetup(2, FALSE);
& C% b# j  U0 B7 D; F& T/ F}4 X! S: E  E4 f3 S; y
  V( Y* X) B8 E  s6 O
/****************************************************************************/
% R( A/ q9 ?7 W& b; F: X4 K& `5 [% G/*                                                                          */3 y% K7 @% j3 O% o8 ~+ B7 o+ t
/*              ARM 中断初始化                                              */
) D* [2 w/ a% n/ n% \: F/*                                                                          */
6 l* H. Z" W- O' ]4 v  L( y% \' K/****************************************************************************/
! ^- L7 d1 N1 K9 O2 O2 evoid InterruptInit(void)
& I3 {) I0 B  D, F/ ^{9 F- X! [, \& d* S6 S/ h# d9 X& c
    // 初始化 ARM 中断控制器
# Z2 z% z: ^! v! l* X    IntAINTCInit();+ L1 Q/ [6 \. ?6 d, K
- m- O  W4 b8 I* K) Y0 N" g3 p) j
    // 使能 IRQ(CPSR)
. y# s- p8 J7 Y1 y6 N    IntMasterIRQEnable();
! r7 f- x  l7 X1 w# j( V7 |% _* Y' _9 I
    // 使能中断(AINTC GER)
7 T5 \- w4 M3 S+ H# j1 f: Q    IntGlobalEnable();
* N: ?8 a( ^7 f$ p! x! ^. J5 U1 d4 `  N
    // 使能中断(AINTC HIER)
& k1 T* m9 M6 q, c    IntIRQEnable();2 J9 o% |, V0 N8 B& X, K& n- h
}
$ J! l/ ^# C, |7 g& E' U* T- ?$ U
: F  G: x. M, @% v5 h, a/****************************************************************************/* r  g' u0 w. b9 b# D! G5 o- y
/*                                                                          */- T9 Z; C( I+ H, M% A0 y/ H
/*              UART 初始化                                                 */6 I+ B- ~& }: u8 h
/*                                                                          */
7 h' T3 v8 D3 }, G' |+ Y2 ^/****************************************************************************/! c- g# L6 \6 l1 |: H5 O  @) ^
void UARTInit(void)
: a# m7 Z4 I7 S' u$ c' G% G5 s{6 T5 f; L5 i$ D: l8 x7 H3 L% y
        // 配置 UART2 参数
% J4 O% c6 ~! D+ C, I# `        // 波特率 115200 数据位 8 停止位 1 无校验位5 I$ [" p2 A5 A, q  q6 v! |6 e
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
2 Q0 B( Z) E, M/ t" N: N                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);* l( [, e) U& L" G8 T1 ~
        // 使能 UART2
0 u2 c% A. U2 c6 E/ i, g        UARTEnable(SOC_UART_2_REGS);
. f9 d! u9 U" ?
7 Y) p0 ?2 D0 F5 ]1 t    // 使能接收 / 发送 FIFO
% C) r" _4 O; @/ [6 l/ u$ E    UARTFIFOEnable(SOC_UART_2_REGS);# a, J& y# h" k0 h% ?( {4 z
" [) D/ U$ J$ M1 o4 N
    // 设置 FIFO 级别
  o! G5 m0 g* m, Y; L    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
! g, r$ j+ F; q2 @}
" M% R9 z+ v! k5 |8 E7 S) y1 s( G8 L- z% m- C5 G
/****************************************************************************/* t# Y# F3 _4 K; C. Q# S& m$ z7 Z
/*                                                                          */0 k8 b9 ^1 [% I  A
/*              UART 中断初始化                                             */
& m6 C. B1 }% ^$ A/ f6 M' x/*                                                                          */  n% A/ B, q. g! ~
/****************************************************************************/9 M9 g5 q! _8 ^/ _4 f9 n
void UARTInterruptInit(void), ?0 L: g0 i6 p1 U6 T& Y) I
{
8 z7 K) A" w7 o& h, O. O$ f7 ?2 b        IntRegister(SYS_INT_UARTINT2, UARTIsr);
1 C' I2 P2 F8 U        IntChannelSet(SYS_INT_UARTINT2, 2);6 M8 X; V" ^% M
        IntSystemEnable(SYS_INT_UARTINT2);% }/ J1 C+ ?: z' k
, ^: Q" D9 Y* W; S
        // 使能中断8 t) ]3 g1 K- p1 ~& c
        unsigned int intFlags = 0;
$ Y# `& ~- {( P6 I    intFlags |= (UART_INT_LINE_STAT  |  \1 ~: m1 V6 {% H$ ~5 J
                 UART_INT_TX_EMPTY |    \) S& ]% |4 Z! o; r9 N# B
                 UART_INT_RXDATA_CTI);
6 A% l! T$ N; c" J! I. s    UARTIntEnable(SOC_UART_2_REGS, intFlags);
$ D( P1 P" c8 _5 n7 C% K$ r}
% k7 p+ C* Z! e: `& P4 ?3 l6 D
* H# L1 z8 [. |! Z, Q! r6 H1 R' V/****************************************************************************/' K6 X3 F! S+ F; g. ?( L$ `
/*                                                                          */
7 g- m, u& F! G" K  w+ v" Q8 J- K/*              UART 中断服务函数                                           */
7 W* s' J, P* Q& X2 I4 a8 g/*                                                                          */( x! o, z/ ~3 \
/****************************************************************************/* j8 U# p* W2 k, r: ^
void UARTIsr()7 I6 I3 A* \1 H9 N4 r% V
{  u$ I, n' }6 ]4 M7 U
    static unsigned int length = sizeof(txArray);
) B0 y" ~$ V0 l" \& ^7 P    static unsigned int count = 0;6 S5 b! w& G# x8 R; ~) ?
    unsigned char rxData = 0;
+ Z( e9 j: g" J' p2 _) r, p* V$ N    unsigned int int_id = 0;
3 N' F  _! k4 N7 x2 k4 z2 r, O6 p1 J3 M$ U  ]4 n
    // 确定中断源: d  o& ]/ @* K9 c0 T
    int_id = UARTIntStatus(SOC_UART_2_REGS);
. m/ J- Y5 D- k& m+ z% K% i- Y
, y, @; p. P( g! T    // 清除 UART2 系统中断
  n+ v, g  w  x4 Z0 {    IntSystemStatusClear(SYS_INT_UARTINT2);
0 j! s4 p9 F' b, N3 l4 C' T
1 a; k" K) D% u) G    // 发送中断4 G- ~3 Q0 R% R
    if(UART_INTID_TX_EMPTY == int_id)
4 l/ W3 x' b; `* v$ T" q* q    {
7 ~- t! H9 G/ ~7 [' H% l  y# G        if(0 < length)- ~, s3 g, ~+ R  A) e3 _. z
        {
& a! v( e  O2 k( t% ]5 A% [* q            // 写一个字节到 THR  U3 r# U, Z3 k! W( l( T
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);9 \' J$ W- m  l, Q
            length--;
' E# k2 M! |. k0 Q2 S            count++;! E) f9 m& ^  H8 l" O0 V
        }9 |7 i0 ]9 C' X5 m+ t1 Q
        if(0 == length)
; }. T; ?  r7 M2 v( q0 A8 I8 n        {: I+ d( K) t& Y6 U5 W1 U
            // 禁用发送中断( V5 T% |+ N) L0 t. _
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
& j, o% t0 k; x0 {  d" \  Y) \        }
6 u) A$ t: E0 }     }6 {4 [" q5 G' Y6 V. j8 D
8 p0 m/ ~* |1 E8 M
    // 接收中断) x4 Y' y: y& D7 M1 F9 R
    if(UART_INTID_RX_DATA == int_id)
9 U6 t+ o) s1 J; N2 y+ c- R    {# c/ f1 n" V" _
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);% f+ F' f) Y( p5 y7 u" J

- N4 g7 U* h$ G) R, @% Q4 \        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);$ c- g6 T, W  [  q8 c
    }
# z, H# \  I( x+ d+ c: K7 x5 m. g( X! @% ?" D/ h! J/ w, K
    // 接收错误
& X& E; h4 K7 e2 y9 Z6 s  H% q    if(UART_INTID_RX_LINE_STAT == int_id)/ j# E# g! f# O  H5 \$ F3 g% w) R) {; W
    {
# I$ m: O% M# }6 ^/ n        while(UARTRxErrorGet(SOC_UART_2_REGS))/ I# d4 y6 q" w. g
        {
! R; w! a( _$ g/ k" o            // 从 RBR 读一个字节' t1 d9 s+ ?& v( d3 _: {5 @
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
# D3 j  `! s( D% v) a  F        }
2 w3 {2 C/ E/ _: k3 p    }
6 e7 B0 S% N2 [4 y      U% x5 t( H1 _/ b
    return;- p/ _- R' c( o% A2 [
}  H) s5 C* K% R% [+ w/ y2 M$ N8 C; q
回复 支持 反对

使用道具 举报

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. P! C0 [& h( o5 a
如果其它设备快速给你发送串口数据,你这边能正常通讯?

) v6 l0 ^, g, J6 i1 E/ ]谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-15 17:45 , Processed in 0.040873 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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