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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8620|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。7 b% s7 ?. n  Y  B0 w; _, g' b

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。" Z, M8 a8 P# U! {

0 c. D" ^4 g1 s& Q& E#include "TL138.h"                 // 创龙 TL138 开发板相关声明! K- n6 R2 ~2 x+ F( }5 v9 H
0 _/ {. B7 t" ^* G; ~' l
#include "hw_types.h"               // 宏命令
/ ]% f! c: `, d# m; l. Q/ s#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
& g  o3 }8 G) ]" C#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器* h# p* n9 o/ O! f/ b) m# E& l# t
7 w3 i7 |, ~9 D& L; ^
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
+ n9 H" s& R7 Z8 `; H#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明+ z& I: K7 U' S7 Q/ H4 ?( f
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明4 C- |, O* P) s
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义% `8 _) t& F. n$ l4 B5 Z

$ }' M' }0 O. X4 i( b- X  b& b/****************************************************************************/
# p: E0 [6 S. ^8 N. o3 y2 Z! u! ]/*                                                                          */  I8 w) K% }  P% s: S
/*              宏定义                                                      */
7 T' R: [' {$ n! q( \& z/*                                                                          */
6 P  b4 I) v$ c2 ^3 z/****************************************************************************/
4 ~1 X# f6 r: `* Z$ @& ?// 时钟, ?3 X# V& D$ ?
#define SYSCLK_1_FREQ     (456000000)
; @1 r) |" m* v, Q0 p% ]* G#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
, ]- M* p3 o, Y2 B" _#define UART_2_FREQ       (SYSCLK_2_FREQ)
1 J2 E% f! t( f, m1 W) X( I. d. F' X
/****************************************************************************/
; Q6 E  S- Z9 F  ~- d- X" V/*                                                                          */9 T8 Y3 B' U' B
/*              全局变量                                                    */+ B6 c8 X  I2 B8 D+ }- \! t4 u1 m
/*                                                                          */
! Q& g0 D* }1 _. I/****************************************************************************/
* {- M2 y) B6 lchar txArray[] = "Tronlong UART2 Application......\n\r";( ~) n. m' }5 X! x
5 f' s% u, P0 c8 D
/****************************************************************************/; @, h- Y- ]  r
/*                                                                          */; v: h  c+ H( R" T4 c/ K, @* G
/*              函数声明                                                    */
$ f% O3 c; f' j8 F8 Z/*                                                                          */' V* H8 x. b1 y4 ^: W
/****************************************************************************/
  W4 o  W$ {" ]( |, F( j: L8 \; g. j5 @// 外设使能配置
9 n. w4 |) Q' g+ O: O- M6 k$ Z% Tvoid PSCInit(void);4 B$ N! W% H3 z8 i* ?) |

" x) J; Y# N$ J. u! {2 N3 A% S// GPIO 管脚复用配置
5 v& S  @/ [9 n" O/ ivoid GPIOBankPinMuxSet();. {5 k; ]/ r7 J' l1 u  b" W1 ~
' y  }. Y& \1 I8 ]
// UART 初始化
3 |9 A4 z1 c- V- S6 x. m# j, dvoid UARTInit(void);
/ A4 |2 P. R9 `* Z% @$ q  d$ m+ _/ X// ARM 中断初始化
, J) e$ U% V9 V. V* y/ x+ Kvoid InterruptInit(void);3 @. L5 M/ y1 l! V" J0 Q/ ^6 p- p0 I
// UART 中断初始化
/ o; {" b6 ?/ X* \void UARTInterruptInit();
( b7 f. h, E6 {' l3 [" r// UART 中断服务函数
. G! b& y  T# ~1 C+ ]# r  A3 {void UARTIsr(void);
, \+ r  y; J1 b+ c2 f
1 b, l: |! Z# [3 ?/ H4 J/****************************************************************************/
! r7 `; m. z; K' N2 s$ S* ]/*                                                                          */% X6 C7 A3 N" U- C, O9 H
/*              主函数                                                      */
" o; U# ~; w: N/*                                                                          */) Z& y, a; T4 u
/****************************************************************************// v% _& G2 @  |1 E
int main(void)
8 d5 Z& c$ m  K{9 S- g3 A1 i3 L. \
        // 外设使能配置* Z! D  H) R# }4 }
        PSCInit();
+ L7 y7 s7 t: @& t        ( z( }6 Y1 h1 {/ w, S
        // GPIO 管脚复用配置6 o+ ]( w/ o& Z
        GPIOBankPinMuxSet();
, S0 C7 A2 f3 s0 ^/ Z, |/ p
: [* M3 R" f/ g9 f1 l$ D6 u0 N        // ARM 中断初始化
" P. Z6 H/ x: X  ^) m& J6 U' U- f( Q        InterruptInit();& V3 W7 l9 @7 d7 C* P. j" ]

3 C( S9 A% {. y. @1 s/ m        // UART 初始化
* G  `4 \0 w  F2 g        UARTInit();' E: K0 a! b5 |- `. z! X

  ^; c" G) |, k2 N; `8 c        // UART 中断初始化2 |7 X% H  g  X5 Y
        UARTInterruptInit();0 Y& B7 ?0 `* w0 ?# c9 e; t  f
# m6 d* k. j5 I0 M/ u7 w% l% {( \
        // 主循环
( p$ e* f8 o, }% x+ s1 s) H        for(;;)
* X/ `' ^1 l. f2 D. q: ?        {
! r4 O$ K4 M5 U/ @* _" V$ E/ h! e) s' T4 v9 x6 i
        }# j, {, Z% _2 m+ C9 E% ~1 {
}
( O$ Y0 M" p* V# k
: ]  Q5 u. G# @/ w/****************************************************************************/  r, X4 R& \6 u0 f! |1 F/ X
/*                                                                          */1 n, z0 \1 T. ?; S6 e
/*              PSC 初始化                                                  */
+ G6 x. w4 n8 B) S/*                                                                          */
9 j0 z& a5 I9 X& r/****************************************************************************/$ [7 g6 j' h' w$ d1 |
void PSCInit(void)% ]! j2 D) X; m: H6 d3 I
{7 R7 I& s) P. a% Y
        // 对相应外设模块的使能也可以在 BootLoader 中完成: s, T7 Q" l  R1 g, [8 a* E; e
    // 使能 UART2 模块
; b7 p# r% a* o    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);* ^3 @5 ?( c; S. N
}
% T3 F, R# f' x9 J: e7 k9 X' y5 @. j* y0 D. }% b$ t6 a
/****************************************************************************/
5 ]# w" E2 |3 X) i8 M+ X. d* v/*                                                                          */" h! W: _3 [) r! |5 x7 G5 c
/*              GPIO 管脚复用配置                                           */' B* ^# p; c3 X5 N/ G! Q
/*                                                                          */
6 R) B) v6 c' D+ @' P/****************************************************************************/
. s4 s* H# T: x% \" G# l6 Tvoid GPIOBankPinMuxSet(void)8 I- o4 q1 k) j: C: h3 Z5 M
{
5 x1 q" q% b9 [1 y) J        // UART2 禁用流控5 m- \, t0 i4 V8 }- E0 s
        UARTPinMuxSetup(2, FALSE);, T1 \# b" l& @# e9 D9 a' {. b( _
}
7 W  ^1 c  c- ?% m3 l9 ?6 C! d9 c
, M6 H" S- Y) Q# C( u/ x/****************************************************************************/7 w0 X* ^9 E( U! c. G) X7 o  y
/*                                                                          */
* A, H. _! A: k4 C5 z% O8 B/*              ARM 中断初始化                                              */+ N8 [2 A/ U+ K; m$ K& ?( J% H
/*                                                                          */
- W0 y3 o) o& Q( A/****************************************************************************/9 l- h& l  l. b& e8 q8 Z; e
void InterruptInit(void)3 H0 T7 R. G% L$ N4 D+ ^, a$ i
{
9 u( q+ e* r" n+ Y1 c1 ]9 {    // 初始化 ARM 中断控制器
. F0 j, s* `  c, e, P    IntAINTCInit();1 ^# v" s2 U- |- Z# E

( `8 t6 _2 K7 z$ Y    // 使能 IRQ(CPSR)# G  z( R/ j  @7 Y6 N/ q: @; V
    IntMasterIRQEnable();/ z. C* I+ C( l& p
9 e* c1 j! _" E* f8 [6 L
    // 使能中断(AINTC GER)& b+ l4 m9 z2 G' T4 c& g3 y( y
    IntGlobalEnable();
0 o! x8 _  \5 C3 ~+ g  I% }4 {; h# |9 C, q( {
    // 使能中断(AINTC HIER)/ G- O) U( i  O1 }' W4 O5 a
    IntIRQEnable();
* a2 B3 @6 Y& O" G' r1 W/ d$ L}4 i/ r7 R& \. z. J
8 u; s3 W7 U9 n- s8 g
/****************************************************************************/8 T; _, k7 B7 J' ]% I
/*                                                                          */
6 z& r0 ~' v. r3 j/*              UART 初始化                                                 */2 _0 S# N5 j% D7 o% J) g' X/ s# [
/*                                                                          */
. t2 j" O# R: l/****************************************************************************/3 @4 n# b  e3 H& Q% B" J
void UARTInit(void)$ Y# e  }: n* y
{! q6 d, F' ^2 m
        // 配置 UART2 参数
" o7 }" p# _: S        // 波特率 115200 数据位 8 停止位 1 无校验位
* n$ `; |+ O6 c8 y  f- G9 Q    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
6 J9 T! ^* J0 M3 `                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);% T6 l7 n7 k! O7 Z- ?. G
        // 使能 UART2! ^$ M  ?$ k* M6 v0 D
        UARTEnable(SOC_UART_2_REGS);; y# M) C' Y3 t
+ }* b% i; O1 I$ Q
    // 使能接收 / 发送 FIFO, @7 i' g8 B: U2 {) {8 P3 C
    UARTFIFOEnable(SOC_UART_2_REGS);1 B" ]* h2 H9 l- h6 E' ~% A9 G

/ y- w; H+ E( Z( s2 a    // 设置 FIFO 级别
  n  F( R7 c+ J0 W$ |# u8 V0 N3 X+ [    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
- C" w8 |! U( A  Z4 r}! Y) X% W  N5 A; g

1 u4 h9 f4 r% e* T8 l' y& H+ C3 U/****************************************************************************/, ]7 J, t( I+ `- A, V
/*                                                                          */  g, l$ `& J' W4 ?7 B$ R) ]
/*              UART 中断初始化                                             */, r8 w3 h5 \: w9 L9 d
/*                                                                          *// [( H1 T) C4 ^% R
/****************************************************************************/
! j) D% u, a5 xvoid UARTInterruptInit(void)6 K% b* e9 W: x. ^* x7 R6 w1 D
{" A* y/ _) {! T0 K! _
        IntRegister(SYS_INT_UARTINT2, UARTIsr);& \8 B! d' I, W. k
        IntChannelSet(SYS_INT_UARTINT2, 2);: P; z) {# r2 D) Y8 ^9 X( W
        IntSystemEnable(SYS_INT_UARTINT2);# W0 u* S" E  X# f& s* _

- _" @' D$ ]' B  @2 k0 Y' t/ S( s        // 使能中断( [. l+ t/ j( t8 L1 V8 r7 `
        unsigned int intFlags = 0;
0 p) w' P+ G* l% N9 M    intFlags |= (UART_INT_LINE_STAT  |  \. j$ g; d* i8 }% E$ ~
                 UART_INT_TX_EMPTY |    \5 e/ e* f" e- y
                 UART_INT_RXDATA_CTI);: D- c: D- q7 h( N, s
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
+ E& t/ H2 j$ `/ z% a}1 H. X- q4 @& H
7 x9 y* O/ e  f) G9 {' F' d
/****************************************************************************/: c6 `6 d$ v1 z
/*                                                                          */
$ j( @. S; }/ Y9 B8 Z: X4 N& Q' d( X1 j/*              UART 中断服务函数                                           */& M# D  M# S2 p  a% y* t) ^) }6 g
/*                                                                          */
) x; l$ K2 ?! L0 c1 D. H' {4 j/****************************************************************************/7 ?% d0 N1 x) f; C/ E# M" H
void UARTIsr()
: w9 r$ ^# u8 G2 }{. Y& P, x/ z* p* M/ S+ a# Y" P
    static unsigned int length = sizeof(txArray);
3 e0 i, _8 w5 W+ z3 r0 e    static unsigned int count = 0;
, i5 J7 y; d; D, q+ }    unsigned char rxData = 0;
2 O3 m: n# z" m1 R  ?  ]    unsigned int int_id = 0;
6 H- U! o6 S2 _$ ~" C9 _1 G4 J* J% k& J/ j8 `
    // 确定中断源+ A1 a6 |$ [# U& L
    int_id = UARTIntStatus(SOC_UART_2_REGS);
1 P" u3 g" K) A- Z, r, Z) d
* [+ a3 d! n7 v' M& {3 y4 J    // 清除 UART2 系统中断1 C) b1 U2 u; f6 C" U/ X% x  ^
    IntSystemStatusClear(SYS_INT_UARTINT2);4 {+ J. ?; S+ p! C) o. H
) f, d* `  T4 Q2 a5 {; o, w
    // 发送中断2 i3 Q, p. U% Q# }! b) ]
    if(UART_INTID_TX_EMPTY == int_id)+ W, S" e) F. R# J
    {) o- x, y8 P* r
        if(0 < length)% ]8 N- Y! g0 A, B8 D
        {$ `- U1 K- H2 p& A& d/ z  [
            // 写一个字节到 THR- m" I, X8 G( y  E* O5 X
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);2 i. g% P7 _- M! e
            length--;
9 [8 J. {2 e- ?            count++;6 A" K5 c/ I0 r/ y, P- e
        }# \3 K! ]- y( B3 _
        if(0 == length)
$ @% E$ S( z" U: M* w1 ]        {
/ k, I! C  z9 a, B3 W& E            // 禁用发送中断& ?  O! T4 f/ p' C+ H
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);; v+ j7 \  U3 c! Q
        }! B% G  y1 r& P  C
     }
; S9 c: O% E2 I7 Y: B5 ?" G3 s4 g+ O3 B! R; U/ e% F% Y
    // 接收中断. w8 I3 N; [$ r8 M
    if(UART_INTID_RX_DATA == int_id)
- B4 Z+ S' ~" j    {# P: L) o4 b4 q/ m, ?5 p
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
( o& Y. y7 n1 f$ N" D, Y
0 o( c9 C& j9 q1 ]" L        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
. A- d/ k- c5 B    }! d* ?/ G8 D6 L' B1 ^) ]
2 C. X* J( w. y' d" G- f
    // 接收错误9 x0 y- k; {& s
    if(UART_INTID_RX_LINE_STAT == int_id)
/ `3 r2 A+ x8 U" ?    {
5 l2 _  v3 _* |% P0 {' q        while(UARTRxErrorGet(SOC_UART_2_REGS))9 d! d* ]$ Z4 ~
        {  n" E4 C$ G& j7 Z5 m$ a
            // 从 RBR 读一个字节
& E; ~, `& x& @( s3 G            UARTCharGetNonBlocking(SOC_UART_2_REGS);
2 Z5 o7 h* F: E$ M4 E( t( D        }: X1 Z1 }0 j7 V' c* g* X3 N
    }
2 k. S+ `8 \0 m9 O) M& {; S/ F    6 q' r0 N- Y1 g! ]8 y* l0 T# n
    return;
2 L' }5 a( \4 V' Z}
4 t1 V" s9 G3 S9 U
回复 支持 反对

使用道具 举报

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
% {) c. L8 c! y* s9 ~4 _+ E1 ?如果其它设备快速给你发送串口数据,你这边能正常通讯?

; [& U- ]( b. ]" _谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-15 08:04 , Processed in 0.042009 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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