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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8689|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
7 X7 f& \! N; u& |" i

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。- k$ Y+ t8 a( A$ d6 E

- I: W) V( \+ l; o! M3 x" T: n; N#include "TL138.h"                 // 创龙 TL138 开发板相关声明( _1 I/ J5 v$ q! @- U* q9 K. O
$ F  C3 u( o  i' P; z
#include "hw_types.h"               // 宏命令
# K( H7 `+ c5 W) j& w; X#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
4 m- v" X) Q( R#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
& a) s+ p$ z. n) Z. v7 T9 J. S7 }/ e' s( ]1 Y
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明) v8 j4 c* G3 z( @! a9 V0 B1 E& ?
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
, \$ H, L# u& E1 |, ^' T! r#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明- n5 k3 c% I" @1 D8 W2 G7 B
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义- ~$ U( D( L7 `4 z3 B: v
+ z  W. p' |: ]* a+ l% ~
/****************************************************************************/
. v& T' p9 v* ^1 f/*                                                                          */
( Y" N+ c4 ?6 ?% s& d6 g/*              宏定义                                                      */+ ^/ }* r8 F. u( N
/*                                                                          */
2 P' s: U6 S0 _0 z$ X# m/****************************************************************************/
# Y$ u/ x* U& j. e9 p' g' E// 时钟! ~. f' Z( I6 O
#define SYSCLK_1_FREQ     (456000000)
4 ]/ }8 T( k. W# v2 c#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)+ d9 z' b) q3 j3 i, I. _3 p  M+ F
#define UART_2_FREQ       (SYSCLK_2_FREQ)
8 Z4 O( x- q' o# b8 w/ R( i
/ I5 ~+ x* Q; t( B. k/****************************************************************************/
1 l; A- a4 s( P% J+ [/*                                                                          */
5 B. R! }$ Y# g6 u/*              全局变量                                                    */
( m6 Y% v0 O" ?. d4 J4 G+ ]/*                                                                          */
: m( P5 z1 a: \. b9 w# Z' Z# i. l/****************************************************************************/
* a# ~0 w1 m6 M4 E+ U; B& Bchar txArray[] = "Tronlong UART2 Application......\n\r";
8 R8 m: i: a! ^1 q2 Z! ^5 H1 i/ ?" K4 ~- e) \! |% k
/****************************************************************************/
( |) y5 z% S6 Q) [* q! m+ t/*                                                                          */; O. v1 h4 P6 l2 J# j
/*              函数声明                                                    */
8 ~- r$ F2 n0 R5 T* D3 s/*                                                                          */9 Y* {3 k8 s3 e! k$ r6 G3 X6 `! q$ \
/****************************************************************************/& Q) m' F6 a3 X' X1 Q" `8 z
// 外设使能配置
  v" [! ~7 B( ?void PSCInit(void);% K/ J( U- Q- g4 R' R

& A; I7 B' O, Z( M$ p1 d// GPIO 管脚复用配置
# ~- N4 d2 B0 x7 [) f/ |void GPIOBankPinMuxSet();
! H  M1 B! w8 X5 X- d) y. ~8 G* n& L
// UART 初始化9 i. A- W, ~1 W
void UARTInit(void);4 h7 x7 A( J0 ~8 c
// ARM 中断初始化" S( z/ s0 a8 q" E
void InterruptInit(void);
8 n$ q/ n+ b" }2 D/ u5 u// UART 中断初始化
5 O, H& _4 P( t) O9 T. nvoid UARTInterruptInit();
2 V" R4 j( |( G( b+ i5 b) o// UART 中断服务函数& x4 l3 k6 @8 s3 {9 v
void UARTIsr(void);: h1 y( M' r! F+ E/ O% ?0 {- N4 G" ?

7 W3 V* |- E* K& i/****************************************************************************/, p( v$ B0 v, L, a+ M% C" G0 \$ K
/*                                                                          */) \# {1 T  r% m3 z* Y* O" J
/*              主函数                                                      */
" x7 a+ p5 g8 ]4 {" g8 t; ]/*                                                                          */2 y# x/ l, o8 e* F& H2 T
/****************************************************************************/% b  h5 M. a2 K4 c' p
int main(void)
0 A/ K. v& M& P6 y{4 v0 E% A; \! m6 S, [3 p6 Y1 J
        // 外设使能配置
& `% A/ Y/ g  y% n9 E        PSCInit();
% T" r1 r* r" ~5 Y        " C: \4 m: o. N! f4 ]
        // GPIO 管脚复用配置
# K. P" ^1 ]# ^( ~) D* q9 T; C        GPIOBankPinMuxSet();; p- W: L0 l1 ?- M, L- G

6 l/ [3 ~/ R) R1 c        // ARM 中断初始化
1 ~/ M2 a0 n4 x; f" u        InterruptInit();4 U% C8 O: v/ M' k+ O! R
5 U  n- Q0 _. u8 F+ c& R
        // UART 初始化
; U! i" @4 D& C( L" c) G/ Z        UARTInit();
7 E- I5 Q; v2 c# B& @) E. b7 h
8 ?. n! t0 ]- H5 K0 D        // UART 中断初始化& k# P5 j- l( `' _
        UARTInterruptInit();$ s) F4 g/ C1 I

- ]5 u# {3 @8 s4 O& P( |- b8 U        // 主循环
9 ^$ w0 V0 P6 i9 W* j2 b        for(;;)+ H" ]2 j7 J$ k$ F% d
        {
1 x4 p  {7 ]% l- v) |" }: o8 c  Q( p- ~1 B7 ?9 n
        }
5 h5 y- l; `9 M2 @9 D* T8 X* `}/ \  Y  Z8 S- d& R8 [( t

( `3 Z1 P, H( x: o- W7 J8 a2 y* G! }. r+ {/****************************************************************************/
# G: n& R9 F& J% x$ l' s  p: x: M( j/*                                                                          */
) |9 L* \" z) ]2 G/*              PSC 初始化                                                  */; ]/ o5 ]1 T9 z4 i( d1 N4 [
/*                                                                          */  w- ?# }7 D  e9 @- |# C
/****************************************************************************/( d' y. S* N. Z6 s) s
void PSCInit(void)- U$ T& u: c8 A
{/ w2 O; M) X+ t7 i9 P+ l! W
        // 对相应外设模块的使能也可以在 BootLoader 中完成! D; R2 l9 j& w: f( ]5 `' s4 ^  t
    // 使能 UART2 模块
4 V& n# H2 B2 G( p, N- w- ?    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);, U) t0 c9 |; `
}
6 J7 w5 r, X2 {7 p& P2 k8 Q, [* G1 L
& E; I( p8 P2 a. E/****************************************************************************/
0 H4 c4 c; {2 Q. a9 y/*                                                                          */6 A+ B9 q; h4 l4 M5 g! v/ Y
/*              GPIO 管脚复用配置                                           */, P+ B/ W; a# b5 v/ p7 K
/*                                                                          */$ ~7 d" g, G  v: D5 g
/****************************************************************************/
; H/ e5 o, b, U+ r! l( Hvoid GPIOBankPinMuxSet(void)
0 [: w# c9 D; w: ~; w4 k{& v/ R/ H5 b) c; E# ^
        // UART2 禁用流控8 p1 V$ a6 V1 G- k' `
        UARTPinMuxSetup(2, FALSE);
" I3 I. v" x4 {/ d% N" I}5 t! r) P; Q4 l5 n; c8 Q

' @5 l  j$ i( \5 E% C/ ]4 [9 K/****************************************************************************/
. C$ u  d6 p6 h9 ~/ @7 B2 }3 ]/*                                                                          */7 N% X+ o* q2 g  \
/*              ARM 中断初始化                                              */+ n$ \6 K+ j( W: l# l
/*                                                                          */2 P& b; {' B# ^& u. r# S
/****************************************************************************/
8 K' d6 B) p8 C2 ~void InterruptInit(void)% @0 x8 P4 V' E$ H% t8 {
{7 P1 Q9 a7 I. T' ?+ D
    // 初始化 ARM 中断控制器
. U0 ~( g' b8 G* T    IntAINTCInit();9 v3 ~% h+ H0 D- N* f

& M( x0 V* s& q. s- ~. l    // 使能 IRQ(CPSR)
+ `1 X' I& q, t) n& W0 j- X    IntMasterIRQEnable();7 V2 \* v& ^! m- I$ `: k' i  P9 n; e
, |, C# \/ @/ [7 D" ~9 L; ^: ]
    // 使能中断(AINTC GER)! w4 i" B4 ~4 Z2 b
    IntGlobalEnable();) B/ o5 O7 x8 A

1 e* X7 F5 @# Z9 `- a    // 使能中断(AINTC HIER): R7 V; D8 ]( o* d6 ]
    IntIRQEnable();; [3 k8 C# y/ q  K' z4 f7 i8 J
}
, ~" o* }$ F# A# J6 _8 @* O6 F2 }6 y0 P3 ^
/****************************************************************************/
4 ]# w8 Y% v( g4 j/*                                                                          */1 ^$ x/ d1 P" K5 U3 g5 U
/*              UART 初始化                                                 */0 _" l6 l- L& l
/*                                                                          */$ p& N5 p1 }* {1 L" D$ L6 |# h
/****************************************************************************/
. h4 _- V3 F6 [4 Xvoid UARTInit(void)
: V& W, J  [! k3 \' h! G{! G2 A3 S% }* K2 e8 ?
        // 配置 UART2 参数/ X% P: f$ y/ y
        // 波特率 115200 数据位 8 停止位 1 无校验位
6 o1 X/ h+ \$ `2 `- N$ T    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
9 P+ E7 e3 X6 L+ ^                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
. Z% s% m) o* g7 n9 N. l        // 使能 UART2
( W  J! r6 N, B; i  ~6 d        UARTEnable(SOC_UART_2_REGS);
) c1 A7 Q+ ?/ A* I/ S1 K, `/ t- q( N; E, W1 f! c5 d
    // 使能接收 / 发送 FIFO& d0 O% G, q; q
    UARTFIFOEnable(SOC_UART_2_REGS);
4 D% W3 ]! \5 E& m
3 N4 u3 o& C+ j& L2 I" V% X7 z* |/ g    // 设置 FIFO 级别4 M0 H# i' \9 q: T$ f9 _9 D
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
7 I2 u8 P: F+ T2 `}
7 e* @% F, _* k, \% |# j9 f9 w/ z5 M5 c5 V* y: `/ t
/****************************************************************************/
% g# T  T7 ]8 V8 b8 E/*                                                                          */
/ o6 ?: [3 f% a' L  e5 ]1 I& r/*              UART 中断初始化                                             */# W- M* ]: h: T, `5 ~8 W
/*                                                                          */
- b' A' A: C6 b( ]/****************************************************************************/2 y+ ]: m* g# k% t
void UARTInterruptInit(void), i& _, V6 X* a6 {, f# w( L
{
2 h1 q5 ~. x8 [8 ]( H0 T        IntRegister(SYS_INT_UARTINT2, UARTIsr);8 U+ B  {, j  L* ]! i1 E5 P# x- j
        IntChannelSet(SYS_INT_UARTINT2, 2);
' @& s' `0 j/ Y        IntSystemEnable(SYS_INT_UARTINT2);
: p6 Q1 f3 [6 `0 ?- n2 V5 e3 s1 Y$ n" j5 R
        // 使能中断7 c8 F7 Y) Z. a
        unsigned int intFlags = 0;6 m  x' @1 g- U
    intFlags |= (UART_INT_LINE_STAT  |  \
. V& K) m/ \" |& @- e- y8 ?: |                 UART_INT_TX_EMPTY |    \- l* Z* c/ k4 Q/ `. l
                 UART_INT_RXDATA_CTI);
7 N; V: v- t. M' K    UARTIntEnable(SOC_UART_2_REGS, intFlags);2 h- Q. ?$ A2 z  h/ U8 T
}
  O$ g* W' {2 ^, |4 z) @5 k
" Q8 ~) e- c$ r( T# Q. T/****************************************************************************/
* f5 ]# |" I, E' [" b/*                                                                          */
5 z- a  \0 q9 _" x: I6 C/*              UART 中断服务函数                                           */& G# z) o6 }- p6 @0 ^
/*                                                                          */+ a2 `2 c% l. {! v$ l0 y
/****************************************************************************/
! i4 j0 {& T5 m4 v5 Ivoid UARTIsr()" ]0 n1 x4 @; X+ r
{4 v2 Q6 q& j6 q0 o
    static unsigned int length = sizeof(txArray);+ ^$ I2 @: M+ S+ K6 @
    static unsigned int count = 0;% K) T% a5 z8 P- J. g. T9 K7 v
    unsigned char rxData = 0;0 f1 A* q" T+ v! v  `, A4 D- [2 k
    unsigned int int_id = 0;
3 H: @2 K" S9 [' h9 S" G1 m# _! a; F
    // 确定中断源2 Q  M# `3 P% l3 W. d/ ~$ h$ b) j
    int_id = UARTIntStatus(SOC_UART_2_REGS);- ?1 P6 V' l% g$ d' E" W8 u
2 ~  k! h5 w  Z/ J; W2 s
    // 清除 UART2 系统中断) k6 D' V5 A0 {/ v8 H: E* x
    IntSystemStatusClear(SYS_INT_UARTINT2);2 [" F' L' C1 j, V
; C% ?# E) A2 Q$ M1 K6 w5 ~
    // 发送中断* p3 Y+ S6 \. f. w
    if(UART_INTID_TX_EMPTY == int_id)
$ c! l% I. }2 e$ I# x9 d' ?    {& h2 s8 D9 r9 o( n
        if(0 < length)- Y9 u6 @' O! D4 a8 G; z0 E; `: D
        {
: n! U/ `0 K7 [: R8 v1 x  U1 l            // 写一个字节到 THR
0 `" }. v- E  J( V3 M8 `0 t            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);# e4 i' P: d0 X% H8 a8 q; f, f
            length--;  ?8 Q8 |# _6 l8 W" @( o# g
            count++;0 F0 k1 N$ G/ C1 n# r$ [
        }
  i# C5 g) z; c5 Z% @1 ^7 _        if(0 == length)
9 y8 u7 ^3 M4 Z        {% c8 X1 u. U! }6 O1 ~  z
            // 禁用发送中断* A: Y4 A8 J/ O3 b! E5 n
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);4 X0 H) i# k( Z6 f
        }
3 j9 b8 h. o# A3 I2 M     }6 m. C7 K/ \% k% v7 \  W* L' w

5 p$ M8 A: T2 D' Y8 V    // 接收中断" i: [# G* u# z) U
    if(UART_INTID_RX_DATA == int_id)6 Q' O5 }* |! f* ?7 ~+ R) ?* z
    {
# }# h+ i7 Q2 h' w& b9 _5 F* |8 L        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);5 Y) }: m9 ?: G6 p5 j9 }% A
4 J0 y; P) o/ h
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
0 g) |' E6 P6 \, |& A, l! W    }
9 u& J3 k* @. l- [- L- O- t1 ^: i9 y: B; @
    // 接收错误
4 e/ A# y4 `" {    if(UART_INTID_RX_LINE_STAT == int_id)
: x6 S, V& b: p# m& \9 ^    {
5 N" E* T1 w7 K3 g        while(UARTRxErrorGet(SOC_UART_2_REGS))7 t1 |; P# L  y
        {
) s) g1 \5 J( [. d            // 从 RBR 读一个字节
- }; I  ~4 k  H: i, d6 `$ _            UARTCharGetNonBlocking(SOC_UART_2_REGS);
/ Q! \4 ~- Q$ l) V) x1 f7 a! L, x        }4 o( c8 S; i5 N4 s7 T4 j
    }
8 q3 W& y) I: I    3 D" N' M/ u* f. q
    return;  w' b5 _( F: |+ G9 H* o
}3 ?( M5 T2 I# M% Y
回复 支持 反对

使用道具 举报

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# o+ C8 @( P& P( Q# |' i
如果其它设备快速给你发送串口数据,你这边能正常通讯?
# V0 y; e# k& f0 }
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-1 09:13 , Processed in 0.045763 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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