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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7504|回复: 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; i1 i$ A) c" T- x

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。, |* i& l, @' ?6 h! g) Q; c, f4 ]
0 P9 j( x( Q6 W5 R1 Y% s
#include "TL138.h"                 // 创龙 TL138 开发板相关声明# O: M; [7 O" W, B
/ @, e6 R; j7 o8 o- N8 t
#include "hw_types.h"               // 宏命令0 }8 u; l$ Z% M  }6 J- v% i" A
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器' ^* ^5 d& p. `6 |, y; U, q
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
2 u# |  Z3 ~. |  G3 O! T% v  l3 O$ R
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明" v4 J; M- V) I5 [
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明5 i) T: ^& X/ }" p2 d/ U+ [
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
) `9 L% ?# y# F# x& C4 E, ^#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
- }9 Y+ r+ _( l7 r4 G) c: t+ p/ W) W$ U6 f- ^# s7 x! D! _7 A
/****************************************************************************/
) R1 w1 u, P  i/*                                                                          */7 g- Z0 X% w0 {% B3 k
/*              宏定义                                                      */
/ |' d+ b; g& |+ n/*                                                                          */1 Z6 m1 |  N0 p9 R9 ~/ H
/****************************************************************************/
" w9 o; a  g7 ?& {// 时钟
( n+ x1 c/ M2 X#define SYSCLK_1_FREQ     (456000000)
9 i- F; |" S' t+ S1 d3 X#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2): A/ w' O+ [- `2 B& _! `
#define UART_2_FREQ       (SYSCLK_2_FREQ)
/ Q2 B' j0 h3 |
- |+ V+ ~1 g/ K" S- ]/****************************************************************************/
; J5 t& q& A. ?" }/*                                                                          */
% q% f% M2 h, h9 F: l# {  I/*              全局变量                                                    */
. ~" `0 \* c: [* r# Y/*                                                                          */
- b8 z& f1 f! W; a" b; _/****************************************************************************/, ]' b. t* o3 ]& c% O
char txArray[] = "Tronlong UART2 Application......\n\r";
# Z/ \8 ]- ]5 @: }; K! T( P8 F0 N  p, y- @# w  w! e5 i- q+ x
/****************************************************************************/, u2 }: a) e+ R
/*                                                                          */
8 z! {9 V1 U4 K+ ?, Z. Z/*              函数声明                                                    */
/ `: V- y- n; V6 c* v$ f/*                                                                          */8 Q; f. i7 c9 o) c8 L& _
/****************************************************************************/' p& v# i3 y+ B
// 外设使能配置0 J- ]0 f; M7 D
void PSCInit(void);
4 ~0 H3 I$ o5 V- h2 U: u) w! n; G1 s2 l
// GPIO 管脚复用配置" x: S4 z+ @. Z$ z* z- E
void GPIOBankPinMuxSet();4 i9 H9 f! R# P, f
# F1 \- q5 N' I  l8 [2 I) ?
// UART 初始化
1 a- g( o' s$ j/ x2 Ivoid UARTInit(void);
; q/ N4 |4 X( U7 h! b* U// ARM 中断初始化
8 _- `6 S1 C" I) r; `5 }* Zvoid InterruptInit(void);
6 m) t# D$ k  H+ ~// UART 中断初始化
  d3 l3 ]7 a( @  b' q6 u' ]$ \7 p+ k% \+ Lvoid UARTInterruptInit();; W' x9 J- M' B6 {; G8 f
// UART 中断服务函数% p) x) D# h% S9 }
void UARTIsr(void);
- ^- J# w0 d. I" f' _; Y/ f0 x4 r' K6 s" G+ U6 E. c
/****************************************************************************/
) X0 \: |! v9 |; Z  @/ w; ^/*                                                                          */
9 E( c! \! Q7 }9 N9 x0 Z2 E) J/*              主函数                                                      */+ L8 X+ E1 Y) z' _' z
/*                                                                          */
! X$ W/ h) t7 s3 w2 i1 H/****************************************************************************/
" F. N8 t& I% D' [  {4 p, Qint main(void)
- @5 o4 f* b! A{, K3 l- H. K3 k4 _
        // 外设使能配置
4 r3 B. {0 P9 u$ `) P8 @  ^7 I        PSCInit();1 B9 T! g/ }: Q5 f: _0 _. E; O& v
        1 K! X1 [3 g9 b6 v5 a
        // GPIO 管脚复用配置4 {$ e. d! k0 T) N0 E6 m
        GPIOBankPinMuxSet();
" L6 t! G7 i* c( }  g; o+ ]  Q2 u, }& o4 _" o9 M9 F
        // ARM 中断初始化
- O. l( i: z$ ~9 j# S" K        InterruptInit();# f2 d5 M! u- _# f
* `$ r, G. b2 _
        // UART 初始化
3 u8 O- o. X: @, t        UARTInit();
; _. r( j1 S/ e) S7 V8 P0 V# M# ~8 L$ ]" e" j3 P; \
        // UART 中断初始化1 H! B$ [+ u2 `/ m
        UARTInterruptInit();
% j* j4 ]/ d$ C$ F  _" [5 h0 k+ N( i6 o
        // 主循环
3 y3 x5 J1 s6 A) C$ a" o1 V5 {, d! n        for(;;)
# p" {$ n& Y) ^: U+ t        {
$ M! [- W2 C. z+ B0 s: @( g6 J/ P3 U5 L2 b
        }2 E2 R. n8 p% \/ Q- y7 U% B
}
) h& q4 o, [" |% s1 V: r% w% p9 o: ^6 m; f% E
/****************************************************************************/
2 k  l* u- ?* j, U$ g5 S/*                                                                          */' Y7 {; [  u& [) N3 F  l
/*              PSC 初始化                                                  */
4 O4 y- P, j, s" V/*                                                                          */
% N4 _9 [" I. |+ m2 _5 b) T/****************************************************************************/' N5 |% E8 t1 q% S/ X7 G7 x
void PSCInit(void)- ~& ~9 S+ R! e5 C) f2 d! P
{7 Q. s1 Y0 u/ B/ g- X
        // 对相应外设模块的使能也可以在 BootLoader 中完成
5 E( M$ r$ V" K( v7 r5 \& D    // 使能 UART2 模块
/ v: x: ?% q/ d1 H" [2 Y( J: ^: _    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
+ o$ \6 c$ N1 w. y+ m6 b4 x}& m- m9 S: \! Z# g, D$ P
4 p, ^+ f. F5 P% g8 u0 `/ z' x/ O$ T! O
/****************************************************************************/
2 q. o$ z- `2 N1 Q0 N/*                                                                          *// m4 q/ l+ G* Z
/*              GPIO 管脚复用配置                                           */  E8 U( G7 d/ t3 i8 u: s) U1 `! E/ z* Z
/*                                                                          */
  S1 Y( F/ A' w. @! g# b* Y$ c/ g9 G/****************************************************************************/
. d7 F/ X& \2 ]' B: Rvoid GPIOBankPinMuxSet(void)
% r3 _" _( U6 z, ~  y% x) q{
6 h1 S/ S. m. I8 i( @, L; w        // UART2 禁用流控
7 D2 }+ h- Z% Y" J: P% n        UARTPinMuxSetup(2, FALSE);
, _6 B  B" {5 v1 Y; w# O# \! e0 }}
) P' \0 w5 e! p4 O6 d( @7 s( r' q. T5 ?, U" w+ I3 d6 L8 I
/****************************************************************************/7 N5 h! q3 `/ \/ D3 N+ t
/*                                                                          */
: e$ R4 K; F9 y) H/ @, `+ Z9 S/*              ARM 中断初始化                                              */
8 k! k& k9 T3 H3 I' j. ?/*                                                                          *// p! V) ]6 i: J5 @
/****************************************************************************/9 j$ V- p, O7 E1 n' h
void InterruptInit(void)
, N" ]: ^1 G4 B7 j{) \* a- A8 C7 \
    // 初始化 ARM 中断控制器
* P4 F: ^) z' [6 t9 @* F6 x    IntAINTCInit();  a$ Z2 {7 r  X3 a& f/ T1 F
5 r. b9 e* b' _
    // 使能 IRQ(CPSR)
. t" B8 Y/ u) ^# }$ z* |- T    IntMasterIRQEnable();  v+ e, d: t' J8 D" w: w( K
* Y5 W# O, [+ y- C; ^2 M/ N/ F
    // 使能中断(AINTC GER)
2 }7 \& ~+ D7 B; C7 _& s    IntGlobalEnable();
" H) \' D9 S7 p; |% d" K: t; _2 g6 L1 k* }* W6 [) ~- {2 Q
    // 使能中断(AINTC HIER)5 A1 t7 i/ N: p8 d8 h  o
    IntIRQEnable();5 |$ t' m& a) z, S
}- Q. Z1 D, d+ R: h4 v( x4 c- W! G
6 Y+ B" q, o) ^0 _
/****************************************************************************/
( g7 @6 H3 b; `; b9 \1 Y$ ]6 K/*                                                                          */. x' H+ o% B0 `
/*              UART 初始化                                                 */
* m" z' U$ J( i1 k6 g/*                                                                          */
/ I: z# u: V7 a5 ?% C8 A' h$ q! Z/****************************************************************************/
& r% |. w0 }( \, A0 Ovoid UARTInit(void)  n$ B' _1 n1 Q( _. X/ w8 Y
{* R6 g: d3 P! W% j
        // 配置 UART2 参数
# z% C" I; W. [# p0 m        // 波特率 115200 数据位 8 停止位 1 无校验位' {" p5 X, s$ X* s9 n* f
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
9 d* S! u2 [# [; ]0 @                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);6 j! j0 K( j$ ~# ~" e5 s5 b
        // 使能 UART2  a0 |/ [# j3 O9 g: j* ^: H7 T9 Y
        UARTEnable(SOC_UART_2_REGS);
2 h" X5 X  M. R) C, L. \+ A8 w4 |: T4 X/ J8 F* p% p5 N/ ^
    // 使能接收 / 发送 FIFO
; @' i2 H5 \: m6 G9 ^    UARTFIFOEnable(SOC_UART_2_REGS);( z: e* d* w: ^5 U: \0 B
( V: S) k( w  p: n9 [: j* u+ ?/ v
    // 设置 FIFO 级别
4 |% |' P/ t1 ~/ R    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);' x6 Y( }8 L5 ?
}* Q2 O) n9 I3 E8 z( A

& A( r9 A# D+ a/****************************************************************************/( w. E" K6 d" y! [- f# J. ]
/*                                                                          */
* E0 E7 E8 X& B1 v& T/*              UART 中断初始化                                             */
" h: X) ~( R; |/*                                                                          */7 U( G# ~4 ?7 N
/****************************************************************************/" T+ B  @* f( c; X
void UARTInterruptInit(void)# y/ @2 E" q- s. i+ G, B/ I7 y# Q
{
& o3 R% _6 V8 w% P( N        IntRegister(SYS_INT_UARTINT2, UARTIsr);/ @5 n7 u# C3 h- N3 s
        IntChannelSet(SYS_INT_UARTINT2, 2);
* @7 [6 \4 `4 C6 T% F        IntSystemEnable(SYS_INT_UARTINT2);" ?  Y9 ?' }" W; w1 e

- K5 v! K8 W- [( P- X        // 使能中断
0 p+ a4 B3 f) a7 Y$ E# k        unsigned int intFlags = 0;- G8 n2 B! E( ^5 T+ ?2 j% B
    intFlags |= (UART_INT_LINE_STAT  |  \
: R, x; x5 F* v! B) S; X2 G                 UART_INT_TX_EMPTY |    \
2 l9 N/ g7 t: H/ r" W  x                 UART_INT_RXDATA_CTI);: v; s$ e4 ?8 z. b+ i
    UARTIntEnable(SOC_UART_2_REGS, intFlags);, K9 Y8 k- u: B! ]. P& x
}2 h6 D+ i7 _/ P9 V5 C

. |1 F7 |) H+ m& g+ I/****************************************************************************/- J4 J3 Y# z$ e3 P1 T5 X
/*                                                                          */
) D$ y. @. L, b. L* P6 j' U/*              UART 中断服务函数                                           */
, L/ E6 i8 L$ H/*                                                                          */7 z7 A4 ~9 c* [+ p) l3 C/ O2 [
/****************************************************************************/* \* ?- X* M( l3 H: f
void UARTIsr()' n! |' \$ n/ }0 G5 H/ [8 ]' P6 A
{  Z3 s+ _  t0 m/ e7 q7 P. ^
    static unsigned int length = sizeof(txArray);
- s$ B- q1 E& N* @% `    static unsigned int count = 0;/ R( H. M9 u; P3 _2 F  b
    unsigned char rxData = 0;5 c0 C2 ?2 X0 |" h! V3 w8 k
    unsigned int int_id = 0;7 n  n1 v. C: e$ Z# M6 W/ @, R
5 w* j; Z% p/ v% M! V  M4 z
    // 确定中断源. L/ y$ k/ l8 E% f; U
    int_id = UARTIntStatus(SOC_UART_2_REGS);. N2 _" V, ~  w, Q+ ~
) u7 y8 V4 S, \3 a8 O, l
    // 清除 UART2 系统中断
0 O3 n4 n+ T% R6 t+ P    IntSystemStatusClear(SYS_INT_UARTINT2);+ L! L4 ^5 D( B3 g+ }

; \7 [% t' k$ ]& t, Q! w+ ]: ]- I    // 发送中断5 H7 _; U, |& i$ N+ j$ I
    if(UART_INTID_TX_EMPTY == int_id)  e# ?: w) Z2 X+ {7 Y$ Z
    {6 d1 h* ^, L5 @. w9 O
        if(0 < length)$ v, R, Q6 `" _* {* w
        {7 \4 Q) e$ d' C" n0 O9 w, @% j) I
            // 写一个字节到 THR9 V$ _6 @/ u, k/ \9 Z
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);+ Z2 y0 J5 z! f
            length--;
1 @, H* Z/ S, D5 v+ k0 e  O7 W            count++;. W4 m8 I1 f/ V# J, _+ h' a' ~  W
        }
, A% x5 a2 \2 j! T- f6 p        if(0 == length)# e3 m( w2 x" f3 k0 o3 n
        {
% u; P+ L6 |; W- B5 B1 C            // 禁用发送中断
& v+ h9 W5 {% }            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);4 [6 L# T9 b2 f& K- g
        }- [# o& J7 s+ I) ?- ^% ]" f* p
     }
: H& b; y- N4 A5 G! }- k# Q8 A: ~8 _5 F1 ^3 p6 ?! @
    // 接收中断
: h- R9 e, B9 E: i2 K    if(UART_INTID_RX_DATA == int_id)
% g# J+ }, S2 |' @+ o* _    {* o+ z1 Q& C  @* H; N1 ^$ C8 q/ J
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);3 s" @; I: R! @! [
7 L- w$ z; h/ _- m+ X
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
7 M: K: A1 f+ p' X# o! M! Q* h    }
; }/ I/ m- G1 A5 A4 {# s
' N8 `: S( ]1 O1 y5 n1 J1 v; v- Q    // 接收错误
' k7 `% x; t0 G. e0 T0 l    if(UART_INTID_RX_LINE_STAT == int_id)
, i2 J% P! S8 w    {
0 b+ r0 {' I$ X* {' j/ `        while(UARTRxErrorGet(SOC_UART_2_REGS))9 K& X6 l4 C" u7 V* W
        {3 h" ~8 J; B" b
            // 从 RBR 读一个字节3 M8 R( E" q6 p8 Z. J
            UARTCharGetNonBlocking(SOC_UART_2_REGS);5 U6 o! v0 M/ G9 d( s
        }
8 I7 T5 b; t$ e# f/ e1 G    }# A$ l- S2 I2 h. C: {. g& d6 X
    ; ]2 q; W! u# S9 M; H2 S' G
    return;# f+ t3 V, [0 n- R. j
}$ q" W/ y. z7 Y0 l& J0 e
回复 支持 反对

使用道具 举报

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% G3 z4 H8 y, u  A: W/ e6 _1 K% u
如果其它设备快速给你发送串口数据,你这边能正常通讯?
9 I  w3 @: h- s# k( s" p0 q* h
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-19 07:25 , Processed in 0.043785 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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