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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5593|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
' |. I$ \; g( e: x& y' p- N

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。+ Z+ s8 E, G) q& Z1 k0 u3 l6 q

/ P+ {# [% G. r9 ~1 J8 @#include "TL138.h"                 // 创龙 TL138 开发板相关声明" D* s( I# Q2 J2 M: {

( p6 j& s/ n0 m3 s/ i" _#include "hw_types.h"               // 宏命令, f% A$ r5 v! \) o& |% H/ `3 g
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
; B. r. F. s% h  l" D8 c# Y  O#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
/ d! U- s4 e: H5 q: b3 l% G% {/ E3 Y2 g) o$ {- }) t
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明/ j2 V4 q2 I3 {. c# B$ v
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
6 H0 ?2 q8 Y4 H2 j5 K2 I6 v0 g  s#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明  P+ A& r1 e$ G3 O3 Y* c) `
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义* g" ~4 \; j2 }- P8 o7 N
- c) y, T0 \! c, G4 X$ q# w
/****************************************************************************/
. r7 K2 M, u+ r. p# C; A* F/*                                                                          */
% x5 x6 S# u" J5 z& d$ u/*              宏定义                                                      */
/ k# W+ p/ c" B/*                                                                          */
; k5 M* Y7 i  U& n- _/****************************************************************************/8 q$ h' w6 C3 n- c
// 时钟+ _9 B# \5 ]) u; i) Y/ J% T
#define SYSCLK_1_FREQ     (456000000)/ {2 w/ }- l1 m
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
( F' C1 I: N# n4 G, N! S#define UART_2_FREQ       (SYSCLK_2_FREQ)' _5 U9 A) Q7 x' s) K" D( ~. a

! e2 p( m; q0 T* D2 S/****************************************************************************/1 q7 K# F7 s2 l: s0 H  Y
/*                                                                          */
+ g! y" f1 d/ j2 M: p% T/*              全局变量                                                    */) `) B3 L) j1 v3 A! B$ s
/*                                                                          */7 B+ u+ a- \: V$ {1 V& \
/****************************************************************************/
! e2 h! t3 f7 Q" [4 m$ U# @char txArray[] = "Tronlong UART2 Application......\n\r";) w) B" C' v  p) }+ L

/ v7 X( {, P$ B+ W& m/****************************************************************************/
( Z! N5 [2 l; A5 V* u/*                                                                          */
. G( p! K& T2 q4 c% }/*              函数声明                                                    */
  Z& y) H1 ]% O, G: v/*                                                                          */
8 t# y) l* t& u( I* M4 A% Z' U/****************************************************************************/
2 X- P  t* R1 L# P// 外设使能配置* N; T3 r5 o4 F6 p8 Y: [1 q
void PSCInit(void);
0 D1 x4 q2 F; p- ]  F* O$ j% ?. x% Q
// GPIO 管脚复用配置
8 u) L* r- w1 Lvoid GPIOBankPinMuxSet();
* r. D4 S0 o/ w
& P5 k. I# F. l3 {5 k2 B// UART 初始化1 u/ G9 R6 F, K
void UARTInit(void);% B# L* w" ?: ^5 p3 a7 m( b
// ARM 中断初始化% c) C4 v3 u& A3 n" w$ S- A
void InterruptInit(void);3 H& p. c+ P( i9 v
// UART 中断初始化+ e$ D2 O+ ^# q, p' n0 i6 `
void UARTInterruptInit();
( D; K, z: {) \; W3 B0 v! Q// UART 中断服务函数6 f& g$ ?- B* p( u
void UARTIsr(void);5 S% L7 }: X5 Y1 M( ~
4 X2 \; q7 O' d9 X
/****************************************************************************/
0 Z  Z9 _% ~2 G/*                                                                          */( f- U; x- _0 w" P
/*              主函数                                                      */! {) ^  j4 C) o( r
/*                                                                          */
% O( N2 g: g  P* a/****************************************************************************/* ]" P4 B, Z; i' M
int main(void)- P2 g( \4 d- ?* b: J. b) V& z% m0 E
{7 l, I, s0 U0 c6 O% b. L
        // 外设使能配置
. s9 ~& c) P, y+ g  _        PSCInit();) ]; g1 L8 C/ [3 s& c
        3 |; [: Z7 v8 r" q7 i$ w
        // GPIO 管脚复用配置
+ j% M2 w+ e( ?7 c3 I0 A1 n% v        GPIOBankPinMuxSet();
1 p/ a" W7 k! J+ }! L# r; T3 Z* d; V7 w  i; @8 B' V/ F
        // ARM 中断初始化
) W7 V7 p; v! ~+ u        InterruptInit();
. _, ?- P, x! q8 P% v0 j  e5 Y( X2 L0 N4 U  E9 p
        // UART 初始化
: H  L  Z9 ]5 j, U4 _        UARTInit();
% C$ K5 ^- Z1 z5 k: F
- K4 E" F/ {8 K0 m- n: W2 S5 H        // UART 中断初始化
' x+ q3 `+ O: j- L3 _3 Q        UARTInterruptInit();3 O5 d! e% `7 K5 G  `, {4 i
4 v8 E7 w* ^; k/ m6 [" e, s  |
        // 主循环' N2 B. \5 g1 G& v8 }
        for(;;)
$ ?4 ~% `) r. C: ]        {. y9 k; V& S* n

' c. I2 `+ u6 C+ ~* `& M0 H7 H        }
3 @9 r" \, u8 C  r6 F}
  C" |4 ^6 C- k  ?) `1 W( A* j  C$ j: `: u4 b
/****************************************************************************/
) |4 B, H0 B. ?, _, z  k/*                                                                          */& }( i* K7 Q) v; Q( ~2 P9 Z
/*              PSC 初始化                                                  */
% Y5 X; [4 S1 f/*                                                                          */
8 \* Y0 a" v$ t7 ^0 P/****************************************************************************/
- Y$ @* A; d  t* w! \void PSCInit(void)  O& K+ Z! v2 E4 `' v7 }
{/ {- {% \. H' i( p
        // 对相应外设模块的使能也可以在 BootLoader 中完成4 \' s* `9 a8 C4 G7 x. M" e
    // 使能 UART2 模块
: h4 T' o3 A/ F    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
" ~% V, }5 e" ^9 z}- Z; o6 b, K& O1 t7 ^+ _
5 o1 m8 ^2 i) Q
/****************************************************************************/( a- B4 z7 H  e! X  n+ g
/*                                                                          */" U. T+ K  f" |" T# K, p
/*              GPIO 管脚复用配置                                           */; q# _" f1 g. F4 S( U) p
/*                                                                          */: B! @* A, D  B+ B& ^
/****************************************************************************/
' q3 d+ r8 y% u# h8 R( q/ bvoid GPIOBankPinMuxSet(void)
+ w" ~+ Y/ y2 j- d+ ]5 c. S. H{
4 a0 x) s6 z4 C( U) w& T        // UART2 禁用流控
, i1 P- V# x$ N        UARTPinMuxSetup(2, FALSE);
8 w4 n" s: W& [  H* A2 H8 I7 |}
" V/ d2 A  a* @0 C7 n2 u5 x+ J5 N4 c
/****************************************************************************/
& u( S$ l# Q8 B/*                                                                          */
! ?- Z$ |2 r  |% z6 A3 E/*              ARM 中断初始化                                              */
' V; Y, ]4 s- t8 z- O/*                                                                          */
; S5 c$ Y, Z& I* C! g( I  N/****************************************************************************/
" H8 X. j0 p9 Yvoid InterruptInit(void)
0 a6 C+ {/ U' |- D4 g5 a. O& H3 j7 K{
* O2 f; [! B6 o. A' z( a( q    // 初始化 ARM 中断控制器$ L! C+ C5 U1 P+ l$ W6 E
    IntAINTCInit();4 ?' @. ?/ S5 Y* D7 n

& d& U, O+ i- f% X* @    // 使能 IRQ(CPSR)
9 H! ^: I/ A, @: w5 f0 D    IntMasterIRQEnable();
8 {5 ^  I- o/ S3 ]" |+ O" l
1 u' q  y; m/ E, |/ r& c& e, v- w    // 使能中断(AINTC GER)9 m$ r  Y( W9 c) H" N0 X4 U
    IntGlobalEnable();
$ Z& C: K" O, G% f8 Q) `% M& x0 f8 |/ k7 o3 }2 @4 x. E
    // 使能中断(AINTC HIER)
1 J+ j  q: ~" l* H    IntIRQEnable();$ i" l! q) ^# y* X, b: C7 B% N
}
" v5 R4 Y4 }+ t) r- Q' t( G& A' B
+ N/ b' @% s5 q6 d9 s1 G8 I5 @/****************************************************************************/
6 D/ p2 b3 E# J' C& \/*                                                                          */
1 {! D) Z! H4 `3 G/*              UART 初始化                                                 */! o" O% p9 x& \" M) `
/*                                                                          */' U2 _9 W/ [2 _' u1 h
/****************************************************************************/: ]# {# @" ^5 `
void UARTInit(void)- ]1 F/ R1 z7 h- b
{( {% ]! T9 x4 z$ y* r- ]
        // 配置 UART2 参数- g2 s2 X! {# e) C/ A. g! C
        // 波特率 115200 数据位 8 停止位 1 无校验位
8 s" C# I& h$ J. m# e* ]    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
" M/ f3 v* _2 t8 E. e                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
; B1 X4 u: _& E  ^% s8 [& f' [        // 使能 UART2
- e! N: ?3 T0 h. s, ]        UARTEnable(SOC_UART_2_REGS);
- @# v2 F" y$ E8 _4 @
! B9 i0 ]% P1 z% R8 N    // 使能接收 / 发送 FIFO6 C& ~( g) h+ d1 y4 U0 |+ e
    UARTFIFOEnable(SOC_UART_2_REGS);
; K/ Z# e& m: ~  h2 \0 [* K  d0 Y2 |7 q6 A* R3 D
    // 设置 FIFO 级别
# w% K3 L5 y  U- B  Y1 w    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
$ J( v: Q/ D# J; n! P5 g' B}
) m( e) M) y- M: X( }. g- ~) }5 V2 B3 W6 F" f& i
/****************************************************************************/! l& A) x' a/ B) V3 b; n
/*                                                                          */) t6 h, Q6 `/ L1 ~5 v
/*              UART 中断初始化                                             */8 j) a% `: J0 O; f! ?% N
/*                                                                          */
! Q8 ^7 c/ u# M) f$ b+ o* L/****************************************************************************/7 Z: z+ G( T: E( d
void UARTInterruptInit(void)
, F0 b) Y& G6 o! b; p{
3 M% U% j0 Z- X" [! e        IntRegister(SYS_INT_UARTINT2, UARTIsr);. h7 ~" [: c1 `
        IntChannelSet(SYS_INT_UARTINT2, 2);
4 @" p, |7 s9 d: e0 k        IntSystemEnable(SYS_INT_UARTINT2);
$ Y' s( B7 C; l" r) ?
0 z' t& `, y# V- M        // 使能中断  H2 V+ f! k/ o9 J. _9 m: a
        unsigned int intFlags = 0;1 x8 X7 t: G0 _% ^  B/ C
    intFlags |= (UART_INT_LINE_STAT  |  \+ s5 [7 K$ m, Y' K
                 UART_INT_TX_EMPTY |    \1 H4 Q% r6 k+ C, o
                 UART_INT_RXDATA_CTI);$ k  {+ p  c4 [6 e, @9 i. `3 j
    UARTIntEnable(SOC_UART_2_REGS, intFlags);  F! t% D* L3 i' T1 ~" M7 ]( k- k
}
' r5 I+ \) r6 S, y0 e8 U- ^4 d
3 b* }* o% }+ k/****************************************************************************/
5 ^! b* c# r  p1 f& F/*                                                                          */1 D. M+ ^! f! d$ q+ @. L, I+ a
/*              UART 中断服务函数                                           */) x( F7 {9 U$ k% l
/*                                                                          */
, B1 @# B2 }+ T! {& p* {4 e/****************************************************************************/) R2 y7 l: P, M/ R8 Y. i4 N
void UARTIsr()
/ t8 X/ z3 w' g: T/ Q( _/ M5 s{
  ^& q! m! R5 n  }    static unsigned int length = sizeof(txArray);$ j( Q3 y' U1 n! W& {+ b6 }
    static unsigned int count = 0;
8 O4 }. I4 K+ P; f1 T4 b* f    unsigned char rxData = 0;
8 z. U. z( d$ a: a! T" n  e    unsigned int int_id = 0;
2 v$ _7 i# `# u2 {: A! K9 N) m; N! }$ L" W
    // 确定中断源* N( D& S# c5 T5 x- q5 z8 O
    int_id = UARTIntStatus(SOC_UART_2_REGS);4 j  I$ S# B4 I3 t, R# c; m; i

1 I7 o8 L8 o6 r3 ]8 Q    // 清除 UART2 系统中断8 I5 K$ t, k2 s
    IntSystemStatusClear(SYS_INT_UARTINT2);5 P: E( t( H/ {- Q- C
( Q3 r, C4 L, r0 R2 v' U  {
    // 发送中断$ b! C1 t9 ?: b( Q3 m8 |
    if(UART_INTID_TX_EMPTY == int_id). ^, T& i: [+ T7 t2 V# l1 |
    {4 _9 C. B' J4 s
        if(0 < length)4 ^5 G( u3 ~& k/ P! }+ n
        {
  M& s$ H) a4 a- @; l* e            // 写一个字节到 THR4 @/ Q3 a7 s! b+ w
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);6 p" c; X4 X1 k9 J! x# `
            length--;$ ?( d! a' O  j8 [+ I
            count++;
+ p7 K0 U+ k( A        }- [7 b6 H6 d+ s9 t6 _
        if(0 == length)
8 e8 N6 d0 z( p% N# \  g* B1 o        {
& h7 R) P, e+ d6 a5 w4 {            // 禁用发送中断+ {$ u; b$ L. ^1 S0 A9 {
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);, N  _0 x8 J0 r1 c2 h, G, r; D
        }9 }% B! t5 V, B+ {% ?* }1 z
     }$ D6 _, z) G+ j2 E5 h
( X5 `+ @% s3 D0 V) e3 ]; [) |, A
    // 接收中断! g0 g9 C5 K. d6 ?
    if(UART_INTID_RX_DATA == int_id)6 h8 ?3 \& g, Z. o5 S2 t
    {
; V& `9 M9 O+ M0 o7 C% b5 u        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
; d9 H  I0 F( P$ S6 R  p# W, ]7 t8 e) s
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);2 v1 C2 D+ a) d3 [
    }7 L5 p6 E9 [$ v% z, y" \" ^- |
: a% N$ n+ o! ]6 ]
    // 接收错误$ J. D. B/ D. G& D
    if(UART_INTID_RX_LINE_STAT == int_id)
( K, T" q* f/ E6 v( y  Q6 ]    {
  j! F! A! p5 ?$ h$ _        while(UARTRxErrorGet(SOC_UART_2_REGS))
$ G6 N! {8 N- R+ K6 M' V! A$ O' _. o        {
' Q8 d4 p* U6 V/ m/ P: }            // 从 RBR 读一个字节
; H4 Y1 k( `+ ^9 B' i7 K. p            UARTCharGetNonBlocking(SOC_UART_2_REGS);  X1 ]( O7 _: a
        }
! J& a* Q8 f, r9 S  v( v: `3 `    }) S; W4 i9 A4 n8 Z& l# H2 j
    % E# N7 s# ]" S9 @" D% s6 e! b$ }
    return;
& n, {' n9 ?' H" K}
; i4 U  b! w2 n5 y6 ^, C
回复 支持 反对

使用道具 举报

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
2 ?1 d! N$ ?' J$ A% Y如果其它设备快速给你发送串口数据,你这边能正常通讯?
  h, }+ O2 h: n* W+ d
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 17:23 , Processed in 0.041909 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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