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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7336|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。. X+ W+ N5 t4 O) O& l) x0 X: E

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
2 [- V& l# N! |+ }8 X4 d) r' p+ T4 |3 Z# D: v+ [
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
4 ^" e7 {' C% V2 Y: n- A0 r  Z- [" ]- d! b
#include "hw_types.h"               // 宏命令
( \9 ^8 K- Q9 d7 S#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
: R2 \& t8 z6 }#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
% e' l6 A( p! v: i$ O) y6 J8 z5 q7 ^3 R8 V7 H) {6 _% |
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
% R/ D6 i1 e4 Z! X4 l+ i#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明$ v- t- n2 `# y( H
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
: M; q9 o$ \7 W, y3 K" {/ u& \- d#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
5 l, L/ H- S" q* l+ D
' G1 f, ?( C7 b+ {! m9 q. Y: X/****************************************************************************/  w2 y/ n* j( _  H- u
/*                                                                          */! I' w% H6 Z% k. m
/*              宏定义                                                      */
: k/ B  t9 l) j  c) n/*                                                                          */
1 |2 `' w/ f; U/****************************************************************************/; E* R5 Z9 }1 {: q
// 时钟
; o( G9 F4 E8 Y" \5 p- p$ p/ v. u#define SYSCLK_1_FREQ     (456000000)
9 E$ i5 f8 s# U  F#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
* V& U  a* O, R2 g! |9 S( X. V  E#define UART_2_FREQ       (SYSCLK_2_FREQ)
( n+ V8 H$ ^. T4 n9 [( @0 `, W2 U) R5 i1 m' |5 `
/****************************************************************************/# u2 Z6 w" [5 x  q$ `
/*                                                                          */# k3 I( Y7 F/ {# g* m" a% D* N
/*              全局变量                                                    */
! P3 b3 U6 ^3 w: q! [2 f; Y% p  K+ s/*                                                                          */$ h# c* t/ r8 C% R- _5 F
/****************************************************************************/8 r7 s8 F) X) A+ J$ m# c4 k/ Y" J* y
char txArray[] = "Tronlong UART2 Application......\n\r";
+ _: U0 G& Q0 E( x1 e! G$ q/ j! O. J8 c
/****************************************************************************/, ]! o/ \3 ?; u
/*                                                                          */7 x. A1 _) A4 [
/*              函数声明                                                    */
/ @/ }8 `1 I+ k  M8 ~/*                                                                          */
& y7 l% o, E- q8 E. y6 n0 E2 [% ~/****************************************************************************/! L! g3 G! I) F4 f' u. h
// 外设使能配置# P5 C0 C0 t4 T1 n' n
void PSCInit(void);- U, e7 ^1 W1 Q: j

, V$ m& @3 ]1 P( r! v3 H# {7 r. p- |// GPIO 管脚复用配置
% a- U) g- I( m' N) kvoid GPIOBankPinMuxSet();
/ G9 E  G6 P% t' o" M5 r
3 j  P2 \$ r4 t& Z& N: V# q  G/ `// UART 初始化
, V, @6 Z4 l  ~8 n0 Mvoid UARTInit(void);7 n  S8 `0 y5 Y% X8 A' u
// ARM 中断初始化
% u; Q% i- M6 H8 h  `8 ^( Bvoid InterruptInit(void);0 p+ B1 E. C5 F, _1 [' ?; W
// UART 中断初始化
* l# J4 N! E1 A# r- k, Mvoid UARTInterruptInit();
0 W5 q, l" X) _8 |! Y" X  U// UART 中断服务函数
: Q% e6 s( m% R, A# O) _void UARTIsr(void);
0 @7 H* n3 u$ {8 T2 ]8 D8 b0 w/ {: z. r0 z3 S
/****************************************************************************/( h% @" K$ P6 Q: {
/*                                                                          */
6 L- m5 P# [7 k/ y9 `: J4 `3 d/*              主函数                                                      */8 ?8 E3 ?1 t; H/ y) T0 V. p
/*                                                                          */
& c* J$ X) y7 E% I+ M0 M! y/****************************************************************************/$ R; H+ c8 K- U- f/ E$ f3 ?6 d
int main(void)' \  e$ r# Z6 M$ H
{- o3 s. T. ~8 }' k- ^
        // 外设使能配置
1 o! M9 G' p; {2 ]% U: W" i        PSCInit();
( z' a' Y( z& [, N: c+ ^       
) F2 I7 B6 |2 u# K# G# h        // GPIO 管脚复用配置
, n7 D) |9 z& Q1 l. [+ F; h* T        GPIOBankPinMuxSet();
: ]% L* I9 X. @2 H# Y
% H2 ?  P6 w( L  b1 x% Z6 z1 F4 Z% v        // ARM 中断初始化
" b4 `' i" b# G' F% G6 t        InterruptInit();, u% n$ C$ f0 q' Z- e# b+ \
8 T# f& w) \% i' V
        // UART 初始化
' ~/ ?7 }( m& e# S& |        UARTInit();
7 W% B- y, T" H; n$ ?7 B& H
. }+ h% _! M, @+ P' W* {7 a        // UART 中断初始化
5 h0 A* z4 ^# p' Z        UARTInterruptInit();! T& g: i2 ^6 Z$ y0 Q, a
$ [/ _+ R% R, `
        // 主循环
. Q7 p& \" ?7 R8 Y        for(;;)# J" D) Q. Y: T* r& q
        {! s/ L4 o" k. H. \9 I7 [
0 @4 B3 B2 G/ z  t7 s+ D
        }
; D5 C& e$ d& U, w' }, _}% _: c3 U: m3 P6 ^) H

8 i) Z) \: T( d7 d: Y# z/****************************************************************************/% D5 A* J# K4 @- |) l% Z; @% f
/*                                                                          */' Z. Y) o& w% r% A2 f% q( h7 v9 Y1 c
/*              PSC 初始化                                                  */
, m3 w, K5 y: A  s" m/ J4 n/*                                                                          */
3 e8 S2 [8 S- v- h: f% {/****************************************************************************/6 `' j8 E/ K6 R- }0 n
void PSCInit(void)
+ [4 c6 K' k1 w. l: G{+ {* U" S9 c. o( ?+ o" }
        // 对相应外设模块的使能也可以在 BootLoader 中完成
+ U/ d  w2 f3 v. |! {/ a    // 使能 UART2 模块  k; V% \' X: d
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
1 e, P- \- m5 S$ [' }: k7 T3 J0 z}+ G! R7 {6 b% \0 r0 [- R! D

& v/ z  @  L& L/****************************************************************************/
2 @& [0 D) S8 e! h' i/*                                                                          */6 ?  D- G& \. W8 L, s
/*              GPIO 管脚复用配置                                           */. E7 J4 E: o3 d) J
/*                                                                          *// V+ e3 q* e% t  G
/****************************************************************************/8 D$ D- k1 L& A) l+ s0 p2 |
void GPIOBankPinMuxSet(void)! o" X5 R, N' p3 D; J$ _
{
, r2 t; e) f. U' N) r+ I  W( n        // UART2 禁用流控
( K) u) p: j# {* H1 X1 ?1 ^        UARTPinMuxSetup(2, FALSE);; G/ J* o3 L; A/ ~8 t9 t! Z
}5 k; a0 N- S* o! T
- D% h) `1 L. P. }' ~5 N
/****************************************************************************/
4 U, d9 f  A7 i6 X) p/*                                                                          */, c- O( m0 ^; s& h: p7 v
/*              ARM 中断初始化                                              */* |7 y, @, y$ N) e, _
/*                                                                          */3 D$ }/ D2 n, L
/****************************************************************************/
3 R5 x) e8 y, ovoid InterruptInit(void)( R( l, W) L* ~# h0 s5 B5 u& q' v% d
{! I3 T6 R* h2 a' m6 o
    // 初始化 ARM 中断控制器* f$ e7 C& g! Q, y6 @' ?
    IntAINTCInit();
' C% G7 }& d3 ]% g: G, Q" q' w  n' q* R! D
    // 使能 IRQ(CPSR)5 a2 r9 z! ~' z" ]. {+ C
    IntMasterIRQEnable();
2 o: ?7 G* S0 J" @+ b* V9 g! [" i8 ?% C' A
    // 使能中断(AINTC GER)
8 S7 |+ G& |. c: _    IntGlobalEnable();
* R1 v3 r0 R. l/ D, |7 e! J+ d: B: [
: J- x; p7 w  ^8 H; n3 P1 n8 c    // 使能中断(AINTC HIER)
4 t% b8 @7 \: K! I% |) u    IntIRQEnable();4 u; `# i- P: g- }
}
2 y: a# T6 Q+ {; q
* P& K+ @$ w1 R( v, w/****************************************************************************/- P1 p1 G& {! p% u
/*                                                                          */
% V( J) r# y3 ]* P7 a( `3 J/*              UART 初始化                                                 */) _% F! B0 J& S7 I9 L
/*                                                                          */  u+ R+ V+ J, z  I, z& N
/****************************************************************************/
" l/ X/ N5 d3 v2 J" ?void UARTInit(void), }' O  a/ ?, }
{1 J4 l. Q4 V. g0 `
        // 配置 UART2 参数
0 c" V8 }" d( W( n        // 波特率 115200 数据位 8 停止位 1 无校验位( t6 _( E, c& h( h) y4 q
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,2 q" D3 U/ {9 u+ e- f# _* R
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
9 Z8 ~/ q, p2 `+ N1 e        // 使能 UART22 P6 O. J: E- z! y0 Z6 I) P3 D
        UARTEnable(SOC_UART_2_REGS);0 L) I5 T3 I) J1 H  a; M

0 x3 H; r, g. K. G1 M/ }$ L5 E+ p  j; w    // 使能接收 / 发送 FIFO
8 H  U+ |4 e8 _1 S8 I' Q' h    UARTFIFOEnable(SOC_UART_2_REGS);
8 |  g; T: \% S8 {# O8 u% C) @6 u  G0 I' m2 o
    // 设置 FIFO 级别0 E9 W7 @! C" X0 S( [% U" K
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);0 u  W, b1 N: B& D' h; F# h* E
}
1 O+ E% Y, F/ g1 {+ z# e& P. N
/ p3 n0 {, y& z" l/****************************************************************************/
1 D) ?. Y) z& u# z% f4 h/*                                                                          */( D" v8 @% r* T: w- R+ S
/*              UART 中断初始化                                             */7 i0 _# [% i% e' \& ~
/*                                                                          */
, F$ N% a7 |  u) |8 P- ?4 b+ z/ I/****************************************************************************/
* O7 j8 d1 \0 H5 K% }  M& Lvoid UARTInterruptInit(void)2 ^( V* I' g! s7 ?' \
{
. E5 ?* e$ ~4 G+ t. y        IntRegister(SYS_INT_UARTINT2, UARTIsr);# H: R2 t9 J( i" d( v
        IntChannelSet(SYS_INT_UARTINT2, 2);
6 b- j; L7 Y( u7 q1 f        IntSystemEnable(SYS_INT_UARTINT2);8 ?$ ^- e( N" v8 I! N

1 @7 g# l% f9 w, |- _        // 使能中断) P4 v. }. c! H  r. ^
        unsigned int intFlags = 0;
* Q) P% [1 X, }4 P6 n    intFlags |= (UART_INT_LINE_STAT  |  \
* V$ e1 }  F4 F+ @9 R4 s: \2 l                 UART_INT_TX_EMPTY |    \& `( a  f1 J- X7 }5 j
                 UART_INT_RXDATA_CTI);
  U: `/ o* F7 k4 f8 B' A/ P! d    UARTIntEnable(SOC_UART_2_REGS, intFlags);& D+ d0 ~/ j5 a  _+ l2 N9 J
}
' c% P2 z7 C$ {: A  w: ~7 g* w6 O+ z% Z
/****************************************************************************/
7 T! S, n' p& ^- ~/*                                                                          */
8 R; _1 h% b1 B4 ?/*              UART 中断服务函数                                           */6 o: r5 m* o- H! T8 b
/*                                                                          */+ A8 a1 @/ g0 p4 e
/****************************************************************************/1 o8 c$ u3 ?  s( i  H9 H
void UARTIsr(). z! e& e& m2 Y# n0 r" g, z
{) G# Q+ Z  _3 r
    static unsigned int length = sizeof(txArray);
8 _8 K, p" D- H% N# `7 v% `( y; W' S; I    static unsigned int count = 0;" r2 w& r/ K+ u  n
    unsigned char rxData = 0;
/ m9 K$ Z. E9 e    unsigned int int_id = 0;
7 w& J- F% {8 j( A
& L9 c' Y9 P% r1 [' Y6 o. C, Y/ r! r    // 确定中断源) `. ~9 _2 _5 W) a, L: O5 x
    int_id = UARTIntStatus(SOC_UART_2_REGS);
: c* l# y6 a$ u3 G  n) A5 [
( O+ w/ x, S9 w7 N, n- W1 a5 c$ l    // 清除 UART2 系统中断
+ s+ J0 [% U" \7 k  s- c- Q6 x    IntSystemStatusClear(SYS_INT_UARTINT2);
, k* B" B$ i5 ~0 l  G" H; J8 h
6 _- w) [0 d# s! }- J# t$ E# b    // 发送中断' i% i6 k  ?( `7 O" ^6 B. ~$ t
    if(UART_INTID_TX_EMPTY == int_id)
) K. M- c! @8 e    {+ Y+ M# [1 B/ T& O+ J1 D
        if(0 < length)$ z' O$ S( }4 M3 s, Q2 J; P
        {5 }8 p2 j5 M' u" r! a
            // 写一个字节到 THR* A5 ^/ Z5 v" J5 y
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);( X5 U4 J$ g+ e, F' C1 [
            length--;
, e5 ]; Z+ ]* ?! @3 c, y$ |4 [            count++;& X& p* L+ h$ P( x5 H
        }
, A' l& s; q" t' a        if(0 == length)
; n  G3 W& k) s1 P, ?) O" x        {
& R% B0 n8 V0 v- |9 O# `            // 禁用发送中断
; N0 V) n; A0 A9 K            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);! v5 M/ |7 b/ W
        }
3 M& {# ?% N8 @     }
0 y1 O2 r0 O( B4 [8 p
$ r! X/ K6 G- @9 N$ h/ B    // 接收中断5 X% K! d5 B. i+ z+ p- g2 c
    if(UART_INTID_RX_DATA == int_id)
3 d; `0 N* g2 u  c6 t; z! d" V    {( X9 ?; G- C. h0 L( C# p
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);" I# b0 L: L( B2 Y

0 r2 R, }3 ?) M6 c) o( J9 d2 }# u$ i        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);% ]& G; W( p" n7 M
    }) g$ u* b  d% j& L
) x! E: p3 ?- p: [( ]/ e
    // 接收错误' g0 T/ X7 B& W7 T; A, e$ p
    if(UART_INTID_RX_LINE_STAT == int_id)  m0 k0 a- U$ L% }7 n- |7 R. L
    {6 {8 \7 ^3 C6 |9 n0 Q0 C
        while(UARTRxErrorGet(SOC_UART_2_REGS))
$ R4 o& r- K* l% q' l7 t        {4 f) u' r0 e& i' L7 ?2 h
            // 从 RBR 读一个字节
, ^3 {+ ?, E3 _% @' o  r" R* c            UARTCharGetNonBlocking(SOC_UART_2_REGS);
! o& ^4 g6 t; u8 O        }+ @, y" e% l8 f$ [
    }9 l- X. c% \4 d  _; H
      N2 A8 z: _; G% `! }1 h) i7 Q
    return;+ {9 C. V" V, t5 e& y$ Y
}
+ W$ ?5 @, X0 W; r: b; m1 I; K
回复 支持 反对

使用道具 举报

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/ y) f  g" ^6 R5 E  f
如果其它设备快速给你发送串口数据,你这边能正常通讯?

' G) b" k( z  P! m. L* ?谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-1 08:06 , Processed in 0.041903 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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