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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5651|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
# d: D# y! {' l" o3 X

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。# q: A0 S8 o" ~

  [) i5 p. j; Y* s4 p7 f#include "TL138.h"                 // 创龙 TL138 开发板相关声明
( x! p0 I/ `, n* W! r# D+ n- I  j0 Y- W9 J. r3 q8 z( X
#include "hw_types.h"               // 宏命令7 S2 q! P) v6 q
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器. W$ n  T& g) t$ k( Y
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
- E" w. w4 P3 |8 ~
3 f: G0 p$ W' s4 P1 w. i% u#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
# `: U+ ^9 L7 W, `9 B# x#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
2 }1 |5 |2 f# S% O; o+ Q#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明7 P; p! u5 c* _3 V+ K% g) B& j
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
3 D9 M+ A) c- x( \- B& `0 G5 j
. H( X. z* y: E/****************************************************************************/8 m( s% w5 u" T$ G9 j
/*                                                                          */
- w2 n" n( T" q4 v/*              宏定义                                                      */
* }1 w" N: c% y8 V; o/*                                                                          */, e4 _. e8 e) Q% u' h% a! v+ C
/****************************************************************************/1 i3 T; y1 a: o: f& A
// 时钟- W+ m# z; k% F( o) @# j& k2 u! T
#define SYSCLK_1_FREQ     (456000000)
( r# q. z7 F9 A. C: x#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)6 z8 X- E, k- M) a! P2 V% C
#define UART_2_FREQ       (SYSCLK_2_FREQ): g: }* R& E) Z4 U2 s: j4 A% s

' B- N4 I; \; V. X* b5 G/****************************************************************************/
1 F  z! a& T- C0 F5 Z/*                                                                          */8 |, o2 B$ b6 C& L2 m
/*              全局变量                                                    */
1 Z, O! C5 {3 f3 W/*                                                                          *// ~/ s9 Q' Z# O6 x5 A) ]+ f
/****************************************************************************/
2 T. e0 [! |; \% Q0 uchar txArray[] = "Tronlong UART2 Application......\n\r";
7 i& V0 t2 v  m7 J
4 v- _0 k% d$ O' O$ l; X" E/****************************************************************************/
) f3 A6 |$ ^* [4 x9 N. c$ j/*                                                                          */5 X( f5 V  q& ]$ [5 s, L3 F# k
/*              函数声明                                                    */
9 K& v3 d' \! Q4 o3 E8 F/*                                                                          */
4 Y7 q: j: u- L; p8 P/****************************************************************************/
. U) _  U6 J7 ^7 \// 外设使能配置
1 K7 g, N( v9 u$ E3 ]0 ivoid PSCInit(void);% D, m$ l: W; e3 ^! g3 K2 I( Y

( ^* N2 d! c" S/ q% A1 ]1 [// GPIO 管脚复用配置1 R8 X( F; e6 m
void GPIOBankPinMuxSet();5 Y3 {+ `7 _* G# L/ K0 {/ T

" k! r! s6 j4 `* y+ b$ J' ~7 G; p' M// UART 初始化
5 k+ O. A: d: z4 g. E, v$ rvoid UARTInit(void);
2 Y5 n8 D& C8 p// ARM 中断初始化
7 j2 `1 d( @& p. ^' _6 Lvoid InterruptInit(void);6 @  y/ g5 n: y9 z
// UART 中断初始化
- y0 L7 h5 y. Q' J/ Ivoid UARTInterruptInit();
, _1 m) ~5 P- R// UART 中断服务函数  p4 c6 X! Q( M
void UARTIsr(void);
& g7 y& @# s( M9 }4 ^. o4 \: A! \. ]# ]+ [  _2 \
/****************************************************************************/
1 t  B- H/ j" W( c% Q/*                                                                          */9 o( S5 h! R" |& b
/*              主函数                                                      */
) P& o. f1 X( l3 H2 y/*                                                                          */
' y+ [: c* N! w8 y8 r/****************************************************************************/2 H. C1 m5 i7 |5 l% G5 A
int main(void)
/ l; M7 D  P2 B{3 z1 P) n  v$ B
        // 外设使能配置
3 _1 N2 c4 z- f! o3 F        PSCInit();3 k0 K1 E% \. x4 o5 n
        " `- d: q) s# O% p5 p! ]
        // GPIO 管脚复用配置
1 s- s3 h+ q: a$ I5 ~# x        GPIOBankPinMuxSet();" g) d- q9 b* O4 S( @/ }5 s8 r
0 F9 ?6 X9 G0 g3 w, ?, F0 H
        // ARM 中断初始化7 d$ v3 M; f2 D- I8 p3 c
        InterruptInit();
2 E6 M9 ^, [( c  X. Q' [, q5 k5 W+ u- }% G2 q; v* I1 p
        // UART 初始化
7 Z* r1 d  G6 x. g4 q: [* R0 u        UARTInit();
- I) H+ A) B: R" r7 _& _9 W0 T5 ~2 ]: H
        // UART 中断初始化
+ Z) A9 @. u0 H. [$ Z        UARTInterruptInit();
1 l' P0 }# ~3 _. L9 Q5 \5 n" `- m: F5 D
        // 主循环
/ Y4 [3 T8 |+ g. C        for(;;)
( T9 l1 n3 x" n/ [        {
7 u/ Z! E8 J. ?( C0 U8 C, o0 y' G  w: X4 ~7 C# g
        }* ]% X- V  Z' T- D8 B
}" ]9 l4 {- ^& i; B& `( d

  F2 d6 a* H1 g/ X* V# h2 \/****************************************************************************/, q! i( h2 L0 {2 g
/*                                                                          */3 L3 v" f7 Y& \2 e
/*              PSC 初始化                                                  */
$ o6 `: |- r9 I, m  c/ }( M  q/*                                                                          */
* g! N8 w! u. n2 D0 {5 \) f8 O1 v" f! R/****************************************************************************/& q' Z( h+ }: X4 b  I
void PSCInit(void)
. O9 [& d" m% e1 D# ?) J6 W" @{
; |7 r5 ?" [: w+ {- y& r        // 对相应外设模块的使能也可以在 BootLoader 中完成
% b7 O2 z% [: j4 \+ H" P    // 使能 UART2 模块
# M( ^; |% s8 |3 _# l: K    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);) v1 X* c- p$ ~8 X
}9 m- H5 t7 r+ H2 d8 l1 f4 p
6 {; Q) Q* J( L" r3 b1 M
/****************************************************************************/- l- \! S6 m, K, }- ^+ t6 ^
/*                                                                          */; V) Q  T+ v3 b
/*              GPIO 管脚复用配置                                           */2 ]2 g  b) b  c! C: H5 x- b& ]* a
/*                                                                          */  v: J9 Y6 m, i+ B% O8 ?
/****************************************************************************/
" c2 j8 |9 h, K' M, d! @void GPIOBankPinMuxSet(void)3 j2 p( c3 D. z+ ~+ M
{
! ^) ]  D  R! f        // UART2 禁用流控
8 f; _$ H/ \' G! d  [/ |: b% n4 I# \        UARTPinMuxSetup(2, FALSE);' h9 J& j: e2 ~
}
% b4 b8 u9 i. m4 y+ A. [% Q6 N% i- f! @
/****************************************************************************/: `2 w$ G- q& v" A% Z3 D
/*                                                                          */
3 Q! Z) J: ^' V+ y* @& \2 S2 u/*              ARM 中断初始化                                              */# }# A7 v7 M+ X4 ~( j
/*                                                                          */
! C" F% \7 T* l8 q) w# U/****************************************************************************/% ^) _2 S3 Y* j. a# f5 A& t3 J
void InterruptInit(void)
0 Y; ^- ]& g: p{! k7 P- h/ \% y7 r+ l
    // 初始化 ARM 中断控制器+ k+ z+ G! l+ W: n- f# |
    IntAINTCInit();
1 ~" X, w& u! E5 a" k0 V% C+ @- m' s: A; F+ z8 }
    // 使能 IRQ(CPSR)
  F+ f; w1 _3 D9 H0 g# ~    IntMasterIRQEnable();* h8 k4 X) o' K# p9 D' H

& e8 C) u" [0 N+ n    // 使能中断(AINTC GER)
. Y2 P  n% L; P0 D    IntGlobalEnable();
8 O( j4 }! \( ^/ A; {
  t  w+ D' i# C    // 使能中断(AINTC HIER)
) w, A7 R, @) i    IntIRQEnable();
8 q  S# N  w  Q! E# f0 ~5 h}1 a& V1 p% P) w; ^

* v1 S, i6 G6 `( N/****************************************************************************/
5 ~% z: f* E/ ~  X" ]/*                                                                          */
- t" r2 [0 ]$ a  W  R/*              UART 初始化                                                 */
9 N! O. S% }% V' C- @/*                                                                          */
' Q1 @# c! n2 N' @6 i/****************************************************************************/
+ H; ]2 N, b- Zvoid UARTInit(void)1 m6 }/ D+ ?. [* _/ Y
{1 ?# m, S$ d. m  \- A
        // 配置 UART2 参数
' n: c% F) {. L4 {8 \1 U        // 波特率 115200 数据位 8 停止位 1 无校验位9 i6 J6 p6 x+ f
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
3 D  d( s/ Y" n) ]: x9 K- R! I                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);- l+ k4 m- i$ w3 `: F( T* r
        // 使能 UART2
% w& N7 q. M2 C        UARTEnable(SOC_UART_2_REGS);/ k% j' E7 z6 A+ R5 W! _/ Y& V
, i- V/ Z4 [: @5 |. @
    // 使能接收 / 发送 FIFO
% S6 D9 {, E) D+ |( _5 ]% g! A! G    UARTFIFOEnable(SOC_UART_2_REGS);8 @, L3 g9 Y8 i; C  R$ R* {6 r

6 Y) Q1 A! }& G    // 设置 FIFO 级别
8 r: R: E  F- o/ d- ~/ e1 l    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
  e* ?* t4 N* ]- |}$ z0 Z) |" [+ X+ j* o+ f/ G& L' u
8 F2 e* y5 C4 h+ m
/****************************************************************************// k2 |" v7 K. M: `; a( f: i
/*                                                                          */
. A# H8 U- E* d/*              UART 中断初始化                                             */
8 L: ?+ U/ a. z3 o5 w. F/*                                                                          */
6 d3 _9 q9 j8 A9 Q/****************************************************************************/
$ q( q7 N3 A! B2 O# k1 T# jvoid UARTInterruptInit(void)
; z" S+ R7 |6 J3 ]7 Y. u: B{% S  J- w4 A# l8 e  {& K
        IntRegister(SYS_INT_UARTINT2, UARTIsr);. }2 F" y- q6 [  ?. X" V
        IntChannelSet(SYS_INT_UARTINT2, 2);0 R7 b$ s" T! f* r& f& }4 K
        IntSystemEnable(SYS_INT_UARTINT2);9 s5 s% _2 T: e, u% X! W9 V1 q* n

; X8 ^$ U( v- S* q( A7 E: H% [        // 使能中断
( z% j8 _, Z* A5 ?/ D( T& Y        unsigned int intFlags = 0;/ f; Z& T! t* p& T2 Z* A5 ?
    intFlags |= (UART_INT_LINE_STAT  |  \" m" q' g' g& ^
                 UART_INT_TX_EMPTY |    \1 e( G/ |; U$ P  s; b, `
                 UART_INT_RXDATA_CTI);4 Z# a% n$ A6 F  }% @
    UARTIntEnable(SOC_UART_2_REGS, intFlags);2 e' Y& Q0 {4 T
}
% Q9 x& g  G" o# N4 T: \7 ^; k- o2 P1 |- k, E5 }2 E' f
/****************************************************************************/
6 n# m4 |) f6 M7 ?9 M/*                                                                          */( U  G4 T4 B  y0 e& n
/*              UART 中断服务函数                                           */0 R$ G1 a6 U* Z3 j# u/ `$ ?* q8 p, z
/*                                                                          */
$ l7 @0 A$ S7 n, }: F9 ?/****************************************************************************/
6 m3 H6 q( \1 i9 s$ Z- gvoid UARTIsr()6 ^- n4 l& B5 b/ Y
{5 T; e; d- D  d" `6 V
    static unsigned int length = sizeof(txArray);
7 y; X0 N: x1 {' O+ I$ u    static unsigned int count = 0;+ W. R1 B6 a, G1 o  r" _. `
    unsigned char rxData = 0;
' t" u7 h& h. c! Z    unsigned int int_id = 0;
, H# l; Q& p4 J) A
- D% v* d3 ^7 ?4 s7 N; Z7 h    // 确定中断源
. h+ m8 E4 X) A8 h! D. {    int_id = UARTIntStatus(SOC_UART_2_REGS);
' ^1 u' y& q; l1 Z. h$ X5 H5 K* z( t+ K
    // 清除 UART2 系统中断
% b$ `" Z. Z1 H' Z6 d  F- F    IntSystemStatusClear(SYS_INT_UARTINT2);8 d9 j0 P  g, n% ?$ s

6 r# _! }( O7 z    // 发送中断. }2 p% J: [# e6 C
    if(UART_INTID_TX_EMPTY == int_id)
4 H8 @, `8 n  ^0 t4 R    {3 N& C4 ~9 H' }* F; @  m0 v% e. N) I; j6 P
        if(0 < length)8 ^8 |/ Y* l) a+ P' _- D3 @
        {* W+ Z) K! I- i) B
            // 写一个字节到 THR
# F, p# V# K3 m7 ~5 A: p            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
9 S& ]$ e* \+ V            length--;. |4 q6 N: W3 S3 k
            count++;
1 z) E* g0 {  j1 m2 t0 p9 X# y        }. z2 q; n  ^, `& ~) p
        if(0 == length)
, z# C; h2 z6 d/ m% N' ^, G/ N( w        {! T, a" |7 \/ z: y/ H; r! K
            // 禁用发送中断
" n) Y  H* h' p& L8 t" c3 w            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
1 a% G; i- Y+ {8 Y* b* p$ K0 c        }1 `8 q* @5 P3 Z/ Z- d" m% t+ v
     }
6 ^! x! l% H$ d4 n5 F. @# H; @1 Z% [* v' H
    // 接收中断
3 R, S2 O; i2 a% N; W7 f# O    if(UART_INTID_RX_DATA == int_id)7 }4 s% T3 x4 H
    {9 a  u  X  v: c7 z2 Z# J
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
0 V  n  y* X9 x$ `1 X- X3 T& L' B6 v: h" J6 v& r, y( }
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);$ i, h: {, _9 F' Q/ f- H+ [
    }; x0 m8 o) X% e2 T4 l

& i- _' E. n/ B4 u. J( ~8 v/ A    // 接收错误
' H) g! Y3 H8 U8 V" v, e8 {    if(UART_INTID_RX_LINE_STAT == int_id)0 N3 w: k! E' p4 X, P
    {
% b. @) x' Z% h* h        while(UARTRxErrorGet(SOC_UART_2_REGS))6 g9 i) f+ ~# l9 z
        {8 w6 \% g  z$ A* E" W# s2 |
            // 从 RBR 读一个字节7 t- ~: f7 `( Q- E6 w2 x
            UARTCharGetNonBlocking(SOC_UART_2_REGS);( e$ ~7 d0 \- @5 y; G
        }% {7 N! W5 y& U! x( C
    }2 }$ R4 i* }9 t5 \( x  d6 X: Q3 a) v
   
" n4 ]7 V7 R! x8 D' K2 ~3 C    return;
! c0 ^0 v+ N0 f7 W4 h}6 c% |( E8 g2 }2 ~
回复 支持 反对

使用道具 举报

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
. t1 K% W5 t0 Z! F. O$ C如果其它设备快速给你发送串口数据,你这边能正常通讯?

3 b; Q# k+ e4 F谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 03:19 , Processed in 0.044369 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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