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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8282|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。7 m! ?$ C) ]( h7 K% l# P

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
+ x5 _  ^0 \4 N: s. t5 j, ~* y! C6 [
$ q$ l/ s6 G1 J+ F#include "TL138.h"                 // 创龙 TL138 开发板相关声明
8 F' [& n' J3 z2 f) y, z% g. ?9 b* l. j5 u/ Q  `; Y+ a6 c8 X1 N
#include "hw_types.h"               // 宏命令8 e, T( {$ l; I  y  i
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器2 F: P" l; `; j8 x! R9 j
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
& K1 q$ z3 \' h/ V) v: j* Q
1 f: _! _. l: B- X2 p#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明  m6 Y2 r  ~6 Y3 R3 S
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
2 q# n, Q$ G4 L, q1 f#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明4 _9 }" Z* b9 z  x( R9 `$ A
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义1 y, e6 A- N$ e% |4 [

/ D% c: M# V- Z: W2 c! D9 o  b/****************************************************************************/* n( v) ]0 F8 O4 ^# r* ?$ u# Z" G
/*                                                                          */  s. H/ [, H, K3 t  w. x5 F
/*              宏定义                                                      */' g3 L2 q. l9 d& r
/*                                                                          */
: E' N# x$ P8 }3 w6 r/****************************************************************************/# h* }" S1 }& R
// 时钟
1 F0 A, p9 ?6 B5 V' q4 V#define SYSCLK_1_FREQ     (456000000)/ w" i8 i) p' g, @6 V0 Q* R% S$ B- `4 q
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2): j, `' p( s6 Z3 B2 m+ t/ @1 _
#define UART_2_FREQ       (SYSCLK_2_FREQ)
0 D" W3 T7 x9 O$ X1 G- r7 J' T% b9 v
/****************************************************************************/
3 ~1 D9 x0 R' U0 k9 m3 [/*                                                                          */5 L( y7 G+ ]6 G8 g
/*              全局变量                                                    */
: p/ a, e8 v5 O) a/ ?- V1 b/*                                                                          */
; w6 ]  C4 }& i1 Q! X$ l* @/****************************************************************************/
6 F* g9 H  D' Z( B- ]' uchar txArray[] = "Tronlong UART2 Application......\n\r";0 I# B* Z1 ]4 d8 D1 c
# ~# e+ p/ }, l$ E/ ?* ^- w. o
/****************************************************************************/
7 m+ U, u0 e; g( T7 W/*                                                                          */+ p, m5 m. u- f' H0 T
/*              函数声明                                                    */
: |5 m' R6 F* c9 y/*                                                                          */
+ q9 D6 F# ]" E- L6 N: i3 o0 T% c/****************************************************************************/- l9 [- c+ O. \( t+ V( |
// 外设使能配置
  O1 G  R7 }! L+ S  j2 Y+ Fvoid PSCInit(void);
7 z  A2 b  w* N2 \  N5 D3 z+ b5 P2 {8 M5 n2 T; l
// GPIO 管脚复用配置
+ j* ~2 z/ \# b9 }0 k+ |void GPIOBankPinMuxSet();
( U7 |" D4 e! N6 x2 l
- v! y/ @" R2 t. ~: z; z// UART 初始化. Y- T, h0 \, M
void UARTInit(void);
8 D( `7 Q. n0 G& x// ARM 中断初始化& r0 Q' {/ L* m$ {) l1 p" p5 _  D
void InterruptInit(void);
! @6 U& y2 }7 E9 Q1 b// UART 中断初始化
& Y9 i: S! P; dvoid UARTInterruptInit();8 i4 w: S$ N9 g) ^( n3 T
// UART 中断服务函数
7 I9 c4 B2 {/ p& Pvoid UARTIsr(void);
7 O0 P+ G4 d- b5 ~: R( u# Z3 K4 l3 L8 M# B! i9 ~
/****************************************************************************/. S8 t, ~- C- }2 A. t; d
/*                                                                          */
% R1 F( j. o4 @( U/*              主函数                                                      */8 H8 S9 z" {- }! p- o4 I
/*                                                                          */& o. g  F- G% V1 B5 o& S: b  ~
/****************************************************************************/  s) U  A: r3 j2 E
int main(void)
/ r' s! N2 N) ]+ h{. B& J" W0 r, K" _) S" ^$ k& M
        // 外设使能配置
. v* k/ P7 h! s  f  K        PSCInit();% d7 T8 i* W# `/ N2 `) R" ]" n+ G
       
$ u7 F1 M  ^* {        // GPIO 管脚复用配置
( C( g& w3 g5 j) ]  C6 d6 n        GPIOBankPinMuxSet();
" L/ Q: P3 Q% v* [4 B: C; [' m! d3 N" v* o3 E9 i8 g4 ]
        // ARM 中断初始化
8 c! u# H; M' y  h  L* b        InterruptInit();
" |8 T; m0 l- @4 M6 e" P  X# b  ~' x! e( X* _! F4 k
        // UART 初始化
) V6 G( h/ m$ i: A/ N4 v6 Z* U- ~        UARTInit();
" J: }0 t0 N- P4 P5 p+ l: a- ]$ H) F. Z$ @- U# o
        // UART 中断初始化
. e5 I/ a! m9 l, z; O        UARTInterruptInit();
  p# h3 k2 d$ e- Y3 d
3 {5 {0 [  L& v# Q/ r1 k4 H        // 主循环% J1 r. m, q- p. N2 }& ]& L
        for(;;)
: _# m2 C# n6 b& d- s; m% V        {
& @* b5 U) U1 o8 c% b; \4 t5 N" x9 ~) o6 b
        }
# T* a, T! S7 I7 |. l) s( @}" o( a: c8 ]) Z0 L5 D* I! ^

" X$ T4 ]& ?$ f, S  b8 [( F! w. y/****************************************************************************/" G+ t. g9 X' g6 k) e6 a, S$ b
/*                                                                          */3 v' n0 |; f' S( ~6 ]+ l0 Z
/*              PSC 初始化                                                  */7 n/ Y% n8 u3 ~: [; [5 X
/*                                                                          */* T+ N" @0 c/ y% K' f8 a& M+ \
/****************************************************************************/
" ^; ]0 J( b/ C& `7 ovoid PSCInit(void)
! T7 H- r5 k0 ^0 N' [8 j8 B{- H. g; g3 {- E9 h# k
        // 对相应外设模块的使能也可以在 BootLoader 中完成6 x' f/ h2 `  F% [1 q, T
    // 使能 UART2 模块) p8 w) [" f5 p  }5 J  B1 I$ f
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);/ M5 A% [( V- h5 e! F& X6 I5 B
}' r2 D+ T% W7 N7 D0 b
8 b0 p0 i; e. G& D* p7 V% k
/****************************************************************************/
) g: K3 m! M. O* ?! ^* c/*                                                                          */
# {" m0 g0 D2 e/*              GPIO 管脚复用配置                                           */
  x$ M# `/ \: C% [/ u; Q6 A/*                                                                          */% w5 L# V/ {/ m- n! a/ R6 s
/****************************************************************************/+ C5 A  A' X- a- I" G
void GPIOBankPinMuxSet(void)+ m1 k0 }% o* }% |+ t& v
{2 d5 G; j: V' A5 M' z% X
        // UART2 禁用流控
4 S/ p% l6 S3 I: T) N        UARTPinMuxSetup(2, FALSE);
2 _6 M, @, h5 J7 t0 O$ x}
) \) a5 P7 [: J  b+ r/ B* n) I
% X: z! g4 \% C% T& K* Z; m/****************************************************************************/' f, w. j! _/ H- i! E, s$ b5 `
/*                                                                          */% b% Z9 Z. {4 d* x7 c
/*              ARM 中断初始化                                              */5 M1 G" E* M8 V1 e9 L  Q1 P3 g; k+ _
/*                                                                          */
6 J8 [7 A1 Y$ T0 g/****************************************************************************/
: `% X, b4 l0 {void InterruptInit(void)
* i8 c( H# O- r' u{) I# J) ]( |  p/ c$ x/ {" r
    // 初始化 ARM 中断控制器
0 T4 p% N+ H/ |2 u! C! b    IntAINTCInit();7 d" r/ Q* p7 G

* h* E7 c+ D; z) o    // 使能 IRQ(CPSR)- h' Q3 `! H+ F' W" g) S: G
    IntMasterIRQEnable();4 ~8 b" ]) O9 q; h

3 K# F4 R* l* [5 I3 ?* {' w) P    // 使能中断(AINTC GER)
) i4 g: o  l, D; \% o    IntGlobalEnable();
1 h9 m! l/ E+ {0 v% Q9 l/ K7 E" L8 b/ Q8 l9 f6 B' a
    // 使能中断(AINTC HIER)* ]' e* {$ e2 f. \- ]  ]# C8 ]& q
    IntIRQEnable();
. v  ?& p& s7 a* j5 o1 K+ T}
* u$ `. r" H, `: R+ [- O  o( G/ [( x; j. U, K! Q
/****************************************************************************/
( d. a- q8 {2 j$ d" g/*                                                                          */5 ^; u$ H4 u. ]( B
/*              UART 初始化                                                 */. J. [4 t: J9 N7 E# r/ j
/*                                                                          */+ f0 u; p' m5 e  m
/****************************************************************************/5 L( z% w8 [/ v: X
void UARTInit(void)5 i6 I) V' X$ I" f
{: B2 k- s- t' x( b6 M# f6 S
        // 配置 UART2 参数
* T1 c: d/ t& f        // 波特率 115200 数据位 8 停止位 1 无校验位
9 D  S+ N/ w( J    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
. m2 \1 [1 O- f; f' P3 t" {9 u                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
- R. n% q$ Q9 U% F5 n        // 使能 UART2- ?4 |& J- Z# q
        UARTEnable(SOC_UART_2_REGS);
) W# B0 z! M* ^# \* B/ ~
) O+ Q7 o. n7 S( T    // 使能接收 / 发送 FIFO
. F4 `- \# Y$ Z9 K3 V    UARTFIFOEnable(SOC_UART_2_REGS);
+ }; `5 A6 |, k
$ H7 T" i+ L8 ^6 ~    // 设置 FIFO 级别
+ |. ?  v" z4 l' N! J# `    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);+ J% B4 w: a4 |& y5 H1 J
}$ c/ a3 a* k! |

7 c" ~, A4 ^1 v1 Q3 |: G. U) l; i/****************************************************************************/: x' j8 x1 X  I& O( c1 @/ V
/*                                                                          */5 r+ `$ O+ g% d: r7 o4 Q0 q3 {: h% T$ c
/*              UART 中断初始化                                             */
' k: `0 |  a  h/*                                                                          */
/ T5 @9 o+ @9 ~& O- d' w9 U/ o& ?/****************************************************************************/
: a4 q6 i) w# D7 v6 @) @% vvoid UARTInterruptInit(void)
6 z; S0 Y% B* Y0 p$ p& v& ?{" U: H/ R/ W0 O% v( V3 h
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
5 _& M8 M  d: e6 Q        IntChannelSet(SYS_INT_UARTINT2, 2);3 Y# w5 X4 R2 a' o7 A+ ^
        IntSystemEnable(SYS_INT_UARTINT2);: {, F* R7 g# p1 [8 n2 z9 Y
7 w$ D) i# O4 v' g
        // 使能中断' W% ]* D8 N1 j
        unsigned int intFlags = 0;
* t( U) Y" O& O    intFlags |= (UART_INT_LINE_STAT  |  \
7 O& s! e4 w  |9 H+ D+ d3 U% l7 l                 UART_INT_TX_EMPTY |    \! ^/ a5 v% y2 v6 \" y" L: r
                 UART_INT_RXDATA_CTI);) P5 s# b' o, `' ^4 t1 a9 I5 ^
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
, z5 T6 L9 X# g% H& I8 R}% r: Q) K. a' {+ F3 Q

( A# v, Q' C) Y3 D6 A/****************************************************************************/- ~/ D* ^/ W- a* f' a: D, _' a' {; M
/*                                                                          */8 M- |+ F& C6 W& Z1 `, x" \9 Z1 N
/*              UART 中断服务函数                                           */
: u2 \) X7 s1 k: L7 x# ]% _4 ~/*                                                                          */
0 W$ b5 }6 g: s/****************************************************************************/3 g+ r  }, K' T& C! @
void UARTIsr()- j, |( z; I9 a; Q
{
% `7 m; E/ G3 ^" S) q# }* X    static unsigned int length = sizeof(txArray);
  b7 ~! N7 ?/ q3 F    static unsigned int count = 0;
" b3 G, D5 T( S    unsigned char rxData = 0;# T# @9 a( |7 |+ A5 k
    unsigned int int_id = 0;- o- x: V' V- o& O

( Y8 D. h0 V' c. E! C  J    // 确定中断源1 @6 T+ z+ S4 M2 U% Q
    int_id = UARTIntStatus(SOC_UART_2_REGS);( k" B% W' i  K9 F+ Q9 l6 U
' N( x$ h" z9 }- |
    // 清除 UART2 系统中断
9 y$ L3 T9 h0 w5 W6 N1 A2 N    IntSystemStatusClear(SYS_INT_UARTINT2);
4 Y# P4 N) |4 ?1 p. Z. R% D! w, `: d
    // 发送中断$ g: }7 G# W2 e) D9 h* O# y9 ^
    if(UART_INTID_TX_EMPTY == int_id)1 U8 H! O5 s& S: v( z( @
    {& H0 `9 z- h, Z' w
        if(0 < length), H( z. \! i4 O, M
        {% T+ ?" M, B8 x1 w- t$ h
            // 写一个字节到 THR7 d3 b. @- ^5 ^9 a, `2 _; y
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);5 U4 U( J( I( u' \5 ~) C; {; @* n
            length--;  ~; v: m! Q* G* |
            count++;5 I" M* D5 J/ ^: V/ W; K
        }
1 g* T! j% n2 U1 s0 K3 k, I        if(0 == length)) H2 p& k4 c' b  U- u. ]  Y1 v
        {/ @: `( q* H$ e! z
            // 禁用发送中断
# x' S3 {1 w# B$ a* E            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);( Q6 s2 x( g* k6 W7 N
        }
  ^# v) ]9 g4 v- _" z1 Y- j7 B. r     }
( q1 H8 D# U% _& D3 ^- m# a1 ?$ Z+ S/ e- J" z1 P/ O! @
    // 接收中断% x5 S. w9 g8 M! N* ]
    if(UART_INTID_RX_DATA == int_id)
' E  O1 R' L4 d6 k    {
9 U$ ?5 `5 _9 v8 o% t        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
! K8 s: ^# q3 A* m" H. N8 G! W" S" r8 `; _# a8 t4 n
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
/ ^- A( p0 W  ~6 ]6 K+ p5 q    }1 T% M8 w3 u% |  k
, I- b. z4 C' a/ W0 R+ J
    // 接收错误- {  Y  k4 |& z
    if(UART_INTID_RX_LINE_STAT == int_id)
+ v3 f2 T. i5 w8 ~% q, K    {- c% w: w% m3 g7 K% G/ L
        while(UARTRxErrorGet(SOC_UART_2_REGS))
0 z, e7 W: M0 ~& O7 c4 g        {
+ L% U9 _* q0 Z% e            // 从 RBR 读一个字节
2 I1 N: T" e! _/ I1 s1 J3 b            UARTCharGetNonBlocking(SOC_UART_2_REGS);
4 U! b& h4 h/ c5 @, n2 T        }
8 r# L* u; Q' N0 u) f5 j6 I    }9 Z, \7 m) M3 r" l* n& y* m- e
   
0 o" ^' }& }: i4 Q9 z6 s* Z# b    return;
* {+ E/ L& X* B7 e}
" C- |: x" N7 g/ F/ i. f2 i. d
回复 支持 反对

使用道具 举报

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
) f2 _% _" M5 Z- `如果其它设备快速给你发送串口数据,你这边能正常通讯?

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-17 11:57 , Processed in 0.042429 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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