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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5579|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。  Q, q- t7 ]8 E# ^8 E

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
1 q! |! Q+ q- a0 Y) H% s  C* Q8 _  ^0 j# l+ Z
#include "TL138.h"                 // 创龙 TL138 开发板相关声明# z* ~% G. u9 F8 r; u3 _

5 Y, U- @' L  b4 z& }#include "hw_types.h"               // 宏命令9 B: }9 H7 F/ r0 ~% M
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器' n, ~: W* S$ a! b
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器0 M( E4 Y9 {, u
3 r$ K3 z+ W6 `2 S6 K% X$ U
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明- r) M6 t" j! D' g0 e! s0 Q
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明2 p  b( [* r$ w/ |3 J$ M
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
; v6 S/ A6 e: E#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义/ [- q* S6 |6 i% Q& q$ ]) S

' p- T+ M+ k* D# C0 m% B6 @/****************************************************************************/: o9 \2 j9 n7 Z4 ~& b% S
/*                                                                          */
4 }9 c4 k2 `" |/ ?& E+ `/*              宏定义                                                      */
7 x4 t( J* C( r( s! f/*                                                                          */
- M4 L( w* r, e/ [% l6 _/****************************************************************************/( m" f9 }+ E( p/ b% |2 c6 `0 I
// 时钟' h( u# D7 n/ G8 B$ G! C! C5 Z
#define SYSCLK_1_FREQ     (456000000)
4 R+ T$ E0 m$ ^% K' _( l- c. B# V2 G0 Y#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
) T" P7 F; o$ B4 e  d#define UART_2_FREQ       (SYSCLK_2_FREQ)
2 ]; l) Q  b& ~9 E
' u4 G+ ^6 c6 i1 V4 ~) J1 a/****************************************************************************/( P' \8 V: Q+ Z. Z+ D. Y: W
/*                                                                          */  P3 U: O6 e1 E# Z
/*              全局变量                                                    */7 [1 m, G; O! y+ c
/*                                                                          */) ?$ s9 U: \5 n2 D
/****************************************************************************/2 w2 t  y9 Z. f5 s% j( I' |8 w0 y
char txArray[] = "Tronlong UART2 Application......\n\r";
5 |2 K+ R/ ]3 w2 S; ?/ V3 s( I+ B% V: u4 j% E7 h
/****************************************************************************/) l5 c9 X# D- \7 Q
/*                                                                          */. Q4 h, }) @$ d, y! l6 ?: V
/*              函数声明                                                    */1 I8 y4 r5 `( w; d
/*                                                                          */
, U9 @; @! g5 _0 {7 S/****************************************************************************/
8 M$ ~, D* F+ K// 外设使能配置
$ w# P6 z) y) O0 j: p6 f( nvoid PSCInit(void);  H/ H! i: e1 C2 e  @; \. e. @/ {

8 q- x2 u% r& X% Y2 I  f- ^+ F// GPIO 管脚复用配置' V: b/ z& w, I8 f# W7 ]: T! R  w% k/ @6 L
void GPIOBankPinMuxSet();2 z1 ?% P+ R% l" P3 D

0 b* |$ m( `' Y' @9 N; Q// UART 初始化
2 A/ H0 c/ S+ Fvoid UARTInit(void);' d- y6 V1 P4 O+ b* S
// ARM 中断初始化
# R, V) Z% `( v6 n% J0 T  J! hvoid InterruptInit(void);: v2 y- |! m# Q) E- X
// UART 中断初始化7 q+ P. L1 q/ g* x, L
void UARTInterruptInit();
" ?9 A5 @! `: f1 ~// UART 中断服务函数
( N# ~9 B* G2 L' nvoid UARTIsr(void);2 y! _6 b. Y0 [7 e3 a

% {5 Z, t7 x5 o8 d/****************************************************************************/
6 H% Q' T0 ^4 C9 D5 l) U/*                                                                          */
* A3 D7 f  w4 ?) X/ w5 e4 N; E/*              主函数                                                      */
% i% \/ X3 l# X" i/*                                                                          */% j- r2 {7 }0 F* X  w) e: M0 K
/****************************************************************************/- T! E, s* ]7 R: Q
int main(void)
) ~" E' U5 ?. ~$ d* {{0 _% h* w3 u( S  Y% A& P
        // 外设使能配置' K( Z* g# X9 u/ U8 _! `
        PSCInit();/ E$ `0 V# b) q( p9 p, D$ b8 ?) w
        - e5 W& q  n1 c! i3 K+ Z6 ^3 m2 l
        // GPIO 管脚复用配置0 t) y4 E; V" v) n  N6 _" X0 W& g
        GPIOBankPinMuxSet();5 |& X- B9 V& l! v" j" L
# X- w, v! w" A' }1 O
        // ARM 中断初始化* S- V# u$ r$ T2 _7 I
        InterruptInit();6 Y0 j6 a: F* a$ Z% |. U

. ~& i7 K, z) L5 s0 f' X# O        // UART 初始化
, m. n) {$ [0 }8 z! W0 E" u# a        UARTInit();* |0 f5 W7 A8 j7 A! S: }
: c9 U- N/ V3 c9 z% a" Y3 t- D
        // UART 中断初始化  R0 v6 r) i1 E6 \: q0 k" z3 y
        UARTInterruptInit();
& H5 n$ W3 t; h% T
# X3 x8 ]' D4 E. e        // 主循环
5 u$ T( L0 r% Z        for(;;)
7 O+ x5 `# Z5 b% u        {
( n  ?: J7 R% a7 k
7 f  S1 C4 F8 d2 N3 q        }
1 D0 }2 E* p3 F}
& P! v; Q" ?! T1 {! r* C4 \
0 `2 R/ V- y7 N" [( @, ?/****************************************************************************/
! _  O' l' L5 C% s7 W. x8 l: C/ Z/*                                                                          */
& v  o. n$ x! `: `/*              PSC 初始化                                                  */; O" L# x, e. p% R8 }
/*                                                                          */- ?$ v/ Z1 C6 f  \. l. g  E
/****************************************************************************/
# Y1 M# K( [% _void PSCInit(void)
: s. S& g) P8 v{# o; U: _; Q* B
        // 对相应外设模块的使能也可以在 BootLoader 中完成
2 g' i  D0 e. Q    // 使能 UART2 模块7 t2 ^5 o* {& q/ O5 O
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
7 y" S4 f, G0 U6 H, @6 [9 J}
# y; X' l) N  S) {# o  z6 D, C8 j2 N4 F" a$ {1 `, [! y) z/ y6 }
/****************************************************************************/
3 M8 U. R( U! u7 M' z/*                                                                          */' j% S4 E! [$ l" y
/*              GPIO 管脚复用配置                                           */
# h3 D. d8 Y+ l5 R* V- b/*                                                                          */
$ s- D% x9 X% k. e' y% ?3 |5 j4 W/****************************************************************************/+ G' h( W: F& B0 Q' O1 g3 P" O! H6 e
void GPIOBankPinMuxSet(void); n  M1 o; {0 n2 e0 `* |
{+ b3 Y7 _; A& f) a8 O' t8 y
        // UART2 禁用流控- f& i: N; c+ h1 a
        UARTPinMuxSetup(2, FALSE);
- B+ b+ G( W5 R. A" [. U7 f6 V7 ]}7 d$ h/ E* a/ U, s- [2 ~

: V' J* J1 H/ K2 v; q) ]/****************************************************************************/: c2 X. x; C& V
/*                                                                          */
1 y  O7 s1 p9 m1 M: Q8 E" b: i; B/*              ARM 中断初始化                                              */
# {7 H/ h, j1 t7 ~9 J5 t8 i/*                                                                          */9 a1 k" ?! S' P. v- |, C  n% h
/****************************************************************************/
+ n0 ?1 p" l. [- Uvoid InterruptInit(void): F3 e+ `1 s+ ], N6 \% m
{
; `7 ^. g6 j: X7 M5 l+ p% R7 \    // 初始化 ARM 中断控制器+ g5 j8 a  T6 m
    IntAINTCInit();
/ [# `9 \5 A  F4 R  M
6 l7 O. T! A5 W) F    // 使能 IRQ(CPSR)
; I: ], B# V4 g" v5 M! P" p2 O    IntMasterIRQEnable();
" j2 A3 w) f- C4 B  E" O( ~' T( `
/ l+ g1 k# `/ ]0 C5 {) g' A    // 使能中断(AINTC GER), E" a2 G. G& ^( Y( W) U3 ]
    IntGlobalEnable();& C6 M( k9 ]) ~% K4 o
. E& W; _* X7 y% G7 m5 A$ E0 F
    // 使能中断(AINTC HIER)
: s% ]1 h: B0 U! J8 `, S    IntIRQEnable();
8 \) {% E4 ~7 q% j}% m3 w- ^6 Z- `7 q

7 @' b4 C7 E5 Q6 {7 N3 X/****************************************************************************/( H3 E5 y+ H6 \- B4 {+ F# G  y* m
/*                                                                          */
" b4 ~! T, H3 S& q( I/*              UART 初始化                                                 */1 p6 Q2 s/ z# K* |8 a
/*                                                                          */; ^" B5 y' I4 }
/****************************************************************************/
0 i& C  o- I3 r8 |( dvoid UARTInit(void)
( S2 R4 U& W+ n. q7 @{' k- f7 u* J: J$ k" @1 F
        // 配置 UART2 参数& T. U& H. f5 X7 g% ]3 C  ?
        // 波特率 115200 数据位 8 停止位 1 无校验位
3 r: X  I8 H1 e  y8 F" q2 m, D8 |8 t) n    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
" H* h0 T- M' }7 O8 U                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
# {$ X* _/ Q: T; r$ F" i# r        // 使能 UART2
5 k" r! v( D7 A2 }        UARTEnable(SOC_UART_2_REGS);
; b9 I. |/ |( f. C+ Q4 x( z6 m. R9 B/ ~9 K& V3 u3 H
    // 使能接收 / 发送 FIFO
% x$ y' y/ L  r; ~1 a    UARTFIFOEnable(SOC_UART_2_REGS);& O' Q8 l1 S+ ]6 W
( D% }+ k8 {$ J' I# C* m
    // 设置 FIFO 级别' a8 \) {1 G& H& O( R7 a% ^' [
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
: T' G9 @4 M5 b/ k# O4 n  W}
( P0 j/ H: K# F" z3 f" p+ d5 [! x+ v& m6 f' ]# y+ h
/****************************************************************************/
: n' c& P/ k" S# k4 W" M' f, Y0 p& Z) f/*                                                                          */
" F& A2 [. p8 b0 \) I/*              UART 中断初始化                                             */" q7 U' X0 n( l- S9 ]7 m; D
/*                                                                          */
' x1 e# l4 g& O# ~' u- S- X" T+ H$ Z/****************************************************************************/9 }4 b8 i; U0 w8 R/ s/ y6 f. h
void UARTInterruptInit(void)% B$ |. @  T# c" e
{" d0 _0 H- g: }6 V1 q/ D
        IntRegister(SYS_INT_UARTINT2, UARTIsr);3 w( l2 |+ ]0 B/ I) f
        IntChannelSet(SYS_INT_UARTINT2, 2);
, d) J. H! g! O+ M  l, I1 r& w3 q        IntSystemEnable(SYS_INT_UARTINT2);- T! d4 e2 {/ U$ g9 o

6 F- ?* @" r" [* m, O* k, q; }7 z        // 使能中断1 k* ]* s# u$ Q* I! Y
        unsigned int intFlags = 0;
- l" Q+ }0 y/ \) d    intFlags |= (UART_INT_LINE_STAT  |  \3 R: s! m; x; Z* I. v) K
                 UART_INT_TX_EMPTY |    \
. g7 i7 F# T8 l7 Q5 `  H1 o( h                 UART_INT_RXDATA_CTI);
0 U/ q, _' f+ X0 Q0 f    UARTIntEnable(SOC_UART_2_REGS, intFlags);' o( h/ a, v' X
}
# V/ p: ~% t1 n5 n+ ?* i* L0 p5 w4 j- {6 }2 C; {
/****************************************************************************/
6 a* t1 N0 s) A# B+ s" a/*                                                                          *// |! p6 {2 E; u0 W" N' D
/*              UART 中断服务函数                                           */' |& r2 \4 U6 {; I
/*                                                                          */
* z$ N, T3 f, |/****************************************************************************/' G- a! A, m2 K; l5 ]+ p
void UARTIsr()
1 |6 \+ b! |& z2 l{/ d6 t& u- Y# C, U2 ?5 ~" @$ e$ t! H# N
    static unsigned int length = sizeof(txArray);
9 S2 i7 X/ |8 e5 M- F' w    static unsigned int count = 0;
9 J+ P( Q& \; t) y- T9 _7 z    unsigned char rxData = 0;
: l( K& p4 n! w. o) j    unsigned int int_id = 0;% [2 J6 [% F4 X3 X% N- q7 E

. P/ M0 e0 P  t    // 确定中断源
- l, p: t- X. g    int_id = UARTIntStatus(SOC_UART_2_REGS);4 x7 I9 t: w  X! u
+ |1 p3 @  ^# v5 h- [5 o* o2 h
    // 清除 UART2 系统中断
$ I& i' l/ O5 L, k' F5 \    IntSystemStatusClear(SYS_INT_UARTINT2);
7 m  x6 }) M0 W
- \! k7 V: K* w, m    // 发送中断
8 B$ `# d8 z/ q3 |    if(UART_INTID_TX_EMPTY == int_id)
2 R- b1 ]/ S" ~2 N; q1 O    {
  I+ y$ Z% j2 V3 ?; j- h- ?' U        if(0 < length)! `8 g; I6 G; z
        {* a* o5 S  {! G5 G# h# ?
            // 写一个字节到 THR
2 C8 ]- \2 v% D  O1 |            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);) A3 F* I6 L4 G
            length--;
7 `9 g1 b1 m: L6 C4 s3 R7 }            count++;; k- G( H7 h$ d9 @- x/ l
        }
: k- e  n7 ^& d+ j6 S' B7 \( L        if(0 == length)1 a1 U5 y" Y- C/ ^' Y; r7 ^  _
        {
7 t; ?3 j' ]% p* f* H: o            // 禁用发送中断
, k' }' |$ L! z" n) t3 E% Z( G            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
. g8 Z* w# {& `: ~# D        }! Q( Y( E) I# G
     }
5 C5 a5 J2 [/ i  J# U
8 C5 \8 @& B- K. I; U    // 接收中断9 U+ ]9 o5 ]. S# @6 x& v* F
    if(UART_INTID_RX_DATA == int_id): I9 q1 \! Z" y/ B8 G
    {
0 p- ~" `7 I$ c5 T8 A. ~( u        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);* T1 x2 l, l5 A9 ^
! Z+ `: \! i& D- j9 J% l& D
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);2 H+ v9 K" W/ G. H+ L$ p' X
    }! i  i' W9 M6 o+ g# |. _
4 c' J: [) R" j+ W4 @
    // 接收错误
8 _6 a  E- x* m7 s  N    if(UART_INTID_RX_LINE_STAT == int_id)
% Z( J% C8 o. L3 }( Z" _    {
& Q; H7 i: w5 s5 g- {        while(UARTRxErrorGet(SOC_UART_2_REGS))
  |0 W& }: J8 O0 q' F$ Y- X% v        {% D  o" [/ f1 A  X, t) p
            // 从 RBR 读一个字节
4 ^- b/ V, y3 t  }% m            UARTCharGetNonBlocking(SOC_UART_2_REGS);
* O9 x$ S9 U* G* |% O        }3 K& @# d+ m( A0 {1 S% N# E$ ^
    }7 o7 S+ Y" [; {7 P* A
    5 e; m7 d+ N' ^" c$ _$ d& t
    return;! q. T& J$ a0 V* ?
}
  Y6 n: ]; ?; Z* @2 N( s& o
回复 支持 反对

使用道具 举报

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# x) O" ?, z/ c# T" N
如果其它设备快速给你发送串口数据,你这边能正常通讯?

$ x" Q. z6 T, j, ], k2 I* w谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 00:51 , Processed in 0.040572 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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