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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8042|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
* B% t; w: l$ Y" ^, ?! m

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
地板
 楼主| 发表于 2019-5-5 22:36:34 | 只看该作者
785235014 发表于 2019-5-5 22:25) o- S) n9 K: P% s9 e$ {
如果其它设备快速给你发送串口数据,你这边能正常通讯?

! e' e: K" s9 l' d+ Y1 s谢谢,已经知道不是程序的问题了,但串口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 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。: V3 j; W8 {6 d+ {

5 j# u8 Z; E1 R, \5 d2 O2 t#include "TL138.h"                 // 创龙 TL138 开发板相关声明
! J- ~) ]6 U$ W7 z) @5 o: F
5 c0 @$ Z6 R/ ~6 D& S9 g- \#include "hw_types.h"               // 宏命令6 t( b2 Q9 v4 U) f* J7 s, P1 l/ M  V
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器, z! r5 W) e$ t" j
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器( y7 O8 Q1 J8 Y* n
4 D" `; T" C  v# d' m; b; r
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明5 l" ~% [9 J& n1 B- h  M  q. M! D
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
" S$ }2 h1 s* C1 p' O1 p7 K2 B" x" V#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明6 B- ]3 n5 W/ G4 i
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
$ y8 r' |/ w; d" [
' v! |. |; j% X/****************************************************************************/) i( F* ^5 D# Z, [
/*                                                                          */; I5 o% c6 _# b3 ?% V
/*              宏定义                                                      */
; u& ]. s1 o: D  v0 [3 x. P1 S5 ^$ D/*                                                                          */; \9 w0 K: o) `) V
/****************************************************************************/
" g; e8 F7 M9 l8 u( V// 时钟
' m3 O% L' d% Z2 t/ R#define SYSCLK_1_FREQ     (456000000)5 k' H3 a- V7 a& W, m6 a
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)) s- z0 v: \4 m6 E+ H6 E+ l
#define UART_2_FREQ       (SYSCLK_2_FREQ)% u+ E/ j' c. w9 K

  m# z. J) D3 v* `. l' S6 A/****************************************************************************/: ^7 W* }  R1 `/ @0 d- w0 Q
/*                                                                          */
5 t' \6 T0 Z, R$ D8 I  G) @0 O/*              全局变量                                                    */
# k  b. w6 x( u& ?# D+ A  h+ h/*                                                                          */
7 Y* y8 L' y+ C- t& X/****************************************************************************/
8 z' ^) X! K/ N1 O! nchar txArray[] = "Tronlong UART2 Application......\n\r";5 W) A7 T6 l+ d2 M
: Y" S& n6 I  C- p( d4 a; ?
/****************************************************************************/) ]& w" \/ X4 }0 R1 w7 ?1 g2 v
/*                                                                          */
: ^  W* r  w  n; F( U/*              函数声明                                                    */
9 V0 O9 K0 A6 F: F5 T$ v  q, h5 |# ]/*                                                                          */
7 J& J; X% M* B/ O' I/ p2 _/****************************************************************************/
7 v9 a1 ^5 \, y6 u' _  Z, F// 外设使能配置7 T3 W; {# C$ q* W
void PSCInit(void);
8 q+ G% E2 }' [- P" E* j+ Q& ~8 b
// GPIO 管脚复用配置! D0 E3 U# Z) ~+ A+ {8 g! {
void GPIOBankPinMuxSet();2 i1 `3 d0 y- S8 G# N' e
+ n% J, g: m9 @. c6 o
// UART 初始化
9 M! o  \1 i: r8 q$ v8 {8 E1 m- C6 A- kvoid UARTInit(void);
# u- [3 _: L7 z2 X// ARM 中断初始化
- ~2 y* q( D# a, b4 Avoid InterruptInit(void);
3 `# r6 X# k5 U% `1 X7 T, u// UART 中断初始化- _. {6 k: t. h& K" t% ~
void UARTInterruptInit();6 z! |$ g& q) I* m" u6 W# G+ Y
// UART 中断服务函数3 ?4 U: O+ S6 ]$ @8 p0 u* q
void UARTIsr(void);+ {' U- R/ W- \% z
1 l  v* p( x+ Q! ~
/****************************************************************************/2 Y6 o+ M7 D7 [
/*                                                                          */+ P- O9 s6 E8 U% c& H
/*              主函数                                                      */
1 w9 Z, z. L$ N+ J* V: H/*                                                                          */  a$ \0 I. }- i
/****************************************************************************/3 e2 n' S- [$ i& A
int main(void)* U, x% A* D/ J4 P# B5 l% U  W+ x
{
1 v" K# E4 F' I6 }6 f# h$ ~        // 外设使能配置' x2 ^/ p7 O0 U
        PSCInit();: O6 Y4 i, @. s& t$ z0 K
        9 z& ?* ~( C* q/ n, I; Q
        // GPIO 管脚复用配置' E+ ^. l+ j' g9 Q' _
        GPIOBankPinMuxSet();
0 S, Z& g7 L# j; p
# T% `5 V# L) n        // ARM 中断初始化
0 I+ |6 V3 V9 h& ~7 n, x6 y* |        InterruptInit();" n9 z2 b$ t* {" T
5 }, ?! c6 t+ v9 |
        // UART 初始化
1 \: S* r) ^4 Q- u9 c        UARTInit();
, {' }5 W  {3 R& R2 u/ M" p# ~' \
; D3 ?) E0 M( \+ g6 x+ Y# o3 W        // UART 中断初始化  l3 m3 u9 Y7 H- @
        UARTInterruptInit();) p; O& o8 n* T3 B0 B
! ]  y# Z8 u, c+ [
        // 主循环2 _# d8 A& e6 t1 s! k! U% m
        for(;;): K# d( r$ C9 f0 `' m$ _9 F
        {
2 B# p' ~7 K0 `0 V
$ m  B9 ]  F% u" w        }1 d) P! L: y* w; f1 ]
}
) |' H2 L; T9 T4 @3 d5 W8 e  Y
6 n" `2 s: \2 S2 H6 y/****************************************************************************/$ f  w& g1 @" U+ U9 c
/*                                                                          */. N& m* J) T+ N9 b
/*              PSC 初始化                                                  */
. c2 J& a  I+ Z& V2 v7 }/*                                                                          */
' I! q7 I6 q/ p' f  R! H/ s/****************************************************************************/, }( S9 O$ M! }2 h5 g# ]
void PSCInit(void)
2 l/ t) q$ {$ t# o' {{2 s3 g1 \' v  @# A+ K2 Z
        // 对相应外设模块的使能也可以在 BootLoader 中完成
( D$ x& ~" U& W    // 使能 UART2 模块- @& d" k3 H' v- ^# W4 i& f3 T' O
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
3 R% j; \4 Y$ t}
. ~. U& V! z& z- H# m
+ C* m9 v' `- I4 ^/****************************************************************************/. t4 D2 H/ I1 V! s% d5 Q+ X( L
/*                                                                          */& i! V" f$ W7 B( i3 U
/*              GPIO 管脚复用配置                                           */
$ u/ x6 A/ E8 w8 `  Z8 ~2 t/*                                                                          */
. F, Y" {4 r$ `; k* Q7 z/****************************************************************************/
( C5 I1 Z# k$ ivoid GPIOBankPinMuxSet(void)3 `! W3 y' p# ~2 N4 _
{3 [; H6 j/ l0 z6 n+ W3 Y0 G$ C
        // UART2 禁用流控$ C3 c. P2 r9 G7 B
        UARTPinMuxSetup(2, FALSE);* a  @/ `) X, u* B6 }5 a9 o6 B
}
" D/ F6 F( ~5 R$ S3 p7 r% a( T
% v3 O/ A4 W3 t% e: j4 b/****************************************************************************/6 `' D' h6 e. z
/*                                                                          */+ i, @; U: Z2 G9 j
/*              ARM 中断初始化                                              */
; \( L: U3 s. F# `6 C4 g/*                                                                          */2 X3 t( F0 D  h+ f4 r6 }
/****************************************************************************/
: B& D' }) X, t9 ]1 hvoid InterruptInit(void), O  ?; b/ P3 B' k
{' j7 `7 h$ L& M+ c
    // 初始化 ARM 中断控制器
; h9 Y) V% c1 ?; t    IntAINTCInit();+ x: d+ b. b- T
9 P  w) Y3 e8 v; N9 r
    // 使能 IRQ(CPSR)  J( ], X3 R1 @, n, |. y# ?$ g1 X
    IntMasterIRQEnable();3 }+ R2 h) B: H, ]7 n

( p/ v, H# v9 X# b! x/ i6 B    // 使能中断(AINTC GER)# e# L! ]* \# Q7 Y% h8 L; U" w
    IntGlobalEnable();+ u% I: o3 t& G1 f1 J9 D) w! S: T

1 D* c5 X& M$ k. p6 T: X7 @    // 使能中断(AINTC HIER)4 b! M7 i9 ]* g; O) V& |& W+ n
    IntIRQEnable();# b2 l( F  W" G  d( a
}9 g  ^4 P& S5 g) H
5 o' J( \7 n3 Y! P
/****************************************************************************/4 q- e7 ^5 A6 b& D1 j
/*                                                                          */
  N* w" \  g4 }& B2 a" N6 G/*              UART 初始化                                                 */5 h, c! x+ J/ w$ Z* ~: Q8 O
/*                                                                          */4 j6 G! y1 u# v. Q: t
/****************************************************************************/8 o8 _; Q- C8 ], Y/ _7 X" j9 a) S
void UARTInit(void)
+ Q( i5 y! Q% F/ Q+ \{
' i- T: H# h; Q        // 配置 UART2 参数
+ w# W) r) |# o) V" e/ r        // 波特率 115200 数据位 8 停止位 1 无校验位" x( w3 N6 T5 A- p& N
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
9 A- S6 J4 j% t" r7 [/ T                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
# M6 {) g2 ?  W# o        // 使能 UART2
8 |4 E* `( h8 B2 A& [1 d: x. [( R        UARTEnable(SOC_UART_2_REGS);
4 B2 l4 f8 i8 w+ \4 H6 D5 w; D( _: f6 }
    // 使能接收 / 发送 FIFO/ p2 G$ E; L: y, U! t, D$ h+ m
    UARTFIFOEnable(SOC_UART_2_REGS);
' }. N6 N6 x4 v" T
$ |' D8 \1 E: D& C: y    // 设置 FIFO 级别  _" l/ e, y# }; O# V( P, J3 I6 E6 f8 X
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
- y" i) n; H. O1 I  ^  E8 X' x}; S! e; s  k* f: f1 _( z

! ~) P( y3 ?4 m: B7 [; _: w/****************************************************************************/. E6 i1 }2 {2 c- a$ x4 T
/*                                                                          */
* b) ^, r& {1 T. K/ {( w" |/*              UART 中断初始化                                             */0 V/ A1 O; q, _3 Z6 ~/ ^
/*                                                                          */* ~" r6 Q  {8 F6 q' T; I! K6 H
/****************************************************************************/
7 M  ~' U0 Q, I, Zvoid UARTInterruptInit(void)" f' `" j, t' k. c% I# {7 X
{& ^% f" r+ h  |* m6 {* g4 S
        IntRegister(SYS_INT_UARTINT2, UARTIsr);! _# {# Z% B: F- u7 |
        IntChannelSet(SYS_INT_UARTINT2, 2);
4 i; T8 F: Q$ @& d        IntSystemEnable(SYS_INT_UARTINT2);3 p7 o/ \. E; Z" T* w  }7 [

2 f8 n- i4 P  o: H' }        // 使能中断
# c! a% `$ y9 _$ f6 f# f* w- G! P0 Q        unsigned int intFlags = 0;. P2 X, n& f& H& |  x! L( f1 V$ x! p
    intFlags |= (UART_INT_LINE_STAT  |  \
! C5 w8 J0 j8 y/ Z; m                 UART_INT_TX_EMPTY |    \! e" c: _6 W1 x. r& Q+ n& w+ D' \1 P
                 UART_INT_RXDATA_CTI);# O% k: {, y4 R/ Q7 t' i! T
    UARTIntEnable(SOC_UART_2_REGS, intFlags);3 B6 ]; z$ \' D9 S" i0 B
}
) g/ u: D2 ~4 M  w3 v* B9 t  z) |' x$ o6 H& j5 c0 D
/****************************************************************************/6 N8 t* _6 h) i, F8 e4 Z. c
/*                                                                          */
) P. ]+ N7 c4 X) U8 g& l/*              UART 中断服务函数                                           */
% f& J# c# X1 P' H4 f/*                                                                          */8 M% t9 l& s' ~' H
/****************************************************************************/
, G1 D: T# O3 ^/ Uvoid UARTIsr()
& D, d) @' d" U% L* H  A{" i5 h( u+ D! G+ c" w2 l
    static unsigned int length = sizeof(txArray);
0 i' s0 k. R, ~% a    static unsigned int count = 0;1 j, m# F: S  F1 ~" k6 O
    unsigned char rxData = 0;
1 [3 n% i# C1 J) L3 i8 m: Y% l    unsigned int int_id = 0;1 n7 P3 N; M. C
, [4 v; Z( X. L8 P3 i0 {6 X
    // 确定中断源
. |0 b+ t  L0 `) l8 {    int_id = UARTIntStatus(SOC_UART_2_REGS);" R% ]% }  X9 b" X
- ^, l  p( _- a. ?4 r9 I
    // 清除 UART2 系统中断0 _3 i6 {5 n5 ?
    IntSystemStatusClear(SYS_INT_UARTINT2);5 p2 W: I& b* u/ V

4 G9 N3 T7 n; G    // 发送中断* H( N9 }& X( o6 I1 Z
    if(UART_INTID_TX_EMPTY == int_id)
* g. _9 y! H' r4 O) }    {  z; c2 C% e1 z! B. O; C! ?
        if(0 < length)7 U: H/ R, t; u6 J6 m# s" k
        {
4 v/ {5 |$ @/ i. }3 ^" ^" ?            // 写一个字节到 THR: _/ H( F' G+ g: _1 ~
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
2 ^+ O7 F+ {/ J) s; }            length--;
' d. s* D2 k! U; ?, E) {( B2 j, Y            count++;
4 K7 h2 y* K# o& A: }( \        }3 n5 Z) J: X2 n6 i
        if(0 == length)
) ^5 B! J4 n! m) Y2 }        {, P9 }* z( D+ T2 t
            // 禁用发送中断& x0 H7 P. i5 t* o' R) p' K
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
0 d2 K. T: ^  X- T        }
- H+ I; u2 j8 d/ K  H8 y/ `5 y     }
& t" [: i1 {! j% l
  Z5 f" a9 x# Z# _" b5 L$ d    // 接收中断, b, ?; }. {/ K; M$ Z1 b
    if(UART_INTID_RX_DATA == int_id)
& E# r; d5 f4 F) p    {( H, V! o* Y$ Y1 u# }! D
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
  a: q8 d% F4 a3 D1 m" H% i" {
" Y; A  O) a1 x% a5 L$ {! U        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
1 V) v9 ^6 q0 p" Z    }; b% k. r+ |3 {7 o; k4 B9 g
; W4 G; o$ r( ~, }1 [4 B
    // 接收错误
. I6 u- f- m/ w1 S' k/ A) S1 {3 S    if(UART_INTID_RX_LINE_STAT == int_id)
4 B3 t" S: X6 J    {$ J4 l, \( p" p$ V- W8 C
        while(UARTRxErrorGet(SOC_UART_2_REGS))
3 g, J. }5 \' i, R        {
* |: U' g. Y' {9 A# [            // 从 RBR 读一个字节* T! l+ B% `/ G" _+ N
            UARTCharGetNonBlocking(SOC_UART_2_REGS);  Y8 B. b; p2 V' q% D
        }
1 g: b& V: b* x7 u! `: p9 H! r0 K    }  R: W8 c. `, `. h, l! g
    5 C/ ^! w% l% N0 Q1 _
    return;
* f8 R% ~% D0 B! V/ b/ V) l}2 [- [; D" y& N; U. D; C. }
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-2 15:00 , Processed in 0.045710 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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