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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7397|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。( x7 V8 J2 y7 [$ M

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。) e; q$ f( i( @/ I
) u: K8 t& @' X8 y/ n1 _+ {7 ?
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
2 d) ~" C% t$ \3 t8 `4 x1 Y" G( U  ]% r: T( Y
#include "hw_types.h"               // 宏命令  P; V0 V! e% |; ^! U
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器& l0 j/ O  t. `& U% S5 i1 P
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
7 R9 E% C6 ]9 @" @% ]' l0 X. y6 `$ m! K
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明* h, ], j0 t2 S/ `( C/ e
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
8 y( v: A0 f# F! {. b4 G4 ?" z#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
/ G$ a! n9 B3 }#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义" V: O" L9 k$ S; I: `8 W9 F2 ]9 k/ ~

$ p7 j5 f; D  H* m/****************************************************************************/7 a- L( s! L8 `; `, J8 M
/*                                                                          */( M% }% I, v2 B+ U% ?5 o6 u
/*              宏定义                                                      */0 z  G9 c5 t+ ^3 [( U- `4 _
/*                                                                          */1 X. V! H" _8 b6 \) v: N
/****************************************************************************/1 V& x6 ]# _/ @, A# _; n9 R
// 时钟
, k- q5 G1 h# I0 S; t- Y- S. O: C#define SYSCLK_1_FREQ     (456000000); M! q, Q1 a2 \  }
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)' I+ s0 v& d+ s0 T
#define UART_2_FREQ       (SYSCLK_2_FREQ)/ K4 v" f6 J( n/ v( L& u
3 E, I6 g, g" Z2 U
/****************************************************************************/1 V) p1 E2 c( [5 E3 ]
/*                                                                          */
/ K* H& T; \3 |/ l9 m/*              全局变量                                                    */
5 f- @& i% r( ~& n( r/*                                                                          */+ e( [1 A/ r( [6 _) V9 ^! s
/****************************************************************************/' Z6 X5 ~5 |1 t) I
char txArray[] = "Tronlong UART2 Application......\n\r";
5 W3 ]6 Y: Y0 a$ k" P7 v" E1 Y- s( |, d& d) \' X
/****************************************************************************/' ~$ X, k3 ]/ [
/*                                                                          */
4 k) o: A$ T% j$ G; r/*              函数声明                                                    */
/ y0 d7 ^9 `1 u* z/ |6 b+ {  h/*                                                                          */
; l3 f5 A6 h: [/****************************************************************************/9 |! P6 ^( y: e6 @
// 外设使能配置
" E$ }, I3 E0 o, z! wvoid PSCInit(void);
, u. H& x. e8 j5 H7 q  J; b, ]( v5 i2 A- M* w
// GPIO 管脚复用配置
: w5 ^2 }3 _) e4 W9 K/ ?$ Lvoid GPIOBankPinMuxSet();' x: ?+ n) x' t' M9 l  f% Z
, E9 X4 d" e6 S  k2 r
// UART 初始化- A' ^. D  x, h. x, E7 h' L
void UARTInit(void);
! |, b% L7 Q( o4 |6 e// ARM 中断初始化
" i; E% V( @& O( Nvoid InterruptInit(void);0 q) B$ E0 T( O5 I8 I% ]
// UART 中断初始化
& u/ b# X4 J8 \) C5 Kvoid UARTInterruptInit();
0 b7 M5 w2 Y+ |% |; d9 I) k// UART 中断服务函数
( X" |0 a) N! D- O' u& `0 svoid UARTIsr(void);( ~! ?; o2 c' g* \
( s: d! x- }6 K- X* F) l! Z
/****************************************************************************/' y3 J6 @- H5 w6 P2 H/ c+ u
/*                                                                          */3 W4 x4 g+ Z; B6 X! M0 ^
/*              主函数                                                      */5 m# d& }- \& }# G$ a
/*                                                                          */
& J1 _! ], x" J. x# N- ^# A- R/****************************************************************************/
1 I+ G+ z+ f* s6 s( a$ hint main(void)
& M$ }' O4 A# @% _' V) i' ~{. U+ ]$ O6 w# V. x
        // 外设使能配置
1 p8 M0 N7 R0 y        PSCInit();
1 I5 E7 Q0 B0 Q0 N7 v3 N' o* y       
9 M* b0 R1 m2 i. O% F        // GPIO 管脚复用配置) j; O0 ~5 D6 j" `" ]7 G
        GPIOBankPinMuxSet();
# ]  u+ U) B  z6 ^' c, k- z
9 U; U* J# w  z8 \        // ARM 中断初始化
" Y/ E. U" R& ?( S" e        InterruptInit();: k! F4 U+ f  n% Q
! a) r' j' @7 r1 C9 |' M
        // UART 初始化
: N( U! ]3 i8 m        UARTInit();% `0 y- n  A6 C$ [' @
1 E: K% R, C1 U# F2 a$ G7 Y) u7 @
        // UART 中断初始化8 ?+ D& H# W# P$ ?- B" W* Q7 f
        UARTInterruptInit();
% z2 R1 t) \0 T/ ]  P: V, z1 e( ^* `9 }' L+ k2 y
        // 主循环! s( r' A# F. b3 `. v5 [
        for(;;)4 ~$ |; K! N9 m7 m
        {0 U, F2 ~* t' H8 X

" U9 b" m# H! ]! |; p* I6 D        }) C* Y: {; \0 i2 N
}" S% Y1 V+ S7 Y  D& j" q
# O( w3 x1 S, ^- O
/****************************************************************************/# d4 T2 q' t  F0 u1 \: o
/*                                                                          */
  ?1 {' f7 L. n) ^/*              PSC 初始化                                                  */: e( R) c' b- B% c; z
/*                                                                          */- r; R4 @) O4 K( j* {. Y% G6 ^
/****************************************************************************/
" ]' _# r$ L7 jvoid PSCInit(void)5 B% X7 @- \- z4 e3 _) P
{
5 E$ O9 J5 N4 [        // 对相应外设模块的使能也可以在 BootLoader 中完成2 M; l) L& N' }& d8 d
    // 使能 UART2 模块' b" o, s. T' O% i0 k+ z9 W
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
* @: J! h, w+ @  K. l}
) |; g0 H" _7 P( ?6 l' \7 @" \# |6 b7 H0 ~( }5 L
/****************************************************************************/
4 {: {2 h' @# q' K/*                                                                          */
+ c: M6 H8 X3 t/*              GPIO 管脚复用配置                                           */
1 |5 Y2 s( }% {/ q6 L" o/*                                                                          */
; w. y( i& q1 L4 z/ d7 W/****************************************************************************/
+ u, h1 x( ?9 ?8 |6 x1 y- ^void GPIOBankPinMuxSet(void)
8 k1 o# K4 t8 l0 P8 J  T( o  Y{* U$ d3 U, H! o* z; G9 t( y) e3 C
        // UART2 禁用流控
. F( J% m) d# C$ n  ~        UARTPinMuxSetup(2, FALSE);
- ~- {# I4 j* I}* o, @& t; M" d4 Y  f1 h# f

/ y* r. I, m& q! c. K% ~: P7 t/****************************************************************************/
9 |5 H: Y" f; ?4 o% r# z) R/*                                                                          */
5 o; W0 W- _+ s/*              ARM 中断初始化                                              */( y5 d5 V: p% ~& [1 y4 f
/*                                                                          */
3 F( w5 J" ^/ E8 T6 ]) Z/****************************************************************************/) o0 s9 s; ]/ O% n; K9 p
void InterruptInit(void)
2 A! W$ W6 V2 z9 o$ Y{
6 P/ {1 D4 L  c* p/ U. d* c; O    // 初始化 ARM 中断控制器
0 {; W  b# e7 J% J. d    IntAINTCInit();
4 h) E' o9 }+ A- ~' o; v' a5 M% M8 L' x. a8 V. U: Q
    // 使能 IRQ(CPSR)/ ~6 b/ G2 `! t" I
    IntMasterIRQEnable();
; Q1 z- P: v5 r& v
, [% }* |. t  @& h% \7 `. G    // 使能中断(AINTC GER)5 f' T( p( A% B1 y: Y( e' R  \+ A, D$ e
    IntGlobalEnable();$ K) z8 t; U& v9 t  E- X& ?
& E4 Y! d; j( K
    // 使能中断(AINTC HIER)
' @' t: r- ~6 A4 ^& ?5 {) h: |    IntIRQEnable();
: J7 p; ^8 C. ]0 G3 X, D6 l}# `- w7 K6 n7 U: F
) |' G, @3 F' L
/****************************************************************************/# p: _) Z; ~) Y+ V5 Y$ h
/*                                                                          */8 s+ k8 i* Y% Q: W
/*              UART 初始化                                                 */1 V8 E3 O6 z3 \0 t; F2 X
/*                                                                          */
4 d; H; M! V& v5 a& ^% K" b& X& _/****************************************************************************/. i# c' u. C1 W( p% L2 s
void UARTInit(void)
; N( m# f- m5 e2 H0 a% i{5 j2 a; S7 x5 `3 |2 |$ ]
        // 配置 UART2 参数' j- k2 q" j4 {/ p5 u' }
        // 波特率 115200 数据位 8 停止位 1 无校验位
* M+ v" t7 M8 v+ z: G& Z- {    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,, N7 L2 x" [& x( `( C# x
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);6 d% x# @  e. t$ p0 x
        // 使能 UART2
& U7 V9 G8 n7 C6 y        UARTEnable(SOC_UART_2_REGS);  B8 x6 b+ F- L" J
$ A) d6 w# S4 ]  g! r( P+ w
    // 使能接收 / 发送 FIFO( b( l* s" Z, i( x. \) G, n
    UARTFIFOEnable(SOC_UART_2_REGS);, V9 i* U/ J4 v

$ L  d3 C- ?: h4 z7 A( d  e    // 设置 FIFO 级别
& Q4 y/ d+ q/ z; s4 x) A+ W7 ~    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
9 w) c( A& D% a  s) x$ t}3 J6 e+ b: G* ~; G3 m" W- A: w8 H

  r' r8 D7 S3 L9 H" F+ v/****************************************************************************/
  r8 l# |* w0 U# O/*                                                                          */
: e  z9 _0 b6 Z0 ^7 V8 g" N/*              UART 中断初始化                                             */
7 s: i! T3 u  L$ T* t, y9 m/*                                                                          */2 x& y! z- U7 v) B! W- t4 v
/****************************************************************************/
; I3 l* _4 b& M: nvoid UARTInterruptInit(void)
6 c  Y, x" l6 X) X1 j) D{2 r9 a8 \2 W1 x0 N% Z3 c+ r, R
        IntRegister(SYS_INT_UARTINT2, UARTIsr);' _" d& o* r  n% @1 y& {4 j$ w# `
        IntChannelSet(SYS_INT_UARTINT2, 2);
5 r3 B1 I9 x" v) j        IntSystemEnable(SYS_INT_UARTINT2);
5 o$ p# q9 x. l+ z: Y
" D3 `6 C4 _) L" k& i        // 使能中断. A/ h% y0 R  W* \. q  t# F
        unsigned int intFlags = 0;3 v) U+ T# i7 C, P. \! o- {
    intFlags |= (UART_INT_LINE_STAT  |  \  L* P! d/ B  K7 S
                 UART_INT_TX_EMPTY |    \5 l1 R0 _5 V( s+ ~! H+ l
                 UART_INT_RXDATA_CTI);4 K/ N4 b  \$ @1 u0 |+ s4 h+ R5 q) z
    UARTIntEnable(SOC_UART_2_REGS, intFlags);5 H0 }7 {; A) u2 X  O' R2 x5 ?7 X
}, S- P. {6 H1 L% _% M
/ e2 ~8 N+ ?& X
/****************************************************************************/
; P1 {. @) a0 h! U  Z/ z/*                                                                          */: l) \) D+ c4 a- Y
/*              UART 中断服务函数                                           */$ ?5 q  |7 T( g
/*                                                                          */
$ \! Z6 w  N$ w# A: i3 K, N! b/****************************************************************************/
$ W" P, g9 U4 v: @( X% ivoid UARTIsr()( B  b& z6 {* [" Q9 P
{
7 R" ?8 [; C0 D, H0 E' Q" n6 y: i    static unsigned int length = sizeof(txArray);
, D' Z. i7 ^2 Q! h; R) e5 A, J- A    static unsigned int count = 0;3 A* k9 Q% y* R; c" q
    unsigned char rxData = 0;6 i  F% z- c- P1 J2 B- i8 T$ [
    unsigned int int_id = 0;
5 m5 q& b% h+ H0 S9 P. o+ e5 G: I" T  C. ?: s
    // 确定中断源! v% C; s' L7 W9 i( x
    int_id = UARTIntStatus(SOC_UART_2_REGS);3 ^' b3 q+ M$ Z5 V4 H

; b/ [  V6 c# h+ x; E    // 清除 UART2 系统中断& P' S1 ?  F1 q3 E. o' _/ W  O* `5 x
    IntSystemStatusClear(SYS_INT_UARTINT2);
3 h, q5 v) t4 I5 ?  A' W& k# L
  ^: G3 v; G0 |. c, T    // 发送中断6 d0 g' ]5 a2 T: v
    if(UART_INTID_TX_EMPTY == int_id)
  i- W5 w; G! P# _8 ~3 m# ?    {
1 ]  m* v9 E$ {, F4 E        if(0 < length)
0 V( L3 B/ R7 f. `3 U        {1 W7 _+ n1 _3 N) X1 o" i
            // 写一个字节到 THR* x2 ^) J7 J2 C
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
( W1 b9 |0 H5 B            length--;- M- g( E$ v# @$ H8 p$ \* e
            count++;0 y2 H; e( ^: B9 ?% u9 h
        }  [6 B- W2 u5 G. B' h
        if(0 == length)5 J/ f9 A3 |. w5 m
        {, u. q2 p  S/ d9 Z0 y; n7 U
            // 禁用发送中断
- a7 G& a  t7 Q% c3 A            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
$ d' |8 i0 z, [0 p: G( q7 C        }
/ d3 D$ e0 G- Z" B7 i& x$ {1 ~     }" J% y7 O& F6 }  U9 G. Y

% V6 n8 u0 h- v8 n9 O    // 接收中断1 e9 `, b& i  p( f
    if(UART_INTID_RX_DATA == int_id)
4 B# F, }# C, v    {
9 _4 B2 F4 Q! o0 A( @- k        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
" [5 c  L# `7 K0 Y5 u& z* B2 s, w0 M; N* b+ U( [! Q- q+ p
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);3 z3 ]: Q( x$ X4 _3 v& A
    }
  V: G+ H6 e8 }+ c$ i/ O4 n; h8 W/ D8 v) n
    // 接收错误
' S0 R/ j; n' S% v# H. m- j    if(UART_INTID_RX_LINE_STAT == int_id)
& j; r$ J& q; k" c* b: G5 Z. [    {) U$ G7 Y) K+ _7 [2 v5 o
        while(UARTRxErrorGet(SOC_UART_2_REGS))* X" G4 X; {" Q
        {# z. S; u  c: k# p8 p
            // 从 RBR 读一个字节
' R/ @4 H4 N/ Q% w; ]            UARTCharGetNonBlocking(SOC_UART_2_REGS);
& O9 M! q/ E7 v! b        }
4 j) A) O; ?, ^! A4 h: {    }/ P% H! k. U$ n8 e9 L
    / q" d& ~5 J5 j- A/ }7 B0 m
    return;
; o! X6 z! z/ j2 c}9 u+ C$ V! V$ ~# 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) }, S3 h1 S  |# r! D
如果其它设备快速给你发送串口数据,你这边能正常通讯?
" U3 C1 H' Y! o. @$ L
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-7 06:12 , Processed in 0.042264 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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