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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5531|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。' w) w7 U" |' c

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。# w# C( o3 O9 f; D& ]' [
, O- @) c+ I& \% @
#include "TL138.h"                 // 创龙 TL138 开发板相关声明0 J( \( f0 o+ r, w9 E

3 y% h" d: F4 r+ t, L#include "hw_types.h"               // 宏命令
( [+ }5 ~6 k1 m7 _. `- b#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
3 i$ o: g5 ~: g1 S, m0 S: w; O#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
( Q0 X0 G/ Z8 Q& ^+ Y, q5 W; Z9 o, I- B1 A
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明- c1 b! H  Q% x
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明* E# U, V6 _+ C: e
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明1 @5 x2 g- W3 m4 v
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义* ~8 D2 T7 J# {, \/ {

$ H! Y* Y1 t' B! L. h/****************************************************************************/1 A5 V, D6 L* A/ {8 ?
/*                                                                          */5 m; U4 T  ^2 g4 q1 f
/*              宏定义                                                      */
3 p7 `+ Y) e5 m3 v- u. k* x/ P/*                                                                          */
( K+ E$ h- n0 |- p9 K# _" t4 k+ v; [" ~/****************************************************************************/
2 d( V& K% x* H5 e4 b! R5 m// 时钟
2 c% G8 {: Q- [, G& s/ p  |#define SYSCLK_1_FREQ     (456000000)
( |/ f. j5 H! ?$ E& T) W) O#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)( n, q1 S; e/ a0 Y9 T. K
#define UART_2_FREQ       (SYSCLK_2_FREQ)+ |6 L+ M+ I: a+ P% V: R

, ?# w+ i5 [+ q. ?% Q* [/****************************************************************************/, T+ U6 U$ E7 }9 U5 S  g
/*                                                                          */
/ R1 }8 ^/ V# R0 Z& h& G. c$ W/*              全局变量                                                    */7 _+ B" M$ R1 }0 W0 w; t2 i! ~
/*                                                                          */
3 v# u. V" O5 r2 |! f/****************************************************************************/  H  c) c: {8 V  @
char txArray[] = "Tronlong UART2 Application......\n\r";
7 ~% O5 j, V; q$ z: L# K5 o
6 r$ e$ z6 M& d( T' ~/****************************************************************************/) S/ W" d3 [/ J# I; V9 M2 \
/*                                                                          */+ ?2 O1 Y" j$ M1 {
/*              函数声明                                                    */
8 F4 a4 D/ M0 n& J/*                                                                          */
9 _8 r8 v. j/ T  @4 l$ P, v/****************************************************************************/) L+ {1 G7 D) y: v
// 外设使能配置5 z0 p/ ^4 f0 I+ X" F  U0 F
void PSCInit(void);# N# {/ N2 ?9 J* z, \
. `2 J7 m% D" g" ?: X8 ^3 f: I
// GPIO 管脚复用配置( \& P* }/ y+ r- R/ y: u' l
void GPIOBankPinMuxSet();! V# M$ M9 i% M' a$ t8 [6 j9 n

% b1 V& ^9 b6 C% {' N) |' ~/ q- l4 s// UART 初始化% _6 `3 @- [8 M% g; q+ e9 W; K7 y
void UARTInit(void);! `9 I% \( x7 `& z
// ARM 中断初始化
# T: V5 `: [2 Z7 U, J) mvoid InterruptInit(void);
( f* F2 d' l4 p// UART 中断初始化
, n7 R: K% I: x! e5 ^; x% J1 Xvoid UARTInterruptInit();
: e6 w. m0 T# R7 \2 \// UART 中断服务函数+ C1 _! ~! W5 P" ?
void UARTIsr(void);  B- u3 p2 ]+ A" Z
  h1 H7 P9 B5 C, ?- z  |) m
/****************************************************************************/
  x* ]% A% o6 o; V2 ?/*                                                                          */
: x" Q$ ?2 L6 L/*              主函数                                                      */
& J* I4 q4 @# b% w/*                                                                          */7 Z/ a5 }/ X; P1 y( g7 M
/****************************************************************************/
* Z$ r7 b! `8 Q9 j' ]3 k( fint main(void)
% G1 Q3 Y8 K" ~) @{% ^) w; n  E# `
        // 外设使能配置2 M9 g% @/ q1 q+ ]) ~
        PSCInit();2 n& Z3 Z, a( Q, M( i1 J) n9 o- }
        2 E* ]+ D: D! p: g
        // GPIO 管脚复用配置  f5 w' E$ z9 o# e6 m! s
        GPIOBankPinMuxSet();
, O' v& ?# ?$ ~$ ^3 j! I: f+ x2 k& y+ P8 `+ k0 I2 I
        // ARM 中断初始化
& Z: U4 G# b% ], W        InterruptInit();$ z# {5 j# h, N- S" F
5 a$ q  {$ ]0 q7 t5 X7 D9 w
        // UART 初始化; m4 S$ Y" l- [
        UARTInit();
9 b# l- P5 r5 V% N3 |" @% U, j
        // UART 中断初始化
7 |# ?2 q3 d4 f# @0 _        UARTInterruptInit();% Y. @8 u+ v5 G- F% m

; V5 _/ I8 D! b) j6 J8 ?8 v        // 主循环% i5 k( _( z: i0 a5 G. F' V
        for(;;)3 s$ X) d  F$ Q$ A+ n
        {9 C5 y, q: G0 Y/ v
' m# v% `: p4 ~1 o4 x" K; a
        }9 Q) u& W9 P6 D3 e* C
}
" p' f' m4 _7 V" q& U& s' z& l) T- \7 l" ?# R
/****************************************************************************/6 G: a" q6 R& y1 Q* p  `
/*                                                                          */) ?. D/ L/ w& ^# p# x( z
/*              PSC 初始化                                                  */
3 {4 i, |) Z# T7 G+ ?3 o- |/*                                                                          */
  Y% V8 e) G2 b+ o0 X/****************************************************************************/$ i5 |/ H0 B. f% u5 I
void PSCInit(void)
. [6 i  M+ K& a$ o, [+ F{
8 U6 j7 v/ N, V" p, e( A: L* V        // 对相应外设模块的使能也可以在 BootLoader 中完成& m% j, S- D2 \7 T
    // 使能 UART2 模块- l- I5 R2 U( C, F0 F  E. ?" Z
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
$ G' v: N& J" ^8 _% _4 V; k- f}5 v4 i; N$ c& i8 m
) S5 e0 L9 f, @3 J
/****************************************************************************/
* l7 N! l# {( z/*                                                                          */
; ]) Z% ]' r0 l+ x, J" [8 b/*              GPIO 管脚复用配置                                           */5 |6 y6 n- E8 V- L7 o2 \% M
/*                                                                          */
9 A9 `, n9 X5 {- R6 g/****************************************************************************/
" \4 n$ c, s' r. [void GPIOBankPinMuxSet(void)
/ O9 _9 S9 D8 b; n: t; M- d8 {{
1 D2 o, X8 L0 l5 K8 I. I' k1 n. w        // UART2 禁用流控
- w1 q5 {" L; ~( N1 l* j% t" l        UARTPinMuxSetup(2, FALSE);
2 S' V  M. L. c/ |  B9 X& @}
) C4 M8 }0 \8 t2 q( |0 ~1 X, G/ y! S( o* K" n9 {
/****************************************************************************/2 i9 K( x( u7 v: I. t. D
/*                                                                          */$ Z- t6 I& q) G+ {6 e( g; Q
/*              ARM 中断初始化                                              */
* d2 z7 G* t7 z5 Q& g/*                                                                          */
/ R! l* u* ?% J# M+ I/****************************************************************************/- Q3 V+ l/ n( y" g3 Z5 x/ M- B& b
void InterruptInit(void)
+ b( h6 L. T' W0 J. s$ d' }8 t{
6 y) _$ ~& e5 n    // 初始化 ARM 中断控制器
$ Q9 U- p$ R7 i  Y+ C/ B    IntAINTCInit();
5 T0 N7 d: y0 H8 t' m: A* s0 W7 t! }
    // 使能 IRQ(CPSR)
/ W. |' M1 D1 b2 e5 J    IntMasterIRQEnable();
9 v0 `- e* T. V& @) O4 H4 \
( H) d; \( k+ Z1 J4 ]    // 使能中断(AINTC GER)
6 y5 c" `3 |% v5 j: R# f+ P    IntGlobalEnable();, C: C" R% L) D7 j, p" t$ s3 ?4 l1 x

; V" V/ m8 x' a+ a: f    // 使能中断(AINTC HIER)4 `3 G- F* `. N% n, Z+ I& b0 k# E
    IntIRQEnable();
+ w0 t1 v/ `7 Z6 Q$ Q}+ v( M" r* E. G+ h6 C
  M1 }9 J$ H) n
/****************************************************************************/
. y* ]: y) i7 Z" p, [+ x/*                                                                          */6 f3 b5 T8 a4 ?4 H8 n& S
/*              UART 初始化                                                 */8 W' R0 q8 g! a0 O
/*                                                                          */$ g8 ~! T! x3 p  H
/****************************************************************************/
8 v' ]- X: ~/ n4 ?; }  t' \% @void UARTInit(void)( F+ b0 M2 P- d0 [/ b
{
4 l. K2 b  R/ f; V- t        // 配置 UART2 参数7 L) _' A1 z6 ^! P& n" c
        // 波特率 115200 数据位 8 停止位 1 无校验位# L" Z& U8 y3 n3 K
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
% X: [$ R+ |2 D' p+ p2 d. T                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);8 Q8 e# p. ^, i$ ^, \0 E1 J/ m- V8 C
        // 使能 UART2) x8 i4 }1 w/ E2 ]# d
        UARTEnable(SOC_UART_2_REGS);+ v+ \) N1 |1 p4 t! i. X
$ v% e4 [# ?$ B
    // 使能接收 / 发送 FIFO" A+ V: P8 Y1 x& R( w, ^. w
    UARTFIFOEnable(SOC_UART_2_REGS);, _. h" n! K8 Y7 l- ^
; T8 h* ^' H7 D
    // 设置 FIFO 级别5 A% T' r# a1 J6 S
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);  K& f) n+ J% p4 J; S. b
}' P; e7 h0 l) M  v1 `& U
8 H4 M( A9 _# \
/****************************************************************************/
3 g" B' m# P: @5 s0 R/*                                                                          */+ h0 `8 L3 W2 g- ?6 m# T+ x4 ?
/*              UART 中断初始化                                             */
9 [- A/ X% q+ B/*                                                                          */
- t! J9 w& A& \& t* b3 i! k/****************************************************************************/
, i: N+ K! ]# R: p' B$ Fvoid UARTInterruptInit(void)0 \1 t% Z4 F8 m6 D6 T; B
{5 Y+ }2 j4 Q* k9 _- e# a
        IntRegister(SYS_INT_UARTINT2, UARTIsr);' ]/ M3 H# K. M3 n* |
        IntChannelSet(SYS_INT_UARTINT2, 2);7 }: x2 p" n4 _% }6 g
        IntSystemEnable(SYS_INT_UARTINT2);, f$ N! s. r+ z3 `

& @2 c0 v# M4 \        // 使能中断$ m+ b1 V$ i' {9 b4 I
        unsigned int intFlags = 0;6 S* l$ j1 y. y
    intFlags |= (UART_INT_LINE_STAT  |  \
& Q& h7 h/ R9 ]& Q" D                 UART_INT_TX_EMPTY |    \6 j: k6 M' F( {- v
                 UART_INT_RXDATA_CTI);7 V# f: b' u7 v" {' `
    UARTIntEnable(SOC_UART_2_REGS, intFlags);, O# l* A4 |3 _7 C) H  C7 h  h
}
2 h' ~$ _+ _2 N/ e1 h( e3 d9 o
6 h6 P) S! G- J7 @# U+ ]0 r/****************************************************************************/% b( n: Z: F* u6 W1 P  J; M, y$ p
/*                                                                          */
( j% s8 F/ q4 J/ ~/*              UART 中断服务函数                                           *// J1 h$ ]: }# g* o3 }% `. S: X
/*                                                                          */
- H2 b% ^, l# n* H9 S: e6 q/****************************************************************************/
# [" G6 a+ A) N4 F* Svoid UARTIsr(). g, j# Z  X; P3 @: F
{1 C1 ]3 t8 y  V1 V, Q- V
    static unsigned int length = sizeof(txArray);
  J9 [/ t# [0 R& |8 w    static unsigned int count = 0;& P4 Z% R' U: j  x: q: _: w
    unsigned char rxData = 0;
% R; h0 |5 K; s. l" H3 {) l# F; P1 A    unsigned int int_id = 0;
/ D& W: K" z! m" q" _
# X' _, e: j% b    // 确定中断源
3 v4 ^! t& K2 w8 ^6 J  Y    int_id = UARTIntStatus(SOC_UART_2_REGS);
! \, ?- h- ^5 t4 E5 ~" ?$ g1 G$ e$ X
; w; w4 n1 P! p3 a/ ]7 A    // 清除 UART2 系统中断
3 W* L% w$ h4 ]) [" f3 h    IntSystemStatusClear(SYS_INT_UARTINT2);
8 E1 v7 D- X. K; e' p. g2 W6 ]' ]; h! P
    // 发送中断
9 Z1 w7 D6 m6 D# Z. o) y6 d% a    if(UART_INTID_TX_EMPTY == int_id)( d, O" M# j# \8 S8 i/ I
    {
+ m* l+ G3 ]  `6 r) v. ]        if(0 < length), K' `2 W0 h( D! l& i
        {
6 x: d2 n1 S  L' F  s. q            // 写一个字节到 THR' ?8 v+ _- C2 \9 u6 \4 i
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
5 D' m) @. t/ m1 A4 F' @2 Q! |            length--;; _( d1 L  I" e, c% D
            count++;6 J1 F) Q9 }; Y3 C* F
        }( @+ K- `+ m% h/ w0 Q" L4 i0 |4 G
        if(0 == length)( D7 V" }4 T' ]0 c+ T3 j
        {  y  o4 t! Q: K5 |
            // 禁用发送中断
1 Y  V- {9 N* W& [0 H3 u. l            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);4 ^* V1 ^* s3 H( F* H  Y
        }
  c" s! `/ _2 |# i     }1 V( z- f5 w% R6 {/ q
  `2 ^7 K! e2 a
    // 接收中断
* j+ {+ s) ]1 t9 k9 {: u    if(UART_INTID_RX_DATA == int_id)
  T: o3 ?7 ^! V- v2 h; o% x    {
; j1 Z+ a& E' l* d5 e( ^# h/ J        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
6 t; s/ h9 y' n6 m" [% m  \5 y+ h7 N) S8 y* Y; x
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);; J9 [2 W/ I+ y4 e+ i2 ?% q! z; w
    }; U" u9 K* R  R6 C% `$ `
) c- R- e( J$ p2 e9 e/ v
    // 接收错误
- c& a. ]1 ?5 p* I9 d% N" ]! d    if(UART_INTID_RX_LINE_STAT == int_id)
7 G6 z! H+ ]. V* b. X    {
# r& z7 [' V# R0 Q( G        while(UARTRxErrorGet(SOC_UART_2_REGS))( ~- g( C# i; p0 ?& B) R
        {6 S# P9 {$ \, g  V. K& t  e9 V3 c, `
            // 从 RBR 读一个字节! q& j; D7 p! N% E6 _" x
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
2 D7 R. }! }" r5 Z        }3 j2 n3 O1 L+ |) k
    }
6 x" a3 \8 _# h* Z. |5 Y! Z    4 E1 |; d" {( g# c7 a
    return;
& Q" N: _# A' p1 h}
5 d- J5 C8 `6 g: F
回复 支持 反对

使用道具 举报

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
  I3 Y5 o. s% d  m; \9 L如果其它设备快速给你发送串口数据,你这边能正常通讯?
1 Z% e, b6 L+ ^1 L+ w
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 21:37 , Processed in 0.040955 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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