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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5581|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
' V8 z# m: B6 F

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。; |+ B' r; D( j5 s6 y. Y

) S4 N5 v. I* \3 t/ _#include "TL138.h"                 // 创龙 TL138 开发板相关声明
  r- Y; H: R. G$ H. c6 `9 u% }" K5 w7 r4 _, V$ _* l3 [% n+ \% s
#include "hw_types.h"               // 宏命令
- i/ W6 q  F6 \8 H/ l2 N: ]#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器$ S! F! h2 x% d, r* V  P6 `. r: A
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
- I' r0 f! B8 b' A6 ^1 ~8 ]
7 r- s% W  |; h2 }- _#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明. d# e/ A0 [" K% h' N; ^" H0 e
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明% O" J* u# r) M- ^) s
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明/ N0 ^; w; j; f
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
3 {0 U6 s3 X. ]- u8 Q- O  I1 p% y7 y" n7 e( a) U
/****************************************************************************/! r( @- V; g5 w3 }6 r. b7 j
/*                                                                          */' H  O0 A4 n& i0 _1 ?
/*              宏定义                                                      */
+ Q, S+ V7 M" J! B/ F  w! \/*                                                                          */7 l  e# w8 b. l) G  `
/****************************************************************************/7 g+ x8 V6 [/ l  p1 {& }: h
// 时钟2 f' ^& @3 }0 V9 g0 u4 W+ f
#define SYSCLK_1_FREQ     (456000000)
/ A, Z! q& R5 y/ y. m9 K#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)) [/ I8 ^6 c5 b( \: e0 k5 b, N
#define UART_2_FREQ       (SYSCLK_2_FREQ)
: P& {6 h; A( E$ {) q/ p5 a- r8 I( M7 L( m
/****************************************************************************/
3 S, Q4 ?/ q* T  e, S8 q5 Q/*                                                                          */
. K# i" F, z& |' o0 h/*              全局变量                                                    */
  v+ T9 v7 C  f* b0 F; J) Q/*                                                                          */( H1 F4 S/ |7 S* H' F9 e
/****************************************************************************/
! @& l& o8 \- n% j2 ]( z" b( v$ ochar txArray[] = "Tronlong UART2 Application......\n\r";+ V& [$ j4 @; q% o, f4 N

- @2 n& y( J& ~/****************************************************************************/
& E8 D; q$ V/ ^+ b2 l/*                                                                          */
1 S% w; K1 }8 m7 y8 \# k3 i/*              函数声明                                                    */# Q: T. Y& {( J9 j6 t; ]
/*                                                                          */, ^8 j: {1 K" r" G3 _! r0 a
/****************************************************************************/
" b& S! x2 j: r- Y( S' a4 r// 外设使能配置  Q8 b+ \; F2 D4 }9 i
void PSCInit(void);
* \, ~0 I1 o( \" f! P% x' ~  p3 X+ r" T, A) {$ `
// GPIO 管脚复用配置+ D4 J& b9 [- k4 m5 V3 S# b
void GPIOBankPinMuxSet();
2 G+ k7 k( x. l- i- |' k
# {8 u; ~% u5 C# K// UART 初始化
2 S' x/ \  C' }; ]/ c) ^- Hvoid UARTInit(void);
+ `$ g+ g+ X4 \# L; J// ARM 中断初始化
) Y* E; V! a# J6 z* V- I! P) i) Dvoid InterruptInit(void);
% y- T' W1 t5 ?+ E8 d* i$ j% g7 E// UART 中断初始化6 u& j4 H# B! V$ ^  x  ^* V* d# t" J
void UARTInterruptInit();
% _7 I  o, d, \5 ^& }; E// UART 中断服务函数
( F! R2 i0 B( x0 b+ p5 }6 U% gvoid UARTIsr(void);
7 }' Z1 ?$ e; `1 J/ i  o* J5 O, d* R" t2 Q: `  M7 O
/****************************************************************************/6 E* m8 S  P2 u4 i# N% d
/*                                                                          */
6 ], f. N2 X* S. U. M4 _* f- E/*              主函数                                                      */
3 p6 w/ L+ Z5 i/*                                                                          */
9 z. U, ^8 ^) }8 A5 H7 Z; H) F  n/****************************************************************************/7 H! o2 }4 ^- L' Q) q, y
int main(void)9 p. P) \: Y3 P. B. t
{5 ]  `. D5 D2 `! p: t
        // 外设使能配置
, }4 a* O5 T, R( O' @: S# n% _        PSCInit();
6 w; a0 S! N; ?8 S0 i! q- P0 B        $ P1 h; C0 y2 s- n
        // GPIO 管脚复用配置9 ^; s! |9 \: n* J% C% U3 y
        GPIOBankPinMuxSet();
* ^' z9 f$ h( ]8 ]7 W+ R7 L3 ?* t4 @  J$ U6 J9 z3 p. h8 d
        // ARM 中断初始化
5 f/ C! N- Y4 o$ z. S7 e        InterruptInit();
* I7 t$ X& Y; |/ w; x& D, x1 {; u
4 @0 b' c& {# V- M        // UART 初始化- `) @+ p1 c% D. U% I% o
        UARTInit();8 ^! W/ P+ p7 \" s# @: U. F$ t' i
) l9 X3 j7 V5 _3 I, K
        // UART 中断初始化7 ?; x4 Q' ]8 k* b
        UARTInterruptInit();
8 `& s, l1 t; \- u7 \- M0 c$ d, M5 ?* ], b2 r  V6 v7 t. V
        // 主循环
9 g' K7 R' H4 [        for(;;)4 r; @5 N/ {4 _* L% `8 ?2 u
        {1 H  [9 }0 [4 Y, \. J
" q+ H9 C6 U+ m8 l3 K4 i
        }
  d& @- C6 \; i+ |0 _+ s* W" o}/ B$ h' W) l4 t
; X7 p8 ~! H) O
/****************************************************************************/
% U. @2 L" G/ W; j% V/*                                                                          */
- [: r; c4 Y( X3 x! V, ?9 X/*              PSC 初始化                                                  */
( K1 w/ S' x! l' \  G+ Y2 e5 i' ]/*                                                                          */
  d# k3 k& K: F/****************************************************************************/- Q% x, Y  }3 Y2 z& C0 x% g* s  y" o
void PSCInit(void)9 ?% j$ b  i& X/ ~$ X! O( [
{
; s3 ]- f. J4 Q2 c& `9 d# `        // 对相应外设模块的使能也可以在 BootLoader 中完成: v1 f! [. k0 O* A0 `1 l6 Z7 N  d
    // 使能 UART2 模块' S8 D" w1 B5 n3 t$ s2 ?; G2 ^+ d
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);+ y) A$ X' i4 M# ?
}9 R$ ?/ R+ Q0 J9 v. j  M
6 V; P' [5 H8 _8 P4 M
/****************************************************************************/
) W: o9 Q& C6 w  F! d+ j% T! E; ^/*                                                                          */( I/ d0 q' [; ?( V
/*              GPIO 管脚复用配置                                           */
$ J! e0 `; A! e% P1 y9 T2 y- l/*                                                                          */
4 J; ]& |0 e  x! M0 H: H+ s/****************************************************************************/; R7 L4 s8 B$ D4 N
void GPIOBankPinMuxSet(void)" U) u% G2 e7 A* y. X4 Z
{8 A3 j, K$ w1 k! Y" M3 R( }
        // UART2 禁用流控! n8 e; Y( V5 |5 z
        UARTPinMuxSetup(2, FALSE);
# J' _4 B4 Y' Y9 l- h}9 x6 j9 [5 z! N- s
' g4 E, ^" V: i9 b
/****************************************************************************/
2 O: O1 r, e/ W6 U" P3 _) v/*                                                                          */1 n* p. n, r4 Q* j& F
/*              ARM 中断初始化                                              */
) d7 J9 O/ ^  y- r/*                                                                          */
5 R5 |! p1 Q& }! k, Z- W/****************************************************************************/
' r# \" M  L- D( v% p9 pvoid InterruptInit(void)- s3 S" j, }0 {% [
{! y( F3 K: g! @3 Z1 H
    // 初始化 ARM 中断控制器
" w+ P" N+ _( B+ z# I2 A7 a9 o    IntAINTCInit();5 Q) I1 ^) X3 O0 D( K  l1 K

9 T% _9 S+ R! Q' u; e: Y    // 使能 IRQ(CPSR)
% ~1 p0 X: r. C& H    IntMasterIRQEnable();
) t4 b9 H. }& f$ ?! o& e& V: A3 i: Q: f1 Z- p. E) D
    // 使能中断(AINTC GER)
- j* ^8 R* O% f: a4 F8 j    IntGlobalEnable();
7 h9 i" D0 |2 J( L% f3 [3 G
' L  |1 d# ?. [+ R- f7 ?    // 使能中断(AINTC HIER)( V9 y3 ?( |' q) {/ k9 [
    IntIRQEnable();
1 k8 L8 z4 z3 e# X8 h/ k  n  r' _}
/ X5 M0 s% |5 H. ^; |& c- C- w/ R' B' T+ a: @  {
/****************************************************************************/
) W& W. [  V* H/*                                                                          */# m3 X1 {; _2 P7 Z7 N+ {  a
/*              UART 初始化                                                 */; D# e' ], Q( u8 Z
/*                                                                          */
- u( M! n) h  g9 ]% [/****************************************************************************/
5 M4 _1 H- n1 mvoid UARTInit(void)% n$ i7 N; ~' h
{7 o, L+ \3 |& f. J, ?+ p, F
        // 配置 UART2 参数
* b1 ^0 [6 z% h. }( u+ H        // 波特率 115200 数据位 8 停止位 1 无校验位) b4 E6 O+ }  v+ r' @
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
, `- d# k. N+ \/ f                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
5 I( ~$ T, |  x, m4 x% e# _; P        // 使能 UART2
; y4 o" O+ w8 Y3 R        UARTEnable(SOC_UART_2_REGS);- Z2 _% o3 Z/ m: k4 u. i8 `; t2 p

( Q# e9 F* w1 ~  u    // 使能接收 / 发送 FIFO
+ W/ Y* s' t+ O) O  C    UARTFIFOEnable(SOC_UART_2_REGS);
+ c- \5 m% b/ M4 l
8 Y9 L4 {* G6 E/ c0 U    // 设置 FIFO 级别
0 q, v1 h) k8 _5 [) Z- t1 p' B    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
1 b5 L- d# {3 M8 t! ?# T) y}  c- _- K/ A5 R5 P9 O9 D/ w4 a+ u

7 d6 J- ~6 K4 [# d/****************************************************************************/
; o/ P8 x# F8 ~, n! ?$ }/*                                                                          */
* j. e% }  ?& w% _8 {! T/ P5 H% Z/*              UART 中断初始化                                             */- F, s7 {( i; k5 _
/*                                                                          */+ W0 G; Z7 w. Z7 a& f# y
/****************************************************************************/3 ]' [2 X6 j' q: m2 q, e
void UARTInterruptInit(void)* u9 e4 w* T" y7 p7 n- b
{0 R3 p2 h: e7 P+ \$ B
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
: u, F4 e0 c4 l% o3 y4 p* b        IntChannelSet(SYS_INT_UARTINT2, 2);* H( S. ~& o% u, L
        IntSystemEnable(SYS_INT_UARTINT2);2 r2 y" z2 W6 D' E( x! D. L

7 a9 _9 C/ C( k- Y0 n5 c        // 使能中断
3 G* Q& e9 b  m        unsigned int intFlags = 0;' Q  d* S7 T9 u9 ?; B& s& \2 T( z# r
    intFlags |= (UART_INT_LINE_STAT  |  \' D+ g/ w" A! n7 L9 U# r! j
                 UART_INT_TX_EMPTY |    \: ?+ J+ S# J5 R% [) b1 |- q+ t
                 UART_INT_RXDATA_CTI);3 ]' J$ f- Y$ C- `
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
- m! D* A/ g8 S, O+ V}2 {; K9 N* ], G4 Z0 @

" X1 ]# g7 `. F) T/****************************************************************************/* ?+ j4 B5 p, `  N
/*                                                                          */; G$ f; Y9 `  X9 T
/*              UART 中断服务函数                                           */, E3 s' |4 G  F9 E  |! O
/*                                                                          */
. u0 B7 n  r4 f; B/****************************************************************************/" n5 o. F% }4 E% J* L7 V& f
void UARTIsr()
7 I5 B: f5 X9 N: i4 H2 Y{
. k5 f: ?4 d0 K( `: t! D  y# g    static unsigned int length = sizeof(txArray);
$ Y/ F  K. k' R7 r. M3 ^    static unsigned int count = 0;8 A0 p! H% Z7 o
    unsigned char rxData = 0;6 V6 R: S8 ^( z) b; a
    unsigned int int_id = 0;4 ]# ?' s2 }  ]0 o

) x- q- @% p, G* G, Z    // 确定中断源9 m$ B; G( J7 p: M4 g
    int_id = UARTIntStatus(SOC_UART_2_REGS);
# H0 h, R! ~5 X" `
- u5 V' }6 z7 i$ m9 [! j    // 清除 UART2 系统中断
4 Z) d9 K6 \; q0 D    IntSystemStatusClear(SYS_INT_UARTINT2);1 t1 R/ f- `0 y( Q4 D
/ B0 A( p$ F. x0 ?
    // 发送中断
" L, P& [* C5 {! B# E, M" `; n0 o    if(UART_INTID_TX_EMPTY == int_id)
" ^6 E. E( t  P9 h3 V; `0 x" w    {
, F  t! ?4 J# [! n2 U* q. m8 n        if(0 < length), N% W/ `7 q  z8 W) ?3 O* e
        {
6 r3 x  ?: a& s2 \            // 写一个字节到 THR
5 E  Y. v/ h9 n) x2 V            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
( G. Q* j9 \4 l            length--;
- `% R2 t9 N& A0 [" z            count++;/ g/ z9 u1 E# {& M! d; t. u. p
        }
, L) G6 Z! X4 `4 @1 {        if(0 == length)/ w& i) K* [. @! E' r; o
        {
% T* W( V3 N% S- O            // 禁用发送中断
8 ~0 q+ \& U8 U8 x3 w8 Z4 G5 K            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);4 Y( T1 l/ S# ~. F
        }
- D% e3 V1 \' w# \     }
% U# K5 h% R. B- Z- d9 K5 a; f  I4 T
5 u- {, _+ {1 l    // 接收中断& p3 ]; z/ y0 ]  j: b5 Q+ l9 O
    if(UART_INTID_RX_DATA == int_id)
  l# x" G! C3 W. U0 {! G# ^    {
4 ?8 P! N0 x( r' Z, d$ v. j        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
( d( f6 q7 U) f' _. o
  [3 f: Q) v& D) o        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
" l6 n% ]+ I0 c  W    }7 D0 \, @  L9 n% ~( ^% s

: q0 o1 F& c3 y9 h4 q    // 接收错误
( H4 D* z! o0 g+ n0 B1 f+ _4 |# c, W    if(UART_INTID_RX_LINE_STAT == int_id)
! C& H% I, G2 b+ m+ V    {' b4 M! H9 {3 {5 Q" n5 [
        while(UARTRxErrorGet(SOC_UART_2_REGS))
7 Q6 H; M6 s$ z        {) k+ \) D( J; P' R9 D& O4 d  A
            // 从 RBR 读一个字节
2 b6 C+ Z2 T) b6 ~5 ^            UARTCharGetNonBlocking(SOC_UART_2_REGS);8 |% x/ P: r) k1 I2 {+ ?7 \
        }
/ b. T+ B% i0 x" V6 y- B( a5 g- R    }
+ _4 Z, o8 e# i9 e9 I   
+ r3 ~) e5 o6 O, O1 h8 j    return;" O0 m! |1 {1 G* o, Y
}( {6 j0 o/ i5 y
回复 支持 反对

使用道具 举报

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! D8 z' a$ |. Q* W$ \
如果其它设备快速给你发送串口数据,你这边能正常通讯?

. q' ?; p7 s. w7 v/ M8 K+ |谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 05:24 , Processed in 0.042394 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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