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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5586|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
3 a* @# I4 t' z  u

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。; `2 R  }2 p1 R! k# D; e8 B6 z& s
: m4 }- a8 J& h5 m+ R# W7 }
#include "TL138.h"                 // 创龙 TL138 开发板相关声明8 v/ o% I) P8 F7 Q: B
0 B& a# C7 m3 V& ~4 p' I1 s' s: w
#include "hw_types.h"               // 宏命令
! H  \6 E6 l3 y#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
6 |/ v# F1 S3 }2 d$ v#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器* Z3 g' J/ M$ s" S6 T6 A

5 M% L, g9 N$ P5 f* j8 E#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明* A, D8 A& _( H( v/ b
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
+ J1 t! M* s! X, A#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
% K5 j/ M# H; @- _& J0 P0 V#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义9 m- q. T( i0 ?& x

" {7 U- d; n. {& B* A' j/****************************************************************************/
% V' K2 I% r* g/ s/*                                                                          */
- t8 @' {6 j3 [6 m6 j' Y" w( R/*              宏定义                                                      */
& V: N2 ?7 ?7 i, x5 m7 Q/*                                                                          */
" T* }4 S# y) e; c' o* u9 X9 x/****************************************************************************/7 `6 H4 B0 Q& x( G# H6 w' G4 w7 |$ L- x
// 时钟0 x# b2 ?" z* t4 g! k- C( j9 Y
#define SYSCLK_1_FREQ     (456000000)
5 @- q4 m2 c1 s3 m- I$ H) e#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
7 c# e5 N  m: I5 ~#define UART_2_FREQ       (SYSCLK_2_FREQ)
; U! ]+ K' r2 r7 z
6 Z, M1 @0 B& z9 K( s0 c. L: k/****************************************************************************/% n# ]8 W2 H5 u1 J+ ^) J
/*                                                                          */$ w8 Q/ D. E: ]) o8 b+ ?9 Y
/*              全局变量                                                    */7 R' E4 X6 b$ `( A: V
/*                                                                          */# C: D+ A: R+ a4 o& B4 \
/****************************************************************************/# e" `% X- v, C1 ]
char txArray[] = "Tronlong UART2 Application......\n\r";7 i2 v- M- m2 A  `5 O3 L/ R2 Z
1 f% a3 m1 a6 e8 {. A- l7 ]' g. A
/****************************************************************************/' S$ l' g) I& z" V" A2 H
/*                                                                          */% Q% T% S7 f5 R6 h1 Q
/*              函数声明                                                    */
) l; i0 H: s# S7 b+ c% q/*                                                                          */
8 y: Q% ]  c+ t/****************************************************************************/
3 K; O+ V3 A* s$ S3 [// 外设使能配置
, O$ c/ Q9 y1 p0 avoid PSCInit(void);5 D7 f9 ]3 K0 F0 a% p1 s( P

" Z8 M- v* `* J- _# r) c% r5 N// GPIO 管脚复用配置
- c: A8 C, j% J, ~void GPIOBankPinMuxSet();
! m4 o) [" s) _5 m  Y) a% Z  ^( E7 v% e" o/ W
// UART 初始化' r' u+ k  U( l+ Q% A
void UARTInit(void);' m  L, {4 o* O5 n) Z1 _
// ARM 中断初始化% m! w* X3 n% t. x7 @3 ^
void InterruptInit(void);
$ c1 ]- J6 `2 i( h0 e// UART 中断初始化1 H8 Y& p* D0 Y4 J1 W7 F5 i  |
void UARTInterruptInit();* T+ z3 G+ `; T4 T3 o% c
// UART 中断服务函数5 I/ u6 I: {. |/ _0 W" T) c1 s
void UARTIsr(void);( L, l; a8 W" q) ?5 A  U+ F" y
, [' |& Y! L. T( H1 R
/****************************************************************************/
- N3 V& |, O* ]* c1 ^1 Z" R/*                                                                          */+ v3 y& s& C0 ~  d6 Q9 Q
/*              主函数                                                      */
/ X, L' B+ N" f3 J( G/*                                                                          */
/ m, V: {$ f7 t0 ], Z! ?# w# s/****************************************************************************/8 t' w- U! i- r
int main(void)4 Q6 _: ?' X: _! x. M: F8 j
{* ?& Q, T6 e# g( T. D4 {
        // 外设使能配置2 z) l5 h5 K" J: r5 _
        PSCInit();
' x0 X9 a/ M# u, n/ P- L        $ i  G3 c) y- |( V* [* k+ b
        // GPIO 管脚复用配置
, `( Q% O4 m; i6 k! P- w        GPIOBankPinMuxSet();; u- ~( g+ ~* Z( _2 u# K* `% y0 a

; X% E$ G9 y8 C) k( C' d# v        // ARM 中断初始化  x! Y, y7 f8 E5 _5 C4 u
        InterruptInit();/ M( Y- L$ U* i1 C
+ ]& h  W9 Q$ Z7 W: G
        // UART 初始化+ W( y" g% ~4 E1 z
        UARTInit();
& X1 h5 p6 ]" Y3 a/ s5 m# e7 @3 q  A( d  W8 z" q
        // UART 中断初始化7 k* `; B6 N8 a, t, \
        UARTInterruptInit();5 L+ T. I6 G% \" t  D1 s

, A' [4 I3 @+ _        // 主循环" v% ~" s' p2 r+ I. f) e/ X% c, j
        for(;;)# M  ?# z5 {* t3 V1 v/ a/ n
        {
: G4 T9 b4 I! K& U0 A5 w( C8 S$ \( W" Y, D  V! C6 J$ M
        }" M/ M! |: D: A5 Q' B
}
0 A& L5 _1 H! C8 R6 o3 e2 V1 H# K$ q+ Q' p! ~0 _
/****************************************************************************/0 m+ Z: {1 u# h. c( E$ x/ J
/*                                                                          */+ I' O3 j+ J0 G, H; `$ X
/*              PSC 初始化                                                  */' v, f; v: ~8 Y9 X+ q) w
/*                                                                          */6 l2 c1 o2 B: d1 @( w
/****************************************************************************/1 x5 `. O+ c8 g3 L
void PSCInit(void)
% q4 h2 O, g4 V: y" y' K{
  c; }' O0 o" D        // 对相应外设模块的使能也可以在 BootLoader 中完成
7 K, {5 ~& C4 F1 s+ P    // 使能 UART2 模块
  T$ Z8 i1 q3 H    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);* z4 V2 E9 p! C0 B
}. ~/ m8 a) Q7 Z- N6 V

# a# `5 F) T' s/ p/****************************************************************************/
# X' v( w, A* L+ x6 W/*                                                                          */# @# ^  c3 r$ s1 \/ Q
/*              GPIO 管脚复用配置                                           */
/ x3 ~! B6 F& ]. ?/*                                                                          */: l, u5 P5 v/ R1 e6 o
/****************************************************************************/1 O3 S$ q' k) v8 j2 p8 ~
void GPIOBankPinMuxSet(void)
& x: E" S1 E$ \' a$ z* W{; T! f2 C5 X8 a) n+ W
        // UART2 禁用流控
$ K2 Q# p2 Z) L/ d/ v        UARTPinMuxSetup(2, FALSE);
; o# b* ]" c1 o" Z}
. _2 l8 u& C9 B5 X
! o, s& Q8 P: n: E/****************************************************************************/+ I1 [8 ?$ V7 ^% a* s" L
/*                                                                          */
) @) Y0 R! l; X, M* m% M4 x# c1 L/*              ARM 中断初始化                                              */! }/ e6 F4 s  m3 P# L5 _! k5 p
/*                                                                          */
/ p) I: p# U4 ^3 F/****************************************************************************/$ u! J: d9 r7 Q; V6 j
void InterruptInit(void)
1 T. B! Z# J3 O9 [2 t6 }{
  |/ q0 p# \8 O/ C6 T7 E    // 初始化 ARM 中断控制器
" J1 ?8 M$ U8 R    IntAINTCInit();
$ f) t1 \( r! T: F9 F: k$ m* s2 A0 E, _( e: W  w2 E5 e
    // 使能 IRQ(CPSR)
2 b. j0 e7 z$ S" o; L( e3 y; Q7 y    IntMasterIRQEnable();7 U. Z$ ^5 I; r  x

' x/ e0 n* M2 ~$ _0 U* ~( ?* h    // 使能中断(AINTC GER)
2 |1 U8 W7 ^* o4 j+ @6 V; j  U8 ~    IntGlobalEnable();( m8 R% m3 M+ i
. {9 t# K7 T# M* v
    // 使能中断(AINTC HIER)
6 b6 j/ l  O' ~4 g1 W6 C    IntIRQEnable();
. M- x, y: i+ Y) E! D& a}& u$ Q  ?" Y. ^& ~
9 B0 H9 K% g2 r! V) c' ~  p
/****************************************************************************/
% N: ?+ m. L+ ]$ Y1 L  b% W+ `/*                                                                          */
7 q( b+ [, S! l' W9 F. H8 F/*              UART 初始化                                                 */
4 r, e1 q- n& u" t4 Q3 @/*                                                                          */% ], m5 d2 x2 Z$ w
/****************************************************************************/
! ^' ]0 B, U6 ^# B/ Avoid UARTInit(void)
; n$ ~9 Q. E: l2 K# U2 ^. V' B' C" Q{
; @: y2 ^# ?. X        // 配置 UART2 参数
% ]! Q: \# K% u        // 波特率 115200 数据位 8 停止位 1 无校验位6 s# Q8 g2 g; i' i! u1 q  w, P9 o
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,5 V, H& u8 H7 k! e( ~" T2 [  j
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
+ N) q/ C9 X+ ^; @        // 使能 UART2/ u3 j. {, s$ j. P: F! ~' y7 [' d
        UARTEnable(SOC_UART_2_REGS);$ o8 Q: a) a+ I. R7 P0 i
' R0 W& |8 K2 Z2 K
    // 使能接收 / 发送 FIFO
  A+ P3 w- f" R! [: _. w, C, x    UARTFIFOEnable(SOC_UART_2_REGS);+ h: `5 J% k9 ?4 P5 r( c5 B
1 ^  y% Q7 F3 v( |5 O$ e% n
    // 设置 FIFO 级别0 M9 E; A) r2 I; ^: m
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
) ]6 n; ~. c  S+ b; k* C}+ D# }; S4 S( S3 F2 _# V& H

/ N* A1 T/ w+ ^3 @) o( Z/****************************************************************************/) g1 ]* \6 X0 S- {9 {3 H9 B4 [
/*                                                                          */
# o# Q2 f8 ^  j/*              UART 中断初始化                                             */
; u& o7 [, }7 Y: B/*                                                                          */# }* z+ D. v+ ], L
/****************************************************************************/
; k3 z$ U7 F2 U, W; [' e, vvoid UARTInterruptInit(void): z: ~  d3 z9 \7 |. o# i' S
{, H" n8 t! k& v% T8 S( m
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
4 m: W- E/ e3 Z1 ^; O        IntChannelSet(SYS_INT_UARTINT2, 2);
, l; i- T7 y! W- g! R        IntSystemEnable(SYS_INT_UARTINT2);
3 ]& n0 B/ ^( Q1 c0 ]3 m/ \% x
( U2 E$ T. L/ r0 z* n3 d: _0 s        // 使能中断% j! a1 N7 Z! z9 e2 b
        unsigned int intFlags = 0;
4 S0 b) q6 ~# i: b    intFlags |= (UART_INT_LINE_STAT  |  \
6 u; X' z0 {/ ~) p# c% l$ _/ N                 UART_INT_TX_EMPTY |    \
* S4 s+ R! }6 T: ^# y5 x9 o6 L                 UART_INT_RXDATA_CTI);
9 V7 f& n3 s  Z; g( a    UARTIntEnable(SOC_UART_2_REGS, intFlags);
. R2 d; f6 g4 g. b3 n; i; r}2 N* `; O9 s& H, @( R

2 j3 H( J: V4 {0 P1 }* y& Y7 E& e/****************************************************************************/
7 U" k$ }* x( o/*                                                                          */* f$ i2 C* u/ e4 c( R) }, A% [
/*              UART 中断服务函数                                           */
2 R1 r) v- h/ `: S- {/ V2 U( ^/*                                                                          */$ |* H7 Q& U+ v% t0 w% @
/****************************************************************************/) N: c  T, X# o: B
void UARTIsr()9 G; m* ?; k- g  z- o$ r2 [% d
{
# b5 d. Z8 @* u1 Q4 {, ?. Z& n    static unsigned int length = sizeof(txArray);! }! ?4 p$ d; K& S/ E3 s1 F! u& e
    static unsigned int count = 0;
4 m# |  @2 ~- a* N    unsigned char rxData = 0;, A$ W7 G; c& u7 q/ O
    unsigned int int_id = 0;3 n0 I. c6 O& k6 O) _

' N% |/ \/ y5 y8 s" a    // 确定中断源
/ ~2 A: A, J$ h' Y- h2 ?' k    int_id = UARTIntStatus(SOC_UART_2_REGS);
+ l7 U: J, M: ]' z& h5 K, K+ k
' F& r* M2 @0 C5 B8 ?4 f9 K1 Z    // 清除 UART2 系统中断
) t7 K. X6 v+ f( u( q    IntSystemStatusClear(SYS_INT_UARTINT2);
  _* K0 ]0 }, s$ G( Y" D9 h4 _  j6 E' k) D! q
    // 发送中断( x; a' X; R7 C0 p/ g; ~
    if(UART_INTID_TX_EMPTY == int_id)
$ I- U. k/ u0 C1 b- W, i& O    {
; W# f: j8 R! D! L/ E$ A; O        if(0 < length)
. M# z' D! G  [        {7 f' M; O2 C4 O* J2 ]( j
            // 写一个字节到 THR% M% n' m' ^* E& p) g6 O( e
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
" ~4 F, `9 k& Z+ z, C0 [# R; U            length--;7 G# t5 O( t% r. D2 n
            count++;
. I% C! `. x$ F4 g9 E        }: W5 G- r9 k) }6 T( z) D
        if(0 == length)3 D9 i- E$ O& D# g* ^! i
        {/ J# c9 S4 A$ B) j4 }; D/ t9 G
            // 禁用发送中断
3 I! x& t& p/ ]4 V            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
& a/ F( E% I: X( C+ x! V/ l        }* S% g; s* s% y# H3 ~6 W9 w
     }& P! U) `, h6 w
7 e0 e6 t% s, h4 ^
    // 接收中断
9 z5 b5 i& J4 w; k$ U    if(UART_INTID_RX_DATA == int_id)
5 X" m9 T1 I7 \    {
# q4 N! t+ |  Q. |        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
) F9 f1 X0 ~: A* O9 y+ N2 n7 q1 O- f4 l
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);4 v8 j' b; P2 g  ~. P/ ?
    }
5 P5 Q, E! J$ i; y3 ^/ J$ r& s( G, J& K. p$ l8 U1 L, D
    // 接收错误: g+ i/ E, V7 m, ~- ~: K
    if(UART_INTID_RX_LINE_STAT == int_id)
# h" X* X+ ]7 N    {9 _' `  t% F  r2 ?, @' B' L
        while(UARTRxErrorGet(SOC_UART_2_REGS))
+ {. S. S3 j( x- f( N3 r        {
) ^, i) b( i( m: `9 z+ l/ A            // 从 RBR 读一个字节
1 B$ R& m# y$ A! J, e            UARTCharGetNonBlocking(SOC_UART_2_REGS);
' n3 P1 W" S5 \0 q" z% I- a; ~7 x        }
+ H6 o* T& j8 V    }
6 B* }6 y( J" o   
6 r1 \: s4 J! F5 w- d# u5 }    return;
. K/ B7 T6 H( K$ N}
! j' d1 f& g  b$ ]
回复 支持 反对

使用道具 举报

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( j( |3 w1 Q9 r# c4 d, p如果其它设备快速给你发送串口数据,你这边能正常通讯?
% k0 s: E; \) w9 Y( w. t( {
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 12:56 , Processed in 0.042942 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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