串口发送中断触发条件 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8567|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
1 r9 R( J# O( x$ l/ X: V7 l

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
1 L5 A8 E+ S% \8 n. d6 A& ~7 e; q* i4 a( l
#include "TL138.h"                 // 创龙 TL138 开发板相关声明+ H" B$ T1 p6 X$ Y) ^; s
; I: `3 ~: T0 n: u' |; J
#include "hw_types.h"               // 宏命令
5 X* r7 [/ Q/ \4 P; D* `% n#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器+ o, R+ X/ y' T5 ]3 d4 X' ]2 u0 Q, w+ O
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
7 n. S$ D* s7 A( D' @4 O4 d( p5 {! a8 B: T5 T; j( q, t* o# R0 n* K
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
& J( H! M5 t! K* u; N3 M3 x#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
' s7 t! T& Q1 Q# A$ K$ u#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明5 h5 O8 ?) M) X" j1 {
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
: k8 ~+ y8 M! K" J/ x5 w% B  e$ O+ p1 n$ l
/****************************************************************************/2 o1 Q, b3 W1 \, L- h. b
/*                                                                          */
& X  W' M6 I9 }! x1 [% P/*              宏定义                                                      */
! q' e, d( \2 G8 T7 B. l$ K/*                                                                          */7 X2 Z* R- B  k- ^" c/ n1 r
/****************************************************************************/: k2 N' B$ }7 \( w; U$ h
// 时钟
/ W' X0 \  @. B#define SYSCLK_1_FREQ     (456000000)
+ d% E5 t4 q; Y, l& t+ `; z- B- B#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
9 \* U0 @0 {# n! }+ o#define UART_2_FREQ       (SYSCLK_2_FREQ)
5 e" O8 L+ T3 y+ u8 y
# {6 |; f3 `4 i  I3 J& E+ x& G/****************************************************************************/, J- R3 Q7 E) Y4 a" ^
/*                                                                          */7 }6 u) v# Y7 i" S, H2 a5 h
/*              全局变量                                                    */2 s4 ?8 O' c, Y
/*                                                                          */
6 `$ O& n. A4 u9 l/ A7 l/****************************************************************************/
+ a  k  d: N' V( h  ]" d; |) ochar txArray[] = "Tronlong UART2 Application......\n\r";" p( J! U, m! M
: Y( s! N& z5 s+ g+ j7 \
/****************************************************************************/
' V1 T* D3 r" r/*                                                                          */" D1 N* R" Q/ Y# x
/*              函数声明                                                    */, m* Y& w  a# d, u, |9 L1 v3 A; N
/*                                                                          */
* _) C4 {- C. `3 Z7 X" P) ~/****************************************************************************/5 I* i0 M9 Z8 r3 J
// 外设使能配置
' a, L2 W2 ~+ A9 d# O! u8 lvoid PSCInit(void);
" ~! V  m% r/ L# N) v$ t* k
$ N  w2 s8 F1 y# L* e0 S) s// GPIO 管脚复用配置) _6 ^/ ?( q; m
void GPIOBankPinMuxSet();
+ S+ o6 K8 `1 V9 `
$ U) D; s4 |% _( V// UART 初始化
6 r! w  `4 H! N8 Wvoid UARTInit(void);
7 Y/ ?7 L% B6 X9 J3 {// ARM 中断初始化" k- h* J! ]; u7 |1 ^
void InterruptInit(void);( d/ F0 z1 t/ _  E! ~1 Y- m+ f
// UART 中断初始化0 M/ }* \8 w3 I* H# Z2 }4 g* i% w
void UARTInterruptInit();, C& l/ ^2 q- I* b! g
// UART 中断服务函数' q9 y! W1 E# M
void UARTIsr(void);
9 p1 U( x6 H3 I& V5 l- I" l- X3 P- U  T, W+ u0 I1 K! j4 l$ k! ^
/****************************************************************************/; G6 ]) f8 l' h* m/ q
/*                                                                          */
- w1 [* S( ]$ ]4 v/*              主函数                                                      */8 A6 r. n7 u% h
/*                                                                          */
$ W1 `* J% S/ r# p; f% g/****************************************************************************/# j+ V. ], q% ^+ V. m
int main(void)
' Z+ F5 ?4 F2 ]# o6 E{
; l5 z/ l! z8 b, i1 \- U        // 外设使能配置7 Z+ [8 I! F8 A& o6 u/ O! Z
        PSCInit();
) ]# J  z% @: T+ d4 L          n4 |( ~1 f* A5 N
        // GPIO 管脚复用配置
* j, S: U5 t  E        GPIOBankPinMuxSet();
$ x* T2 l) T% \. g$ e; C, c5 }& T7 Q9 p" \. b' V/ R
        // ARM 中断初始化3 H4 n  K- N' T( t
        InterruptInit();
7 v3 k. L; F1 `# z5 |! Z3 z2 k9 ]( S0 F, o& U0 S% I* {
        // UART 初始化
0 F* W- h2 j0 `; d) ]        UARTInit();$ i0 J$ {& c: ~) W8 z8 i
- N5 L1 u$ i7 I9 l
        // UART 中断初始化$ n  ]* [5 Z* [( l
        UARTInterruptInit();
5 t1 P- h9 E; n' V& z! E5 p- \' \
0 P2 [* I; i1 O6 U  ^6 [% T        // 主循环/ ^% C* ]. n0 e0 C( H
        for(;;)
- Z2 t0 z: B! {8 `. Y4 k        {
! c# f! Z; s5 |$ O5 b  r2 O# ~" e) M- J
        }
7 l: Z# A8 a" R9 J5 l% I* i: V9 I0 L}1 V; ]9 T  W- s$ f% q0 z+ f! `1 ]
' j! C2 _8 L* {, y. {* O: V
/****************************************************************************/! {+ n6 a; E" C# x
/*                                                                          */2 C0 k7 N" {- k' T6 i8 K# y8 n) \* V
/*              PSC 初始化                                                  */  D1 F$ a4 `& U4 x. @, l5 h
/*                                                                          */5 S3 O' X, Z0 e4 |( \. E" ], W
/****************************************************************************/: f- D2 a& \2 \9 Y
void PSCInit(void)3 I+ a9 _. P0 d# Y9 Q% W; U
{
: f) K1 n5 g: d2 P! y        // 对相应外设模块的使能也可以在 BootLoader 中完成, k' J) S5 {# a! X
    // 使能 UART2 模块: L! ^! Z7 X; K9 R
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);" T" s9 z, ?4 @; Q7 K! a2 R
}
8 }3 T. B% _# z4 A/ A! z2 g7 N8 o) f5 f, Z. Q
/****************************************************************************/
0 A  d  [' C$ I+ h. c; S/*                                                                          */
. N* H/ C7 ~) g& U7 R0 K( ~7 o/*              GPIO 管脚复用配置                                           */; }" L4 |4 g0 T3 y! z
/*                                                                          */
6 \9 R6 ^: N5 M! n+ Y8 i; J' y/****************************************************************************/
) V$ ?: O) F$ e( m1 ]void GPIOBankPinMuxSet(void); X: G8 W- g: E( z5 g  h
{
+ w6 j: f0 n4 d4 n        // UART2 禁用流控' b9 r$ x: w7 a
        UARTPinMuxSetup(2, FALSE);
' L( Y, {, Q6 N4 X}
( y, k1 l7 t# J" M5 l* K: r" d$ Z1 F& g9 h" Q, [' V+ k" q
/****************************************************************************/
4 C5 _" z* d- I/*                                                                          */
! d5 K5 `* s- g+ O7 {" X" q* n/*              ARM 中断初始化                                              */+ J4 o) A8 g8 U& I$ w0 v
/*                                                                          */* q' R& l9 K) a0 O
/****************************************************************************/
" Q! c% Z0 W$ Tvoid InterruptInit(void)" I0 d7 Y: p/ r# T) g
{% q7 t: Y6 g. p
    // 初始化 ARM 中断控制器
  o! O- R) \% E! e- ^    IntAINTCInit();
( N/ O$ ^: D" Q+ i3 f  o7 V" D+ o0 Q9 |
    // 使能 IRQ(CPSR)
9 h  E' s; m6 w2 n: ]& {    IntMasterIRQEnable();& }6 M! s5 w8 \
+ K6 W* o# z- K; W0 Z
    // 使能中断(AINTC GER)' \9 q) [! Y! Z8 W/ Z2 E- U
    IntGlobalEnable();7 b9 ?1 K2 G1 `2 }( d$ f. J" ^6 r

2 j* a+ ^* A' n# f    // 使能中断(AINTC HIER)9 D4 F; r0 d* H9 V: q
    IntIRQEnable();
) ~& q) {6 M& R1 K( w$ h}
2 s: ]& n" d) }- d$ d3 }5 R5 ~3 ?2 R! V8 N/ c3 g7 T8 q
/****************************************************************************/* p- a5 w* U3 M. k1 |4 d: q+ ~! E
/*                                                                          */+ r" G5 g! J7 M3 y
/*              UART 初始化                                                 */& P$ o  Z( ^4 F1 ~0 E
/*                                                                          */; Q& {8 C. D( {5 @4 E
/****************************************************************************/
5 z- Y# B+ f$ k1 L7 Qvoid UARTInit(void)
& |) t( h0 B$ S- _& B! \/ g2 _{5 J' Q3 w+ A9 J) P/ S2 M
        // 配置 UART2 参数
3 Z" S( I! t: i/ ^9 O2 H$ I9 l        // 波特率 115200 数据位 8 停止位 1 无校验位
4 V1 N% ]* d, ?7 I3 j    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,- U0 E/ B8 f* Q
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
6 E3 i. x! g# {! K! R7 g3 R        // 使能 UART2
" c$ ?. I4 Z& X        UARTEnable(SOC_UART_2_REGS);4 Y2 ~. H$ O$ {: a/ a3 j9 y/ n
2 g9 g% d% P/ T& D
    // 使能接收 / 发送 FIFO( L2 Q# p5 K" G- o$ y$ X
    UARTFIFOEnable(SOC_UART_2_REGS);
9 a; |( ]$ p0 |8 {- R; ^4 h% M: O& K7 |- e% @
    // 设置 FIFO 级别. m1 F5 s  k" h9 N
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
) @; i9 E" m, h4 n) O+ h}
5 Z! \# d' ~: `! r' g
( F& C7 d$ y: Q/****************************************************************************/
5 ]0 c2 u. n5 ?; {6 y/*                                                                          */% M9 Q% a# e1 B0 e; Q
/*              UART 中断初始化                                             */% G# g/ ?' R0 l3 T
/*                                                                          */
( i7 N3 ?; F: t1 ]1 |3 x* S1 m/****************************************************************************/
* O$ R1 m% W) N9 K" G. C; q; L- Ovoid UARTInterruptInit(void)4 v; `- {1 Z7 i' c* x3 p
{
+ E% F) n1 G# j5 G9 h" [' l; K        IntRegister(SYS_INT_UARTINT2, UARTIsr);
1 I. X7 l6 i2 h' r        IntChannelSet(SYS_INT_UARTINT2, 2);. s# o- v; o3 X9 P# b# R- y" w; h& o
        IntSystemEnable(SYS_INT_UARTINT2);
# Q1 C  l( E+ e
4 y3 u* {9 ?' B# D3 t; k: e        // 使能中断
; `  c8 i; r! m* M  {# L7 r        unsigned int intFlags = 0;7 }) ]" l8 q' k5 S
    intFlags |= (UART_INT_LINE_STAT  |  \. O4 v; r7 Y* m( c1 ~: w" r
                 UART_INT_TX_EMPTY |    \9 ~& q2 t+ E5 I4 p& R( V
                 UART_INT_RXDATA_CTI);& z0 ]1 H( P' M1 J# I# n% ]3 `
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
& }9 U8 I! H  |! ~3 @( A}
7 _" B; k2 ]  N" `) ^6 G( L, |! ]1 [; V
/****************************************************************************/
% O5 {- F! V, ^/*                                                                          */$ f6 j7 E/ ^! V0 [  t  H+ z
/*              UART 中断服务函数                                           */  W% m, ~" b( ^1 A/ j  F
/*                                                                          */  U* f) Z: z" r6 F( d0 `5 Y
/****************************************************************************/
3 I4 s, m) l8 `8 m* Avoid UARTIsr()# h8 x9 h  }3 x8 E
{
4 K2 P9 i& n1 }) t( E  G" f    static unsigned int length = sizeof(txArray);0 W2 s! f. X- {$ N" ~/ V  ~1 N
    static unsigned int count = 0;
' v! a7 f1 K" z$ {) I  i, U    unsigned char rxData = 0;
) a* v, W) B: Y, x/ N# n    unsigned int int_id = 0;7 \% k1 @% X! M

! n2 M6 ^1 I5 F& [- x% K, |    // 确定中断源! Z) X  v" u$ b+ ]/ H' M- b4 E: Y
    int_id = UARTIntStatus(SOC_UART_2_REGS);
- e$ u3 S) q+ l4 F  L
4 w" @2 a7 u' @1 @) z& ?! `    // 清除 UART2 系统中断
& P4 q& v  S! b! E% @8 c- G    IntSystemStatusClear(SYS_INT_UARTINT2);9 u/ {8 j* O, Y

& j! Y& U0 K/ V' J" V    // 发送中断
6 g. A: J! v  r% J% V    if(UART_INTID_TX_EMPTY == int_id)
! c! s" V) ^& |    {: o9 A/ A* D0 ^! ^
        if(0 < length)+ o& E6 C/ e1 O3 I% @! H; b
        {7 ]2 w& F9 n( p1 T. \* U
            // 写一个字节到 THR
, i4 }2 f+ Z1 D. g            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);2 \8 ]4 z4 n0 i; H( R" v
            length--;
: Z2 P6 x; W6 G7 \% g3 w5 B  ?            count++;% I4 y  ?; e( D6 B. b
        }6 E7 [. d2 O, z) n% w# ^" b
        if(0 == length)  Y! f$ ^% v* r8 J+ R( N8 I
        {. \6 }# f: z( u7 N% F- e
            // 禁用发送中断
9 D, i* A1 |/ j            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);" \; X0 v& N/ @( p% C& r0 @
        }, @& K& |  `' d! _: E7 q& d: o
     }' J- \& a6 b2 L
+ c7 \' a7 u* f5 O0 ^: C% Z
    // 接收中断
, j; P+ }# b9 S2 l. ?0 X4 \% v    if(UART_INTID_RX_DATA == int_id)
' b* L2 r0 ]  k% n" h    {
7 o+ l% ~5 {% T: q% D& J        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);; Q2 N& d% i$ z0 v- |

; r, q8 g9 ~- h( O! K        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);" m) A% U- X$ a/ l' k. C
    }
  }/ D5 M7 S- S& N
3 S% B0 R+ Z- v9 F# z$ T( k$ ?    // 接收错误  i) m0 u8 h4 g
    if(UART_INTID_RX_LINE_STAT == int_id)) ]2 e$ _" C# k9 B4 \6 }/ t' G1 Z$ k: _
    {9 W9 }$ I) ~: B& J0 u8 k) e5 K/ h7 o
        while(UARTRxErrorGet(SOC_UART_2_REGS))9 V. P4 d2 M2 C$ d
        {
% c' x  i3 a+ e; @            // 从 RBR 读一个字节% C3 g$ b, p7 [% O  k
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
) R4 B2 P! d  m8 a2 ?        }6 a7 u8 @/ d0 A; p9 w- h% Q
    }
4 ^, a- S$ h% U    1 N- |& R; t/ e0 t; W0 @7 M: A, L
    return;: f4 g) r8 L# C9 j+ o5 F$ V
}3 Q* z  ?+ N; F5 ]
回复 支持 反对

使用道具 举报

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
* P6 H( O- u5 N& ?4 Q如果其它设备快速给你发送串口数据,你这边能正常通讯?
( D6 B2 T/ E* u: ]: y  U$ V
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-3-1 05:50 , Processed in 0.042777 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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