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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5577|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
0 O- A& I2 {8 u. m3 a

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
0 z0 ~+ P* B& U0 m) d9 d; {# ]" x9 W& K) p! e
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
! m3 }3 h0 `7 d6 j4 w' I# M
0 K& A4 N1 i! k! ~7 |4 Y  b9 c# m#include "hw_types.h"               // 宏命令
/ H1 j8 c# \! ?5 L#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器2 g$ ~& g4 H' U3 I1 _4 R. i5 Y
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
  f( X5 V+ U4 u) z( Q
5 G  j+ t' E5 `! }& A, t#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明. Y+ F/ r& p* y! s
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明0 X; }. ^7 ?+ Z) I/ O$ P
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明. m. ^. ^8 p; E) ~. Q; E
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
4 S+ M  o  g4 F" q
6 f$ N3 A9 c5 r* M, N. ^7 d/****************************************************************************/. D+ p7 B1 b  [) K8 @
/*                                                                          */7 v0 F4 X/ F3 @! Q* C7 ^9 a- S
/*              宏定义                                                      */
8 e3 z5 C: P8 T* K# F/*                                                                          */, T  `2 Y6 _" Q0 X
/****************************************************************************/2 X1 Y2 k7 W* w1 [5 K* ]
// 时钟3 \4 |5 [8 f# `  ^
#define SYSCLK_1_FREQ     (456000000)/ p6 t# G1 O+ w* V
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)6 F* B7 A7 ]' v) a' u9 q0 u
#define UART_2_FREQ       (SYSCLK_2_FREQ)
9 i5 S' A3 j) S: a
( P9 d% j# g) f$ O; e/****************************************************************************/" f8 z( j4 {+ s: |
/*                                                                          */6 S4 b0 L8 J( F! D
/*              全局变量                                                    */
9 H& v* C7 Q/ _- D! X6 c1 _/*                                                                          */- ~$ T3 m  o5 e4 Y1 Z9 M6 K
/****************************************************************************/# _' O& U" R+ ]% u- T
char txArray[] = "Tronlong UART2 Application......\n\r";2 X% C( X% b6 S, p# H, A2 W; A

7 J  }6 P% X9 P- y: ^/****************************************************************************/6 _5 N/ q! _1 c* A3 ~- O6 q! `
/*                                                                          */& P+ m/ ~* `$ g, v5 g% N; u
/*              函数声明                                                    */# _" a; ~3 x- P
/*                                                                          */# O% y5 I+ l/ s" [% [7 f
/****************************************************************************/
6 g+ v  ]) l( H. N& c  M; N% A// 外设使能配置$ z8 n8 y! p$ u0 c1 v+ Y- M
void PSCInit(void);
8 y# ?) Y8 V2 B; h# }$ s, J1 i: _8 r3 p4 t, x2 d
// GPIO 管脚复用配置
% p7 U/ o2 ]6 ?5 B0 w9 |void GPIOBankPinMuxSet();2 h0 D2 j- K' J* \

6 ]1 z; M$ M# L  Z// UART 初始化+ @- x6 S1 r9 S; H8 [: }
void UARTInit(void);+ d# x* M' C# l' j4 }# I% c; p
// ARM 中断初始化: m" s  R8 |- B% c- D
void InterruptInit(void);
; e# N( N1 a' R8 J// UART 中断初始化/ N# k2 e" `3 B& s  A( E; {
void UARTInterruptInit();
2 C2 F, y3 Y; s0 O" X// UART 中断服务函数+ h& }- |( m9 _8 [# F& b/ t) G
void UARTIsr(void);
* z# T% m" Y8 W( a# K5 i4 n' f6 w2 L
+ ?$ c! e% c0 S. M/****************************************************************************/
6 v  y1 O* d: `/*                                                                          */+ x. f, i( g/ Q' ^" ^
/*              主函数                                                      */+ Q/ f3 ~6 c, g
/*                                                                          */
: L$ Q7 C1 o# R+ y# p0 k& @7 h/****************************************************************************/
9 W7 r1 [. ~4 h; X2 K- n- _int main(void)
. {; p2 k8 L2 k# {8 N, F{
; U. L  t( m' j9 u- }5 o4 K        // 外设使能配置
. m! L( o& o6 d% N; x( v        PSCInit();& I# e! j5 z+ L) {" j, t6 A
        0 _5 t# }( L0 b  \: l0 `
        // GPIO 管脚复用配置( [1 V' f) I' u- z+ @/ N
        GPIOBankPinMuxSet();  c2 F4 p2 z& q( x7 _' k' c9 ?
+ M) g) Y/ Z" y' S! `
        // ARM 中断初始化
9 S2 f" d9 C" \3 |        InterruptInit();
: ?* ]) n/ |5 f: S% J# C6 t
4 Y! L* r- }. y        // UART 初始化8 ^! I# o7 e+ H; r
        UARTInit();
/ I9 [! o; _3 e8 f# B  ]  @. g! E7 x2 |, L1 b# W( C/ u
        // UART 中断初始化0 P' k3 {( A$ y+ K4 x* B$ H
        UARTInterruptInit();. }0 [* E0 P. b2 h. \; C
/ v* t6 Z: Y) i2 s. j% B
        // 主循环9 q3 ]1 w/ S+ \1 f7 A* X
        for(;;)
2 H2 S/ G& v) S# p        {
8 B' u* S+ w8 @: }! I; V5 n' p4 f! p0 c' e9 y
        }
# C" l- s$ _  R* i6 e9 Q}
' [5 b" q/ K$ x& K% K* N, G, Z; ^2 _0 J9 L/ Q
/****************************************************************************/" r- Y5 ~* B1 [9 S6 l/ Z
/*                                                                          */
7 B8 @: J7 J+ s+ o) W3 p5 F  O. c/*              PSC 初始化                                                  */
( ~  @. U5 B# [6 H! y/*                                                                          */
1 L+ a4 V! m" s# m6 S' `$ P/****************************************************************************/% Z; s4 S4 s) O# _# ^( `$ J1 M" d, V
void PSCInit(void)
5 t; b, O/ ^+ C+ R5 s$ c9 l{) X: @8 A/ m9 ]; `9 m# m! d
        // 对相应外设模块的使能也可以在 BootLoader 中完成3 E7 y9 a0 i5 w3 Z! C, H# d
    // 使能 UART2 模块8 B5 e# u' ~& q3 g
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
, c8 L! a: T( Z& |) t3 G}
" [0 H+ J1 S( y6 V% Q2 |  Z( I3 j9 d
/****************************************************************************/
2 j' J* x! ]3 ?8 R$ P! X; e/*                                                                          */
; `5 F# V2 J* f! i/*              GPIO 管脚复用配置                                           */& V6 C6 b  g) h' c
/*                                                                          */
# W, b. O9 e2 G6 l* W( U# x. C/****************************************************************************/
8 h1 E. T9 ~' U+ C# l  svoid GPIOBankPinMuxSet(void)* D& y$ d3 @4 Q( K
{
) Z- M+ |4 _4 q8 I, B6 y        // UART2 禁用流控
( b3 H# ^: d* q        UARTPinMuxSetup(2, FALSE);7 x8 n4 @. S8 A& }& ?0 d5 a, q
}+ q' I; `/ ?8 p( P( U" K+ m5 T
8 H2 N, b; _3 n8 z
/****************************************************************************/
3 }8 }6 X2 S5 a/*                                                                          */
: K2 j+ }/ U  [6 m6 t9 g5 [/*              ARM 中断初始化                                              */2 a9 y7 K/ c" V
/*                                                                          *// v, m5 c# z( [' u" d
/****************************************************************************/
, @/ [0 X0 A) r! g5 Evoid InterruptInit(void)
( @5 A  y" G$ x" j4 f4 F( G  Z- h7 W{
$ l/ Z' y! U' i4 ]) \    // 初始化 ARM 中断控制器
7 m: U* u; M* i    IntAINTCInit();& |2 _% T* l0 d7 q( ?( v( H# t9 V

  S9 [* S8 B5 ~+ k1 z) H, e( y4 u    // 使能 IRQ(CPSR)
% p: w& t5 N" y9 _0 Q    IntMasterIRQEnable();
* l5 f, p0 {3 t6 f3 p
8 L( \- h' {3 c) y/ R+ d5 ~    // 使能中断(AINTC GER)
1 n+ ]$ P( P, ?  ^) S+ @    IntGlobalEnable();/ j0 ^) J& ~7 w0 d$ ~* ~4 ^! b! p
. n  P. ?# Q, _$ @3 `- {& S+ x$ o0 G
    // 使能中断(AINTC HIER)
! v# H! V8 i  \' W' x1 s4 X    IntIRQEnable();0 k" _  i+ o$ n) ~
}' {8 @; J2 H- ?3 g0 _! A

. J' `0 P5 Z7 f& I5 a5 w8 L/****************************************************************************/
, g8 t# v: _2 c/*                                                                          */( u. @/ B3 @) \  U  c
/*              UART 初始化                                                 */
' l0 v4 l2 }4 a* ]6 ]& j/*                                                                          */+ r4 z7 f9 v- U- {  q
/****************************************************************************/
/ w. z* m( H# q% B3 ivoid UARTInit(void)1 }# {" s- ^; ]* Z4 ]1 V& S
{
2 @8 f1 R8 U: u2 Q2 O        // 配置 UART2 参数6 L! n% r4 P6 y* d
        // 波特率 115200 数据位 8 停止位 1 无校验位/ P' V2 ?. M- d! e- F0 m7 N5 o
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,+ {' H% v$ W0 V
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);5 s% O: X4 R2 I
        // 使能 UART2
! G- j6 L: }9 C! c" h        UARTEnable(SOC_UART_2_REGS);
) O- o  X9 u: p& x; }
: D) g" J7 J6 J& ?% E+ x    // 使能接收 / 发送 FIFO! N, P2 j( w# M8 Q
    UARTFIFOEnable(SOC_UART_2_REGS);7 H9 A/ ?% g( n$ [4 W
1 y$ {! x5 [# a6 |" Z
    // 设置 FIFO 级别
3 y* [! k  a. W6 N! P" Y2 l% P    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);6 b  d0 u8 d: f4 W$ `8 R4 P! X
}. s  R* A, x, f8 X& ]
5 s' V' y8 f2 ]: I( i6 v5 |
/****************************************************************************/( L  a7 N; C4 E
/*                                                                          */$ S6 j: h& |$ i& T' c
/*              UART 中断初始化                                             */
# s5 {- D0 B0 B2 J1 A) R3 {6 L4 ?8 _/*                                                                          */
; z) v' e6 Y5 y/****************************************************************************/+ W4 q5 d4 v* O1 @5 d
void UARTInterruptInit(void)% o+ `* Z4 e/ S: u* x
{; i8 p# H7 T& A7 T$ R2 j
        IntRegister(SYS_INT_UARTINT2, UARTIsr);6 u- l4 o( G$ m' f1 t) F
        IntChannelSet(SYS_INT_UARTINT2, 2);& F6 j# R; {( ^) p3 n' y8 ?5 @
        IntSystemEnable(SYS_INT_UARTINT2);* U( U3 P: R# R
. n; u9 Q, r' L- Z6 F! I4 C8 c
        // 使能中断" `: }3 L5 i7 i  g
        unsigned int intFlags = 0;
; L& ^; f- B  e: j    intFlags |= (UART_INT_LINE_STAT  |  \
: x4 M8 F( v6 S6 R+ e9 m                 UART_INT_TX_EMPTY |    \7 \0 k5 i% {: J; P8 l# ?6 g
                 UART_INT_RXDATA_CTI);
9 J  f# _. z2 Z' n" K' k# q3 G* G    UARTIntEnable(SOC_UART_2_REGS, intFlags);
/ `5 @4 |- J, V2 v) L2 M; O' t}
6 W. D- W! r# g1 T' W* A
1 \! o5 @' }4 K4 v/****************************************************************************/2 _; i. a1 u. {2 Z; P2 U7 i7 T& a/ S# y
/*                                                                          */, c* g( C  O) ^/ D0 M$ _( D1 H
/*              UART 中断服务函数                                           */' u+ L: @5 }- n: s# Y0 |. y
/*                                                                          */
2 v( L7 @- G: V+ D, L! O& ^/****************************************************************************/# a- J3 D! X" X8 C. c+ e2 a6 |
void UARTIsr()
  P  h! V4 O6 m, {2 y{5 D& o$ S. u( ]9 A! D0 \% o) R
    static unsigned int length = sizeof(txArray);; n" E# w% [( y9 Q: u
    static unsigned int count = 0;' n4 x' p( N- I2 q/ _: L9 Y  T
    unsigned char rxData = 0;
& k8 L+ j5 h/ C2 B7 y    unsigned int int_id = 0;
* R9 U8 `& L4 ?3 R, `& j3 B! u8 m8 I
    // 确定中断源; L+ o- A% E. E9 f8 r( `9 Z
    int_id = UARTIntStatus(SOC_UART_2_REGS);
' {" A7 h4 {8 C3 e) C7 q& X+ I2 F3 z1 B, I- w& r* S* M/ A& {# ^$ L3 M5 A
    // 清除 UART2 系统中断- W7 v8 h4 E; {+ Q! z/ f5 ~
    IntSystemStatusClear(SYS_INT_UARTINT2);/ Y4 Y: g4 y7 R6 k/ d8 E' `( `/ A
/ L7 r8 Q: @  N# p7 i
    // 发送中断- Y5 N+ A8 Z6 J1 c  E
    if(UART_INTID_TX_EMPTY == int_id)4 `" l% M8 Q7 T4 C. S
    {
9 Y5 I0 Y0 T) |$ q- `        if(0 < length)
  @" s3 u5 L# t, C+ e' V        {
: d+ A& |& }  @            // 写一个字节到 THR& l, d7 }1 D; T: Y  V% @
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
9 Y5 n# z. [: N, }            length--;1 k* K  P) D" L6 I* f
            count++;
& T# Y9 j- F6 N0 D3 E        }  F" Q: T" t; J/ z- ~/ q
        if(0 == length)6 ^7 }6 W3 _* z4 p& D) A
        {" t) ?9 s* y9 `" ^
            // 禁用发送中断
6 ?& y, ?2 G3 ?: U0 z            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);/ n0 k+ Y9 W2 M6 c
        }4 {7 C2 u- \, ]( x, ^& [. s
     }1 M4 ~) v9 |, ?* F( y3 H3 z2 M
: D0 v: {6 p! a+ _2 I0 G
    // 接收中断
8 m& p% v/ _! f4 o! w    if(UART_INTID_RX_DATA == int_id)
- ]( d  z1 I% x2 X( R    {
9 X2 x2 _( q- C$ |7 Z        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
7 Q6 ?# J) c: @( D) [, A
5 b2 b* z. N4 [5 p/ I( [$ P$ u        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);$ C+ r6 d/ Y; t1 o) G* |
    }! f; ?4 x5 M! ~; p/ I6 G( Z$ W' g

' z( i8 D1 i/ b6 g3 P0 X    // 接收错误
( ~1 ]/ |+ w3 c1 v) l6 g1 s6 B    if(UART_INTID_RX_LINE_STAT == int_id)
: ~/ k& v$ [0 F) e' l. k* G/ P" X    {/ n. Y( n8 a# ?+ k' I- }6 h
        while(UARTRxErrorGet(SOC_UART_2_REGS))5 b3 ~# X* }- v* P
        {
4 ^5 l  l* I% ~1 S7 C            // 从 RBR 读一个字节
6 [6 m+ k! q" |* \& b            UARTCharGetNonBlocking(SOC_UART_2_REGS);
; I" ]) y# q0 C: G: g& y        }0 u( [0 k0 R/ d) ~" n
    }( o) m( `5 N5 i9 v0 P
   
' G  f# G( O6 F& r    return;" R9 E" t& L6 d! m
}3 {* K, r( U$ X) U
回复 支持 反对

使用道具 举报

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
; @1 @0 @) L) {* N如果其它设备快速给你发送串口数据,你这边能正常通讯?
; m( [4 g" a$ F$ f+ ~$ E3 A
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 18:20 , Processed in 0.038554 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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