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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7800|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
6 l9 Q: ?/ H* F5 ~! T2 m' I

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
地板
 楼主| 发表于 2019-5-5 22:36:34 | 只看该作者
785235014 发表于 2019-5-5 22:255 ?! g9 B  {9 A6 t
如果其它设备快速给你发送串口数据,你这边能正常通讯?

' u! y! y' `; J8 g4 t! L. l+ L谢谢,已经知道不是程序的问题了,但串口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 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。, b; I8 v1 E4 P- v0 w! Z) v/ {
: h+ u: U2 V. k
#include "TL138.h"                 // 创龙 TL138 开发板相关声明$ ^) z% k9 a+ P4 o) n7 O2 H

. m0 ~2 e# I8 o+ M9 F! d2 _& u#include "hw_types.h"               // 宏命令: C9 p# L) a! L# @
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
6 K7 T4 e1 e7 y, _0 n5 R8 Z/ g#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
% G$ }5 h# [' S& d2 a
% a1 T6 Y6 t9 i#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明+ |) V; }1 g3 B
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明9 C  [; e5 B/ X# r7 \
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明% |* h4 Y; R, d3 P$ U. f/ J: B
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义5 ]/ a' _3 P6 d+ k$ I9 ~- }/ c, P
* O( X  S/ Q9 t! N5 g
/****************************************************************************/3 K! |9 E4 h5 K( O
/*                                                                          */9 P& h: P4 F0 q7 I% s
/*              宏定义                                                      */
( T/ ]; J8 w: r, J8 N/*                                                                          */  Q9 ~# M& f+ e6 g' R
/****************************************************************************/
$ A6 {3 {2 _# S4 \// 时钟  }  j+ N" t1 b' t3 V( k
#define SYSCLK_1_FREQ     (456000000)! @1 Y: ~6 D4 c) F# F
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)& R/ Q* u, L# J# j. p: E
#define UART_2_FREQ       (SYSCLK_2_FREQ)0 m- z6 `, t5 A0 T/ T

  }; \% W- H8 t# R8 ]# J- Y0 r/****************************************************************************/
; R/ ?, u5 J0 r# g. W. L- I0 L/*                                                                          */
7 c  E2 f; _( i+ c' n0 e* ?* |/*              全局变量                                                    */- v1 F: Y+ H6 @  l7 P
/*                                                                          */: d  I8 x3 d. @  G8 Y3 W! Y
/****************************************************************************/# Z& k6 w# m3 R* s* G0 E  d
char txArray[] = "Tronlong UART2 Application......\n\r";) m. m6 R2 \. Q9 s3 F  w( v
" ^8 m0 \1 `7 f
/****************************************************************************/
& b$ _* D. b% K$ n8 K/*                                                                          */
: Y' e5 x1 }& j* q( ?3 z/*              函数声明                                                    */3 K6 y3 W5 D& W+ y1 E
/*                                                                          */
5 `' C7 E4 T) K' v4 ^/ R/****************************************************************************/& u: e4 l" t% M( E" ?8 @, q3 K% |; A5 @
// 外设使能配置
4 P/ U+ t. X. `! jvoid PSCInit(void);
9 `) {- }$ Y2 n5 Q& A4 a$ U2 u1 s% X3 k, M' G  n) o
// GPIO 管脚复用配置
) i& U! P' U  R1 svoid GPIOBankPinMuxSet();
) a7 L) j1 _; l) a7 Y. o$ A- b" Y8 ]9 L
// UART 初始化" c: e, b7 [1 ~/ Q" I
void UARTInit(void);
% h! v, \4 y' e! b4 }) ?6 z// ARM 中断初始化
4 `7 G( R* a5 i: @$ |! F' ^void InterruptInit(void);; w( ]6 D2 [: ]
// UART 中断初始化
" O) |2 Z% U# [/ Qvoid UARTInterruptInit();' g+ s+ t- l5 D, w+ U% c5 C
// UART 中断服务函数% r! [0 O1 R1 ^) s
void UARTIsr(void);
" {- |! Q/ @. D4 Z8 j' m  U6 s" z, T* ^
/****************************************************************************/
' n- t+ T: |: l$ s5 p6 V/*                                                                          */
$ s3 c3 X! h$ U5 B/*              主函数                                                      */7 v& E- ~  X4 ^; E! \5 c1 h
/*                                                                          */1 I- Q* L8 V  J8 w
/****************************************************************************/
1 B3 v& J* G  f2 r& _9 q9 K  oint main(void). g, i) m8 F$ I1 [
{0 @7 o; s* S. {
        // 外设使能配置
  }0 V/ M3 Y* o+ }        PSCInit();
* j9 ]( a( L& g+ l       
" S) X4 |: x3 v/ `3 U        // GPIO 管脚复用配置
7 k& F1 K' q* C- A        GPIOBankPinMuxSet();
1 [) V7 ]- |0 Q& x6 B. E
. p" z7 f6 s8 p3 J( X& ?        // ARM 中断初始化
  q& F9 Y: {9 |* t        InterruptInit();
# |  z: E3 o: k
7 W8 L* m# p4 F        // UART 初始化
% K/ k! _$ S; B- W        UARTInit();
! v( c, l# ~2 p/ e7 y3 e% h2 S- n/ @3 k* i' B
        // UART 中断初始化
# d/ V/ y5 @1 N# t' v4 E- `- M        UARTInterruptInit();+ f* W# l4 y" d& O' Y
8 D( R7 i9 p+ w, G: s$ T
        // 主循环+ p# K6 _1 u! r) F
        for(;;)9 e( ^$ Z& G) _& ?2 F& ]3 J$ [  G5 F
        {' |4 c2 m+ w' t+ `' L2 B. u
( W* K5 z0 E, C0 N* C' T% F
        }
# s: o0 T) \3 V# K}
% y  O/ C/ v+ o/ u' [% e4 @5 S: I8 `+ K
/****************************************************************************/
2 o" {+ Z( l  v/ U! ?2 z2 r/*                                                                          */
) j- t: t' c9 ~4 o- N/*              PSC 初始化                                                  */# z- [4 G  u8 h3 ]2 |: @: |
/*                                                                          */$ @. t" I/ p1 z7 ?- M$ G" V- `: G
/****************************************************************************/# o& k$ Z1 h6 S3 E( N  N
void PSCInit(void)+ T: z# J& w8 v& d8 R* R
{
: S+ `7 j- a- m, r6 z4 F# K) t        // 对相应外设模块的使能也可以在 BootLoader 中完成
, ?6 [: T/ n1 U$ _. k    // 使能 UART2 模块0 q5 r# e3 Q/ ?- Q) e/ `
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);* \8 ]& g+ R8 R
}
9 `; U4 k: {3 ]( P' f" J
2 L  N5 F$ M: u( I, B- N" Y# M/****************************************************************************/; K% v  t1 r/ u7 B5 {
/*                                                                          */7 C- J, r+ ?# n& x1 e5 f
/*              GPIO 管脚复用配置                                           */
) h- S6 e, u6 s" T$ P6 T/*                                                                          */
2 H8 R4 e/ F) U* t/ z/****************************************************************************// C5 D3 M9 t! f
void GPIOBankPinMuxSet(void)
( E  h7 C. u, Q' W# l  K7 j. W' H{
' m3 M+ o7 i7 [+ n        // UART2 禁用流控
" {/ O- V9 ^1 c5 q        UARTPinMuxSetup(2, FALSE);
. b+ H; _% Q: f: r}- }) s% k: [% e6 t; s. \% p% |6 S
7 z0 x) r; m% L! d2 W2 V" h( x
/****************************************************************************/( o4 G6 P4 Y6 V7 b7 R
/*                                                                          */8 Z! [! u" C. E) r  x
/*              ARM 中断初始化                                              */* P3 E/ P& K1 Q
/*                                                                          */' n9 }1 p8 q! K
/****************************************************************************/6 q9 G' p' k# p( r
void InterruptInit(void)
' s( U' ~+ p% p1 t; i! ?. Q! [{
9 x9 ]0 k& w, R3 F# @* z" u8 l# A9 D    // 初始化 ARM 中断控制器
1 @/ {5 F# E2 D  S  S; w    IntAINTCInit();
6 k0 {0 e- N; c2 Y; o1 v" p5 L# z. A7 ^- ?/ h7 \5 d
    // 使能 IRQ(CPSR)2 ^* v2 t; w) g; M
    IntMasterIRQEnable();
+ R9 x5 I* L6 C  w' D+ i* F7 _$ k/ p$ i8 i5 G: Y& M/ }
    // 使能中断(AINTC GER)1 M! k4 }9 n. q9 E
    IntGlobalEnable();
8 y) y( C* X1 s+ O! i' n8 c; k; N  v+ ~0 `7 J' g! U0 Y
    // 使能中断(AINTC HIER)) A( n$ S# C' w
    IntIRQEnable();
  H; S; k; d: L2 p2 l* s; P% C. w8 _; Q}
- a  q- d, t1 X0 x; B
4 K5 G! Q8 ?# G: `* l  ]2 h! a/****************************************************************************/
# u( n) l- a$ z3 e/*                                                                          */8 u2 s; F$ W9 ]
/*              UART 初始化                                                 */4 U$ e! U! }& l/ M: W; Q; O
/*                                                                          */
1 F- {! _- _7 R" e% B* \/****************************************************************************/
. _" r( E, u' g3 Hvoid UARTInit(void)
$ ?- y& w0 d& z; j, i0 T+ ~{
* l# W- P0 \: \2 c        // 配置 UART2 参数5 Q+ a. G4 G' V
        // 波特率 115200 数据位 8 停止位 1 无校验位. y0 Q" I; @& H' g) }, i. C( e
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
: D9 f" g. |8 ~  P3 p6 ~                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
- |& }, g' O9 i# E        // 使能 UART2
' U9 s4 {; l* Y/ S2 S8 G) q3 Q6 J' Y        UARTEnable(SOC_UART_2_REGS);
# l( k/ `) s2 [- R3 D8 u; J* z" e) o* n; C' G" P7 @
    // 使能接收 / 发送 FIFO
' d1 m$ m' y4 Z. [' |) g2 {: k0 u4 |    UARTFIFOEnable(SOC_UART_2_REGS);. Q' h% |1 t/ p2 Y: I6 d3 Z6 F

; P4 X8 G% ^! \1 Y    // 设置 FIFO 级别& z4 C' J! ]# p0 Q- i5 z1 g
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);. d4 O) n* @- v& Z. \
}
6 S6 Y' z! K+ g
; ^8 C( D/ I$ }, k/****************************************************************************/
' ^: G+ H; Q. P/*                                                                          */
2 m. W! p8 P' a: T0 X  W/*              UART 中断初始化                                             */
- g, Q9 _3 M7 W: L/*                                                                          */
) |! I; Z, l; ?; @3 I2 K+ V/****************************************************************************/
- {' h' I: _( b, E3 D$ ?" Nvoid UARTInterruptInit(void)9 v; q3 h; a8 _9 |: `' Q8 m9 ?
{
4 z3 N- O) N% T6 O! E% D5 q. D        IntRegister(SYS_INT_UARTINT2, UARTIsr);
9 o5 y7 W4 `# u4 ?        IntChannelSet(SYS_INT_UARTINT2, 2);
/ y1 j) z$ I- n: h0 \0 u+ J: c6 {        IntSystemEnable(SYS_INT_UARTINT2);
+ v# k, k/ @2 l* c3 {4 o4 p4 w- s% u0 X
        // 使能中断* x% t; [2 Z4 I: j) M( }' D
        unsigned int intFlags = 0;0 K! S. v( ?- h: O
    intFlags |= (UART_INT_LINE_STAT  |  \, x$ X" y) |2 D& }! q& b, E
                 UART_INT_TX_EMPTY |    \
. H9 a/ [* H4 v                 UART_INT_RXDATA_CTI);
2 w( U" x2 @' e    UARTIntEnable(SOC_UART_2_REGS, intFlags);
/ [. U  {# D5 K7 h. k! ~}
# C9 {# l% S) g: m: v$ i! Y0 P0 y% Z0 W5 c0 N$ Z7 x
/****************************************************************************/% x) ?/ y5 z1 B$ G) f* E
/*                                                                          */  s% T  E6 S& f, m- a- J+ u
/*              UART 中断服务函数                                           */: D3 V: V9 H: l" e+ G. n
/*                                                                          */2 k- |( [. O0 H% v: y% R% p
/****************************************************************************/- @0 l  V% F& _  O0 y. u1 _
void UARTIsr()
$ c/ e, O* C3 G0 y. P5 T{
- z- s' S$ u6 Z9 S    static unsigned int length = sizeof(txArray);
% i5 C5 i. b. y' C2 ]    static unsigned int count = 0;
( u! W" J) J+ u" K' J7 m% e    unsigned char rxData = 0;
3 u, P$ }6 j% p, U* ~7 s3 [  O    unsigned int int_id = 0;
4 O2 e: _' F- m2 Q+ P: _
! h- e7 U# {( F1 `. g. }    // 确定中断源
2 C; @/ j' Z$ R( [8 D/ d+ c    int_id = UARTIntStatus(SOC_UART_2_REGS);
1 M( X* D" e6 m! |  V! G/ g: z& ?  A0 i
    // 清除 UART2 系统中断
) ~* p2 C6 a' q5 K1 J, a- \( d9 K    IntSystemStatusClear(SYS_INT_UARTINT2);/ g5 B! B& L( V# G" e: u

* I  E) k4 D6 i0 u    // 发送中断
9 l) ^- U7 b# R) k5 v    if(UART_INTID_TX_EMPTY == int_id)
# X7 ~7 g5 e5 x& q" i" r    {$ o; `' ?  N. X/ ?) s7 P" }
        if(0 < length)+ [- U) x3 |5 ^" G  l2 [$ L# q
        {  K7 r0 s7 W9 i4 P: X8 b
            // 写一个字节到 THR( h8 G. u  l" Q+ u* g5 Z! i
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
& L, r2 V8 f1 V7 p' A4 o            length--;
8 n$ j7 A) D3 v% H+ [; o6 W$ ]            count++;+ ^/ K5 h+ A; V, r
        }) h& c" ]8 W2 f, S% \& ?
        if(0 == length)$ F: ]" ~2 i7 ?2 ?1 i
        {2 Y, ?$ M( e: ~/ Y5 b& }$ `$ T
            // 禁用发送中断
8 r6 k7 O2 B9 o- e2 I9 U            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
0 H& n+ b; y' y  I/ r  K        }
! q- U7 r+ \( F, s     }$ s0 f4 A2 }) e

0 M3 Z6 M7 z$ d$ y, d) G+ n! D    // 接收中断
4 s- h, Q( N( k    if(UART_INTID_RX_DATA == int_id)
7 R" t' }4 s: b9 l8 r: c4 ^5 I    {
5 G: C# G; k+ l, f+ J6 f8 ?        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
% g) o* B  ~3 q& G0 \* e6 e. r7 d) z0 @7 u2 m& |) v
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);. W+ p* G( j/ ~6 {: P0 U
    }0 k' o. O# R+ b3 m6 _3 N

  s8 x! h- i8 N  }8 s* G    // 接收错误# Y0 ?( z; q" Z0 y/ ]* I6 O
    if(UART_INTID_RX_LINE_STAT == int_id)1 D- F% G* T6 Q# G! w5 i
    {
$ n* [+ G7 U5 x0 q% [. y% I        while(UARTRxErrorGet(SOC_UART_2_REGS))
& z" S9 @1 `9 f: Y; y. B        {
" [4 R9 M2 g+ [! S5 ]            // 从 RBR 读一个字节
9 G! t; I9 s" l* T            UARTCharGetNonBlocking(SOC_UART_2_REGS);
( q+ I9 `# _  |( c0 W" J        }- f; w8 j& S$ G; W
    }
, Q0 x" [* x# B6 G. m, B! l: c8 z* T   
: y' d3 N% L7 w1 v6 W    return;" k' y' @) C8 E0 S/ O8 H
}" o# z; s( Z8 [) T0 T2 E
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-17 20:47 , Processed in 0.046560 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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