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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6994|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
2 u) R$ q$ C. [0 \) T' J5 v

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

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

! U) [/ s9 o" w& {1 M3 D#include "TL138.h"                 // 创龙 TL138 开发板相关声明% Z3 I; x+ j0 r0 J0 r; @
( t# ~. b6 ]' K) G' \
#include "hw_types.h"               // 宏命令
! C% S" ~0 |  R#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器4 I0 u) Q3 c6 q8 V, @
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器0 S" r. N% g9 y' c& G
8 F8 E' G9 `; F/ g
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明0 c  s; I" d4 A9 a
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明7 ~0 q( k% H  C9 m1 c" H  G
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明, S, Z9 V8 {6 j! e$ H; j. R
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义) o/ ?& g& j) Y, i0 m5 `- E
6 f7 e7 N7 Q2 M" ~6 j
/****************************************************************************/3 |# _8 m$ o3 m1 V  e
/*                                                                          */
  R! v+ Z! e9 u* E# |, w3 T0 S) G/*              宏定义                                                      */# C4 h4 w& A( z
/*                                                                          */
8 ~+ N# u6 z$ o; u' C/****************************************************************************/6 P0 `& x, m3 }% k
// 时钟
' _; d$ h8 S3 Q#define SYSCLK_1_FREQ     (456000000)4 Y$ j. d: }6 E8 _; u/ e
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)- {+ O& j; h$ U0 K: _/ g
#define UART_2_FREQ       (SYSCLK_2_FREQ)3 v  X4 M' v: r- k5 g

/ f! [$ s7 J: B4 L- Q$ E3 G/****************************************************************************/7 M) I% K! `, m* a
/*                                                                          */
/ ?1 M2 M; V* q0 \7 `' z  y* [/*              全局变量                                                    */& D! n7 W/ F9 _8 k
/*                                                                          */
7 A1 U8 F8 T$ u$ K+ R/****************************************************************************/6 O( t$ q+ ]; I
char txArray[] = "Tronlong UART2 Application......\n\r";
) s8 z  M6 r  U2 Y- D$ i' p2 t8 \( v8 j
/****************************************************************************/$ b) d) }: _! R9 e* ~
/*                                                                          */: ]$ o1 N4 S: I7 e
/*              函数声明                                                    */
5 H1 ?: q/ i+ C" W/*                                                                          */8 ^" A+ Q+ y0 k# K
/****************************************************************************/1 W+ `0 I* }1 p: N( s6 d* ^
// 外设使能配置
- S4 x4 _2 o4 ]/ k2 b3 @. n; B# Bvoid PSCInit(void);
/ @* }  l! X0 {  r5 R% {. X; S& k) ?5 V% u  V8 f
// GPIO 管脚复用配置4 A1 T  ?  e$ Z6 c& y9 B6 Y$ o6 z
void GPIOBankPinMuxSet();
  |: e+ F4 w2 x* k* j2 s1 u, ?# l3 g/ C* k/ a+ v1 m# L
// UART 初始化, a. d9 ~" T+ |8 d' E" Y( @( |
void UARTInit(void);! s9 \) I/ ~1 N: D2 j
// ARM 中断初始化
7 e+ K2 a; N7 i5 S8 @/ Xvoid InterruptInit(void);( S/ G. g. A" s9 R+ I
// UART 中断初始化  I1 p3 }0 c6 z! @. ?( r  B
void UARTInterruptInit();* I: n% s% }+ d- `
// UART 中断服务函数& m' S7 U( K5 M
void UARTIsr(void);
  B& K) Q# q2 A% ~) _) Z, Q6 `# W# ?6 H3 W6 x
/****************************************************************************/
; r2 d6 M4 b5 g  Q& f- ]# s/*                                                                          */
: L( U; c' ?3 d0 Y/ G5 n$ p8 T/*              主函数                                                      */
7 j  n" V5 k+ H& }6 H/*                                                                          */+ |* Y9 C" r/ h' C3 H9 f; s( w. j
/****************************************************************************/
  o2 @6 _9 m- B+ x: R2 s* n- eint main(void)0 H/ [" K% X- |  Q) S$ U
{
# P: }: s  k+ ~' x  ]: o! N        // 外设使能配置% y" v) _' o+ T$ ^
        PSCInit();! O8 B& b' f3 f+ e
        4 B: |& H5 m: O6 M' n& J
        // GPIO 管脚复用配置+ i; r. ?! M8 h9 O& k% p4 z  B
        GPIOBankPinMuxSet();
% o; ~0 u7 d. j0 a! j  H# u
( p' p' j& z5 F' I6 e) V        // ARM 中断初始化
) z7 z+ R# E! q( C" Q: r* F        InterruptInit();
4 B4 j, V6 q$ O1 w3 L  o3 h8 u8 e9 I% e# C: f: U
        // UART 初始化
! k0 W8 H' r4 a" _/ s        UARTInit();
# H  f- a3 r3 J( F# |+ Q
* \; e) y1 H$ S& f: p        // UART 中断初始化* |! _2 _& j6 b# m
        UARTInterruptInit();4 Z& N0 L  t5 x4 H+ h" {, A

4 F3 |' A7 {  M9 E  h        // 主循环( w+ J, c1 ^' F) V. N) @
        for(;;)
; Y- X" c- h6 S1 j/ }5 _. }( ^. a" I, @        {
# E! i" }% q  E& L3 j- w! C
9 q/ @, r7 |2 D1 J/ [  V0 y( E        }
( a+ n  `- Y1 b% G* k, `/ x+ D; b}: Y9 V" b/ Z( ?1 ?: O) K

1 j7 b% Q& O" d' \. t9 h5 x/****************************************************************************/
* o& k$ f6 N$ D! M/*                                                                          */
' k5 M( G/ a' M2 ^2 m/*              PSC 初始化                                                  */
0 s8 ]: w# M0 R, N' X( T  r) a/*                                                                          */
9 k% w5 X# i4 i2 k/****************************************************************************/, ^+ d6 S, u8 H" K* N4 G
void PSCInit(void)6 n3 A; e' [/ _
{" ~$ @5 m; s1 |$ n$ @0 K: K
        // 对相应外设模块的使能也可以在 BootLoader 中完成
6 b6 I6 |$ U, y6 o( ?6 t    // 使能 UART2 模块
2 c2 x% [+ H2 F8 z3 P4 G    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);# y/ `2 k  j! y2 O
}
; J! F- c+ p$ V7 r4 Z% p9 K% j1 D- ~. B. K9 Z
/****************************************************************************/
- F: l- b2 ]8 h9 p# r/*                                                                          */  W# l4 ^" S7 |$ @2 A% G8 n( G' T
/*              GPIO 管脚复用配置                                           */
. ~" U1 f! u& N& Z( o/*                                                                          */5 N$ o$ e7 y1 M7 y
/****************************************************************************/; E5 {' i% U. f+ v) [* _
void GPIOBankPinMuxSet(void). z4 u2 p* d1 Z" ^# D
{( M+ {; `, T% {" `3 Y4 n
        // UART2 禁用流控: o8 h; Y- Y& A! H+ m
        UARTPinMuxSetup(2, FALSE);- L. I( l2 Y# a$ f
}2 V# [& N' i( E& k
* `: m+ Z# U8 ?$ `, G8 d
/****************************************************************************/
+ F% h1 ?0 ]( ?6 Z( S/*                                                                          */8 T2 D# z' I  a' n" b7 b2 w4 D+ }
/*              ARM 中断初始化                                              */8 v) H% W5 b: X% q
/*                                                                          */: H. n4 [: v3 r% g
/****************************************************************************/9 W/ T) G( I! J
void InterruptInit(void)
. B! r$ E# M3 m6 t{
9 R% c( m* [4 \5 O8 C6 l" ]    // 初始化 ARM 中断控制器' J: C' g$ }# n, A/ o
    IntAINTCInit();
8 a$ s0 v+ }! n) k9 c) B* w) L; ?, \
    // 使能 IRQ(CPSR)
2 s$ J/ h4 H* z- h" w  U# Z3 S    IntMasterIRQEnable();, y. p4 d- B4 e$ N# L9 o
/ Z) z8 B/ K( i5 q- |
    // 使能中断(AINTC GER)3 r# ~* X" L" B( w
    IntGlobalEnable();
3 ]- ^' b6 P" [/ u# G# S3 O
( ~; I0 V2 U: `) M    // 使能中断(AINTC HIER)/ ~6 L/ P" p4 [; k
    IntIRQEnable();7 q7 q4 R! k- R; U8 j* B
}/ a. z7 e# n0 z# V) R* I

# \0 d# b- h* ~4 B/****************************************************************************/
$ g* Q( s! w2 S/ w0 x/*                                                                          */
! C- r# X( \8 V/*              UART 初始化                                                 */1 J, k( q) @# Z/ W
/*                                                                          */! a# P: |2 @* D+ {. ~7 R- K
/****************************************************************************/
8 s8 y: i" a4 t: ^, ~void UARTInit(void)
% g3 {, {0 @4 p! l7 C7 W6 a! g{
1 Q# f5 t; s) l. ?+ M$ l        // 配置 UART2 参数$ m9 u" G/ r, i4 L
        // 波特率 115200 数据位 8 停止位 1 无校验位) O2 u' c) [1 K) E2 D
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,8 _& z* F( u# N" U  y% G
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);& B1 P( b" I  J0 R
        // 使能 UART2# H! c3 t4 C! ~3 n
        UARTEnable(SOC_UART_2_REGS);
* r' m: u) C; x& T
/ ~, K: L" q! c! u    // 使能接收 / 发送 FIFO
8 D# s# P7 Q' i    UARTFIFOEnable(SOC_UART_2_REGS);
% k1 r; R1 ?, k9 K% |8 N6 M- h/ o4 L& `3 Q0 I% L' V: J
    // 设置 FIFO 级别
" h1 C" t4 k# }% H4 K9 X    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
' |  ]3 W& X0 f3 j}* X/ W7 ]% C/ f& C
2 }5 C$ ?9 K( O
/****************************************************************************/& F0 H  i* f- H$ x/ e: b
/*                                                                          */
& u: V% W' \; [$ X$ X/*              UART 中断初始化                                             *// I. G) w: T6 k. ~' T
/*                                                                          */" Z4 A9 B+ u! J: z; V; P
/****************************************************************************/; N; L2 v1 q/ }. E4 d0 {
void UARTInterruptInit(void)' T/ N3 G2 X3 K& f5 n, V1 K
{
+ k* O6 @8 a3 l* I+ |        IntRegister(SYS_INT_UARTINT2, UARTIsr);
- g4 W5 f1 ^" P5 b        IntChannelSet(SYS_INT_UARTINT2, 2);# o0 v: H" m. G' D1 H3 C
        IntSystemEnable(SYS_INT_UARTINT2);
5 t6 B9 E' z3 n9 m6 s1 N: ~8 ~3 _: [' L* z7 W
        // 使能中断
) @: O% A& I0 v8 B( _' ]9 a8 d9 B        unsigned int intFlags = 0;8 p. X+ n9 O- m1 k" b4 K; F
    intFlags |= (UART_INT_LINE_STAT  |  \( N# M* D* ~: r" @9 C' h
                 UART_INT_TX_EMPTY |    \4 {+ C0 g; P! Y$ l6 I6 @4 Q* ~! q
                 UART_INT_RXDATA_CTI);! |, B/ j- u2 l$ G( W; O4 A* g
    UARTIntEnable(SOC_UART_2_REGS, intFlags);- Z1 S' _0 M: W6 V  F% M
}
; ]! D$ O: t% Q4 F+ K8 U1 k3 ~
8 L9 _* t* T: c/****************************************************************************/! v9 h: d" N9 m: u  q) V
/*                                                                          */
2 O0 `6 W0 x! @" e& J: s2 o/*              UART 中断服务函数                                           */
) L$ b. d. m/ X3 i/*                                                                          */
. R, H1 j6 _3 l/****************************************************************************/
' E8 S( z) s" |* d& u$ Q7 b* }/ }8 wvoid UARTIsr()
6 A  r' h4 d7 D" r, t) L{& r" E3 O6 l' u1 I% S- W0 r
    static unsigned int length = sizeof(txArray);
* ~+ F$ B8 Z& A5 {# J3 p+ F& C+ O3 ]    static unsigned int count = 0;: s# Y2 g: N) V( l5 b; ]+ j; S* O
    unsigned char rxData = 0;+ f. L0 R, U1 b+ f2 M* K! I
    unsigned int int_id = 0;7 ~/ ^9 m, w0 T2 R& N  h! ]
) `. E7 P- R& q3 e- Q: u5 H+ G' q
    // 确定中断源
! K/ d3 D) j/ Y2 m$ K& M    int_id = UARTIntStatus(SOC_UART_2_REGS);" o6 u5 f) \  r# G; J
7 j" i0 A: e& @& h% u& b2 [
    // 清除 UART2 系统中断
& H% y8 x( D2 j$ w    IntSystemStatusClear(SYS_INT_UARTINT2);
9 S" @5 Z  g4 c. X5 o3 m$ }
0 @6 s. A1 s5 A4 T    // 发送中断- N& s: v, m3 h# L- M
    if(UART_INTID_TX_EMPTY == int_id)
7 B8 O' }0 m% x% J! ]- U$ W    {; x4 ?. S7 C- i* M; A2 s
        if(0 < length)
% g+ x! S0 U, z        {
5 Y  o- l6 n1 f+ [' m            // 写一个字节到 THR: R3 l! @, T: A3 s- c: `. |9 L: j
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
" r8 e9 ^4 I+ u, t5 L( w0 V* S            length--;
7 q+ \8 f- W% [* P+ u            count++;
2 t; p5 x2 H$ n$ M        }
9 R4 H2 Y& G3 c( Y        if(0 == length): l$ h+ y8 C5 ]9 R
        {
2 k; @3 Y  S2 W3 _" o            // 禁用发送中断: Z* h* ]9 f4 O6 |5 B
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);; I3 e" k" j6 G
        }8 c5 q2 _( a+ B1 v6 B
     }- `* x4 n* I' a7 _5 l2 |3 S0 o

% t7 F3 E$ \, M! u# p    // 接收中断. o9 Q+ T0 P- G( ~! @
    if(UART_INTID_RX_DATA == int_id)+ M+ f9 z* T: [3 \4 a7 H' V
    {
: P- {2 ^! f7 f/ S* E" e5 v        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);2 j) _$ o7 f0 U- U7 D- ?; m

- R3 D- j9 R% j( G4 k' {6 z        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
1 V5 W* b5 ~( o1 W6 v  M    }
$ z5 {! i2 U( |1 z
; o; A& {# x! J; S% l: \    // 接收错误* f  d) K: c( X" g
    if(UART_INTID_RX_LINE_STAT == int_id)0 E( F* i* [. I# a: D, W1 l
    {, B' l( e- [6 L/ l9 _" s' E# ~, i5 ?' }# U
        while(UARTRxErrorGet(SOC_UART_2_REGS)), W6 P' @. a/ `: P. w% @( j% A2 N
        {
* P3 d& ~% B8 Q$ E            // 从 RBR 读一个字节/ w/ _8 b3 [6 m+ X2 u7 X
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
# P' g6 W8 U$ p8 u( W        }
5 V4 i  e+ T. {5 f% s    }7 k4 [) |# N% o, x/ O
    ! @$ ^  h! F5 T3 U$ @5 O4 q) D
    return;
( j6 b5 D9 r/ X% i; s& f8 B; ^9 A2 \+ y}
4 B5 ~5 m* Y. g
回复 支持 反对

使用道具 举报

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:250 r' V3 I( j' Q6 ~
如果其它设备快速给你发送串口数据,你这边能正常通讯?

) K( f& I* u# E' h' _( p3 s! y) n谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 09:10 , Processed in 0.043850 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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