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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7951|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。+ J; I# O  ], _# {4 y

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
/ @: Z: g! q. ~
8 ?: R! h. ~- {0 t# d+ X# U#include "TL138.h"                 // 创龙 TL138 开发板相关声明/ W- {7 ~: c- }& U3 p

" X# i3 b/ N1 x* P0 q9 n#include "hw_types.h"               // 宏命令) C! T+ z1 I* N6 `
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
0 T4 E' ~2 X/ g' S( y#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
% o- k; U2 y( q& d: z/ i
6 ^( u: `5 a/ _! A4 Z9 p2 y9 [#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明3 u5 ?6 a/ p- O4 [* S
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明" S$ @' U2 W- P* L
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明1 [' m- z% ~) I: a7 X; U8 D! c
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义' |" K) o+ O! J, R# r

0 }: S% V* O- }; y/****************************************************************************/
8 Y3 z( x6 A1 n5 T" @- t/*                                                                          */
- c, p0 F$ n7 H3 a3 P/*              宏定义                                                      */6 v+ Z  y+ \8 x0 X: E% b- m- ]
/*                                                                          */
8 W! W% t/ `9 G) p# W/****************************************************************************/
2 g* `. w. U$ P4 r( h- r// 时钟
5 o$ N4 D: Y7 l) H#define SYSCLK_1_FREQ     (456000000). T; p; B7 j& p+ v% G8 [
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)/ P) L9 K7 i+ \* V8 x% h
#define UART_2_FREQ       (SYSCLK_2_FREQ)6 K, B  k; s6 g. v  Q, \
8 @1 k/ {8 n, i! ?: ?  I
/****************************************************************************/5 O& Q2 t  [0 l" D" p! @
/*                                                                          */
8 ]/ R2 F1 i! q8 H/*              全局变量                                                    */
6 m& X& m1 F8 [; n! [/*                                                                          */
; A9 N7 h( g/ @' E; u; r5 W' N) L/****************************************************************************/5 C0 V; s5 e6 J: I  P1 }  m
char txArray[] = "Tronlong UART2 Application......\n\r";: {) ?3 V- J7 T3 s3 S/ E% I

7 B& w/ S: b& s$ H7 s- u7 X9 _/****************************************************************************/. M" |0 t8 U) H1 `7 v- E2 {( |% `
/*                                                                          */, f8 a, P+ E# [
/*              函数声明                                                    */
- k/ H$ |& p+ d. O/*                                                                          */" M% q/ V, Q+ ]3 G4 S
/****************************************************************************/7 K$ u( G* n8 O0 Z1 ~
// 外设使能配置% t! c/ W( E0 r
void PSCInit(void);" @6 P3 s1 S$ l% e& C$ S9 B
1 A7 j, Z5 b% y3 g# O
// GPIO 管脚复用配置( Z7 {, e; Q- b3 W$ f: o) L# f
void GPIOBankPinMuxSet();
8 ]- j7 P  }( C6 q3 g: A8 Q
& L7 `- S$ `( _) ^4 b& N+ s. J// UART 初始化$ }/ O5 Y0 ?$ g% r4 Q
void UARTInit(void);3 ?8 c. ]) q. |8 {4 f* L
// ARM 中断初始化
: P1 E7 Q# @/ o+ X& K% z! @: x, uvoid InterruptInit(void);3 O' U( C3 h: r( F  }5 W/ ]2 \
// UART 中断初始化+ E/ s* K1 {, ?9 D2 _
void UARTInterruptInit();
+ e; ~' A1 }6 d" }2 j/ r// UART 中断服务函数
% N9 P$ q2 Y5 F; F3 yvoid UARTIsr(void);4 f. d; V: k; H4 n$ h

; o8 Z( c" R5 y; E. ]" r/****************************************************************************/
  h( C4 }5 g( t, R4 J5 c+ s/*                                                                          */
; f# c. q/ {, B; t) v3 W% w/*              主函数                                                      */
+ n% c5 D# e( F/*                                                                          */
  c! _/ J  y. D/ V" r" x/****************************************************************************/
8 g+ S' t. H8 `6 ]2 I: |int main(void)
2 s8 ^4 R) C& D( C9 c{3 t+ O& [9 I* o/ l! K! j  k4 `
        // 外设使能配置
( v8 s! A: X! z' k$ _2 c        PSCInit();% F5 e. O2 f0 T
       
/ x' j' @. c6 a5 ~0 C1 S        // GPIO 管脚复用配置( b5 H% c: \+ v0 C2 a
        GPIOBankPinMuxSet();( m( T5 @. ?) P

! r+ o" @" H  S; V        // ARM 中断初始化
0 X* |) ]" o3 ?4 \        InterruptInit();' n9 R- r$ j- e$ x3 W
" m7 z3 T2 l/ k; b9 i3 m
        // UART 初始化
/ P2 @+ A4 Z1 N. U1 w+ `        UARTInit();& _" K# E0 k) G& j. }0 p  Q

: g, m" J& m2 G        // UART 中断初始化! e3 X; b* f) d' U' ?7 S# G- z
        UARTInterruptInit();
( }; ~' m( J( b: P# N7 p/ N. u
$ j$ N7 L, k4 K$ u% T        // 主循环6 f$ b" F, _( X4 u7 E
        for(;;)
* Q: g2 P. @" ]9 Q0 P        {
! z8 j# y- P6 C- d, Z$ S- l* x6 l% F+ v) G0 E8 Q
        }9 c% p, W. ^% s- s  l  y
}: n& B( i, ?$ k! H7 d- R
5 ^. X; p9 E9 N
/****************************************************************************/* L/ q4 ]/ z! S" y
/*                                                                          */0 I  Y$ @6 R9 [2 P" |! a, Y
/*              PSC 初始化                                                  */
( V! G0 V2 ]% a# @$ V( o/*                                                                          */! W8 w$ Q8 ~8 V5 C! i0 a& L
/****************************************************************************/
4 u" V+ e; ~2 }3 g' J$ D  F5 s+ Uvoid PSCInit(void)& F  Y  O/ S) h. H
{
3 F( S1 }, p0 J! X0 J9 C        // 对相应外设模块的使能也可以在 BootLoader 中完成9 b- C8 N9 |1 c3 J. R& U7 w
    // 使能 UART2 模块
0 H1 g0 `. `- Z    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
$ o: m. `  o$ h+ x, D}
. p# Y9 \6 |: M3 \6 z& w$ z$ j+ ]. g$ G8 c
/****************************************************************************/
8 w4 U, Y9 W* G) d0 ^/*                                                                          */, u; U- G" A/ h
/*              GPIO 管脚复用配置                                           */3 O/ p  N4 {6 r% v, h
/*                                                                          */
1 b% \8 E8 w. B4 h/****************************************************************************/
. }% K. J1 h' |% P3 C$ _void GPIOBankPinMuxSet(void)
% J* o- G1 A" ]! v1 u: V% n# n{
. g3 S$ [& A8 D; y4 ~% j        // UART2 禁用流控& r( b' |8 m7 F  j  _8 L* _
        UARTPinMuxSetup(2, FALSE);
9 ~8 S6 y* _6 h, x* a  {}2 U: \6 I& i, F, W% W  j
: J3 j# n9 V0 ^9 ]9 `
/****************************************************************************/
1 w1 h2 u* }( t, j. i" N( q* c+ ]& t) t. B/*                                                                          */
0 R. f* ?; N3 f6 x4 k: C/*              ARM 中断初始化                                              */
  o) w5 N  Y+ |. @$ y# f/*                                                                          */
% x( I# W1 d7 X! c' q, o/****************************************************************************/: o" ]( s0 G1 f  v( g
void InterruptInit(void)& J. k% t) m1 R7 i! C' F. H
{6 G2 H2 K# ]& u7 A: e% ~6 n9 p+ Y
    // 初始化 ARM 中断控制器: s/ _1 ~  s! i5 h' E, Y
    IntAINTCInit();
: d5 q- K3 }; w, P; C3 @% R
3 i7 o* D4 A. p. h; f    // 使能 IRQ(CPSR)
/ D1 H# g; C; Y* t- T2 q$ p  d    IntMasterIRQEnable();
$ C# l7 |5 w/ c# Y4 l1 U- f
& W! x) \  a0 [% q; u1 `    // 使能中断(AINTC GER)
4 G! ]1 J& [  B! h" f) y    IntGlobalEnable();
8 g7 k$ J+ p! j1 |
! V0 R+ _7 w9 E& ?* P" M6 h9 e    // 使能中断(AINTC HIER)
: m9 j; v( v8 x- f! \, v% w- a7 D1 g    IntIRQEnable();/ H0 ?6 Z& o. z' c( F) S& t
}
. a8 L- N7 `- r. a3 d! P. {7 m+ R1 A" T- g
/****************************************************************************/0 W; V# [- S# ^( C7 {) |( j) _
/*                                                                          */
! Q- m" V2 Q9 _/ g: C' V) M/*              UART 初始化                                                 */
+ w3 b# A4 o6 z6 Y: H3 V! F/ a  B/*                                                                          */
) }8 W& c* T, V6 ?$ C; }/****************************************************************************/
5 b% J" C6 O5 _  N* V" h, J# Yvoid UARTInit(void)& Q  G1 i. n; S. x5 g3 E
{
! v  y% K- m4 c8 c5 R        // 配置 UART2 参数
. F- A7 G6 q: Y        // 波特率 115200 数据位 8 停止位 1 无校验位' S/ C% I/ ~% y
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,7 l+ w. S& |, S9 m1 j$ E
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);+ Q/ q, e# X# N$ O. g5 [
        // 使能 UART2
) j0 N0 |: R# ]% U6 K        UARTEnable(SOC_UART_2_REGS);- R% G: a4 Q- r
' _0 Y4 }- S6 J3 U# A1 f' J3 k6 v
    // 使能接收 / 发送 FIFO+ T8 q6 Y/ b. ^& n: r7 j
    UARTFIFOEnable(SOC_UART_2_REGS);
/ o5 ]  X2 L+ F( L$ x/ b& ~/ G4 i% i& e, t8 x
    // 设置 FIFO 级别
% n! a+ \. G7 y8 Z3 c    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);) b3 v4 u% a9 P/ i1 u
}
0 T( |* F3 n6 L: E- ~9 z* w: G+ B6 `# |1 ?; v
/****************************************************************************/( e4 t( V9 p& O/ M; X
/*                                                                          */" l; P' l& D% C
/*              UART 中断初始化                                             */
3 O, T' \) l; B/*                                                                          */
8 ?5 ?1 f" i( c+ w* s/****************************************************************************/
- O- d: H! h& |void UARTInterruptInit(void)
4 U9 O* a; x& E/ ?$ S, H  ~{
/ k) b0 y# a( J2 W+ n, F        IntRegister(SYS_INT_UARTINT2, UARTIsr);
( {2 S  `+ M$ J! d8 i0 \        IntChannelSet(SYS_INT_UARTINT2, 2);- J" d+ M8 \3 r; ~- c+ L
        IntSystemEnable(SYS_INT_UARTINT2);
2 s  K6 P3 M# T8 q, E. q- V, T1 h
        // 使能中断
3 @8 Y/ a( b. w0 t        unsigned int intFlags = 0;* r1 i, V% G$ h
    intFlags |= (UART_INT_LINE_STAT  |  \
5 T. @3 o: y9 `% c                 UART_INT_TX_EMPTY |    \( ?# J) r* i. K" p
                 UART_INT_RXDATA_CTI);
' a  s3 D) E) l3 F5 o2 U    UARTIntEnable(SOC_UART_2_REGS, intFlags);  a8 T. S: [+ a( J
}
% Z& e' a, f1 L
/ r- I' s" l& `' o; O/****************************************************************************/) I( m6 p8 ]9 s  m# F
/*                                                                          */
, k( _* A$ i7 m# A" M! {4 f/*              UART 中断服务函数                                           */' j4 Y6 o9 W. T/ E( s/ o
/*                                                                          */
3 t: b6 w2 f& s0 m/****************************************************************************/1 @: \, R- o. I: X4 B8 f4 U
void UARTIsr()
& k. }  b: }2 m9 F0 m{
5 G  a/ W' [: l  \. h    static unsigned int length = sizeof(txArray);
6 `' A2 u5 s  _1 V* \    static unsigned int count = 0;7 D) {' }7 \  u7 o. ]
    unsigned char rxData = 0;4 r' G8 S$ o0 g# T, z1 W: Q
    unsigned int int_id = 0;# v/ m7 C9 k6 x' @* a

. M* i! P' i: d    // 确定中断源/ O& a; V) u$ Z3 Z- Z
    int_id = UARTIntStatus(SOC_UART_2_REGS);
' F" U. O8 m5 ^: C% [
" Q7 B! R8 G6 h' ]# W$ {    // 清除 UART2 系统中断1 v: G1 ]) M) W) X6 |2 P2 _, y" O9 e
    IntSystemStatusClear(SYS_INT_UARTINT2);: N$ x% k# \- ^

- D" K1 m" Z5 D3 P0 ]( E3 x    // 发送中断
* E. f0 ]# Y) ^1 v$ H    if(UART_INTID_TX_EMPTY == int_id)5 \/ e/ D( E) ^! Q. a! q) ^! N7 e
    {  c' l0 r9 t- s5 l+ k( }. r
        if(0 < length)
" K0 B9 Q: L) u3 n        {1 P+ ^5 @5 R. \/ q. Y* k0 G3 j
            // 写一个字节到 THR$ R0 Z) _; g4 R& v; c. E
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
0 Y. }% L0 t  |5 e1 W            length--;
' h# p  B* j0 z            count++;6 [0 {& }9 ~: ~) i* @
        }
& }& @& s& Y  H% @        if(0 == length)6 i7 d( m0 \& v: V$ p. h# A
        {
+ C7 Q/ T6 {+ f3 t. n            // 禁用发送中断1 ?8 \7 d9 f2 S- L$ D
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);' |5 q8 a0 M# w( e) h* h) o
        }+ c% i6 r7 v  ^2 c3 F' @
     }$ d2 X! l0 d( j: w
3 S3 V/ o9 G: j- s7 B; B
    // 接收中断7 w" S9 J, x. p1 f' e
    if(UART_INTID_RX_DATA == int_id)
& w' x2 l) D' e& \- }    {4 i& n- [1 D' z. y" P4 e5 S/ t
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
% E9 x2 d; v9 X
+ U4 [* G) Q; j1 g4 d) j        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);6 S! c3 E( |! l" q0 n
    }
* C3 x* V# G# I* \( a; {2 \! V, o+ O8 M# v
    // 接收错误  U0 S1 U! o2 f5 r9 W8 u2 F+ N
    if(UART_INTID_RX_LINE_STAT == int_id)& ?; J5 I  u9 c- _6 U
    {
( i' e0 c+ a) m. R! _2 m        while(UARTRxErrorGet(SOC_UART_2_REGS))0 \7 i2 z/ a  D1 G7 u9 U4 G
        {
$ H4 W, [" |! q% Q: R5 B$ A& r            // 从 RBR 读一个字节" p  v, D" h" k2 J, |
            UARTCharGetNonBlocking(SOC_UART_2_REGS);- t3 l# [2 c# y/ I
        }/ B) t6 @$ ~' z3 c4 W- r8 l+ d2 `8 n  r
    }6 r* c: s, J1 x1 h
   
! `' Z0 s$ n$ E6 J    return;* _. W' H# y0 g( M6 j7 ~  j
}
( I- H& D+ R8 J, j8 p9 v' i$ c, V
回复 支持 反对

使用道具 举报

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( [: f4 y% T/ ~5 z! J
如果其它设备快速给你发送串口数据,你这边能正常通讯?

0 N, Q6 S* }- b谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-18 15:57 , Processed in 0.056522 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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