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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8655|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。' }  D) }3 c+ v( C5 r8 X5 A2 D  `+ E

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
# s2 M% e" }) v' g6 _3 s, Y! @, t6 X0 `
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
" v$ D$ v$ d* ~5 z
' b( ~; l6 i4 p% \: |#include "hw_types.h"               // 宏命令# b$ K8 x6 Z  h. B9 ~5 }0 n& B
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
4 b/ W' a% I) A' x# ?#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
6 W" l6 K4 d6 O  ~3 P  b
  O: d( q0 B" Z* D0 c#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
2 y9 T) }0 Z( y#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
* f7 v7 P% W" v, S1 p/ U: h/ A& f#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
6 }5 J9 j" |- d" U3 B. `#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
1 T$ j( \( \, B( V# l
3 W' m* o* I) `# |* U" Q. r5 ?, r/****************************************************************************/- _4 \. B4 x3 a  I% G# ?6 }' Y1 b
/*                                                                          */
7 r5 J$ L0 q9 |9 c& I: E& v  I/*              宏定义                                                      */' \& _) X6 t$ r2 [$ R
/*                                                                          */
& S+ n3 C5 H! E/****************************************************************************/3 B" L) E+ D2 R; o* E
// 时钟
6 |6 y* T* ~5 m2 J- F* ?! P#define SYSCLK_1_FREQ     (456000000)
; |& }. s  M# m- H! r#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)# [+ ?$ m. [$ S. X4 y. _8 t. N* e
#define UART_2_FREQ       (SYSCLK_2_FREQ)
# z) }) z  {7 H( R: p- D9 T) X8 m, a
& _) U/ b. w; Z1 G% U/****************************************************************************/" W4 e! s5 [+ A% Q! u$ X3 g$ O
/*                                                                          */
1 Z( e. \7 y- Z+ \" m8 e' ^3 `/*              全局变量                                                    */! n; o5 u0 P2 c: b7 B
/*                                                                          */6 C: N; M- M" v1 A2 q% E
/****************************************************************************/$ X+ u! O* v5 A( i) @$ r# D3 o; N
char txArray[] = "Tronlong UART2 Application......\n\r";4 p7 [  q, g' f0 `
( \0 G; b8 l6 |) v' ?: T+ D8 G5 \) R
/****************************************************************************/* l3 @$ ^, ~0 k# c# v6 w
/*                                                                          */3 Q8 @2 L  E+ U5 s
/*              函数声明                                                    */" j+ f! _5 \' J
/*                                                                          */1 B+ h/ c5 G. {4 W  O
/****************************************************************************/
! C) U# F; U( y. J# R- Z" r// 外设使能配置. I3 t: E, {) f" h* ~; A9 ]
void PSCInit(void);3 _; u8 w* N" O: a: W
0 v8 o8 D" Z# p% b1 k6 V4 r! c3 a
// GPIO 管脚复用配置
+ X  Y7 Q% t: `4 c) |void GPIOBankPinMuxSet();
6 Q5 E) M8 Z/ `1 Z9 A
  @: P7 Z! Q( m. ~// UART 初始化2 m7 J  b8 X+ G9 Q; Q9 g
void UARTInit(void);
5 J) D! ?2 V0 N4 p: f$ L# y0 h// ARM 中断初始化0 C: k# g7 m1 @0 K; f4 n8 r0 C8 L
void InterruptInit(void);
( m: i1 Y- {; F# |// UART 中断初始化
4 o" b- n0 ]- \1 \+ @) yvoid UARTInterruptInit();
' G) b& d' k+ K$ s5 n5 J' |% i5 o7 a2 G// UART 中断服务函数# ~, v; f( c" {
void UARTIsr(void);
& s1 S- E/ f8 ~7 b5 s$ D/ X0 T3 u& z! G. |3 V+ l
/****************************************************************************/
# t6 K1 n: c% c# m, ]- S/*                                                                          */
9 N8 N8 D, W: v' I3 V/*              主函数                                                      */& o" Z. l7 D! [  k! K
/*                                                                          */; v# d* g0 }0 H/ I
/****************************************************************************/# r, I" o" T, a$ K5 Z: G
int main(void)' {9 ~4 `4 t  s! w1 t3 D
{' i9 i: L3 I. R
        // 外设使能配置
* |" ^( L" P  P+ T        PSCInit();
# }; R5 C; ]5 `6 f# O5 j        6 v$ S2 ~. h( e8 X
        // GPIO 管脚复用配置3 K# U6 k' c2 Q# ?1 k
        GPIOBankPinMuxSet();
. l, _* }' j: p% {: V( S
' F+ ]4 ?0 }$ k( k8 {- j        // ARM 中断初始化. M1 E5 t7 T3 Q0 q
        InterruptInit();  _0 u) Z8 v+ s
* s" ^' a8 n7 S+ W6 z
        // UART 初始化" g" Q3 I" R4 q5 u
        UARTInit();* o3 _! h. h9 R& m7 B$ M3 ~

4 F: P5 F' j6 Q7 J9 w; [" G" S( X        // UART 中断初始化
3 Q2 x2 m4 g  V+ D( L        UARTInterruptInit();
7 D- g! J: _4 o; w, G. i7 r
. `1 F( v( E1 A, d1 j        // 主循环, h  k0 }5 H1 E1 k) O: R
        for(;;)
) g3 {; d1 m2 u4 [* ~2 n8 {        {
) d. \, f6 _7 n8 ?! g7 d' Z$ Y; e5 \" ~6 x
        }- ?) [$ D( B! l( h
}
0 C6 T5 ]/ q" r- Z  @6 j4 H: H: c' ^+ g) E/ E0 ^) s. t
/****************************************************************************/0 S/ C+ m0 r- o- W; z1 f
/*                                                                          */! W+ ^5 O5 l& ~6 X5 a1 n, w
/*              PSC 初始化                                                  */4 k6 x3 ~- z# U  @# I" B
/*                                                                          */+ O6 a- P, \. T! e2 k
/****************************************************************************/
+ a& V1 P. d- A6 l7 Cvoid PSCInit(void)' n& V+ M$ u9 z9 O4 Z
{
5 L5 |: {$ l) _! R% \        // 对相应外设模块的使能也可以在 BootLoader 中完成
. q, X3 b* A1 K5 V, v    // 使能 UART2 模块
- Z6 y5 H0 t$ B6 H: Y- V! A    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);, m1 ~& q) E! L' V0 W8 x( t& I
}0 ?( I$ A0 I4 a& G5 O- |- N7 I
7 k* Y  R4 J- @, b
/****************************************************************************/9 S9 v* J0 o# m" a
/*                                                                          */, u0 M  m; h0 R- o5 C8 T$ X
/*              GPIO 管脚复用配置                                           *// t4 H5 U& k4 ^8 y$ n3 G; W5 V
/*                                                                          */7 c  \# i8 w' N$ E( {
/****************************************************************************/
; U& p* F. l6 N& P- y3 T8 P# y+ Lvoid GPIOBankPinMuxSet(void)
9 Z, I9 o/ d! @6 `- L2 r( V{
. l/ c( p* s6 K. w5 M1 w        // UART2 禁用流控
" |( Q5 l. m0 t' C9 ~        UARTPinMuxSetup(2, FALSE);1 T; G2 j, \& e* ^: |
}
) w, x# h2 Z  R1 z5 o. L4 ~1 f; W9 C0 N8 E$ P
/****************************************************************************/
! D% d( Y: H* a) j7 U/*                                                                          */- r4 Q- Y9 p4 w: _+ W$ W1 s
/*              ARM 中断初始化                                              */+ j% ~+ z; {5 z( c0 ]) E9 ^! Z
/*                                                                          */9 P) l% J8 C. |5 A
/****************************************************************************/+ a4 W' C. z; O* O
void InterruptInit(void)
- t" f9 {2 O5 @{
4 e& b7 B* p  `6 [    // 初始化 ARM 中断控制器
% E, d% s7 c. \6 H    IntAINTCInit();
. `+ U1 m1 C% ]& p! H
( _; U* M: v, F0 g. o# j) G2 d    // 使能 IRQ(CPSR)
  E! w* Y* ~+ P  ~4 d4 Q    IntMasterIRQEnable();& F) F$ E4 f( H% Y( W' w

: ^1 |0 D9 q9 ^) C6 J6 ?    // 使能中断(AINTC GER)! K; N: \6 `4 V' d3 q) U  o6 u
    IntGlobalEnable();
: T6 O5 S0 R, }1 c) @: Z! v% ]: ]6 F  n+ ]4 J' v- T
    // 使能中断(AINTC HIER)
; ^5 S: P; C$ ~5 Z$ |; Q) |/ B3 F1 E- a    IntIRQEnable();
/ |! ?$ P" H! f) T0 D}
: \5 i) d3 Y4 F% a7 |
  I) Z/ ^* i7 I" x) f/****************************************************************************/
% L- ]; O5 k: W& F/*                                                                          */
, b6 {2 i: U0 v7 _+ o/*              UART 初始化                                                 */- p! [; M# s. Z: X, f# y
/*                                                                          */
' T9 s/ a7 T" i) i# p' J4 V2 O/****************************************************************************/) u5 ^$ W6 K9 t9 ^, e. U
void UARTInit(void)" I0 J. u  P0 a
{
! m, I; \/ K! ]$ c7 ]$ }! y        // 配置 UART2 参数6 P( N) o5 l4 U& ^" e/ N
        // 波特率 115200 数据位 8 停止位 1 无校验位$ g/ j" Q& y8 B) v2 A2 Y1 l$ \
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
: R! D0 [" y2 h) i4 ^9 K! C9 X                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);$ m6 Z! B" f2 y9 p, a# R
        // 使能 UART2
. \' r: q$ I, D- a        UARTEnable(SOC_UART_2_REGS);! ^2 W/ w  d; g$ j4 M1 C3 `

, L1 ^0 I3 K- v, I2 Z2 G    // 使能接收 / 发送 FIFO
' b# ?- ~: b, U- D- j' n    UARTFIFOEnable(SOC_UART_2_REGS);
2 @7 F1 Q: Q7 R" D9 i. z, n" o) q! \7 n4 P- ]: Y
    // 设置 FIFO 级别
) U6 `3 o2 p$ D- j1 V    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
. l9 q; m% j6 z1 c$ p- j}, C$ w7 {8 ^* s, H. |3 m. F

: p; N% i$ Y7 y/ l5 j/****************************************************************************/  y. |) l3 O" ^9 X% ~
/*                                                                          */
. R$ K0 u9 a1 [/*              UART 中断初始化                                             */% n8 C1 P* S+ q3 a
/*                                                                          */
5 t6 J4 ^7 M" S3 c# R/****************************************************************************/
$ w/ N  r' h1 uvoid UARTInterruptInit(void)
+ \" M* s$ U2 [. g. e{
- F0 h0 Z# `/ Y4 Z  j9 k3 h        IntRegister(SYS_INT_UARTINT2, UARTIsr);
+ ~0 |7 V  ]% {        IntChannelSet(SYS_INT_UARTINT2, 2);
; q; E" T; l; p9 i1 q. ]# h% X6 U        IntSystemEnable(SYS_INT_UARTINT2);
, Z9 @* x% d, y
8 B# {5 Q0 Y% H. v        // 使能中断
7 N2 x% j  ~$ g8 A+ p        unsigned int intFlags = 0;
$ _. r/ N- q3 Q2 j    intFlags |= (UART_INT_LINE_STAT  |  \- W3 E3 G/ d" R6 O
                 UART_INT_TX_EMPTY |    \1 i6 c, h) v- e
                 UART_INT_RXDATA_CTI);$ O. z/ @0 \+ x: b; G, N9 ^
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
  |$ c" x6 A, N8 m6 U}
) x5 q( h! C" n3 E5 A7 u% a: M& B  u( J# i9 B! Z* g0 R* m
/****************************************************************************/
5 ]. ~% `$ @$ E/*                                                                          */5 l: x/ X6 U3 U; Y& D; b  i
/*              UART 中断服务函数                                           */9 s+ b) h* f( N& |7 S- b& Y
/*                                                                          */
. C, u8 f& J: D/ D* L4 i/****************************************************************************/
4 a! O! E% v" a& Z* a# g( [* W. jvoid UARTIsr()# p. n6 I/ o) x9 r
{
: h$ V* _8 N6 V7 S. d5 F$ P/ u    static unsigned int length = sizeof(txArray);
! y6 d# R1 d/ f( h/ x4 A    static unsigned int count = 0;
' j7 s2 G! _- R% i2 v9 Y    unsigned char rxData = 0;
( B+ _8 ^  v* |5 N" K    unsigned int int_id = 0;" v7 }- H0 M- m8 [0 Z7 b7 m

4 ^; f+ o: o$ v% w7 w8 R8 m; u    // 确定中断源* @2 B4 ~1 W9 B$ ?" x1 h" p
    int_id = UARTIntStatus(SOC_UART_2_REGS);
6 b/ {- {) c- o; F( r, t5 Y0 h& F( a1 L( y. \+ `, u
    // 清除 UART2 系统中断
( M, q+ ?9 e2 S/ f5 Q8 V    IntSystemStatusClear(SYS_INT_UARTINT2);: r+ G4 \. E+ G: v5 C& Q* a
+ X& ~5 T3 J% ~! L  ^0 w- \" x
    // 发送中断
, c0 P; L7 y. P. t  |& j9 }    if(UART_INTID_TX_EMPTY == int_id)
4 E+ K7 U* D1 c    {
% I& s  I" g; n) z6 Q$ `        if(0 < length)+ M5 }* a$ C) t- w# C
        {
$ Y% p' M# b! X4 t            // 写一个字节到 THR
+ t; N% \4 k, K; Y6 M" [            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
+ B8 ?( v  H3 H! D" b% j# S            length--;
% u* G, m. d& Q  G! ^* T% D; e            count++;, d% s; M% Y/ B# Q& A; |
        }4 F( A) ^% K8 a7 s
        if(0 == length)
& H2 e$ G6 z  @3 w0 W. x6 `+ ?        {
) j4 `' Y( g& O. T1 f1 B1 ~5 `; q$ J            // 禁用发送中断
9 a) Y* v. P% {2 I            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);4 @& Y' R# a  q6 P
        }
4 X; n3 B- j( B5 Z     }. x7 O  X6 t' j0 X/ C
% `& w' E. u/ H4 {( z2 ~
    // 接收中断
8 e6 i" Z" ~7 R7 u1 c9 V8 f    if(UART_INTID_RX_DATA == int_id)
' \8 ^6 V9 f- k  M& K; I1 C    {
9 u* g0 e  `( x        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
' f8 X0 ?" v+ r/ ?$ {% y8 E' N8 T
4 n; n" F2 S, Z8 J4 z; b; o        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);7 d0 Y5 h4 R; f0 s
    }: J2 J1 i: X- s

% x% K* D  j% _* |    // 接收错误
: r& T2 V/ j; J' V7 f    if(UART_INTID_RX_LINE_STAT == int_id)
/ B( X! K% P: d  H    {
7 i# E, \0 i; k& ?( O( T' |        while(UARTRxErrorGet(SOC_UART_2_REGS))! j8 S7 h% q3 z: v' u
        {7 w" w6 D. \6 A  \' V- P! U+ T
            // 从 RBR 读一个字节
, M( a; e! s5 P/ R            UARTCharGetNonBlocking(SOC_UART_2_REGS);
9 e: @$ F* M. Q$ B5 R        }
; O9 A) d9 y- _! o% [2 D" s! `* R    }
+ l# f9 y: ]9 I+ }    ' k8 R# {  `- z0 e$ n$ H7 E
    return;
2 t) A7 H8 g/ M# S5 m}! c6 ]8 Z) ~/ }4 f: \2 w
回复 支持 反对

使用道具 举报

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
) H1 |. s* K& p  E7 m如果其它设备快速给你发送串口数据,你这边能正常通讯?
. l* y7 ^$ @/ d5 C( P9 f4 S0 L
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-23 20:25 , Processed in 0.045287 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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