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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6992|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
) e, o$ ]. H: A6 q

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。5 ?8 }) _! J% }! U. P% @% T! ]
, l" ]; ]) Y' n8 y: w9 s
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
6 L& M# S3 _8 t( }% |% A# _& z7 H$ e5 ?; ~; @; _' N5 p) ^& X
#include "hw_types.h"               // 宏命令
' b1 @8 J. ~7 K+ X3 M#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器& e+ d2 J2 `( e! `4 y0 ^& J
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
& Z! r; L$ r  I4 K* Z5 q) a# k* S! {
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
# Z0 z! ?$ D) O, D; @, P#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
, t4 c4 l, d# w4 G  e# f* g#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
; Z; T6 l' _* q0 R4 @2 c0 l7 ^5 K#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义; B8 @1 T* A2 n- ^9 u% a/ n/ c
' S; H- v7 I4 k- P$ \5 y2 q
/****************************************************************************/" X$ D" b$ [$ h7 ?# v4 X) k
/*                                                                          */3 h7 L" j1 y/ i
/*              宏定义                                                      */( q$ c# R0 \! Y6 o* B
/*                                                                          */
, U8 [4 F: @  `0 g2 n/****************************************************************************/
3 n! x5 S8 |% s+ U// 时钟
4 H3 \/ p# y! x7 i" l: [#define SYSCLK_1_FREQ     (456000000)
/ I  R: e2 a% ~7 B. j#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2): D; p& I7 ?& l5 v
#define UART_2_FREQ       (SYSCLK_2_FREQ)
% @' e  v6 _: W  ^; A. N4 r9 o& x7 Y, Y; t
/****************************************************************************/
) g; _" B0 N# w  u) _; G3 B/*                                                                          */. V  c  y8 X0 w
/*              全局变量                                                    */& k. P, n8 W# q4 ^! C, g1 r" z
/*                                                                          */2 K" K* C  i0 P! i: y. L( J
/****************************************************************************/
/ g6 z. ^. s* N6 d; V2 pchar txArray[] = "Tronlong UART2 Application......\n\r";
3 M3 b& w% Q: X) N4 ]; w' x+ y  Z0 {: _9 l; b
/****************************************************************************/
" i1 N+ k: M* r( A4 }, s/*                                                                          */
/ E6 x8 p+ M8 Z/ [/ q7 e8 o1 S/*              函数声明                                                    */1 j4 C* h6 e* E1 P1 J$ a! w
/*                                                                          */- F. y' g( V  U. v: d
/****************************************************************************/. P7 J/ W/ d+ u2 u: U% \5 K! O) f! s
// 外设使能配置. ?+ O2 H4 Q- \' b# A
void PSCInit(void);* O$ T; b# ~( `% C

0 J1 L, B- [/ @& N// GPIO 管脚复用配置
* p; ~# U/ E* L( D1 U9 S% kvoid GPIOBankPinMuxSet();
- k! [; o0 h( E1 s5 L! J' H+ ?% ]3 ^- F# X' U0 }
// UART 初始化
/ e0 e: `5 Y8 u, |/ b$ vvoid UARTInit(void);
* \  x& K8 g  g// ARM 中断初始化
5 r! x- X! s% u7 X( J% D( gvoid InterruptInit(void);/ b& J/ y. A: k& R6 e
// UART 中断初始化3 ^7 G: k; C9 Q' B6 @. q
void UARTInterruptInit();
9 u, s- C6 }" A// UART 中断服务函数
2 P' q$ X/ M& h3 w3 U7 U- Jvoid UARTIsr(void);
/ n1 \; q- C# H" ~6 w% {5 _& u& O' B' L' @, M7 y& F
/****************************************************************************/4 i9 m# @" ?9 w# w, P
/*                                                                          */
* w3 l+ |0 Y: Z/*              主函数                                                      */  l, f% o7 {5 N% R1 t
/*                                                                          */
. ]2 O8 [" m* c: ^7 b4 F. h3 D6 t( X/****************************************************************************/
0 _( c4 G2 V3 Sint main(void)
6 W1 L  ?1 R+ [" s8 z8 }7 \+ y8 e{5 _3 M! C. E; ~) W  e3 i0 W1 j
        // 外设使能配置
) t" C* @2 {) f8 ~        PSCInit();
; O$ K7 O3 O' J( _! B0 F        - q0 f8 H; ?0 q; y
        // GPIO 管脚复用配置
- q- W' p' Y  ^: Y        GPIOBankPinMuxSet();9 A* f& u# f+ j

2 H9 x+ v0 t& `        // ARM 中断初始化4 K! s* N7 C7 E8 H/ F
        InterruptInit();
7 w( s; n6 i7 h0 b3 j
3 ~8 e/ I2 Y" X1 ]5 V        // UART 初始化3 R( @& \' e/ ^) [) e3 Q  U7 q
        UARTInit();
5 y0 {) i" K3 a( i  W
3 b, C8 y" l; F! I# ?$ \: ]        // UART 中断初始化4 }0 e$ p3 I2 O. k2 D0 u
        UARTInterruptInit();4 d5 t* U1 M1 K' n" C, L
7 d3 i$ j) U$ c( A9 |! ]' t+ Q
        // 主循环
, h! `+ S) d4 F. J. u        for(;;)+ S3 _! z8 }7 Q1 b7 p
        {. M8 F' T/ Y4 n0 ]+ D
/ h( x, v9 x  c
        }
' d: o2 e2 H6 U}/ {- Y. d3 `1 V2 S; v3 |

8 `  G8 C" ?+ D2 [/****************************************************************************/
/ @" b4 Y: d1 ?" D- Y( S- ~9 Y/*                                                                          */
) E9 W+ U5 D! T+ J% @, S5 {% l! Y/*              PSC 初始化                                                  */5 M5 J1 V, Y* H& }, C
/*                                                                          */" m# G1 q$ F( \7 s3 _
/****************************************************************************/
) X1 n  l4 M1 N5 Hvoid PSCInit(void)1 Q. p' U; q/ \6 A4 J7 Q4 y7 }
{0 h' z$ l9 r; Y9 i: v
        // 对相应外设模块的使能也可以在 BootLoader 中完成
4 C1 A: F# {% \  U8 b5 A/ f    // 使能 UART2 模块
7 {1 U0 u0 J- ]* i    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
) h5 A- @8 A0 Y: g+ c2 t}
3 @0 z7 z1 `1 ^. M# T
( v: G9 g+ \- {3 s, a( ?/****************************************************************************/! b& x8 j/ `% Q8 Y
/*                                                                          */
9 S! |5 H6 G5 q1 M4 M/*              GPIO 管脚复用配置                                           */
" a. B9 ?) O: M: r: V9 n/*                                                                          */
6 }0 i1 j. g6 K3 M  c; Z/****************************************************************************/+ a* W! O7 o+ d
void GPIOBankPinMuxSet(void)/ R8 y* ^; k% H. l/ V
{
; f: N* E9 |& V: a4 L- U        // UART2 禁用流控( P& B; O4 g! F) ~, ^' f: L3 r
        UARTPinMuxSetup(2, FALSE);1 Z4 M( m$ ~- N( F6 s( m
}
0 V. |) c4 [' g; z* w& E8 v  p6 v5 `- w# ^2 C
/****************************************************************************/& R( m7 T4 U' [7 g0 N" {
/*                                                                          */9 g- w2 s' S' }! Y3 q( j! U- u- h3 p9 T
/*              ARM 中断初始化                                              */& n) k6 ^: @& Y- p, P  v0 e
/*                                                                          */6 Y( Q, _7 r# u! y
/****************************************************************************/
9 Y9 y* k2 z7 _void InterruptInit(void)3 |3 j- ~2 _7 Q: B, S9 }7 {. |
{! m$ c( [2 c" b% }, I( w! X) t9 K
    // 初始化 ARM 中断控制器
3 `( c1 |3 R) _+ ]0 t0 H) F% i" K    IntAINTCInit();1 I( r1 y5 A7 C7 R- X. ]+ V

; P, A1 M  v  I( H4 s$ N& p    // 使能 IRQ(CPSR)
# F3 Z) K( S1 R! H) z5 m    IntMasterIRQEnable();
0 J6 d8 l+ y; D! F. F1 y- q
) e. g1 h3 z0 w    // 使能中断(AINTC GER)
6 _( m5 W+ X! B1 C8 l& H    IntGlobalEnable();
) B2 g. m- I- x% S' r/ n) v1 Z. D: g' S4 e! c$ q) ~5 V2 f
    // 使能中断(AINTC HIER)6 O0 r4 W5 l, {& z
    IntIRQEnable();
: u9 q+ G/ F( L6 n}5 n4 @0 r% {$ k; @  S; b
& @& N# [: Q6 l" d5 m( F' h) p
/****************************************************************************/3 l4 k; G2 t( y" k
/*                                                                          */
, ~5 D$ v$ B1 i( d" @/*              UART 初始化                                                 */
5 h9 z4 j2 s; R7 W3 j/*                                                                          */
% v0 m8 t7 s+ y* v/ L. C/****************************************************************************/* ^! E  |! ~3 R% O% |
void UARTInit(void)* w8 R$ c2 a- L0 A+ u: Y
{
' n* o- i) B& ]  k' R* P; J+ f        // 配置 UART2 参数$ k% s% Z; U( |9 I
        // 波特率 115200 数据位 8 停止位 1 无校验位
! A; J0 N( M  ?& \    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
3 u$ j5 ?1 s% x4 f$ \9 e                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);9 @) B! j) g$ Z
        // 使能 UART2' A. K' ?5 ?7 Y9 i. j& X
        UARTEnable(SOC_UART_2_REGS);- k! E" ^, b  M+ [( H, {
: r$ k1 S( A/ e
    // 使能接收 / 发送 FIFO. C% b* X9 A8 d, S, e7 y) j% t
    UARTFIFOEnable(SOC_UART_2_REGS);
7 R& S  j  N! Y2 Z* F: U1 ^3 l7 r" }( ^, W
    // 设置 FIFO 级别/ B! K2 Q# V5 H; u$ b
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
, Q5 N  d" R' U* H  F}  M2 T2 z% G3 H* C

0 C2 D& u, g7 R$ m  E* U3 M; ?/****************************************************************************/
2 i- Q5 Q$ M, c- }/*                                                                          */
1 S% B5 a5 S% L/*              UART 中断初始化                                             */( o* \1 z9 J1 D7 T. S$ Q, z
/*                                                                          */1 E/ n, O; z& P' I& y% U
/****************************************************************************/% K: C- l( E2 C5 X
void UARTInterruptInit(void); a+ Q5 }0 g& G
{" n& Q, G' P* G
        IntRegister(SYS_INT_UARTINT2, UARTIsr);% @& g/ t! E! M& v5 r. J2 x
        IntChannelSet(SYS_INT_UARTINT2, 2);
+ A' z( s2 s- v9 \3 T  ~        IntSystemEnable(SYS_INT_UARTINT2);, R0 \+ s; E* p- N

! @- ]( y) P" [7 v8 t        // 使能中断" m: G6 S, {$ k- x  y/ S8 W
        unsigned int intFlags = 0;
& H+ _# P: H  l# @/ L    intFlags |= (UART_INT_LINE_STAT  |  \* t0 Z% j5 z' s+ f; [: O$ I
                 UART_INT_TX_EMPTY |    \) U1 T& ^; Y/ a$ w% ]" b( k
                 UART_INT_RXDATA_CTI);( U& t, P/ A; J' L; Q% F8 f6 s
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
5 g- `, f0 v# M% S}/ r& u6 H3 c/ n0 a' J* A

, C& r; O$ W$ I5 ?/****************************************************************************/* T4 F9 m5 c3 Y; G0 Q1 I
/*                                                                          */
) d- L6 J* y2 x5 x/*              UART 中断服务函数                                           */! @( S! j4 Y0 C4 V2 S7 n  `, G1 |
/*                                                                          */: b9 N+ u, s8 W5 I5 ^( S6 Y% ~
/****************************************************************************/3 M# U1 d. s& i1 I1 j' I0 s) K
void UARTIsr()5 Z  p( Z2 _; a
{; a9 U9 {6 F+ Z) j
    static unsigned int length = sizeof(txArray);. R. L* A- T: y9 Z+ j
    static unsigned int count = 0;
6 V" o6 I* w5 o7 R5 r    unsigned char rxData = 0;- Y; Q8 ]& J0 V- j+ J0 \, T, y
    unsigned int int_id = 0;
$ g9 [1 `2 N5 ?4 D& [& d
# [' r& |* C! g3 T2 t, v    // 确定中断源
+ ?/ {' ?  b) p1 b# w7 `% o! K    int_id = UARTIntStatus(SOC_UART_2_REGS);
+ `' l' [* _# ~- N
" l; v( p3 A  z) t, ]; |    // 清除 UART2 系统中断
- K1 f0 P, n0 ?  N, H    IntSystemStatusClear(SYS_INT_UARTINT2);
" D0 o+ N) g* j: z; R  R3 o7 t
1 H  |: B3 I" O; k1 {    // 发送中断- ]/ [( l8 F+ x7 O  r) C7 y0 a9 N
    if(UART_INTID_TX_EMPTY == int_id)
' z* R2 Y( }+ y    {
% o/ @5 G: W5 R1 S) s% H* `        if(0 < length)
. M* D  Z* u1 }# L; a2 {* r        {! o( n) }# k# i. K1 i8 @9 G$ S+ s
            // 写一个字节到 THR5 t9 s+ b' Y3 Z' X* a0 {- h
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
3 A3 a) Z& _! r) ~% O" V' R            length--;( E) w: O, C# O! j" U
            count++;# ~' x/ `/ d0 X& A
        }
% d& R/ e) Z& ^        if(0 == length)% {5 v7 D+ v6 ^+ p# {- v
        {
% ]! Q' `# |# h4 ^9 {6 \3 c& ~            // 禁用发送中断
/ |) t* F. T3 g! r2 ^: I            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
/ @% ]7 F  v$ J) X) C0 Q2 O& d* I        }
6 F5 [. e& i2 u8 N5 \' ?     }( |' |7 K7 V! w& B
  U$ @) ~: H6 `7 z& [7 m" f/ [# R
    // 接收中断
: |4 y" @8 ]  f+ Q/ _5 @% U    if(UART_INTID_RX_DATA == int_id)& V" y  |7 f& S# w
    {9 E5 y4 Y7 j7 R, H0 m; _! L
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);9 q4 }+ R7 v$ s: B7 r
5 f  L* ~: q& N+ P" T0 F0 O, _
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);0 J' P$ [% f' `) d( t+ R
    }
4 {0 [. S8 c/ y0 j# F& \
/ N+ N, ]% d. p: u3 M# M' q% z. ~    // 接收错误
" G. {# r8 _+ T! |8 [0 @2 |' @: R    if(UART_INTID_RX_LINE_STAT == int_id)
2 ]6 c8 }' p) T% ]    {0 {2 E# L' n+ X7 G- T
        while(UARTRxErrorGet(SOC_UART_2_REGS))
- u" M* {+ t  }1 W6 _8 ?# k        {
5 {( G" p- q0 J' J            // 从 RBR 读一个字节- `/ V% T; C2 V9 F0 J, m
            UARTCharGetNonBlocking(SOC_UART_2_REGS);( C2 P4 m% L& ?+ q" `) n
        }& X) e! j: u; u& i* d, e
    }
& U" E/ D# E2 p5 c   
* i4 c$ K2 M6 x0 p    return;+ u4 _3 X4 j7 G
}( W0 o# c( i8 ?2 {$ {
回复 支持 反对

使用道具 举报

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
8 g, }) g. [9 N( @% E' u如果其它设备快速给你发送串口数据,你这边能正常通讯?
  a3 }; g! N/ L0 t
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 06:50 , Processed in 0.042893 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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