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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5600|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
9 c. W7 c$ q2 G" S

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
地板
 楼主| 发表于 2019-5-5 22:36:34 | 只看该作者
785235014 发表于 2019-5-5 22:25/ x" P6 g  s* s  @) Z
如果其它设备快速给你发送串口数据,你这边能正常通讯?
# M6 X; k, n4 d- f# P8 h
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

1

主题

5

帖子

1034

积分

金牌会员

Rank: 6Rank: 6

积分
1034
板凳
发表于 2019-5-5 22:25:37 | 只看该作者
如果其它设备快速给你发送串口数据,你这边能正常通讯?
回复 支持 反对

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
' ^% ]) H2 V" k3 _) P' Z; Z! @8 I7 U
, c  D' D; G& \# F* F: K4 [' E#include "TL138.h"                 // 创龙 TL138 开发板相关声明$ ~/ U0 a. {9 X- i3 o2 T& y

3 u$ B3 |5 |. a) f; K9 W" p/ d1 V#include "hw_types.h"               // 宏命令
; ~1 u1 s% ]" r; E" V; W% H" v#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
7 h3 C. j9 g4 H#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
$ n! _; [8 y: f; w- ~& m% |# i. H4 X, Q" \3 m& C4 J# j' c
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明0 g9 u7 D, c# I# X$ z3 m  Y9 e
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明7 q- z5 O$ V2 D8 F8 o
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明+ f# r% W' F/ z
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
, R! p/ y* ]4 Q( y5 b
8 j' S* K; b) w1 b/****************************************************************************/5 J( V! t! m* G# w3 d9 v: L
/*                                                                          */3 m" I' N* ]2 _4 v) o! d
/*              宏定义                                                      */" _* v2 s/ r8 m; q" M2 N
/*                                                                          */
6 C+ E7 r9 Q, e1 n$ T/****************************************************************************/
# u4 V7 Q, ?) q$ H* E( `: z// 时钟, g( [& j3 J0 `3 P
#define SYSCLK_1_FREQ     (456000000)# r0 U1 l  y( N) j3 H: c1 ^- c% y
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
. d' l$ _$ t* T. c#define UART_2_FREQ       (SYSCLK_2_FREQ)
) q& N; S# n1 X9 y' R# p2 K7 I: s# s$ U+ E) ]* a% o4 p) Y
/****************************************************************************/1 Q% G- H( U8 \  M
/*                                                                          */
( }7 S7 I* ]! g! k3 t/*              全局变量                                                    */8 c1 u3 {9 O7 E, i7 q' M
/*                                                                          */% _" g* N" a+ [2 }# E
/****************************************************************************/! q3 ]* A! x2 w0 [; A0 f& `5 o
char txArray[] = "Tronlong UART2 Application......\n\r";
9 q4 j, Z( l1 b( k
, g- M0 l% x' B: W0 E/****************************************************************************/
: E1 e  f) }; s/*                                                                          */
1 s; r  ]  O5 {. ?" C/*              函数声明                                                    */
) l: F" R! ?, A/*                                                                          */) I2 }9 |) J1 g  r( P
/****************************************************************************/) J% u; z# y, f. D
// 外设使能配置5 w' |! d1 J* g# _; m/ c" t' B
void PSCInit(void);& |3 ]- S. P- D2 t  s
- M9 h6 z5 D/ h- [% D. h' V* x
// GPIO 管脚复用配置
3 }+ _6 t1 M5 G. dvoid GPIOBankPinMuxSet();
+ i4 P5 L- ?  N4 R5 b8 G2 h# J5 n4 z, i- r
// UART 初始化
7 G. ^- v# S$ ^. f, s7 hvoid UARTInit(void);
1 L* O0 a% D; o, W% [// ARM 中断初始化1 N( A  R$ D- l. N/ _
void InterruptInit(void);
9 h7 p5 o. O7 ~4 I! j9 ^+ {) A// UART 中断初始化8 _" V; G5 h& @) D1 B
void UARTInterruptInit();/ P0 H6 k& R0 Y# x
// UART 中断服务函数
0 y' U5 N8 G% C' t+ n" D% S! C  evoid UARTIsr(void);$ s2 N7 V- A) t# x" Q4 d& m, [0 k
" Y8 |6 q; A2 f& b
/****************************************************************************/
6 j2 T* h1 b! z8 [, `0 ~) E2 Q( }/*                                                                          */0 k3 a: ~8 v3 A* k1 ?
/*              主函数                                                      */" X9 J1 i; U  K1 B
/*                                                                          */
1 j2 j9 x) J; h4 w/****************************************************************************// V( x6 C" d! K7 U3 @
int main(void)
6 X% D& i( o; Z) D, }9 v3 k0 _{1 R' f8 C/ ?( E6 G$ p- a
        // 外设使能配置& R" i/ e) @9 A) J8 t$ f
        PSCInit();
% J/ h0 [! T1 |+ p" L        * }6 l7 s' K4 }/ D* h
        // GPIO 管脚复用配置
( r  W; T9 Y9 q2 m9 [( v, H, O        GPIOBankPinMuxSet();. g! v7 d' @6 D0 ^; d
0 _" w) }) O  u# o( J* s0 m
        // ARM 中断初始化1 V' f5 E! T* y2 ~) q8 v7 ~2 G
        InterruptInit();
& Y5 z6 `' C4 ^+ P. s5 B' s
; a) O/ e4 U, k& X$ e! P( n6 Q        // UART 初始化( c( g. W0 R" }
        UARTInit();* b# {6 ~7 `& G0 ]

$ r" q8 c, }" `9 |$ u3 {6 {        // UART 中断初始化
0 R, f+ e0 b' n. P- `4 `4 G4 \. H        UARTInterruptInit();
2 m4 y1 {5 {0 G" ?+ e7 y# K. Z  x$ G* |, q
        // 主循环
) a( t" _6 R$ r' n8 u8 S& }, p        for(;;); J$ |  B. T2 ^9 ?3 T
        {: S# G0 x5 G4 C0 L
$ _1 b; ^8 p0 P: [
        }7 A! ~& T0 Y9 @0 v7 b
}% h( L& [  [; z) U2 n. a/ F

& e6 v0 y7 y  q+ V/****************************************************************************/5 P. c2 M  ]+ ~' o
/*                                                                          */8 s1 y4 B4 W. j( X
/*              PSC 初始化                                                  */3 B3 c, j7 m" U" d- [
/*                                                                          */0 X1 l/ p  k4 H  F% Q0 B
/****************************************************************************/7 \7 N( _# ?* V" F, }% T
void PSCInit(void)
0 S* F% ~  Z% H7 ^5 \{
8 c& W' P3 a  A* o# u1 K        // 对相应外设模块的使能也可以在 BootLoader 中完成/ e. s" z7 G/ P) A
    // 使能 UART2 模块
; ~- t& C9 W: ]5 z+ }! I9 v    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
6 [5 z( e8 F6 y1 A' q, \/ A7 K}% K  ^  R) ?6 R8 C- V& H# E2 ~6 P- R
' _/ o7 L6 v. G
/****************************************************************************/
7 @1 D- \3 O2 K8 w2 j5 ?  _, I: O: W/*                                                                          */
- i3 P9 P, a% T/ x! e- ^. o/*              GPIO 管脚复用配置                                           */9 q2 x# ?) x9 [8 A, y) I
/*                                                                          */% R. g- N" b+ B+ Y- Q
/****************************************************************************/* p3 u, p# u* r! u* Z
void GPIOBankPinMuxSet(void)
/ ?% f- X  |/ `{
. o+ U& E+ Y. G6 k. d: b        // UART2 禁用流控# i3 F: p  _' Q2 B+ D- V* |' a
        UARTPinMuxSetup(2, FALSE);
1 X' D9 m8 b, C; t9 O& u. F}
5 m* ~) x$ i8 s5 ^8 F- Z4 T0 r
0 E% o+ q3 u1 _8 S. u& b/****************************************************************************/
/ D, a- n- [- a7 l" o/*                                                                          */
0 {# o5 C4 @* j/*              ARM 中断初始化                                              */
  ^  \# a. J* W( v5 t6 v/*                                                                          */
2 A; \" A) ~" y4 ?7 {* t3 Z9 K/****************************************************************************/) ]2 n2 z! m! c  T
void InterruptInit(void)7 n& H% M* S. s. ~( s1 s2 n% T
{6 _' W) k! j+ K5 X, \
    // 初始化 ARM 中断控制器; f; n) d8 g' \4 s! m
    IntAINTCInit();+ H# \' ^# T) m5 j# H

) o$ {4 _9 ~- {: z3 b1 h    // 使能 IRQ(CPSR)
. ]( ], V8 \# x$ C8 }8 @    IntMasterIRQEnable();
$ |# `5 [( h$ f; O5 ~5 G/ ^2 }6 I: b4 a0 K) c' b
    // 使能中断(AINTC GER)* f9 ^3 H' `. Y
    IntGlobalEnable();
( a( h0 m, a3 e# V1 w: l0 e0 e4 W2 F- y. [
    // 使能中断(AINTC HIER)
# e+ m3 h5 l5 x( [# w4 z    IntIRQEnable();
0 s9 q( O+ P2 @+ u4 Y}
& c" H7 T5 M& k7 F& p; }6 n2 L! C& D5 g) B( f1 a6 o1 r. i6 o4 D
/****************************************************************************/
: S9 [0 W4 ~; V' L" K/*                                                                          */5 M+ Y2 C5 k, b6 x
/*              UART 初始化                                                 */0 ?7 X  a, A# e, D
/*                                                                          */. X: \9 R( g8 O7 z
/****************************************************************************/
3 Y4 g/ c9 H( Gvoid UARTInit(void)- G* h0 a0 W* ]1 h  K$ H; _- X
{
3 y0 Z# o( s0 H+ X* I/ _' f        // 配置 UART2 参数5 k3 t6 o8 P5 o$ D
        // 波特率 115200 数据位 8 停止位 1 无校验位
" y! \" ^4 G( \1 H    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
2 l4 R7 F$ m1 u2 T, S6 r5 X                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
) z2 X; L- n& c  f$ D( \        // 使能 UART2
3 n: r: b' @4 Z+ u        UARTEnable(SOC_UART_2_REGS);8 U- i- v; Y+ u1 T
: e* g" v3 e! S
    // 使能接收 / 发送 FIFO0 P( W4 r; O" t: @
    UARTFIFOEnable(SOC_UART_2_REGS);
' R$ U! `5 Q7 ]0 _$ B* \0 `% ?! i& A6 f0 N
    // 设置 FIFO 级别
6 Q0 L3 q  f8 u" k0 S" I    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
' z: l" v* @: O3 D}0 p! i* Z7 R/ @
: S5 }/ L: n3 Z" Y
/****************************************************************************/: o6 j0 q0 c4 O6 H
/*                                                                          */
# F. _: j5 F& X5 D* }( U- o+ N* O/*              UART 中断初始化                                             */
/ J  r# x0 d7 P/*                                                                          */. N  C& z" D/ ]9 g; w% p: ?7 R) h
/****************************************************************************/% Y% o5 o. ~4 v, k* L
void UARTInterruptInit(void)
+ C; ?7 W6 o% d% J3 A. d9 I- w{
. ?% |5 A0 E- Z* p9 \        IntRegister(SYS_INT_UARTINT2, UARTIsr);7 e$ b1 @! |0 W2 m0 }( r
        IntChannelSet(SYS_INT_UARTINT2, 2);
! t$ r# A7 q5 f  M        IntSystemEnable(SYS_INT_UARTINT2);5 C; F; \6 }6 q( t( C! ]8 [/ O% Y
3 R1 d8 R8 s( O7 m
        // 使能中断
8 p' [  ^1 k0 ?; ^: |        unsigned int intFlags = 0;( V) D: l+ J* M& F7 E5 M' o
    intFlags |= (UART_INT_LINE_STAT  |  \, q! }9 g: V8 R3 M6 r) |$ B
                 UART_INT_TX_EMPTY |    \
6 v5 M3 Z1 ?3 }- c( p3 n                 UART_INT_RXDATA_CTI);4 K  a5 `. p: \: x0 V0 U
    UARTIntEnable(SOC_UART_2_REGS, intFlags);  |: F1 N2 R& ]& q) [
}: {+ z! Q0 f6 h5 a: D  p7 N

! t% L$ l* P4 }0 M0 e' o/****************************************************************************/8 L) K  O* o' M) y2 {1 \
/*                                                                          */
) C3 [$ Y' r7 j1 h. T; i8 |/*              UART 中断服务函数                                           */8 `+ v2 @/ L1 I2 ?8 V: b4 ~4 ~" p* k
/*                                                                          */* o: G1 d* S5 q/ G
/****************************************************************************/: ~. h- V: y1 a  I4 b" }! n' B5 y- n  E
void UARTIsr()% |4 K% d% ?4 d4 h- X% j$ I
{8 f6 Q7 `/ b8 r, b3 C7 l8 l
    static unsigned int length = sizeof(txArray);
3 m7 w6 n9 r% g2 ^    static unsigned int count = 0;
9 o6 I( t8 d# c; k: A    unsigned char rxData = 0;' B4 E6 h/ ]7 Q6 z7 X  @# a7 J
    unsigned int int_id = 0;, ]& _# X+ M9 p7 n7 R% c- Z: i
9 I7 C+ Y4 y* u
    // 确定中断源7 N7 I/ D( r) T7 l( v
    int_id = UARTIntStatus(SOC_UART_2_REGS);3 |5 c- K5 P4 j/ \1 A! ?& Q) C! B
4 O& z0 \6 s+ u: v' ^& Z, P7 ~
    // 清除 UART2 系统中断! T/ [3 M( ^5 \% Q* b
    IntSystemStatusClear(SYS_INT_UARTINT2);4 {5 U+ h4 |- {1 F  X2 `6 m- l# ~

) Z# k3 @  Y$ y2 |/ V    // 发送中断+ D: W/ G: L: f) y1 N. r8 R
    if(UART_INTID_TX_EMPTY == int_id)) F5 ^3 O! c3 P9 k4 I1 u5 ^
    {
& }) ?% z& P* ~- U2 S        if(0 < length)* x) R9 X0 S' q1 i$ A
        {
2 `& B' c: s  S9 V0 M, {0 ]- {$ R            // 写一个字节到 THR
0 K" q- A4 `7 n4 Q: _% B( q            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);1 \5 \* P8 ~, W; Q7 i. n' D0 b
            length--;
) J! O; ], x4 P& c0 f, w            count++;
1 K9 B6 _4 J6 T. v' y4 Y        }8 j0 A; U5 U0 Y/ N# `9 Z# P4 z2 ?' r0 c
        if(0 == length)
2 c5 y' R/ Q* O' p/ T4 F' o- S2 n0 I        {
2 e+ f! ?0 u) Z3 G2 t9 x            // 禁用发送中断
( ~& I7 U  i# m! ^2 M& i            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);( J1 V. g! }- S' c
        }
% F: b& ^! Z: F& P( L     }( m6 x. p, m( m* D4 |
/ B* k. k" f) U
    // 接收中断
. O! f, O/ U3 h8 \1 ~    if(UART_INTID_RX_DATA == int_id)6 q* B6 M. f# F- ^; p# u* S
    {9 \  F" e2 n  B
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
3 u( r  I6 O/ y, I' l. u5 ]( y/ W' u( c- F, d5 K9 A
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
, m8 L( |% R+ B, W, C4 ^% Q6 H    }$ Y- ]8 K$ f: y* K( c' X
9 @9 T; l3 O5 u. `& M
    // 接收错误
0 {0 |3 S& [- x/ h. X' H    if(UART_INTID_RX_LINE_STAT == int_id)8 o* q) q- ?" J% Q( i
    {4 j1 c1 q$ S7 v9 d1 Y
        while(UARTRxErrorGet(SOC_UART_2_REGS))
" e2 o, O- U$ `2 F" N        {+ z/ B' n( b; l/ z/ F+ H8 Y) {4 z
            // 从 RBR 读一个字节
0 L# k7 ~& v7 c            UARTCharGetNonBlocking(SOC_UART_2_REGS);
6 Y$ |* N% ]9 z9 z" E6 V        }& Z9 a% b2 D1 f" y9 T2 K: O( D
    }
/ p9 s8 Z4 e. J; ?1 d, C( Z    / ^' X2 u$ E8 b3 E* n8 c
    return;
, P( q. n! C( u' B! E  L}+ n) o  T( {  |# O
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 16:07 , Processed in 0.044039 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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