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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8580|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。$ }5 h& }6 r& e" F$ n) \  t8 ?

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
+ U. T) w' ~3 ?. D/ K8 ^5 m, B& x: ^* L3 Y, @
#include "TL138.h"                 // 创龙 TL138 开发板相关声明. S! B: O  w3 Y- E  Y5 |+ [
' X) t6 Z5 y6 C7 l# [0 i/ `
#include "hw_types.h"               // 宏命令
% X' [: {6 D+ h6 M9 F#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器* T& t5 _4 \/ X4 p1 y
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
- x# k5 h3 u, T( |2 y( ^0 ~% \& A' t; D/ N; U9 ^
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明  v+ ^2 U) ^- W5 x8 H7 u  v
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明* T, A8 l8 m4 O0 ?1 T9 W! K
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明" D4 X0 ~. l  Y2 M  l
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义7 C8 J+ }" {# {! R
. M& X; c) ?$ h8 U- _0 Z
/****************************************************************************/
( D; o( D/ l, r) ?9 _: [: m/*                                                                          */
+ V7 u) Y9 J- ~/*              宏定义                                                      */& l( D+ p+ F$ R+ _7 f3 v4 N# a9 ^
/*                                                                          */
( p+ K3 b& ^) b' ]/****************************************************************************/
- v  [# u" j8 w! d  s5 d4 x// 时钟
( I  ^% s% @* j6 U, N& `/ P#define SYSCLK_1_FREQ     (456000000)9 p' ^7 P4 r! v+ X
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)# c; P+ K" ~0 }( V; d7 _% ?
#define UART_2_FREQ       (SYSCLK_2_FREQ)
( e/ |% L/ P0 M/ t1 i) e/ b# C7 i" E
0 i) h- Z0 Q3 x) Y2 a/****************************************************************************/
+ Z9 z$ A  \. w" P/*                                                                          */0 B2 S2 i/ v3 Q+ o. |
/*              全局变量                                                    */
' l9 A8 y& Y5 T" C: S/*                                                                          */
( |% B0 I+ B4 L$ U( t5 D! \% ]/****************************************************************************/. N5 s: R' a/ p8 Q2 L
char txArray[] = "Tronlong UART2 Application......\n\r";9 N% _+ a" ~$ {/ Z  k8 p

& t% @6 \9 t9 I( h9 l  P/****************************************************************************/
+ V2 l' x7 [7 L4 i/*                                                                          */
6 B# x: x) r8 E) j+ F- r0 ^, L2 s/*              函数声明                                                    */
. D/ Y# w9 z& c/ W/*                                                                          */. v3 o+ G: l' t( f( S+ k9 }
/****************************************************************************/
6 |) i5 y- }. |3 o6 ?# T// 外设使能配置" w! t; i% [3 c; ^( }
void PSCInit(void);
# f2 u/ P" S* f
% m, I, O' i# [' n// GPIO 管脚复用配置% @! ]  f7 E4 N
void GPIOBankPinMuxSet();* i4 H% t# v6 O9 j6 G

6 w$ W8 ?+ Z' h0 I" ]* H& k// UART 初始化$ i. [0 H& i7 p/ ^, K
void UARTInit(void);6 U( F' T5 A4 F+ j( M: [2 X0 y& l
// ARM 中断初始化: [( I) b1 H. T! U  h
void InterruptInit(void);, u, J( m$ Y# h* }6 b. _  J8 @
// UART 中断初始化# Q, e+ _5 R) d2 k
void UARTInterruptInit();8 I8 f9 g- r( t3 i' g
// UART 中断服务函数: B2 V6 g: B% w' Q. D/ l
void UARTIsr(void);) v6 F$ M1 ]( W2 y; m* Y, \
. C. S$ y' i4 b
/****************************************************************************/: N( S" d/ i7 _! L1 {; I
/*                                                                          */2 A) n2 D4 N& a' B% m3 k4 Y: f3 m
/*              主函数                                                      */* }; U+ x! L4 t3 V6 j, c4 j
/*                                                                          */6 p8 w$ Y) U) W9 @" [
/****************************************************************************/$ }, G# |1 [6 `- t% |
int main(void)  _, t- t# q' g0 \+ U  ?
{! R$ q4 N4 |4 q; x+ L
        // 外设使能配置
6 p5 f9 U& L1 ^4 u- @: ]6 E2 R: C6 ^5 q        PSCInit();  |' E+ z* b) i# G
       
9 @! K3 C# u, w( A- Q        // GPIO 管脚复用配置3 g7 w0 I& U- g% r4 E
        GPIOBankPinMuxSet();) ~/ L7 I4 q( D1 `0 d3 k  f
( \4 f& y4 h! i
        // ARM 中断初始化
$ ]. e  R7 d- \6 ]9 U% x7 E: P        InterruptInit();
0 w9 O' m. T, M) N$ I7 F* W
$ s3 X/ N0 [+ P; g& @0 U6 W        // UART 初始化
3 [* }; y0 H! p6 }# P6 ^        UARTInit();
/ ]0 A% k* X- D& }/ D2 _" Y& O: V; P; ]1 u$ _6 d
        // UART 中断初始化2 z& u! O& B5 h
        UARTInterruptInit();
" A' C, W# Y4 A$ x+ Z& L
! F5 ]- `+ Q' j; Q& T        // 主循环" [, K/ Q5 S+ c* T; _
        for(;;)0 e. w" A- ~, h! F5 `- {
        {$ t, _7 G( P7 a9 g
% y* E( X3 G! S6 g5 Y8 d) g* A2 E
        }
) K8 Z" E* v- A}$ E* [2 C: ~# S
  S$ b) Q1 U. R( u
/****************************************************************************/: c# a3 H7 C/ z0 T) I$ W
/*                                                                          */
, }8 s% Q2 @! Z7 F9 O# l* W/*              PSC 初始化                                                  */# q5 b6 U. K2 s
/*                                                                          */( C; Q! R; q; o( Q) q
/****************************************************************************/- m1 K( h4 M+ D
void PSCInit(void)' `( |! |% @- s: E6 {+ R
{
- N4 `- Q6 R' k7 [& m        // 对相应外设模块的使能也可以在 BootLoader 中完成' z. e' U; ^* `' _  L* k
    // 使能 UART2 模块2 P' o" y, J% }1 k3 t
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);/ l, P$ ~1 O* `) w8 p# q) j
}, E1 b. o5 t$ V6 Z+ s+ M6 x: s' q
- A- {. R; t" R- I1 g, W
/****************************************************************************/
) [! [( `' U3 O# `* a; Z+ }/*                                                                          */& \$ `/ C# r" L% U9 g
/*              GPIO 管脚复用配置                                           */
6 `" o9 N6 k: C/*                                                                          */
6 G2 G4 V% F# L1 \: H1 {# Z/****************************************************************************/
& E$ `4 {2 S& V# X' S, x2 fvoid GPIOBankPinMuxSet(void)4 R8 ?1 I% L. r2 B
{& ]+ f1 w) W4 T& Z- v% x
        // UART2 禁用流控
1 D! h6 e( p0 F9 k$ U! }; P0 M        UARTPinMuxSetup(2, FALSE);. w) i/ S2 X6 t1 E' _
}
: l7 J5 V$ D9 m* \% u: K/ a) D) R) r
/****************************************************************************/2 }( R5 C; o* e8 E5 F+ r# C  }
/*                                                                          */( l0 U& N3 Y4 c" y; V2 ~! [
/*              ARM 中断初始化                                              */
- E0 |0 a0 n) {, D0 Z  h3 V2 i/*                                                                          */
5 B2 z! j" H/ `- i: I) i/****************************************************************************/
% \6 Q/ F# z/ w& ?7 P! ?, Bvoid InterruptInit(void)
8 L, \0 o8 ^- \, }( M3 K{. }. E! H  _  n; E  S+ V
    // 初始化 ARM 中断控制器/ W! q) x3 V9 h- ~+ }$ e$ |# E2 ], ~5 e
    IntAINTCInit();
* A8 I% Y0 ?, P5 j+ s) ?% w, i9 i+ B6 E9 j: c
    // 使能 IRQ(CPSR)& e" R1 p* |5 M/ X6 D7 D9 h& v8 F
    IntMasterIRQEnable();
' f, D" t. Z: |* \& S$ w2 s6 i( h4 j+ G
    // 使能中断(AINTC GER)9 U3 E% @6 ?! Y6 d* w
    IntGlobalEnable();
& n* y2 A+ R) A0 s" L8 C4 V4 \! y9 Y
    // 使能中断(AINTC HIER)
  b5 T& g# ^0 R: ~2 k; y    IntIRQEnable();( p) v$ k* P" w/ I+ P* N) y
}
4 v4 n/ \: N5 o  }# |. e2 }5 T# n( d& _4 }0 E$ g* T! |
/****************************************************************************/
3 a& J9 a+ Y8 u: |) _/*                                                                          */
: B- k5 ]# ~$ m4 V/*              UART 初始化                                                 */
+ C, L8 m1 t" j! F" J' o+ j/*                                                                          */
, _+ e* U( X4 }/****************************************************************************/
( v7 f2 `- w$ X; s" |void UARTInit(void); C3 x/ ~6 R2 C# F0 _! [8 I% [
{. u: a( q7 @% c9 G4 w
        // 配置 UART2 参数% {+ H% Q- u% W4 W
        // 波特率 115200 数据位 8 停止位 1 无校验位
3 m0 J6 s7 t# F4 k$ t# k# Y    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
+ n9 o! z- @5 J& U2 R- ^3 E. A                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);3 u' e( f3 C1 c  s/ z; y& d6 [
        // 使能 UART24 C& I7 r* I' p! z4 f  q  g1 A
        UARTEnable(SOC_UART_2_REGS);4 s4 A7 n: r9 f, {6 q

0 [: K! G8 ]1 u/ i# _' Y3 P    // 使能接收 / 发送 FIFO
. i5 ~; _+ y! h# O' S  x) ]1 p! ]0 d    UARTFIFOEnable(SOC_UART_2_REGS);
: j5 o8 o8 O9 y1 ?/ p' `& E+ y- [- ~* A9 x% b0 A2 z
    // 设置 FIFO 级别
  r$ z' _: q# @. Y) P    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
% ^  Y+ y; m. b0 b) @( K% y6 a- n}9 D( x3 c: Y5 |

9 \7 t1 G- x( D* u5 ^3 d/****************************************************************************/& R% ?4 _  x1 }
/*                                                                          */
, i. D1 @3 O+ C3 }" R/ L* W' t/*              UART 中断初始化                                             */
3 S4 C) q" x! ?1 |8 T/*                                                                          */
. O# D5 j3 U$ m5 h/****************************************************************************/1 m- J& e( Y! q5 l# W
void UARTInterruptInit(void)- V% Z. h( T: R! |0 X/ {( O
{
3 \) L2 t% _" N! b: ?        IntRegister(SYS_INT_UARTINT2, UARTIsr);
8 K% n3 N: k' V8 F2 M" v        IntChannelSet(SYS_INT_UARTINT2, 2);
+ B$ b- K- M5 S+ }5 M. n        IntSystemEnable(SYS_INT_UARTINT2);
. N5 f& [9 p; S4 R! l3 L6 w4 w4 Z2 X, {8 T
        // 使能中断
/ ^4 ~  p4 U" ^9 {* F! ?# i# ~( ?        unsigned int intFlags = 0;
0 O0 w9 I& G6 n, d    intFlags |= (UART_INT_LINE_STAT  |  \2 c2 O% u# Y: T7 @8 G+ j
                 UART_INT_TX_EMPTY |    \: U  w3 J: O1 i" Z
                 UART_INT_RXDATA_CTI);
$ J( n2 [- V9 E0 f# s0 z; g$ u% p    UARTIntEnable(SOC_UART_2_REGS, intFlags);
8 h' `6 x+ z* x}( u9 R2 \) w) \) K- S

# N8 x/ }- L' A( {/****************************************************************************/
; X$ }3 j! l! e& s1 a% t9 a/*                                                                          */
( ?. f8 q2 o( Y/*              UART 中断服务函数                                           */! n* v% ^- i/ [' M, U
/*                                                                          */% W! U( D& e# y& E5 t0 x
/****************************************************************************/
+ i$ q- S+ t) a, A# l+ `: lvoid UARTIsr()
2 S# O9 T4 ]: O{
& r" h: Z5 [+ A0 R% F) x    static unsigned int length = sizeof(txArray);
% ~& x  J$ K* G    static unsigned int count = 0;! h0 n1 S) ]- P% m0 D& x
    unsigned char rxData = 0;
1 c* W8 B+ J. P  C- b+ b" X    unsigned int int_id = 0;
% l7 A% ]; H0 r, T$ l+ `5 c! K8 X4 K1 I- o( M7 P% U6 a% H/ ~
    // 确定中断源- }2 Y! G4 l8 [) |) M. p
    int_id = UARTIntStatus(SOC_UART_2_REGS);
, M& I& c+ r9 K1 ?* w/ j4 L% o+ u# o
2 R# ?8 S( n( e* y- L    // 清除 UART2 系统中断1 s% t3 v; a, a. C
    IntSystemStatusClear(SYS_INT_UARTINT2);) i! w% {1 @6 U/ Q" v
& J% G6 ]: j1 f3 J
    // 发送中断  {' S# k- r# T2 K6 O
    if(UART_INTID_TX_EMPTY == int_id)' s0 N$ H/ P3 r$ G" w
    {% K* t3 _0 ^; Y: v, @
        if(0 < length)
( ^, c1 g2 K5 |3 w1 e1 o7 G        {
/ ]) }) O! C7 X4 c% B2 C            // 写一个字节到 THR
; V9 A* _: k. C2 ^            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
: t; r) f+ r1 F( d8 N  E' p            length--;; b% B2 ~: u% B7 v
            count++;6 i3 v' N$ v4 U! C% l$ \* m
        }
% L8 p& K9 P  {2 T        if(0 == length)
# t/ H0 F: `+ L        {! K$ p2 }: v9 S8 \+ o5 E
            // 禁用发送中断  m! j  l+ r  G& G' f9 N
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);( E; p7 t: k: h# Y) X+ S3 }2 C! r
        }
5 _) Y4 h, j( _9 V8 \     }
% v2 v/ z. [" |- p2 t: m" n( z! L4 K1 G2 _
    // 接收中断
( H" t2 o1 L7 `0 V    if(UART_INTID_RX_DATA == int_id): v: }+ }0 H6 a# \* H- O8 y( d
    {
6 V$ p3 V8 M- I3 _        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);  l& \; G3 {9 P/ \+ ]+ P4 e

; v, T  V" P7 H: B9 h4 d' K        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);. d7 C' {" ?) K
    }
2 K  ~7 f( n/ {0 y$ P  b+ a
8 `5 w( U% W( I    // 接收错误* H* Q2 T1 ]6 m% _& ]
    if(UART_INTID_RX_LINE_STAT == int_id)
+ `7 q5 O5 g' [) b3 f7 Y    {4 m/ c; z& y7 ]
        while(UARTRxErrorGet(SOC_UART_2_REGS))
! m: M) E& B9 c+ i        {
- {. i5 _6 F. W7 Q$ Q            // 从 RBR 读一个字节
) ^, G4 A6 E' d- o, V7 L9 }2 V            UARTCharGetNonBlocking(SOC_UART_2_REGS);
( o; f2 C2 V" Z5 b" _' X        }8 C1 `/ d2 R5 x6 x' Y
    }- @: c" u: {  t8 ]: I
    2 I2 g( `: m& V0 P0 N1 _9 h
    return;
4 _/ g$ }( C$ `+ w3 c1 _0 n}& K" v. J  U, B) c* w% q% h* E
回复 支持 反对

使用道具 举报

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  ~' ]5 p; F. N, F. l$ @9 q- G& q
如果其它设备快速给你发送串口数据,你这边能正常通讯?
0 b! a8 i% f" f" T& c0 F2 ]
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-7 08:54 , Processed in 0.055020 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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