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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5648|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。' n8 L! ?" _  P  l+ _& d5 j; l

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。( K# a( C+ D! [3 ^: i: o2 X
( O& K/ y1 A1 m2 Q
#include "TL138.h"                 // 创龙 TL138 开发板相关声明; L5 m4 w% Q0 C7 D* `  O

9 z6 d5 e$ p! b% ~" b#include "hw_types.h"               // 宏命令2 P$ E: z5 Q" x5 i' c: f9 |( X
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器8 b4 X- v/ |1 k4 G
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
. V3 E7 Q; J/ o: C, k" y9 X! {: S4 U; L% ?
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
' T( @( k) _1 B#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
" F( V& y6 S! R: E#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
3 |4 S9 m. S- P: A#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
/ q+ `* m: p* ]8 `" B4 O( F
4 o  J7 R& O+ J! T  T/****************************************************************************/
' E0 P* t3 C: b2 t/*                                                                          */" c+ l# V; v* ~7 _4 t
/*              宏定义                                                      */; b! H) M6 G" k3 m. l
/*                                                                          */' b- [& Z- O5 E' H
/****************************************************************************/2 l  `4 \' Y9 C4 W7 L
// 时钟# E6 K9 K% y$ k1 i
#define SYSCLK_1_FREQ     (456000000)
2 G3 X0 c: h7 G8 K& v: C#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
" l9 Y: y- O# P/ f$ k7 A#define UART_2_FREQ       (SYSCLK_2_FREQ)$ l8 T3 S& @+ G- Y
- X; K2 ^9 R/ ~: W2 K
/****************************************************************************/$ l9 k4 c# o- [% U7 n5 P2 _) z* P
/*                                                                          */
' M( y: l3 X. w) G9 _7 A/*              全局变量                                                    */
+ ^- ]1 Y9 l8 X1 x. u0 q0 B; J& c/*                                                                          */
8 |+ F" s. v" }2 }/ C% Z/****************************************************************************/
& B0 j  n7 v  m+ Wchar txArray[] = "Tronlong UART2 Application......\n\r";# G% X& j! }1 ]: i" m9 y
% D! {- Y2 D8 O
/****************************************************************************/
; q5 p8 ]( m: z. k  R/*                                                                          */
$ b2 r: q( X+ U* M7 h/*              函数声明                                                    */% E1 l) n# r; j  _6 ?9 j& |
/*                                                                          */
! T, L+ u: i( a5 O: I: K/****************************************************************************/- V1 |+ V- H; I# ?0 K, ~+ Z: K
// 外设使能配置
  K2 l, V$ }% O: d; F0 b; ]void PSCInit(void);
" O4 ~' a& i9 C3 Y' y6 B! k+ k5 t4 r  I% L% p2 y
// GPIO 管脚复用配置
4 ^" P/ j6 D0 r( s* N6 Kvoid GPIOBankPinMuxSet();# q0 {. y- W  b! H& j
9 _% x/ l4 H3 Z: C/ S- W
// UART 初始化
/ F" J# u( k4 I6 r; [4 @void UARTInit(void);& c/ Z$ q" Y: R* {& [
// ARM 中断初始化9 D2 y% J; n) m) T  Z4 F. c2 S* ]
void InterruptInit(void);
( g) ~; w, @4 Q" |. p/ r+ \9 R// UART 中断初始化: m0 ^6 }& e- o2 }" n
void UARTInterruptInit();
: z7 x' h6 c' @) h/ f  A9 W// UART 中断服务函数3 l8 h$ c$ d9 B
void UARTIsr(void);
; I8 T! J: ^" j! D$ n; Z
& O- ~! T& g9 g, {) _/****************************************************************************/' O. m! B/ B$ J/ e& p4 f4 f
/*                                                                          */& a* }# j+ G! S; L1 Z5 K
/*              主函数                                                      */. t/ @2 M4 U* U$ c$ G" a+ s  y
/*                                                                          */+ }% O8 N2 `9 l5 u
/****************************************************************************/% v( R! |+ T6 o+ c' B8 f
int main(void)
& {2 L: A; U0 c5 p* W- E7 Z{" ~1 F: ]" _  }8 w9 [
        // 外设使能配置
4 m+ F/ A) \) w5 n( a        PSCInit();
3 ]" l7 Y/ V/ \" @# Q) s3 c7 d( ]       
! ]5 t$ @3 X5 o: Q( F  j  O        // GPIO 管脚复用配置
3 t) }; s3 ~  n4 K9 ^/ s' m( V' p        GPIOBankPinMuxSet();
8 `8 T6 d5 b# R6 J' @2 b1 \* o3 Y; I4 z" s" {
        // ARM 中断初始化
' r- ^  t2 @5 T- d( e        InterruptInit();
: [- K2 E* L* o" ~, O2 G9 Q! H; `  [1 t7 R3 L
        // UART 初始化
1 s0 f, a& f' d5 A        UARTInit();
: ~* L6 e+ j7 @8 c% l6 t1 E# O( j
- W8 [- z% Z4 _0 q9 e        // UART 中断初始化
* q% t% a( P2 e, A* I1 |6 V- x        UARTInterruptInit();2 Q# M5 I  ]7 ]- O3 c, d, `

9 i' `, [' U6 ?2 f        // 主循环
$ T6 @6 w/ \- @1 E" e        for(;;)
9 j, Y& N3 D; g; J( o% q! F        {
$ y: f  ]: D0 D: O# h$ D. l9 p4 O+ K) A4 k' ^) n# r& z
        }; R+ e8 Q" ~# r
}; ?" l( d+ g0 k

; z3 e. M8 c* P( Y/****************************************************************************/! O) O4 ]& r$ W
/*                                                                          */
2 w+ w! I  a+ T" e+ n6 A7 D/*              PSC 初始化                                                  */3 ~  q% W, K  c
/*                                                                          */# X3 A- Q/ m* r+ f
/****************************************************************************/8 e' D$ N' Z5 L8 |# |" i* B
void PSCInit(void)9 j# K6 @1 Y2 E
{: B5 B; ]7 i/ H
        // 对相应外设模块的使能也可以在 BootLoader 中完成
& O% k, V* N4 G, Q    // 使能 UART2 模块: f# k# c5 |7 k% Y1 \8 K& \1 E: R3 a
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
. n, O$ r, K, c" n; l  F}
$ N5 q, h0 C$ v. p) L4 B. r4 y  u
2 O6 v. O8 I/ H! S. q+ Z9 r/****************************************************************************/$ S0 v  D* h+ d+ r+ D
/*                                                                          */( Y1 g1 K  D$ @4 r8 w% h
/*              GPIO 管脚复用配置                                           */
, q$ H5 c9 f0 Y$ `7 X/*                                                                          */+ O+ P  \5 b& M/ |
/****************************************************************************/
, H+ L; R. y4 ]. M1 j+ N8 |void GPIOBankPinMuxSet(void). j+ L+ h6 r) E# F% j. P1 A
{
# Q- d! f8 f- j/ R! o        // UART2 禁用流控* d+ y+ ~: X* W
        UARTPinMuxSetup(2, FALSE);; S- W% e- n  Q( I9 ^* R: p) `" A
}6 m8 \; }  @4 X3 ^

: C* ]: C4 Y0 u" F8 e. S" K; f/****************************************************************************/
; @. p% G  {! ^4 r! s0 Y% {/*                                                                          */
+ p; x/ J) C& Y5 O/*              ARM 中断初始化                                              */' Z6 v" U+ _0 X2 f$ Q! x
/*                                                                          */
( M' I3 |# l) _( U7 G$ J/****************************************************************************/
0 b% v  c3 E8 J* A( `, \void InterruptInit(void)
2 D' l" Z$ [1 C) \{$ m9 [! y, ?, s
    // 初始化 ARM 中断控制器# z1 I0 a" L5 l3 `" l
    IntAINTCInit();
& g) N6 i# Z  T/ y  I  x
: U( ~+ H; A0 K# j    // 使能 IRQ(CPSR)+ q: V3 j, G8 Z& D
    IntMasterIRQEnable();
7 m$ W' c+ A/ d( F6 p8 V1 J% H8 x& Q" B7 m+ W8 V6 Y$ P
    // 使能中断(AINTC GER)" b. G% X' |! ?( c2 _$ U/ F
    IntGlobalEnable();
1 o& _$ B, o- S! j6 l) M0 L8 E6 i8 R  V2 Y6 J
    // 使能中断(AINTC HIER)
1 [+ O# A/ |/ U1 y$ C    IntIRQEnable();3 X) Z/ t3 e6 m. E2 L
}) e, w% T: [. l
# T9 E! j/ s+ @+ \  H1 o
/****************************************************************************/" s2 J# G- n0 W1 ^, h
/*                                                                          */, O" \2 p2 i8 ?, E" u( @8 k5 z8 C: T
/*              UART 初始化                                                 */$ F5 b  o( X8 B
/*                                                                          */+ L- y; d2 o& s
/****************************************************************************/) O$ q- `5 T( ]4 Q- _+ M. R" j5 y
void UARTInit(void)
$ q, R& O  c8 J  }{3 K: T/ @" X9 x4 v, U
        // 配置 UART2 参数
' J' f+ F4 T( B2 o  V        // 波特率 115200 数据位 8 停止位 1 无校验位" ~' S# j1 [0 }: o4 \: v
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
/ I4 }! p* W) v' q) |                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);6 T2 i. e# q7 e* Y+ m
        // 使能 UART2
# G& e  H& A: M' ?- y7 b        UARTEnable(SOC_UART_2_REGS);* ?, _% z# |3 u$ W) O

- \: n, n7 C* M* z! G    // 使能接收 / 发送 FIFO1 k  O1 L- [- x# }6 h
    UARTFIFOEnable(SOC_UART_2_REGS);
, ?, c9 K# e/ q4 `, ]: Z+ O6 m+ f
( ?- Q2 Y/ E" f# K/ D    // 设置 FIFO 级别
9 \$ Y3 t/ K# _% N  q1 [    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);) {& K" i+ S& D' W" m- H% ?
}
4 z$ n9 g9 c5 R' c. a
+ l: f3 j3 l* i6 f/****************************************************************************/+ i1 D9 j7 p# b4 S; s: g- y0 D
/*                                                                          */
: G7 q& q* d4 t5 v8 q/*              UART 中断初始化                                             */
; N0 e& s( E* x/ y% q/*                                                                          */
/ {* O$ B2 V; M7 f# \/****************************************************************************/
" o% v6 A! O: n  ^5 c- dvoid UARTInterruptInit(void)
8 c4 ~4 v0 u/ j* \9 V/ @! H{
; ^/ B5 T& N  U7 D- |" u" @. X        IntRegister(SYS_INT_UARTINT2, UARTIsr);
. y; P- w4 Y/ V. n* {* m$ g5 {        IntChannelSet(SYS_INT_UARTINT2, 2);! q1 H- m+ P- w
        IntSystemEnable(SYS_INT_UARTINT2);
5 r8 m1 {! i8 H4 h$ }1 I& |" ]1 p  L2 I( m+ d0 H
        // 使能中断4 ~0 z& y3 X; V7 M
        unsigned int intFlags = 0;0 r) A+ S( H" p5 T- `, X
    intFlags |= (UART_INT_LINE_STAT  |  \
2 P4 e, P% ^. ~6 J                 UART_INT_TX_EMPTY |    \) D/ x9 h. p, R  P- l3 p2 a$ q$ o
                 UART_INT_RXDATA_CTI);# e8 m0 ?/ ^# V! M; X( @
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
8 A+ E+ z2 |3 t# F4 c, ^: m}
! T3 M0 u$ v5 r/ f' C5 y+ X! Y
. z+ O0 H6 r% c/ N* U6 ^7 |/****************************************************************************/5 I+ `2 R' a2 Z' m
/*                                                                          */
# m: s3 A  A  K) T' j4 A4 X/*              UART 中断服务函数                                           */% {  C) O5 @& ^, B6 y; O2 {
/*                                                                          */! M0 q5 Y$ P8 g2 i& U, e1 Y8 ~
/****************************************************************************/9 ~8 F1 s3 t9 H% {' Z0 n
void UARTIsr()
0 A, B/ m' t- t9 I: ^{. w" p  i  {+ v0 A' p0 C0 S- @
    static unsigned int length = sizeof(txArray);
: P+ Q1 r: k- @0 D    static unsigned int count = 0;
% ^5 o1 K7 h* I7 z1 ~, y    unsigned char rxData = 0;4 [. ^  {& P& D0 H: ?" g7 x
    unsigned int int_id = 0;
* @! g5 }. u* X  `4 f# R+ g5 Q
4 }1 q* F; G& W* n- {* R* o$ m( b( _' _    // 确定中断源, u% k5 z0 E% B. R6 d' K$ N3 R
    int_id = UARTIntStatus(SOC_UART_2_REGS);) |; _/ D9 x/ ]% ?

: _& l, S' U$ K* X, }6 ?6 i4 G    // 清除 UART2 系统中断& F9 a$ O+ t( q+ R# `
    IntSystemStatusClear(SYS_INT_UARTINT2);
; I% I9 A/ u# @* k$ {; Q5 [( B- O% a, y) |5 @* }" b
    // 发送中断7 j1 f( h( z% {9 m* X! v
    if(UART_INTID_TX_EMPTY == int_id)
2 E. m/ ~5 \# z( S# L    {
; q+ C# F2 O5 c6 X; @        if(0 < length)
* g$ a9 R' Z3 _; d2 t        {3 @) `# i: O- [% k3 z2 d
            // 写一个字节到 THR4 I( E! a5 K+ N- X: ?( L* `
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);; k9 p! A7 o* E* }# t
            length--;
7 c9 w7 P& L8 c5 P8 e            count++;
6 ]5 S# P1 f6 y; f7 m7 y        }
9 m% Z* }2 z4 _        if(0 == length)/ B7 b: X# ?: c4 }% H
        {0 W! k/ y+ Z6 E, d; a1 [# r+ j* G
            // 禁用发送中断# V: @4 i7 |: q. @, e
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);& w8 `% W) y! Q3 F) ~
        }
% x& e. A; z: W+ Q  v5 ~     }
4 l- E' k8 D  f* B- a2 ?, \7 X) {( _! j6 }, `$ F/ u4 R
    // 接收中断0 ]( @9 n* j  i
    if(UART_INTID_RX_DATA == int_id)7 ~& _* H4 G- P( Q" j9 L4 ~4 o
    {
  Z6 B* Q$ K( c& Q8 {0 \1 O8 @        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);5 U3 k$ o/ m2 J' r7 @1 L/ I

* T: I; p. y, s5 c1 ~$ f2 F        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);- i1 A- S; T3 t3 M- W
    }# y8 L$ F& B6 U+ {: m1 }  f) v
0 q  G7 i) H0 t- z8 w1 |
    // 接收错误
2 L. Y) u1 t* I, w7 g0 e8 a( Q    if(UART_INTID_RX_LINE_STAT == int_id)
* i. s1 W" a7 c) h% e" W8 Q; z0 ]    {
( S( t  V' N: {% J) H        while(UARTRxErrorGet(SOC_UART_2_REGS))
& A- v5 Y" h2 k! K; g        {$ W. h0 E- ?6 |7 ]. a% g
            // 从 RBR 读一个字节
* x! h6 o; C' h' Q- b5 e- o            UARTCharGetNonBlocking(SOC_UART_2_REGS);
! w7 K1 h' q& |- b& s' I  @        }
) g+ V; p; P# B# q9 W    }) o5 h' J5 M5 a9 _, M5 O
    # ~" v( M. t& J, w5 R* s
    return;
# c" u; k) T% A  f, A# t, K* H}
: G$ I" A$ ~) B* `0 U% S: i
回复 支持 反对

使用道具 举报

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:257 j; G, y% Q, ?0 e* o" t
如果其它设备快速给你发送串口数据,你这边能正常通讯?

0 {8 P0 a2 n: |, T谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 23:25 , Processed in 0.041509 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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