串口发送中断触发条件 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8368|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
  o% O* M0 I! q* N

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
/ E0 k- V2 a& E# F$ Z0 T7 g, z% q% ^! @6 n
#include "TL138.h"                 // 创龙 TL138 开发板相关声明6 h( c! _6 o4 k
/ U( d/ C; a' S$ ~6 I2 ~6 d
#include "hw_types.h"               // 宏命令
$ G2 }; S8 M, I#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器* d# X5 \, t3 V9 ]7 h6 n$ O- v
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器) `2 s: e, l" M
; T& k6 B) O3 c1 V2 s
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明- l5 L+ K7 c* I+ P; \* x$ Y
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
2 ?5 q- R1 `1 [8 h1 ?0 o#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
5 O! _/ G$ C- j: D' H, _#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义% Y6 E7 M+ a! Y9 D& s2 ~
0 |1 ^& f5 ^1 \6 n. o
/****************************************************************************/
% r% f& v1 ~4 k4 l/ C8 h% F/*                                                                          */
: s( \! o2 y4 f/*              宏定义                                                      */
5 w! N1 i+ L. P6 W/*                                                                          */
8 t& S+ T6 v, X1 H& o+ C/****************************************************************************/
& a& c* _# ~2 K4 o5 I' V; i8 K// 时钟9 a- F# j8 _4 }/ ^- O
#define SYSCLK_1_FREQ     (456000000)
& W0 {9 e' n# J% R2 C% F#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)1 D' A2 Q& r, p. k6 z
#define UART_2_FREQ       (SYSCLK_2_FREQ)/ M. S. Z/ F2 D. S) d* D

& d7 m/ g4 N/ k; G5 [% q8 c/****************************************************************************/
3 m. r* a! }$ X6 B; }1 y) G3 `8 _. N/*                                                                          */
! }) ]; H6 J% n! @) I/*              全局变量                                                    */; j2 J0 r+ o6 B% G) E7 d
/*                                                                          */  E7 a2 _5 \  ]; v6 u, m, D
/****************************************************************************/! t' A  \7 x% D
char txArray[] = "Tronlong UART2 Application......\n\r";
! x  S  B& B# I$ A  u. W- ~1 T0 p4 e
/****************************************************************************/
; W0 i- m- ]5 g& D/*                                                                          */
+ K  z- _1 s2 Y/*              函数声明                                                    */
# A7 d2 f3 X( q/*                                                                          */: J0 r* e) E9 E9 ~9 o4 W; ]7 ^
/****************************************************************************/' I7 h; q# }  |, C
// 外设使能配置7 P+ |$ c) z7 G* E- B
void PSCInit(void);
$ ^. S; i4 h2 y' ]  X: U' I" r1 M; p: C2 F
// GPIO 管脚复用配置
7 E1 ~8 G8 b) K% Kvoid GPIOBankPinMuxSet();3 X9 v* K, E# {2 Y* [, N/ R5 T
( o) p, @9 q$ U- q& @; M
// UART 初始化
' t' k8 J; r6 b$ O' [void UARTInit(void);7 }0 d% @0 U5 S) N1 S
// ARM 中断初始化: F% B3 m# H4 Z
void InterruptInit(void);
+ }/ s8 I) l& `0 {) E// UART 中断初始化. [. {# t6 H2 P- D; H
void UARTInterruptInit();
# `5 R9 {5 L/ {7 K: _2 `% U% w4 G// UART 中断服务函数
' M" A& c$ U9 O- W) D9 C9 Cvoid UARTIsr(void);4 m3 Z9 G, P& ^. T

! `% s+ E' T8 Z$ z2 s6 b, G/****************************************************************************/3 k4 k( o! r' a2 ~( r0 j: t
/*                                                                          */
3 U8 I  E2 Y# ^/ ~. \' s2 ]! P/*              主函数                                                      */* ]9 b' \+ p- ^; [/ r" v
/*                                                                          */# N" {* u4 r" K) h% G
/****************************************************************************/
) [5 r6 q# c+ C7 v. f6 Pint main(void)0 w/ `- w. h( P: t4 [7 x) K" B
{
& f* o3 g! ~* w. c$ r/ ~  p) i" s        // 外设使能配置" d+ d8 C( h8 @+ z% L/ S2 ]
        PSCInit();
8 ^3 i# {% i' ?        1 M# P3 [8 A9 Z, n, @6 d. w# f
        // GPIO 管脚复用配置; E. X) W. Y3 t* C  e
        GPIOBankPinMuxSet();1 N; \; G5 n$ O5 [

6 s* K% y* V( u/ e) i9 N+ E        // ARM 中断初始化& P5 J  V+ t" ?/ _
        InterruptInit();
9 z, J: j1 b1 n- u5 n# l+ n  i' r, R2 ~( F0 h: Y' G0 \
        // UART 初始化
( k% B$ }+ I7 T1 F; y* ?: M        UARTInit();$ g- C5 t: J, R* M& ]" n

. ?: X9 y4 [# J$ I5 n& f" M$ A/ B+ s        // UART 中断初始化/ h4 g  r) o- q! l( C- g6 d
        UARTInterruptInit();
- O! G# W9 a! f9 R' g1 W* A4 n) K5 ]0 v8 t9 {! w
        // 主循环
7 U9 m, J4 k. P5 V, I0 Z! o; [7 f        for(;;)
* W" r& H! Q& |        {% ?  d+ m9 z+ {& U

8 E- z, t  Z3 e; z' d& {8 U        }5 M, W: Z7 v+ j
}
; l. j. ~. r+ T: k' [3 L
' H0 t% l" I8 N' O1 a/****************************************************************************/
7 m0 ?1 K+ r: P9 ~/*                                                                          */
" @; e. b- u3 D- D6 \" B/*              PSC 初始化                                                  */: \% K- s3 N1 i2 k7 Y3 n4 V
/*                                                                          */
* |! `% A; i0 Y7 o9 T/****************************************************************************/
# M9 N1 v' x, d+ u$ b) [7 f$ @$ Pvoid PSCInit(void)
! g: q* k+ i' \5 k; ^{
5 Q! y, W: K. ~        // 对相应外设模块的使能也可以在 BootLoader 中完成
# H% Q5 a% o4 g    // 使能 UART2 模块* k  a# W, X# G8 _/ K& r* V
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
; [, N) X- l( v; e3 j, C}
) E" L) C4 I: L, G- Z8 |
; Q6 ~1 S! [; F" B7 k0 r( J3 [/****************************************************************************/# C/ P# ?5 m0 t0 x0 r
/*                                                                          */
* w+ f8 M0 M, K: D% x0 ~/*              GPIO 管脚复用配置                                           */5 P2 J7 V1 {- f' }+ t" Q9 J+ \
/*                                                                          */
+ D) k9 k; W5 d5 ]/****************************************************************************/7 f! d8 ]. Z& G- T1 |
void GPIOBankPinMuxSet(void)1 ^/ Y0 N. T& G+ B1 K* x8 R+ w/ t
{
% z. ^+ {& ~- ]# U( [; y; q4 r        // UART2 禁用流控
; ^& L; b! ^. @, m        UARTPinMuxSetup(2, FALSE);# [. x! C& r7 T+ @) G
}4 b0 F5 `( m- a4 I3 l( K" z

( ^$ M; y+ t1 n- r- e2 o/****************************************************************************/
! W5 Y& r4 W8 P: v* {( f/*                                                                          */( s+ ^: R3 z- I2 B+ k: W6 S" q
/*              ARM 中断初始化                                              */) `+ {5 G% I/ i% h
/*                                                                          */! u& e8 `1 n' Q2 T; [. w, g( X
/****************************************************************************/" p& R8 S4 {1 e. K- t6 H2 f4 ~
void InterruptInit(void)
# x3 f8 }/ N2 p{, ]4 h: U3 Z" W' h& L5 d
    // 初始化 ARM 中断控制器4 W  Z& C: k' E3 U9 t" `$ p
    IntAINTCInit();
* @2 I1 F- v9 D& a& c3 {( j+ A9 ~
    // 使能 IRQ(CPSR)
4 b1 v! [! T# x0 J% ^    IntMasterIRQEnable();
' l2 G2 R; O0 p' Z: e; e
0 p8 g3 v$ U, }0 @; W1 D    // 使能中断(AINTC GER)9 ?8 W- H/ z/ {! j/ Z  G
    IntGlobalEnable();
; E" B; [; O- W  M3 S) W' S6 |6 L, I& f2 j* Q! U+ F- G
    // 使能中断(AINTC HIER)- w  q+ g# a/ r; _3 z3 [
    IntIRQEnable();6 P9 U& V) J0 Z! t9 r$ k
}
9 B. X- U7 q3 A3 a2 f* K: I/ {/ O% Z2 h+ R
/****************************************************************************/2 v+ R7 ?/ K+ V& ~+ `
/*                                                                          */6 t6 T7 h) k# d. j. c' @5 g
/*              UART 初始化                                                 */
3 j8 J$ u3 J& ^) i; x% k3 m6 D. q/*                                                                          */9 o' a) f5 }2 B! L
/****************************************************************************/
" y# P2 I  c- x) Jvoid UARTInit(void)& n0 u: b7 _8 h
{3 q4 i5 _0 c* h. @& Z! v
        // 配置 UART2 参数& C" f* }1 Y) D* H" t5 R8 m
        // 波特率 115200 数据位 8 停止位 1 无校验位+ _: Y+ G# R' B3 M7 l
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,6 h4 m1 E# K5 W8 s1 _' S+ k; H
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
" L0 o$ q- e; r# I        // 使能 UART20 F; e) ^$ u# V! \
        UARTEnable(SOC_UART_2_REGS);
# u: [" Z# X& z5 x. e3 S# S, f; N) U5 E1 `6 S3 t/ G
    // 使能接收 / 发送 FIFO* K2 q" |% x" A* W
    UARTFIFOEnable(SOC_UART_2_REGS);1 r- N; a- u1 P4 Y8 B- u
: ]! _3 j+ x, w2 r, n5 J+ O
    // 设置 FIFO 级别6 x! m( l4 Z: i. `$ j& j- d
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);8 q; ]- n  }. i
}
7 j6 l, T- J  r$ [+ J* U( ?2 M; n& h5 L& C" k5 t
/****************************************************************************/5 V$ g6 i0 U+ C, K* L' I  u# n: J
/*                                                                          */
& s% d( U, r- w  X) C# Q% u& W  k/*              UART 中断初始化                                             */& r" z% h  N- U. j5 V! _6 K" y: f
/*                                                                          */
  {9 ^0 n" l4 D" L1 M6 z/****************************************************************************/
5 g* {& H# X+ `8 U  {# h6 a6 x9 Nvoid UARTInterruptInit(void)7 U7 ?4 }. Y" F+ `, l
{
, L6 Z& ~* j- M( R, \        IntRegister(SYS_INT_UARTINT2, UARTIsr);" r$ s7 T- Y& _, U8 t0 D: p( [6 g
        IntChannelSet(SYS_INT_UARTINT2, 2);5 _$ e5 f. V4 M6 Z, ^, G
        IntSystemEnable(SYS_INT_UARTINT2);/ Q% s! f! q8 P/ X
3 n: V, w0 r2 }6 ~
        // 使能中断" }0 G; L  w  w3 l
        unsigned int intFlags = 0;/ m& r9 z7 j/ m- ?) g/ N
    intFlags |= (UART_INT_LINE_STAT  |  \7 d' p4 [0 q* p) ^: \+ `
                 UART_INT_TX_EMPTY |    \, W3 h% d5 t  s0 [
                 UART_INT_RXDATA_CTI);- L# f3 I$ }; [% m3 |+ B
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
& t* E$ a% u% K8 [$ s}
5 j: l, m& O/ O
* A5 P9 j- I" P7 R: K4 Y/****************************************************************************/
- H9 m; e6 A; Y* V' {0 P( a8 h3 z/*                                                                          */; j8 v+ h2 E/ s9 B3 O5 M  Q/ _% `
/*              UART 中断服务函数                                           */
3 {3 W5 u8 b4 h8 t- q, _+ J0 N( B2 H/*                                                                          */* }, {! ^$ S/ n3 d, Y* _; |0 c) p
/****************************************************************************// E' h0 t; m$ \) ]7 K
void UARTIsr()
  b1 q6 T: N+ \; S{
  N2 x. b6 R+ S* L    static unsigned int length = sizeof(txArray);
" u6 J# N2 x7 `& F    static unsigned int count = 0;
3 S; R. _8 K% i; x' W" U4 q( i    unsigned char rxData = 0;
* X8 \& r. N9 S7 Y" j6 R    unsigned int int_id = 0;- S2 [4 F- d6 E

* Y+ B* d" Y5 A, s9 M4 M0 m! D4 A    // 确定中断源& X8 M3 V+ L6 _* |5 n' w, F  A
    int_id = UARTIntStatus(SOC_UART_2_REGS);
% G  b9 r* p3 A! M: w
; k% }9 s; k* [. p0 H) R    // 清除 UART2 系统中断1 w' ^$ k8 Z7 F+ O$ _1 N2 R* {+ a
    IntSystemStatusClear(SYS_INT_UARTINT2);
, X6 ?: E# ?) i6 _  b
, u# C7 T; }) i: W8 I    // 发送中断
/ k+ u8 y4 t( @% e0 T1 n* I+ n1 z% X0 n    if(UART_INTID_TX_EMPTY == int_id)/ N. R" ~. U" o$ x- T/ \' S4 @
    {# I3 k# z4 W& l% y4 ^4 R/ M! c
        if(0 < length)
1 s; p# z% ^1 I% |  C1 a        {
2 ?. [) k9 b1 L, f. M( `$ y6 [) v            // 写一个字节到 THR$ H) g2 Z9 k! K
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);- @( l5 S1 b4 v
            length--;
% i' V7 a# n+ \* q2 J" B8 |            count++;( ?3 w- p. y! b5 _- |% p
        }
* v+ l$ O5 d: D9 n, g* a3 E9 ^! i3 J        if(0 == length)1 J* y6 ^& H/ ^) G6 U4 e" T3 P2 a
        {
/ D9 N2 |7 m+ m$ v9 O            // 禁用发送中断4 }- ?. }: n! a' j
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);0 _2 L* g% Y7 t. H" x1 e; P4 ?, `
        }
5 {5 M8 [, ~6 b$ Q) K     }
; a% A& Y! M2 Q1 a4 A
3 c& w4 n2 W# h$ W    // 接收中断
2 Z$ C# Q/ z) V$ g    if(UART_INTID_RX_DATA == int_id)
2 Z, M' Y, ^4 Z/ K2 R9 G    {. p0 C, i1 _3 {6 v; `' f
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
/ }. m" V+ K7 @" L( y0 j8 [3 X/ @5 O1 b# Z- ~/ U! R9 c: R
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);% q/ M5 N/ i2 P  S& x: A9 G: q. {
    }7 S# |; b; |' _2 F0 @& ]
8 t, Q$ X$ e) d  M1 p' g
    // 接收错误
( V$ T1 _5 c* @1 Z, z( M) H    if(UART_INTID_RX_LINE_STAT == int_id)
7 j4 d* y/ n% Q    {" y7 c  p/ q/ }' S4 K$ `
        while(UARTRxErrorGet(SOC_UART_2_REGS))
( ?, G- h, U2 H        {
6 ~3 E* j/ B) ]7 L- J# D            // 从 RBR 读一个字节
$ D$ X" @+ ^7 t2 F- Z            UARTCharGetNonBlocking(SOC_UART_2_REGS);( H9 J- Q2 D. j
        }
* ^( K3 ^& X- k7 X/ S6 `/ U! v    }
$ o1 c" y$ P* f) V0 a6 E   
: \3 t4 L! T" Y" U" l- w; G    return;$ O5 M5 E; e5 f0 v8 b
}; f6 v5 \* Y0 @6 u0 A/ u( g
回复 支持 反对

使用道具 举报

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
+ Q3 k8 N, ?1 Q4 ?如果其它设备快速给你发送串口数据,你这边能正常通讯?

2 V- L- o5 m% T/ |1 ~谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-1-15 14:18 , Processed in 0.043789 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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