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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5601|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
2 y$ w. e. N: T$ T. d# n

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。& H+ r8 {) ?& p3 c, R0 R- M

& \2 c; [& O# j# b: K#include "TL138.h"                 // 创龙 TL138 开发板相关声明
6 x2 G. A5 u1 Q. H; m: R
: |3 }9 E$ A' r; n/ f& I#include "hw_types.h"               // 宏命令
9 x7 Q) s( w( [* M8 R#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器( Y( k5 E0 s$ Z
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
+ }% \$ [' m. {6 L4 w- K
1 k3 [% y8 ^7 S( N; }: Y#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明8 f7 X7 V# d& k
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
  n( |& Y$ s7 |& I#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
& a, W/ z" ~: ^#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义! J/ v( H% Z" G7 |

4 ?+ f& C1 G: G9 U/****************************************************************************/# b% Z! \8 f2 m9 _
/*                                                                          */
6 L$ b. F' U$ z; x' z/*              宏定义                                                      */
' c0 w* v0 M2 r5 I. {9 ^% l/*                                                                          */5 i2 p5 E  V: B; b" ]( u; C
/****************************************************************************/
+ x5 L! |' X. k% i) {// 时钟
5 b# S6 F/ Z1 S. i#define SYSCLK_1_FREQ     (456000000)
+ W* Q6 A8 V# B% s6 u9 U/ q#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)4 p3 S6 Y: F6 z6 A, _% m
#define UART_2_FREQ       (SYSCLK_2_FREQ)
) N+ e; M7 r" q+ O$ J
, j8 _& c- O) }% O$ R! H& t/****************************************************************************/
1 x1 [6 @+ u& y! z% A1 Z# {/*                                                                          */
( g3 \0 w. {/ G1 \& D/ q/*              全局变量                                                    */0 @( S% |; S  e0 f# c
/*                                                                          */, h$ ^8 {3 A1 l, B. p" E
/****************************************************************************/
" H. I8 M2 ?& x# F  S; l& d# \char txArray[] = "Tronlong UART2 Application......\n\r";
  c% h% V6 |1 B2 ?: h2 y6 P, i9 t$ ?* B
/****************************************************************************/
4 ]( S0 `& G3 Y! i4 H9 L1 P6 T/*                                                                          */" C% n6 ]1 V4 E+ C2 U
/*              函数声明                                                    */
  S  ]8 X3 m$ z/*                                                                          */
: F, n5 H; G% Z* }- [/****************************************************************************/" W7 l% Q  v8 O% k+ X; a3 G' ^' A6 A
// 外设使能配置
; M9 F$ L7 [+ F( S' \. Fvoid PSCInit(void);1 K5 {" o* a3 j: h% a& d
6 t7 v6 J: m! o3 F9 H
// GPIO 管脚复用配置5 h1 @( Y  D8 }% w# a8 {
void GPIOBankPinMuxSet();
; K4 w7 i4 a4 _! p
9 d& d! K. _( R3 T% M7 }// UART 初始化# c% [& A6 B1 v; g. k3 p' i( f
void UARTInit(void);( c+ ^( }3 _+ W5 R+ U$ X
// ARM 中断初始化
% T. q9 u9 h! d: c  D1 N( w- Xvoid InterruptInit(void);0 D7 _3 C. u. ~
// UART 中断初始化
$ J; ?3 o9 E! C$ {, Hvoid UARTInterruptInit();
# g" w6 U+ ~6 G- ^// UART 中断服务函数
& s1 \+ Q5 S7 k# B. H+ svoid UARTIsr(void);
+ B0 c( I  ]% B5 s2 T6 E1 x) k7 E* d3 v2 {
/****************************************************************************/. b- h8 i: w. `4 j# l# @
/*                                                                          */
! U' o( b7 \1 N5 H/ v# q/*              主函数                                                      */5 C* r2 M0 a8 D4 w' }1 m; D
/*                                                                          */' S" G5 Y- l, {! L; f( \
/****************************************************************************/
1 _0 }0 v1 O3 w! c3 R+ I& fint main(void)/ S5 I* W% v6 q. n, \
{
" U# i) W( O# B5 R/ C        // 外设使能配置! v1 L. m; V# e9 \8 R
        PSCInit();
" [* S2 J4 _, K; e$ c) k  n        1 k( e: v# k: p8 y
        // GPIO 管脚复用配置
- M1 L/ W  g6 P0 @) n' N. G        GPIOBankPinMuxSet();' |2 [9 \. W, Y) O0 I
) ]; D1 p) ?  |8 x* h
        // ARM 中断初始化
' I( }* z/ p5 c        InterruptInit();4 i' h2 O# W( g! d1 c" f
, f$ X; p& `" o
        // UART 初始化9 O1 B8 G, N9 X5 C
        UARTInit();
2 V9 n  U) h- b# F) o" s. M/ r  a9 [6 J% l. @1 b0 d7 l
        // UART 中断初始化3 n) u7 t$ U- a
        UARTInterruptInit();2 h2 O! I0 y4 J" g2 x: w

. m% s* q2 S1 g$ a, v) r/ ~        // 主循环
; `% k8 ]$ _" u& c* e9 X6 j& g, t, b        for(;;); q) l) @. p) G( b8 S
        {
, }; I+ g' S, F1 M2 D  Y# x8 g  _8 L9 F- w$ T8 Y. S
        }) r' w4 U7 ]! X- f
}) c' {% e# a2 I. [- L# J4 T7 i
' j: M) w- y6 l% T9 y. v
/****************************************************************************/: Q* T! i, b  y* S- r" e- Y
/*                                                                          */. r( l- m- c( i& n. W
/*              PSC 初始化                                                  */
( @; i: P$ d9 o8 L% a2 P/*                                                                          */
7 y3 S3 l: y& }4 j4 d3 s* F  V/****************************************************************************/# V7 W0 v4 Y2 l2 V6 V
void PSCInit(void)
  X3 Z8 i/ j" Y% _; t4 P- z{
# B* X9 u' n- |* @0 X3 G+ m        // 对相应外设模块的使能也可以在 BootLoader 中完成6 B8 Q" }, ~( m
    // 使能 UART2 模块8 O4 G$ l( x- a2 p
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
% r. X. f" M" L6 ?}: N0 c% ]2 D8 L# e0 {' P
) J: v  b6 y" L7 Y9 y2 L) d, E7 ~
/****************************************************************************/& e1 n% z( w3 V
/*                                                                          */8 D. l4 [6 o+ {$ P- d8 b
/*              GPIO 管脚复用配置                                           */
* X0 }# d! p, }/*                                                                          */
6 E2 d! Z6 f* }: U/****************************************************************************/
4 H( y" F2 q" P, Lvoid GPIOBankPinMuxSet(void)
" x/ `2 Y5 B+ Y6 E1 ?( g" p: u{, h, F6 Z/ n8 z# L$ K( I& C0 s
        // UART2 禁用流控! {9 k5 a/ I! f5 J, G: S
        UARTPinMuxSetup(2, FALSE);& ~' C8 L  l0 v2 q( W# L
}
& O  E' I6 u: O  o9 Z8 W) B' A" d
5 ~% O2 E* ]: E3 O  V* W+ P/****************************************************************************/$ _/ C, ?* Q* L: {% ~) r. D
/*                                                                          */
8 y" ]; a2 M$ C  }: \% t/*              ARM 中断初始化                                              */* G' W5 Z2 y# D" J
/*                                                                          */
# j- ^% i# A# d, l/****************************************************************************/3 @" e& b( t- Y! L
void InterruptInit(void)
3 j, g; }2 C: |2 x0 s) l& _{
2 L  w7 x$ {, Y; p6 `$ G    // 初始化 ARM 中断控制器
9 G9 s( U' `! H2 u6 M% |+ E/ H    IntAINTCInit();
! m! H) C9 v4 G  o
/ f& t# h0 F+ A7 u# e) J    // 使能 IRQ(CPSR)
! k+ V& I7 X. Q" L# Z" v/ s* ?    IntMasterIRQEnable();
7 J- t' T' H- w" c( ]
# d; g/ Q. s. G# `9 ]) V+ u0 J    // 使能中断(AINTC GER)
6 }* e, d5 V2 E7 b0 N7 x    IntGlobalEnable();& L; v, Q8 |/ n' U* p

5 G* k! l: T2 u* J    // 使能中断(AINTC HIER). j- m6 C" D8 S- m2 W! K3 N3 R
    IntIRQEnable();
: `! Q! r  d1 }}; E1 q. j* N; p) d# \  H

0 H* S, M; Z$ L, |0 _/****************************************************************************/
) N' I1 C0 l" H$ N/*                                                                          */
* f6 S9 e; G2 J& w6 W- B/*              UART 初始化                                                 */
4 |, S7 w; t3 b8 C" r. t3 [2 n0 k/*                                                                          */
: {9 T; s9 o$ e, r% E/****************************************************************************/
* {$ M3 P* f! K: K! y" g3 f: }; nvoid UARTInit(void)
) U9 F; ^, i" b9 L( c2 b{
. ^0 {" b  z/ R8 Z( K) C* J        // 配置 UART2 参数
; e, Z7 p. c  `* d0 s        // 波特率 115200 数据位 8 停止位 1 无校验位. T+ S" B& l& C) u2 v5 I
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
! q" S+ Z6 z/ \+ e7 x                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);* s* N6 J% k/ F* {- P; G7 _- d" J
        // 使能 UART2
! [8 M6 J. u' @* c2 w4 f        UARTEnable(SOC_UART_2_REGS);! m: L+ f9 z: W8 N, o
2 h2 X0 l1 n" d; t/ r4 `/ v9 Q
    // 使能接收 / 发送 FIFO
" @' f+ R- N$ m* p8 F    UARTFIFOEnable(SOC_UART_2_REGS);$ ^! l6 z3 E: ?% f5 P  Q, M

5 H5 h; P) Q. l' |3 {/ o    // 设置 FIFO 级别
- C6 r8 G/ x% O0 j0 N: k    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);7 a% f) i; h+ \% ~0 V! `- G+ |0 }. b
}
6 D4 `. Z, v7 A$ K, j! X$ d3 b
/ |+ G" c$ a( f$ ]/****************************************************************************/( \5 V& J+ W' N/ X
/*                                                                          */
. q7 e8 i7 P5 ?2 B/*              UART 中断初始化                                             */
0 i8 }1 M: U& d) z; b. C/*                                                                          */" h7 \6 L3 R- Z6 ^+ ?: _
/****************************************************************************/& }. V0 e: z' H" W* `  N3 v* M
void UARTInterruptInit(void)4 S; X1 z" V( b4 @+ q, Q
{
+ X/ T+ \2 R. Z- l0 e        IntRegister(SYS_INT_UARTINT2, UARTIsr);4 U9 k) `/ [  C
        IntChannelSet(SYS_INT_UARTINT2, 2);  T" g' e- B1 v2 E2 u5 J0 [  m
        IntSystemEnable(SYS_INT_UARTINT2);  A4 r! G' f" ]/ S6 }7 B* j
" u2 C! s9 P3 n: d2 D2 j9 |0 a& |
        // 使能中断
5 Z% R; V1 G0 o# I( ^# ^        unsigned int intFlags = 0;4 Y4 V9 `- g$ n+ o0 L
    intFlags |= (UART_INT_LINE_STAT  |  \$ o; o* v7 W9 g
                 UART_INT_TX_EMPTY |    \
. Y& A. ^- E" L                 UART_INT_RXDATA_CTI);. I4 J1 Y4 G: J! K, q6 V  v
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
+ \( {- K0 Y! W  k2 B}; P" l7 d$ y+ b7 g6 J

" H. l% @0 Z3 M+ P/****************************************************************************/
: o# u$ s7 B" c1 }1 p4 L. O/*                                                                          */1 j1 q) y4 }8 i9 S$ s8 u; R
/*              UART 中断服务函数                                           */& }" Z$ B# L5 \* L+ ^( S0 Y
/*                                                                          */
: Z) ^' }6 D' M/****************************************************************************/0 w  K$ w: J* s: U; {
void UARTIsr(). j" h* f; \# S; e
{
; u' i" y, [- ~' G  t    static unsigned int length = sizeof(txArray);4 n  `; ?8 g' q3 b* _- r
    static unsigned int count = 0;7 H6 C0 `, z9 z; U& ~% P; K
    unsigned char rxData = 0;
) c' e- q4 H8 {7 k/ l4 M    unsigned int int_id = 0;
+ P9 Y5 c. P- B0 L- |* z! \  j1 p1 ^: q' n* r( s& S$ w' i
    // 确定中断源
7 Q1 G& [& e5 b. R2 X    int_id = UARTIntStatus(SOC_UART_2_REGS);) n! m/ o) {0 w( `- V

- V# S/ b# ^" Q' i/ K* i0 c    // 清除 UART2 系统中断
  F8 L  T9 N5 N; X9 \% u    IntSystemStatusClear(SYS_INT_UARTINT2);
' v, e$ s4 o* g) t  F9 j- H
; _8 `; A8 N0 Z/ n( j4 `    // 发送中断
! `: [8 M6 e5 W3 ~5 Z    if(UART_INTID_TX_EMPTY == int_id)
4 s4 Z& ?4 I. P/ T' {    {
, ?+ P0 ^! i7 |        if(0 < length)
8 h* o, U2 |; |  G, K2 D        {
6 h" S, d1 c" K" P  T3 L9 g$ z            // 写一个字节到 THR3 Z+ p( b3 q" t1 V. q; o, I
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
) [! ^  d2 Z  G5 L            length--;
8 ^, u3 C% L1 R5 J" _( v2 Q: d* Y            count++;/ y# q2 ^" T* r; d0 X
        }: x5 L9 _; {3 l& b# J
        if(0 == length): K3 }) b2 V8 b8 E2 A/ P
        {9 C; \& b" Q& R' Y
            // 禁用发送中断) O6 [; I" a9 n- S* C5 k' N9 S5 g
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
: G! A' y3 t( ^; B3 K, h$ a: O        }" o- D6 A4 f3 h( B; {- ?# F) Q
     }7 m9 y) _/ t; P1 w( `+ u/ C

) I- e) l: _" p* n6 K1 P+ X* W    // 接收中断
! e: n$ K7 I- E9 ~    if(UART_INTID_RX_DATA == int_id)" L& V. B$ x* ]: e* C
    {( Y: Q1 L& y0 A4 H7 `: i
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);. n  T9 J$ R* U1 Q
9 ~1 H2 N4 N, T9 w7 W6 f+ h
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);. G5 T9 ~* ~7 H5 q/ y
    }5 l. C) y5 G( O8 V0 ~7 Y! D
; F8 H/ B5 l, ~) u. }9 h! p
    // 接收错误
% T: U' _- e, t- _    if(UART_INTID_RX_LINE_STAT == int_id)9 b" ]6 s/ m/ B* ~5 k! a
    {; w0 U0 X6 ]. E; u. n! y$ U
        while(UARTRxErrorGet(SOC_UART_2_REGS)); H, d" {+ Q# ^1 L2 O3 l" m& \
        {6 J, v9 o0 m( y6 A  L! w1 I" B  a6 Y
            // 从 RBR 读一个字节
+ ]. |- l( B4 a; T6 e4 r, R7 l" F            UARTCharGetNonBlocking(SOC_UART_2_REGS);
2 x6 R- Y! M  q        }# _' A0 J1 j/ [7 ]" J4 P( [8 g: I
    }
8 |6 ?, q$ v/ U. R, _    9 H* ~' s5 x+ B' ]- ^# v
    return;
" w. R$ f5 Z4 z' H7 n}
* M1 W7 Y; {2 I9 f0 {9 e
回复 支持 反对

使用道具 举报

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:259 K# p& d- j! j  F, B3 X! X
如果其它设备快速给你发送串口数据,你这边能正常通讯?
7 n! n# {/ z/ u
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 14:36 , Processed in 0.043289 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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