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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8018|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
4 ?" c3 J4 J3 q1 L# x$ a

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
0 R- m0 C( }  E1 t
/ H6 C' S3 S1 h0 s5 R; J4 h#include "TL138.h"                 // 创龙 TL138 开发板相关声明) w  ^) W0 O% a# [" r  w: `
2 G% i: T; A! P* R2 c
#include "hw_types.h"               // 宏命令
. E- y' g) Y* n8 z2 [! K2 w2 a. D#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
3 y  K& t! e! ^9 Q2 D% _#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器2 |% c4 e! _6 r
7 k% K+ {4 ~1 E$ l3 s/ O) Q3 j
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明5 D. w" c, i! k5 q
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明- U9 }. w+ x' f9 z7 U7 Z
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
" K+ Y- h% T4 l5 F* y. r#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义" I, A; L; j6 _7 D" Y, q2 ~
5 R5 i7 M; \0 n. H; ]! [5 I
/****************************************************************************/" ~4 w; X# U6 c  U; D  u7 Q" G
/*                                                                          */+ C% m# E6 [) J. j) L6 }
/*              宏定义                                                      */
' i& Q- ^! m- U* ]9 ]/*                                                                          */
3 |! E- p' \4 i) Z0 N- D6 @6 e/****************************************************************************/8 \! b9 u% L( E' ^' c$ |9 U$ O
// 时钟! [+ ~) n& n& _' W1 a' t. V+ d
#define SYSCLK_1_FREQ     (456000000)
9 X$ _& b: a' I$ W8 T* }; p#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2), H- \1 T3 Q' J+ ^" I. X
#define UART_2_FREQ       (SYSCLK_2_FREQ)
+ v+ N) _- }$ {) D5 ^" S# H& U$ o) M$ o+ T, G- j  |
/****************************************************************************/' g# }; L2 q5 ]( f
/*                                                                          */+ ?  h4 k8 H, m& [! |3 q
/*              全局变量                                                    */
1 P: {. `: s" a( z6 l3 x/*                                                                          */
+ F  Z8 J& \) l7 h6 |# c/****************************************************************************/" M, C+ Y5 k1 c  Z% g6 u  o. {
char txArray[] = "Tronlong UART2 Application......\n\r";
8 g( H% o7 _2 t1 l6 F% ?) B3 @* i( j9 ?+ a. [+ X/ r9 q6 s4 r
/****************************************************************************/
3 @3 ^6 [) B* {" v$ Y% P  d# I/*                                                                          */
; K$ P  C  ^' B) a. s- B/*              函数声明                                                    */4 }3 f, f* T; U: S
/*                                                                          */
$ @5 K( r+ t6 L/****************************************************************************/
, x' M. Q6 I. x( l# Q// 外设使能配置  H  V$ t0 f7 e9 z1 n! }+ H; b
void PSCInit(void);' O* U$ I% u7 h, p: T6 P6 V' t

& ]0 o" b2 K- d+ @7 ?7 N// GPIO 管脚复用配置
+ p$ I( J* }- _! {void GPIOBankPinMuxSet();" s% o/ X7 q% R# ]3 G6 _
% o) G5 ^8 K/ m' Q+ x3 L" n( Z* W
// UART 初始化
2 Z$ G; u' E& e4 T9 i# Lvoid UARTInit(void);
, L$ @- r( y3 E9 v5 c9 y// ARM 中断初始化* U; i9 a+ E9 b* Q  `
void InterruptInit(void);( A' ?8 P/ M! }  o4 I1 G" \
// UART 中断初始化! P5 j$ V) S9 u
void UARTInterruptInit();) w, g5 e* u' k9 i+ d
// UART 中断服务函数; @& R2 x$ |( o
void UARTIsr(void);: I, H; H, A; g9 n% E0 }! j, R) M
2 ]& I; T+ R; E5 h) A: J: r
/****************************************************************************/" y" ^( [. x7 s6 p  R4 _
/*                                                                          */% R$ |  U* E: Q* Y
/*              主函数                                                      */
9 c: Q9 B% R3 ]. v/*                                                                          */1 {( F; l3 v8 A" w) p
/****************************************************************************/
5 C  Q# y/ Y6 Y0 dint main(void)1 Z( m' G" d7 C# D& Z0 R  S
{" o7 c3 J* F/ k8 M- ?
        // 外设使能配置. k! }: a. j, H+ q  [/ S0 K4 n  K
        PSCInit();4 ]! }: T. s; M( [1 O7 ?* i" r
        3 [+ c8 {6 ~# z" G9 g
        // GPIO 管脚复用配置
4 Y) t5 q3 z8 X4 K7 K2 j; F$ q        GPIOBankPinMuxSet();/ N* R0 x4 ]: L

" H3 o2 @) e7 d1 Q$ H* C7 A        // ARM 中断初始化
5 |7 Q7 Z8 E7 Q        InterruptInit();9 ]; c, q% W" b, `+ x
# m$ _% q& G( A6 @, ]- V4 I. u4 }$ L
        // UART 初始化
8 T- i" L& X9 m' x, s4 q+ R6 R        UARTInit();2 b7 K8 U0 {3 Y( I, K* Z
# D8 }: t, ]* y6 d( O
        // UART 中断初始化
( J0 g$ i( |4 e0 e- ~" _( ~        UARTInterruptInit();
! t8 C. i# X- m; c# S6 e5 y/ f% T2 `
        // 主循环' P# U" s" @8 P
        for(;;)' |/ b+ [& u8 }% T% ]- B, J) `
        {
' @+ f+ H, y5 @8 W
  P& H  \5 H7 H- r3 n1 i9 K        }! [5 J) y; L% d1 m1 {
}
, W, K/ u5 @/ |
. E0 F; M6 E) S+ H/ g/****************************************************************************/
$ o; ?) e9 e$ q3 d/*                                                                          */' b, |+ ]3 \' i
/*              PSC 初始化                                                  */
3 B, i* R! S! m& t9 a- }/*                                                                          */0 _- i. I  `1 p& u/ _  N" `
/****************************************************************************/$ G% m/ p+ u2 z! n
void PSCInit(void)! R1 n. l! M1 L0 x
{) L' i% Q. N0 }8 U' q- ~+ B
        // 对相应外设模块的使能也可以在 BootLoader 中完成
' y  R/ B" K4 T+ C    // 使能 UART2 模块4 _  @+ n  \5 m. Z' p6 I
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
2 ^9 U3 [3 b" J+ u" f' n}
# ^; Z  `+ f1 Y% i* i2 m! @4 ^/ J% S6 m) A- |; _6 [( K3 {
/****************************************************************************/
+ _+ q+ z6 b/ h) ]9 n$ ~- `- n3 B/*                                                                          */' b" _. _+ p4 g$ j8 z) z
/*              GPIO 管脚复用配置                                           */7 Y9 {" z5 j9 b2 r% a; ~
/*                                                                          */
6 d& ^  B0 G7 V- I  l/****************************************************************************/
' A3 ^% h: d! rvoid GPIOBankPinMuxSet(void)
1 M8 A- |! P* r0 ^{
0 l" S1 U" g# ]. y$ S        // UART2 禁用流控) p: I9 Y$ }7 ~+ }* g3 O
        UARTPinMuxSetup(2, FALSE);4 ~* R3 n( |0 j$ T" f& h$ R
}
- J7 \1 R3 n" W$ q: }- v$ C
3 @8 U: X  X5 _% t( V- g. K/****************************************************************************/
' ?" ?4 F& q  X: p: M4 h% K/ l/*                                                                          */0 x4 s) k+ T4 ?# v9 [' ?
/*              ARM 中断初始化                                              */  x. o: ?) L: t' w* K
/*                                                                          */& D2 R. \1 [+ _6 o, G0 c
/****************************************************************************/
8 O( {: G" g' d8 Y' Y6 ]void InterruptInit(void)5 g2 P8 `5 S' Y$ I1 h& w* A
{% h) B& X5 v% W! _2 p4 K4 L- s
    // 初始化 ARM 中断控制器2 S+ v8 y) B9 x) N
    IntAINTCInit();9 X! ?+ ~. v0 R+ c
5 i& S- {2 z  b7 r
    // 使能 IRQ(CPSR)
8 c  B( T3 ?+ V+ {6 T4 a    IntMasterIRQEnable();  X+ O5 @0 Z  t

& T9 f/ W8 {4 E5 }1 P    // 使能中断(AINTC GER)
0 K  C+ M* T& X5 y, P; b    IntGlobalEnable();
) T. A' P' g0 Q6 a& J  j: x+ _9 R; V# o" ^
    // 使能中断(AINTC HIER): s% F7 Q8 T+ X$ G# P% p# K$ A
    IntIRQEnable();9 J+ ?  L) t: M) M. T9 ~( a
}: i% g; K+ O; ]

/ d: K( T! D8 I" L" @( Z/****************************************************************************/2 R4 A1 @$ @' ]& O0 A/ \" `2 v; `
/*                                                                          */
3 \9 }: J) [1 ]/*              UART 初始化                                                 */
$ h1 [/ [! C. L/*                                                                          */
. V# A9 N5 y% |6 U" Y/****************************************************************************/; w; L" B3 d+ O7 q$ d* h: b; e
void UARTInit(void)* D9 U- a2 F2 B' P4 n* V8 g2 ^
{8 h: `6 E- u% q. Y" h
        // 配置 UART2 参数, g; R3 d* W  k' L% i6 C7 t$ n
        // 波特率 115200 数据位 8 停止位 1 无校验位2 }2 d. U* k3 O4 r0 p3 z# I: ~. `
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
8 d! `' R" u# q                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);  [. \1 w! _9 h9 t: k
        // 使能 UART2. G$ r" S  {3 {- A; T
        UARTEnable(SOC_UART_2_REGS);
: d2 N3 D6 Y% F, Z, P
2 M% G, H6 z. k2 U  ?5 Z3 s, J* p    // 使能接收 / 发送 FIFO) P% X& p7 t! @8 O: f6 Y( d
    UARTFIFOEnable(SOC_UART_2_REGS);+ N6 s' d: A6 G% O( d  x! q

9 k! {- l9 ?" g! b8 S    // 设置 FIFO 级别& H" g% B; y1 f7 |2 f" T
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
6 {( c" R5 r8 O* _. t3 T1 {}
0 X5 o* }( x( F  H3 `* D# U! y1 Z# ]% T+ z7 y
/****************************************************************************/% A+ z, o0 n  u4 }7 a' k
/*                                                                          */: r) i0 K  y1 k
/*              UART 中断初始化                                             */# m8 z8 Y" C' O* I2 L
/*                                                                          */) j: K! ?+ J8 V$ A
/****************************************************************************/
$ V* [: w1 g! ]: I" [8 vvoid UARTInterruptInit(void)# J; R" ~3 c( D% o6 e
{
- N- t, y* g! c* J( d: l, l        IntRegister(SYS_INT_UARTINT2, UARTIsr);" |# I0 i0 X9 y3 s
        IntChannelSet(SYS_INT_UARTINT2, 2);' a1 g& j4 |" j1 p" h: E$ g6 u
        IntSystemEnable(SYS_INT_UARTINT2);" ^, G+ u; ~3 f% {+ y' P# P
' E* n4 u0 _; F' `
        // 使能中断/ o6 k5 r4 |& Y* I2 ~: u8 ]9 b
        unsigned int intFlags = 0;( B. g  l- ?) t% m! R# Z
    intFlags |= (UART_INT_LINE_STAT  |  \
& p1 v( t. Z2 k. Q: r7 X% E2 ?                 UART_INT_TX_EMPTY |    \
. D! q, C1 D0 F; G, C5 ?4 j                 UART_INT_RXDATA_CTI);! I* V+ v) ^9 A7 ^! d. `8 q
    UARTIntEnable(SOC_UART_2_REGS, intFlags);6 r' b/ T/ k+ e' J- U% _
}
' W8 J& A- @1 W  X9 c# J# B3 I: J" k1 G7 s
/****************************************************************************/3 B5 ~' |! n8 g* ?
/*                                                                          */! w* t$ _- u* z- m+ a* k$ f* \# O
/*              UART 中断服务函数                                           */
5 X  L8 R+ y& d) t* C: b( ^/*                                                                          */
9 a+ y! r6 h# n+ c3 b/****************************************************************************/5 o' E9 p1 j' x  O  `$ g2 P/ r
void UARTIsr()
9 r/ U* o! |$ a+ K$ ^- m& y1 K: H{, P5 @" r2 b: I
    static unsigned int length = sizeof(txArray);
- c9 E* n; Y' T* S; p' ~) k% z$ @2 J    static unsigned int count = 0;2 `$ ^" p8 ]! \' [  [! ~
    unsigned char rxData = 0;" p, f- I& x; R" r- g" G
    unsigned int int_id = 0;
! U7 j/ s. z/ O" F- K$ r* R  Z* }% V( a8 E0 O. F) D" W8 c
    // 确定中断源* @. I0 r* J. O4 v5 `7 z; m$ `
    int_id = UARTIntStatus(SOC_UART_2_REGS);
* k, S$ h  p: ?8 J+ e( Z) t; a+ f6 _, d9 n2 ^" \) @/ ^
    // 清除 UART2 系统中断
# _  N/ K/ R' p, L0 _- j( n5 [9 q; {9 h- `    IntSystemStatusClear(SYS_INT_UARTINT2);6 x6 f" y: o, }' R, @( `! l

' i1 O1 Z  @: \) z$ p& l    // 发送中断# s2 d' e: \; V6 y! P
    if(UART_INTID_TX_EMPTY == int_id)
4 r& X* q# K4 q2 c: t    {
- B' D+ U8 b) _  e  i1 {9 O        if(0 < length)
1 m1 X' k5 Y- @  D: W        {
: h$ f% W; t- Y0 B; u! L5 q            // 写一个字节到 THR
3 I  `* q1 Y4 [$ a# T            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);+ d" _) q7 H, y6 Q+ f" m
            length--;, `3 X; d" p! y7 b" s. F) ~
            count++;4 K0 X/ T. i6 e2 }6 @& ^% R5 ~
        }0 s$ {# i4 J) w$ N! @
        if(0 == length)/ `2 \" k: Z8 {& _* d+ R
        {
3 s, i8 X, d& s: [            // 禁用发送中断
5 _# r8 s2 E0 m  T: T1 {) }            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
9 ?% ?# Q& D! n( O  D- O# f5 }        }
1 ?7 T$ e* M5 {9 ]" O7 L9 F     }
3 D+ h- C6 H2 I8 p5 ]# `, F2 V# \: J$ Q+ G% w+ A
    // 接收中断3 _& N6 _+ V3 P2 w0 m) }+ R1 x
    if(UART_INTID_RX_DATA == int_id)) C$ ?2 I0 T8 s* s5 N
    {1 T# P. l) c) B/ P4 \: {
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);) G4 Z, Z8 k6 E8 h
6 J) G4 ~* Q7 b8 H
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
$ O, F! ^$ v- S- r- r4 M& _! n( _    }' N- {& v/ h$ X) @) }" h

4 b9 }  R0 ?. O+ \: w4 n# J3 f    // 接收错误
" _' E) A6 ]6 O  ?3 f    if(UART_INTID_RX_LINE_STAT == int_id)
' @, X/ V5 a5 Q# A* c    {8 F$ e9 L$ d, m
        while(UARTRxErrorGet(SOC_UART_2_REGS))6 j( ~. ]3 A: C
        {
6 _. _6 Y) k' M; F. e) \, r" ^1 v            // 从 RBR 读一个字节
( Y( T# D- |1 J; x- l+ [; r            UARTCharGetNonBlocking(SOC_UART_2_REGS);; [: \) N# q# ^3 x0 Q$ t$ j2 @
        }/ y5 x4 ?# k. U  T# u+ N
    }9 p! D7 ~8 c+ G1 a: a$ U1 ~1 O
   
+ _3 r1 u* B3 c; k! L8 E2 O    return;
/ m0 v) y/ c# s  x0 u}' Q! [1 |( g6 L8 H2 m1 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$ V$ v# P$ X( a  z' c7 J
如果其它设备快速给你发送串口数据,你这边能正常通讯?
0 U8 X6 h$ t$ J8 I; B1 o" f" T
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-28 03:00 , Processed in 0.044496 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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