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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8370|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。! R- {6 z( E3 n; k6 ?! T- J! Z

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

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

; n  `4 V7 |5 J6 m. [#include "TL138.h"                 // 创龙 TL138 开发板相关声明
5 `' f- [+ d0 C; D) R
- H' M! m0 C5 K#include "hw_types.h"               // 宏命令
% p! Y! K6 X8 |#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器7 b4 u1 ?0 ?% O
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
" Y! t. @% q* V1 z. S1 X
: p' x6 O9 N- Q4 h7 {. L#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明) x' ^6 [5 `; N+ u; Y% ]- S- X* n
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明& m7 E' ]9 F7 {7 R" c5 ^
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
/ s" [$ ~5 K4 {#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
" X. S* V0 Y: t% S8 F2 f. Z9 Q( i" `& ]
/****************************************************************************/
0 S0 z# T. N% Q3 a# n/*                                                                          */8 [. w% @8 s6 V( _
/*              宏定义                                                      */
7 O* b1 m, M  c! L/*                                                                          */
. y1 h+ O! O. y1 S4 \/****************************************************************************/) H6 [# F/ C, p# j: F: o
// 时钟4 E5 I. O% Z; y
#define SYSCLK_1_FREQ     (456000000). {0 \, |! B5 K& N" ?
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)7 W7 n" k7 v7 P% Z, Z6 ~2 x2 ^
#define UART_2_FREQ       (SYSCLK_2_FREQ)% S9 v) a! M$ b9 d. Q: [
7 j/ }/ C3 J% }2 ?( u2 D0 [3 G* @% `
/****************************************************************************/
( |3 n6 d# F5 U# T- \1 R- @$ s4 M/*                                                                          */
' s! a4 i% G: |+ _8 m( `% e/*              全局变量                                                    */
( n1 E' g- B6 j7 b! R/*                                                                          */
5 o2 S; I8 o0 m- I  v9 O/****************************************************************************/) k/ X) `! a' ]% M
char txArray[] = "Tronlong UART2 Application......\n\r";
) ~$ J- A: G+ s" c- S% Q
5 f; j! E! ?$ N3 h5 r$ ?/****************************************************************************/+ X/ N) V% }" U% h
/*                                                                          */7 Z+ ^' m2 Y3 P* p. z9 \
/*              函数声明                                                    */6 C' M7 ?* X& X3 c! N4 U, ]; Z5 k
/*                                                                          */' h% N* v1 i. B! H3 e2 g4 n
/****************************************************************************/
! @0 F  ]) a! i5 ^// 外设使能配置! v: N5 W) U+ y7 U0 [7 F1 M* l
void PSCInit(void);9 W  |' M! d+ T
2 h1 n8 g' d" w7 b, x
// GPIO 管脚复用配置
8 S3 y% U9 [, G$ O5 I7 w+ ?6 u$ zvoid GPIOBankPinMuxSet();
) S  H" V' ^! z! g& r
5 ~$ e! m: Y1 x% }$ l/ C- |$ J, X// UART 初始化! o" X1 O; F7 _9 r0 q7 l3 v9 I
void UARTInit(void);  ~( W: M: F3 U1 W; F# W- Y  i9 [
// ARM 中断初始化: w0 W* j$ m1 F" x4 U0 M/ g4 S
void InterruptInit(void);
$ ^$ v, z8 o8 a// UART 中断初始化; O+ i% j  Z  ~
void UARTInterruptInit();
& {2 m- x# V: m. r0 x! N) U// UART 中断服务函数
# L$ ?: d! a( T  u2 _2 S/ |void UARTIsr(void);
! z, M( q' U0 e, Y4 x2 i% E
5 c6 _& j, Y4 z  O7 I8 d% w& A/****************************************************************************/+ }" G: j7 I' b4 Y# \
/*                                                                          */
, k' ?4 T, |3 O7 V" b1 ?/*              主函数                                                      */
" i* `* v  D/ W7 ?& o+ |; K* E/*                                                                          */% ?8 Y% j  h9 b) a, a& m% w1 y
/****************************************************************************/" s, d; Z8 H- k3 n& i2 O
int main(void)
* l; Q* r1 n, H; q5 l{
0 u# ]2 z5 \: U0 V9 \+ ?        // 外设使能配置
* ~$ ~6 E7 G! G5 W# L- e- v3 k        PSCInit();( `% c  O# `2 T
       
/ B) j/ [6 k$ _' E4 `5 X* ^        // GPIO 管脚复用配置
% i. L4 X- C* E  v% j: ~: H9 v        GPIOBankPinMuxSet();5 @. i1 v& Q; `6 f

1 a4 q: Q: q% i3 m        // ARM 中断初始化0 g' c$ w& i0 u% }
        InterruptInit();
0 z( J8 ?, I; E# B
  E4 v. D+ T, |, S) o        // UART 初始化
. [' f8 t% d' [: Q' W" n        UARTInit();
# `: o6 G6 x/ L6 a4 j
  _7 |7 C3 n) @$ t0 [        // UART 中断初始化
0 J5 B2 y6 U, S5 @        UARTInterruptInit();
9 r1 |# A. ?8 P' p2 P
. U$ ^2 K& Z3 \( S        // 主循环) G0 ]! o4 M2 k* {, l" a
        for(;;)6 f6 r+ Y$ h5 k/ ]" R' ~" |
        {
* e* R& \% {$ S0 C2 d+ B/ l* x- C7 N5 r- @1 P5 k8 b/ |
        }) Q- D* V0 W$ |% q/ a
}% z4 p+ C: ]4 E! y. ~( R! X

& i3 x# a5 I! m8 K, K; `5 t3 t- e/****************************************************************************/
9 }" H9 c& p5 r) W6 J# X/*                                                                          */
4 e3 ~' r% [/ y, p7 O/*              PSC 初始化                                                  */
7 M' F9 B5 A: T' e$ J$ |0 M/*                                                                          */$ M* {1 F3 M; r7 D; q- q0 N! ?
/****************************************************************************/
$ ~' R0 ^' `% p7 @. L. dvoid PSCInit(void)% K, e  x# p7 a$ L- x; A$ Q
{! c8 y. I+ u3 p9 ~3 j: F
        // 对相应外设模块的使能也可以在 BootLoader 中完成
* A# b1 p$ {  J9 H    // 使能 UART2 模块
0 `" [' v& d2 \: z! m7 m$ [    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
+ i- d8 c4 }8 b}6 d. n3 o8 h' W/ j) F+ X; n+ }

9 S- K  S7 F- t0 F! m/****************************************************************************/
8 A+ U2 b; K- }+ N4 l2 X/*                                                                          */
) k" B$ j( l; p/*              GPIO 管脚复用配置                                           */
% K7 V7 H/ C; k/ a, `3 w/*                                                                          */, D- ^/ c  p! n4 O7 R6 l9 f: s
/****************************************************************************/% r$ \* G( ?: D: P/ a
void GPIOBankPinMuxSet(void)' l: Y" e6 N) T( z6 \6 K) E, w; x
{9 [7 f0 d$ W1 Z/ T; L( z2 W0 y0 C
        // UART2 禁用流控
: x  ~' P& w! _! }7 U, y/ M        UARTPinMuxSetup(2, FALSE);: O: `5 V  }) P% {2 r: N4 _" s
}, p. ~: }& O' p+ M; a' O' W
$ I: A- D  E2 x0 W. r# T# u
/****************************************************************************/
: l% P$ ~3 ~+ [2 Z/*                                                                          */
4 X2 j, g8 q9 w  n/*              ARM 中断初始化                                              */
* H% U- @! f. H/*                                                                          */  b2 Y3 I5 \! j% C: O
/****************************************************************************/- a5 c, ?$ g( U5 p; W! O2 o9 u
void InterruptInit(void)0 Q. L% C7 s/ A5 x( I( _' ?$ H
{
7 Q( u, f5 U( r- [  a; A; H    // 初始化 ARM 中断控制器2 i2 z0 o- v# K% A
    IntAINTCInit();: t% U; N9 L- z8 j
  N4 o" o: K& W( |# t) R
    // 使能 IRQ(CPSR)7 }. U9 y/ z) @1 ~' ~' S7 a
    IntMasterIRQEnable();
4 U2 n& f" x+ I; E) K4 k. F5 M* a4 G( B
    // 使能中断(AINTC GER)$ O9 F, i* _* K: d' b- _
    IntGlobalEnable();
# z5 I2 l9 X7 U8 [3 l7 i
. m1 R' m0 s$ D4 F0 N- X8 B    // 使能中断(AINTC HIER)
! W* @) j$ `4 o) b    IntIRQEnable();
4 @- @! A% R5 E; N5 o# P}
7 X, `# @, u5 f6 b; X
& i! r* Z8 {  r& K* \- e! }4 T- K6 }9 [/****************************************************************************/
$ I. [$ E+ _9 P( a1 y7 `6 s/*                                                                          */
$ M7 [0 x& t9 b" F/*              UART 初始化                                                 */1 T4 s9 L% W& i; }' Q, C$ U
/*                                                                          */7 a  F  R$ K$ ^' m) J# Y! y1 z
/****************************************************************************/4 z* G) Q, o% \0 b2 V3 V- W% L
void UARTInit(void)
4 p5 p$ b+ p% N0 \) A: L$ \- p{% `# i/ y; D1 Z0 H3 A1 _' J9 E* [
        // 配置 UART2 参数
& ]" i0 k- G; Y/ q$ O1 `% T        // 波特率 115200 数据位 8 停止位 1 无校验位
/ ~4 e: T) O9 v$ d% z    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
' b- S9 V' b  n& l6 B6 ]2 R                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);  E  |  J/ \8 _# ^: t% a
        // 使能 UART2( x" d' S6 o8 A
        UARTEnable(SOC_UART_2_REGS);; w1 ^1 N! ^8 ~  p
% ]( b$ b4 |+ a
    // 使能接收 / 发送 FIFO, x6 n% R% u: \5 H0 J
    UARTFIFOEnable(SOC_UART_2_REGS);
5 f& o/ a1 m% S: i# ?6 d' i) k
0 d) {) A2 d# V, J! ?# q    // 设置 FIFO 级别
# E# ?( k9 W' N. Y- {6 V: Z    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
9 v6 V5 ^0 r- K2 R4 j- P; J0 z}1 x/ m+ Y% f9 m# U7 p0 j/ I
6 o, B8 k+ \+ H# j: h
/****************************************************************************/
& y& P- S1 c5 K) }/*                                                                          */
5 u. N5 c1 M1 y+ P* q6 a/*              UART 中断初始化                                             */
  J8 P9 _; c$ X! S4 c' C9 z% C( l/*                                                                          */
. e/ a3 P. p' V- @/ E/****************************************************************************/! n- |% g" y  v
void UARTInterruptInit(void)4 b9 [! M7 x' N( N
{
, U$ ^: w6 X. D! S8 f5 q        IntRegister(SYS_INT_UARTINT2, UARTIsr);* {& a8 C$ Q) y( }( I* J: D0 f4 Z
        IntChannelSet(SYS_INT_UARTINT2, 2);
" L3 r  D$ Q# j$ G/ r6 Q; ^' H! C4 J        IntSystemEnable(SYS_INT_UARTINT2);+ t4 H: ^$ `5 j0 j& Q& h/ J- f

6 C, Q9 w, H: Z, F( J        // 使能中断
- z4 L' J1 @5 c        unsigned int intFlags = 0;
- `2 h# _" W# a& n    intFlags |= (UART_INT_LINE_STAT  |  \
9 k9 W: a3 M7 e; S/ W7 ^1 o                 UART_INT_TX_EMPTY |    \! g& C; l* X2 \0 n% t6 r
                 UART_INT_RXDATA_CTI);
$ ~3 C0 G' F7 x- [% o/ ?    UARTIntEnable(SOC_UART_2_REGS, intFlags);. c! z" K6 W- V2 K' F
}
& G. L$ X/ T; B% ^' U- \- ^' y' _0 m2 f! P3 O
/****************************************************************************/
0 f% U5 h% F0 C1 u6 W7 G/*                                                                          */7 _* `, k2 X" ]% k; k) _4 ?. s2 e
/*              UART 中断服务函数                                           */
% Y" P) ~8 |( y) j+ y- ?8 W, V/*                                                                          */
/ k8 M" ^7 R, d/****************************************************************************/
( T7 D+ f  a' \& T/ P! Wvoid UARTIsr()  J5 U/ @: ]6 n" z
{
: C- _* g* H! p2 Z% a" p2 R  I8 N# w    static unsigned int length = sizeof(txArray);
- n) U2 [4 Q6 f" T& f    static unsigned int count = 0;
, O+ q1 v' K% q$ x- ~+ S: T    unsigned char rxData = 0;2 ^  C  M; j" k! n- ^# p
    unsigned int int_id = 0;3 |4 T/ X0 w& N; D3 y: b4 L% L

: O" p( H7 ]' B0 H+ v    // 确定中断源
7 ]. P+ W1 K3 R* g    int_id = UARTIntStatus(SOC_UART_2_REGS);
( o+ C1 Q& b( s* q' T
" i( E& I( F! s    // 清除 UART2 系统中断
6 @' w  M: f2 ^    IntSystemStatusClear(SYS_INT_UARTINT2);+ p$ \* E7 y1 a3 z* h

% l$ d6 }0 M8 g% u. R. F    // 发送中断
& C; \% y" [- P1 z, V$ N  p    if(UART_INTID_TX_EMPTY == int_id)8 \0 ?: c  s: ?5 T% K/ M
    {3 m0 `( A/ j8 n7 R
        if(0 < length)' M- Y7 I$ t; O
        {
1 G. o( f( x  t  n1 `: E' t: q! ~            // 写一个字节到 THR- T" W. d, `0 K- s- k5 ^8 S5 C% u7 h
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);- h. O( U. s4 K2 V; c
            length--;9 |, l& I/ M$ r5 ?6 X) O# `/ C) F
            count++;
3 `! ^# x" x& P& `4 G- r( W( }        }4 l- J5 o1 D% I/ V! I
        if(0 == length)
9 z% l6 a  z0 l  D7 T        {  Q: X; N# h( a- H1 F$ `
            // 禁用发送中断( H- A1 K3 l2 W  W) Z. b* @
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
/ j, f# M3 @8 [, S9 d        }* Y& r! T( b9 Z  a& z
     }
/ S0 p- J1 z# ?8 {. J
# E! P& W1 F* M    // 接收中断# `0 h* g, h/ v- K
    if(UART_INTID_RX_DATA == int_id)
7 R' x0 P- A7 [1 o    {
. j; S4 o. m% c/ ?6 q8 C        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
2 C8 D* B. W$ g+ U/ `; s3 z: y- d3 ^
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);3 c+ K8 f1 w$ X8 L& V+ r" V# x
    }
0 W+ I& i6 b! r9 z7 d) r
2 E& n& b1 G: f* t, e    // 接收错误
' C+ d$ [, A" R& S% y. W    if(UART_INTID_RX_LINE_STAT == int_id)" ~) Z8 Q. T- a; X/ _2 K
    {! `8 u6 b9 V8 F! N7 N
        while(UARTRxErrorGet(SOC_UART_2_REGS))
: U" g( g1 l; u$ D( [        {( |( |" @/ ~2 [
            // 从 RBR 读一个字节
) ^' @8 `9 {& ]/ S; A) W            UARTCharGetNonBlocking(SOC_UART_2_REGS);
( Y7 Y/ c5 n7 |5 }% g7 L        }/ }# N2 c: o& R2 v. N" s2 j3 q
    }
' N6 J+ m& f, Z( W' e$ ~+ U! [    7 }2 o- `8 d! ~  |- m" O7 ^/ L
    return;
" Y5 l, w" R. C! V. }2 r8 w: N}9 j, {. X0 U9 W: E8 T
回复 支持 反对

使用道具 举报

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
! ^# U/ K. J2 F9 O3 W如果其它设备快速给你发送串口数据,你这边能正常通讯?

5 `1 U7 \9 @3 R& Y谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-16 16:51 , Processed in 0.044238 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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