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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8630|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
+ y  H; k7 X0 [. K; K3 X

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。6 R- K- p2 Z. K
- W* ]. y* ^0 ?" J, B5 |9 J
#include "TL138.h"                 // 创龙 TL138 开发板相关声明! v: L: {2 Y' g. A$ J# `1 J
. u# b- B  `2 w; p/ N  B- r! V- k/ C
#include "hw_types.h"               // 宏命令* Y' v; k# W7 c) z
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器4 D/ D4 s6 o9 g- T$ L& ^; [
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
0 t* w4 F3 i0 I. m
, G% i7 z1 Z" e" D2 c! w#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
, a4 R9 v! c' U8 _$ `#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
6 V7 j% b) u9 c. {" P#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明* t8 j! K9 X9 a) V8 x
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义) u+ ^$ ^; G' D0 j6 i2 l

9 s! K. G+ Z, g) g' O6 P5 j8 ]/****************************************************************************/
5 u0 @( f8 X/ f: Y! y/*                                                                          */* \, a. {  C, u; {
/*              宏定义                                                      */6 D  }3 l& }5 P" S( i& `" ]( X
/*                                                                          */
# F6 s8 w9 y5 c& j0 ?/****************************************************************************/" @! R. X( ^" [' B- t/ L; K
// 时钟
9 w2 {0 x1 `' A& ^! p. t7 _& f& d7 V#define SYSCLK_1_FREQ     (456000000)
0 S7 W( E  d' M0 d+ W#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)% n: ^4 `4 J4 ^" C9 O
#define UART_2_FREQ       (SYSCLK_2_FREQ)
# O$ c' R, j- N* }5 X& m! ^! A
) `3 r! F* }+ M3 X7 I4 @1 B/****************************************************************************// p1 @! w6 {# {0 h
/*                                                                          */
8 _4 s- s' \9 H* {1 X( H3 S/*              全局变量                                                    */0 w9 O5 b4 W+ @. W% m
/*                                                                          */4 @  |# w5 M6 m3 b: ?$ T
/****************************************************************************/; J9 x) b9 o+ }; p# U, ^5 D) z6 Q, _
char txArray[] = "Tronlong UART2 Application......\n\r";
7 F3 v, z& Q8 S# r: ]; T( ^1 S+ p! H7 p! ?& g: }7 u
/****************************************************************************/
! U' v3 c0 a) B, r" I/*                                                                          */
# o  r; J! O, m7 O5 |7 }: \8 g/*              函数声明                                                    */+ n3 j& H" t- D( `
/*                                                                          */
! v+ z9 N# u& Q  K1 c  H/****************************************************************************/
" W( ^, j1 r4 Q$ r1 _// 外设使能配置5 E1 m4 _5 A+ _7 R5 ]
void PSCInit(void);3 w+ s' q! ]/ q  w- @

+ N8 @2 b: ]! e! d1 W) ^// GPIO 管脚复用配置/ A2 i- X" E% Q: a$ g
void GPIOBankPinMuxSet();  {. {* {/ K+ p1 \6 s

4 D6 O* U. _' F// UART 初始化
- S2 F! u9 I" R5 y2 n! nvoid UARTInit(void);# u# Q& z0 T. y0 P* V* }) y0 M" ^
// ARM 中断初始化% D, l% t1 y& V! W$ L5 Z+ c
void InterruptInit(void);& M( Q( y: D7 F# u: A9 L; m" L5 _
// UART 中断初始化$ r! i" J5 [' ^  ~- j
void UARTInterruptInit();* g5 X0 K2 \$ {, @1 e
// UART 中断服务函数7 V: [% [9 X$ _, W4 O; c
void UARTIsr(void);0 c: i; e5 r2 \7 P" [% K

6 x) M. S( d3 T. r/****************************************************************************/
0 f8 y$ n5 I2 G4 M2 o. V( A/*                                                                          */
1 h! b5 V' P9 w, J- Y9 a5 C7 C/*              主函数                                                      */
1 o; b/ H$ N: k% d/*                                                                          */0 H' m  S" w0 y7 ], @
/****************************************************************************/& |! h& H# J8 _  E6 \! v
int main(void)' Q$ M% t) P! {+ D, f9 c/ i# l
{; X% U% T, h6 w, ?7 b2 \
        // 外设使能配置
1 Z5 E: l. K3 m* C$ Y& i; {        PSCInit();
( P$ s$ j$ A8 Z       
  n  h* q) e# C8 C        // GPIO 管脚复用配置
. n: ]9 }. N8 R5 {4 r        GPIOBankPinMuxSet();/ |! s8 G' @! }% S
3 `% A- [* L5 z2 W3 f( d" @' v$ f
        // ARM 中断初始化
) ~+ B4 x# Y+ x' w7 b7 u        InterruptInit();* |% @  O1 J. u4 v7 p
0 l: t6 o: S, _) S6 n+ j7 l( C
        // UART 初始化+ c+ Z. P# D  ?# h( v7 y
        UARTInit();6 j" D( n- t* B. @% }" `, m

! T; T2 u0 o  K8 Z        // UART 中断初始化
4 ?3 z. I2 P- h( z0 U0 y/ A! E        UARTInterruptInit();* K+ J9 H- m3 F- m, ^: x
7 Q* P; t- q; {- G3 `  I# s! |8 D
        // 主循环( s6 N1 Z4 d  B
        for(;;)
% @& s; s% {* C; o        {
' E& l! i+ ]+ p. a  i0 d5 {6 J: y4 Z
        }
, ^3 y) s' V1 ?}
" |, f4 ]6 W# A6 A- N1 g' H2 B% F
! \& K' M" L& j" H/****************************************************************************/
7 k) v& L! g, y: U, S2 ^( S$ N/*                                                                          */
3 R. v6 ?" N* G/ B2 o6 R/ z/*              PSC 初始化                                                  */
" B9 i, Q. y6 _( D! q$ e0 m7 [' f/*                                                                          */- ^6 q1 d! V' P( m3 ~% _
/****************************************************************************/
& y. p) S9 @, J# y' U6 z" `) B5 U  Hvoid PSCInit(void)
; S; Y! S# s& c' Z. L& [  c  M{
4 k  N: ?$ o/ ?  N# q$ q2 g0 |+ ?        // 对相应外设模块的使能也可以在 BootLoader 中完成
; m) x1 Z) ^" I" l+ h    // 使能 UART2 模块' Z/ }" o' |& i: [) C
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);. i9 w- d+ v  c! f! `+ i
}! x: C! j7 E: f1 J- I; Z& d, i
8 Z2 e+ f0 r. A# V* R6 \+ a7 Z
/****************************************************************************/
( l" _  ]$ C' C8 q, l9 c% A/*                                                                          */
# r# I0 H9 x& t/*              GPIO 管脚复用配置                                           */
1 V# m9 t; Y! L0 t& x/*                                                                          */
( y7 P# B- X5 _2 K( u  z( O( Q/****************************************************************************/. @' F' f. U* ?
void GPIOBankPinMuxSet(void)
  M/ y% i( p' Y% I0 s3 A2 G2 l{
1 i) E& X; E) b        // UART2 禁用流控
9 f) M) X' D# Q' L        UARTPinMuxSetup(2, FALSE);
$ T' V$ z! \; p7 {}
) x8 X8 |* _% u5 L6 R
5 k4 x5 f, E  h  c/****************************************************************************/
9 G& c, P- ?" d0 m+ O/*                                                                          */" e" w. A! I+ _' k* w
/*              ARM 中断初始化                                              */. g+ c3 \3 @3 U* [7 E" O9 N
/*                                                                          */% C0 m# s/ B3 Q2 ^: S% B- X
/****************************************************************************/
& P" S* {0 m: V7 p0 ?- N4 Hvoid InterruptInit(void)
# U) K# ~* `$ t) S- V  U5 J{
6 x; I9 [. ^1 {1 J7 f3 O    // 初始化 ARM 中断控制器4 r/ P% k3 r$ ^# f, q( E+ N# s
    IntAINTCInit();
) g& G5 o. W  i) S: F5 s  O3 o! t8 Z3 L: D3 M  x% Z
    // 使能 IRQ(CPSR)
+ d2 ]# R! e6 {* K    IntMasterIRQEnable();
. H# i6 o6 T4 E1 M' h2 u
4 H: R: ]+ e$ I4 i" D9 X    // 使能中断(AINTC GER)
: `# o7 s' I+ E& y) o: H9 p    IntGlobalEnable();
$ A. m  E1 `% G7 F1 _
# a; c! v# i" C0 U1 d    // 使能中断(AINTC HIER)4 s# [) C. r0 t
    IntIRQEnable();# `8 V0 y: F1 @9 N+ K' \: J% O( F
}8 e7 P6 H  `8 T+ E" S

6 O0 r! Q( S' r/****************************************************************************/, n6 b/ ~9 c7 [) {$ ?8 C+ }
/*                                                                          */
  K, {* V4 L) [) [1 \/*              UART 初始化                                                 */
' x9 W1 V! }8 y/ D/*                                                                          */
5 ?& V" x$ {# K4 {( E9 R/****************************************************************************/* D. t. H+ j2 u+ k
void UARTInit(void)
& T+ q% B# b/ e{
5 S' r" ^+ ^! i7 {  l        // 配置 UART2 参数
+ p* X8 m7 \. e( b" V7 L        // 波特率 115200 数据位 8 停止位 1 无校验位6 k/ U; T5 b, ~& |9 H8 S
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
- [  K& Z5 Q% A                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);0 |  b. |7 y. f' q3 _: O3 s
        // 使能 UART25 c/ z/ C0 W! r
        UARTEnable(SOC_UART_2_REGS);0 i& J! ^# F; y0 P. [' D
* b) s2 k9 J7 f1 Z" Q2 m
    // 使能接收 / 发送 FIFO
: V3 p% r2 g) O3 }1 i8 [  |+ u    UARTFIFOEnable(SOC_UART_2_REGS);  }1 G% N. U8 `/ b( Q
  n, v0 Z5 B3 f5 m2 y3 I
    // 设置 FIFO 级别) ^8 D; ~; w* A# @* k
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
1 q4 X3 G% s% H/ u6 F}, r# e% W5 P( u( g

2 N: @" \) Y1 B: f9 q/****************************************************************************/% C$ u9 ^& X6 G5 E: P" d, W
/*                                                                          */+ S4 B+ G) v* W; y
/*              UART 中断初始化                                             */3 c2 q, h% c! Y: P5 ]- ~4 W
/*                                                                          */- g8 @* W# d0 G0 T1 I+ Z
/****************************************************************************/
* u  q1 V6 n  H' vvoid UARTInterruptInit(void)
9 d. j) D. ^! V( C7 g& d) o1 k8 ?{
2 j% x3 o4 I5 R* X" I$ K4 v        IntRegister(SYS_INT_UARTINT2, UARTIsr);
" u# Z5 z6 q4 u; k- d$ {' c        IntChannelSet(SYS_INT_UARTINT2, 2);
8 W1 L# I0 f) E# ^( Z6 Z        IntSystemEnable(SYS_INT_UARTINT2);) w6 t+ |. [) P. U  a

3 ~8 R' X; k% v9 I1 H. @7 i        // 使能中断
% I& L2 {/ J! b& l9 p        unsigned int intFlags = 0;9 `. P8 ~/ o. u" d7 j
    intFlags |= (UART_INT_LINE_STAT  |  \% ?+ c+ X4 T9 ?5 N9 Y- v% v' J
                 UART_INT_TX_EMPTY |    \
/ a& G) L6 k, @0 y                 UART_INT_RXDATA_CTI);  _7 B) R# P1 J( G# l: O1 ]
    UARTIntEnable(SOC_UART_2_REGS, intFlags);. @# `  N! r+ r+ K4 O' V
}, {8 F" S# R7 e* L, m

# ~  N. S) S: a4 Z. D" [. V/****************************************************************************/
& Y3 M: @) S4 p% J4 f. Z/ e/*                                                                          */: g  {/ U: {, q6 r, C
/*              UART 中断服务函数                                           */
6 |8 g/ ~2 X  o& W8 ^$ b/*                                                                          */. z4 [1 t. `3 S1 [8 L- Z
/****************************************************************************/% p: N7 d6 r# U
void UARTIsr()
/ d2 K* f2 o1 @' x7 s5 L7 i3 M{
9 H7 B; Z* k. @4 y, @    static unsigned int length = sizeof(txArray);
. J% Y) V9 M# Y: s2 \. P    static unsigned int count = 0;. L/ K3 h: B% [6 E3 Z; A. b- K7 t
    unsigned char rxData = 0;
/ @- X7 |! q3 k$ |) H1 K; W    unsigned int int_id = 0;% E, q8 H; k% I5 ^4 G2 k

+ M! Y8 b$ t" q, f  f* m* h+ H$ E    // 确定中断源! y. T7 E! u  f+ g- R
    int_id = UARTIntStatus(SOC_UART_2_REGS);
, L4 [+ A) t3 F% a  r0 \, g8 w, p6 j9 A0 R) L4 a, v+ Y. M, J
    // 清除 UART2 系统中断( [7 O/ B0 d& U
    IntSystemStatusClear(SYS_INT_UARTINT2);
3 {: d9 B! q: k" A* [
2 r: j' y8 ^; q* n* N    // 发送中断
# C* H: w6 h2 x% l# F% c6 K" W    if(UART_INTID_TX_EMPTY == int_id)6 X. b: }2 w9 x0 g
    {
8 f3 @, a) `+ N0 s: ^" n        if(0 < length)
0 g0 X3 z' a/ N% u" I- ^        {
7 t* N8 ]) m, w            // 写一个字节到 THR' _1 W' S3 I6 p  \7 |) x8 A) ]
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);  X4 {1 c; l# I) M; |
            length--;# [; C* Y7 t/ \1 g* }  O
            count++;/ j* z4 J/ k7 k# ~7 D2 o
        }( ^+ Q: n# ~0 [, i& u
        if(0 == length)
( R7 l' e, T8 v" W, L6 e        {
, |* P8 Y/ z& D; x9 i            // 禁用发送中断1 D. P: K. j' b4 y: O
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);) m) N( \( F0 u& C2 P: B6 l
        }+ w7 k1 t0 S" \" T
     }  C) T. |% I3 ]) M2 Y- x; E

8 m' c5 r% y- W: z6 |1 y; V    // 接收中断) O8 B. p, v9 ]3 I1 \& S
    if(UART_INTID_RX_DATA == int_id). f/ s2 q9 C% s- F. j$ ~+ Z2 F
    {0 l; H6 \4 e5 \  e" [  \
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);  y; n) J! l2 u$ d( U* M$ f; r& O
8 h/ t7 [# N) H) ~
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
$ E* [& V( ?2 @4 W    }+ `' _; P9 p9 z: @* f) }. }! u
! b" }! A8 ?1 M3 k7 |& b
    // 接收错误
7 q: ]) y) n- p  X/ w# F8 y( a+ `    if(UART_INTID_RX_LINE_STAT == int_id)
3 c4 [: S' r- k" C    {( _& }1 Z3 X/ x4 o4 M! p; }
        while(UARTRxErrorGet(SOC_UART_2_REGS))( I5 v  Q" O! Q
        {
+ K! ~5 a* e9 i+ K3 L2 r3 E! K            // 从 RBR 读一个字节0 W: k8 U% u' \5 \
            UARTCharGetNonBlocking(SOC_UART_2_REGS);9 D0 `' G8 @3 V) E
        }
% x: |2 A) o$ H; a3 x    }& i. Z- |" A( R) R, I3 Z
    2 {0 q: Q- s. O& P
    return;" U7 [- C# p# l/ A$ N8 [! _
}
. A; N; R2 X0 ]' B! K+ N4 N0 y
回复 支持 反对

使用道具 举报

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
7 S, J! V0 a) L- r如果其它设备快速给你发送串口数据,你这边能正常通讯?
7 \, B; ^# ]' L2 q' e1 s( X
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-17 02:33 , Processed in 0.042586 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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