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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8468|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
% p3 A* Z+ J6 w+ l' q

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。4 \8 Y- C3 v: }( X- _9 g1 {/ p+ s: ^

* Y9 q, d9 n' [8 e5 c! |#include "TL138.h"                 // 创龙 TL138 开发板相关声明. K! {; l0 [/ w
$ T, e& P! r2 P3 c/ ^+ k3 p+ u7 w
#include "hw_types.h"               // 宏命令
( n/ U- r* a0 s#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器; M2 T) P  l8 e/ w4 o7 Q  ?) N
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器8 d/ J6 \6 u0 l' j8 `" O6 o
4 E/ I; S6 A, T
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明2 b1 j+ `, H8 ]% r* y
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明5 P; H$ a8 L9 ~4 t! \4 t! l
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明) P  V# X" \$ Z, P
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
. t! n/ G8 M% C4 }) E2 C
$ J! r3 {/ T" Y3 ?6 X+ `/****************************************************************************/
- v) K' [# ~% U3 z* l# f2 o/*                                                                          */7 r, q" S/ v8 R/ T' l# y
/*              宏定义                                                      */
- ]4 ]" J+ C- T7 _, y$ E5 V/*                                                                          */
0 B$ K- d3 h: i" [0 }: ]- y" d: q/****************************************************************************/
  h$ O; i/ \. ^: N  y( y, W// 时钟% ~# ]- ~5 J. G) T9 p  Y0 V6 o8 {
#define SYSCLK_1_FREQ     (456000000)
/ B$ l, B& J6 W  J& e#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
; N5 y: w9 F  A#define UART_2_FREQ       (SYSCLK_2_FREQ); P# }1 g8 Y- T! T* K- b* T

7 a3 n5 I8 _3 R3 l, V: w* f/****************************************************************************/5 ^0 x; E+ h3 @# v- u
/*                                                                          */
* |: P9 }( M- w( B0 o; d/*              全局变量                                                    */  i4 U7 y, A5 @. U4 y
/*                                                                          */
* e+ z8 \! t5 {, K8 f* q/****************************************************************************/: Y' ~0 L' ?" d9 U/ W# c
char txArray[] = "Tronlong UART2 Application......\n\r";1 s" c9 Q: Z( p. g( T

3 j& E% Y9 y0 V% g/ F$ J# k/ \/****************************************************************************/* |+ T: ~% v# t( A
/*                                                                          */5 t" d; |4 s4 H  n% {1 D5 C" B
/*              函数声明                                                    */
- C! z- R; L# z' v1 T/*                                                                          */! `' \1 E4 X" h
/****************************************************************************/
( h, v; [5 G5 o: \1 d5 L0 V// 外设使能配置6 W7 U3 v* k/ n( }
void PSCInit(void);/ \: J: ^0 w  h3 b7 O3 K; T1 U
# b8 _- A) a, ^6 R1 a
// GPIO 管脚复用配置) `8 R9 C& m4 I9 m: p- T1 @
void GPIOBankPinMuxSet();3 y; O! z7 W4 j, t( }$ N5 b0 ]: ~

0 l) g4 \& y) F* D. g, j// UART 初始化' Q6 b) K- j6 {7 {
void UARTInit(void);  a; H+ u- g; c/ m1 z9 ~
// ARM 中断初始化
: L' M5 m: R/ qvoid InterruptInit(void);
& v/ P' M5 m4 I# H: m! D0 j) _. e// UART 中断初始化
1 N' Z5 u' y6 W6 I% z0 Kvoid UARTInterruptInit();
! {5 R& a$ a8 @8 F// UART 中断服务函数
$ ?$ g' {& ]  Gvoid UARTIsr(void);
+ N. S- D6 y5 G* J" ^. X+ @( \; j- l2 \9 `, ^  n8 ^# v5 K. }
/****************************************************************************/
) a, Y$ a( y1 L" t6 t. \5 D/*                                                                          */
  e3 R; \4 m. [4 \2 R/*              主函数                                                      */
! B8 i6 a5 |+ A" M& _1 S/*                                                                          */7 P8 U6 k9 n! _
/****************************************************************************/
! ~# l# |+ N5 W' Cint main(void)7 w' k- E' q9 z6 _5 z
{  o9 j1 D) H6 e! _$ M
        // 外设使能配置
8 T. ?% `. ~" V        PSCInit();2 S3 g7 f2 h! u
        $ C0 t" z7 {/ y; f* a' K& z  m& E6 V
        // GPIO 管脚复用配置
0 Q" U7 ^6 O8 m        GPIOBankPinMuxSet();
: B& K1 t* m: e
+ f8 o* w0 Z( M% w  O+ w5 I# [        // ARM 中断初始化
- a7 u0 p% X/ U        InterruptInit();( R8 ^1 `4 C2 K; G( W7 w4 G
# f& p- V  [4 U4 ?
        // UART 初始化
6 G/ X; ~5 v2 `& Q# k4 l' W1 }3 d/ n        UARTInit();
% F$ K1 |$ H. Y0 w. }" \
4 x2 M2 k9 y0 E. W! z        // UART 中断初始化9 K8 L9 P7 V& K) ]( i' ^' j! O
        UARTInterruptInit();3 g; c9 @1 t) l( R

' c. [2 @* v, m! M( ~8 O        // 主循环
, a9 F% v1 `* d4 a5 x" d: D- e! I        for(;;)- x0 Q# a# X( m+ F+ a
        {' c3 V+ r3 D" E& [& _1 t; ]' h

) q+ l% a$ u- W/ W* o        }) t( s: W- y8 @5 ~* P& ?; U
}
& m7 V  M) ~/ E
2 i. M+ B- u  C! {' N6 A' k* Y/****************************************************************************/5 a4 |+ G7 U& {" Q$ Q/ P
/*                                                                          */
' y  [. Q. ^* h$ e4 U) U9 y+ ]/*              PSC 初始化                                                  */. Y+ x  \' @# [) I; }
/*                                                                          */
2 U3 p. B3 f) X3 Q" f3 M/****************************************************************************/
5 [* E, _) F, b: F0 ^void PSCInit(void)2 P' y1 X3 m) F
{8 j) b$ f: @6 R8 v! ]; r1 j7 s
        // 对相应外设模块的使能也可以在 BootLoader 中完成
. G4 o- ]/ u6 C8 G    // 使能 UART2 模块9 o! j. P/ l8 K
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
  p% [" d$ D' Y# D2 A! y}" L5 `5 \! f5 t, m6 f

$ j$ \) Z6 F' h- c0 X8 ~1 @/****************************************************************************/
) O; @7 s: l" A1 d+ s; o  o' N  w3 n/*                                                                          */, \" f; c1 }; e8 s( q" P- J$ O( q
/*              GPIO 管脚复用配置                                           */
% k5 J7 d2 w4 V6 |/*                                                                          */
1 f4 n1 R1 K2 X2 d/****************************************************************************/) l+ J2 a0 w0 V! z+ A- N7 `
void GPIOBankPinMuxSet(void)
; S. s7 t  d6 a4 T& H{5 `" C* g  A5 U# F/ \- ?/ H
        // UART2 禁用流控
  [5 A# X6 ]) j6 s. D% I3 u. R        UARTPinMuxSetup(2, FALSE);
& @! \3 o9 j! L$ ?, T7 c0 Q! ]}  U. h& b7 Q* G) z7 l* h3 L
! V" q+ l/ Q- P# b% O: @
/****************************************************************************/+ {1 ]' e4 S8 V7 l
/*                                                                          */$ t! k( k5 l' N% _' B; [' [
/*              ARM 中断初始化                                              */
% g8 }6 h. X# P' |9 [/ g0 S/*                                                                          */- V3 b. {' x; I2 K/ P: i$ |1 Y
/****************************************************************************/9 ]1 S& y* A0 `* t" q3 m
void InterruptInit(void)$ L' K: X/ o/ N; [1 V2 U: e
{4 j9 a+ Y0 U5 ]
    // 初始化 ARM 中断控制器
* X' k) x% j* D# ]    IntAINTCInit();
  r( p  X$ A- d3 _! U3 U) E. w7 n6 x; X. O
    // 使能 IRQ(CPSR)$ ^" P8 c. x7 F! I- d
    IntMasterIRQEnable();- n, d, f4 C) [! V6 b$ @, w

  G' I% w0 A. o/ @1 l1 w    // 使能中断(AINTC GER)
7 z. d! A: Y( L! W/ U9 F4 _! m5 j    IntGlobalEnable();" u( a2 i& @* ^  ]/ ^, }

! q9 }& c3 \& U. Y/ |8 H2 L$ _2 b    // 使能中断(AINTC HIER)9 ~0 I" k# h  x1 C% Q) \2 g0 r
    IntIRQEnable();
. }! |) x/ h2 }! w}
4 J: ~% I) D! Z) _# E1 }" I6 j
& A! F$ O4 A4 C: g/****************************************************************************/
. v# u- t; {- y7 q3 p- q9 @/*                                                                          */
: _! N# r( z4 p" S/*              UART 初始化                                                 */1 ^- M$ h: C: u6 J; d' r8 B
/*                                                                          */  s2 J% c% G% u; E3 V- }2 N
/****************************************************************************// R2 z4 o; W- N" d, c
void UARTInit(void)
1 p, c& i8 U, l& p( H{* K* |! h# J5 u. {1 a& O$ c5 a4 Q
        // 配置 UART2 参数
2 C" ~# U' t2 h! K        // 波特率 115200 数据位 8 停止位 1 无校验位
% F9 b4 e* u4 W9 _2 U    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,# E, ~% L5 M$ t6 S: z, Q& ~
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);& [5 i1 b. ]4 [$ Z4 s
        // 使能 UART22 R$ {1 X. z7 r& V) }
        UARTEnable(SOC_UART_2_REGS);
& ?; ~( J! l6 f& m1 m$ z/ N. p& M0 `$ K; d1 w0 Y  W
    // 使能接收 / 发送 FIFO# k4 W" m" V( V2 P' ~$ W6 u5 V
    UARTFIFOEnable(SOC_UART_2_REGS);
# m6 ]5 \6 C3 q( I+ q7 Q6 S
% N9 \3 k* s4 A/ }# n' Y8 I% {) H    // 设置 FIFO 级别+ D# N, |9 j  P# |/ g2 y
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
" e0 d# n) P0 \}
6 h$ j5 Z: k% Z/ i
+ C* B) u+ @& w2 K# u- u  P/****************************************************************************/
' N6 z% m* r6 o, C/*                                                                          */
. d, E* D( S. U* L+ K8 E+ Z4 c/*              UART 中断初始化                                             */0 [$ ^# p/ L( L( U. M
/*                                                                          */3 h* M0 Z7 l' y& Z5 ]# |
/****************************************************************************/
" U3 ^5 q0 K# W3 b: W8 o, d( f2 O/ rvoid UARTInterruptInit(void): b- \8 R7 G9 Y& H
{5 {  w7 N, U: Q. K
        IntRegister(SYS_INT_UARTINT2, UARTIsr);2 y3 e2 r; R- x) W& T, h$ u
        IntChannelSet(SYS_INT_UARTINT2, 2);# W' [/ O5 P( i6 j. J7 t0 X
        IntSystemEnable(SYS_INT_UARTINT2);
2 T  m) }4 N0 ~6 F7 B5 v, P+ p3 k! S, s0 t' w7 \
        // 使能中断
1 g- b! m. O+ Q0 S7 O: A        unsigned int intFlags = 0;$ n. B0 |3 C! o; ~- ]6 G6 i
    intFlags |= (UART_INT_LINE_STAT  |  \
( B9 J2 o( E4 {3 A, K, I$ g                 UART_INT_TX_EMPTY |    \5 k3 y4 z- r* K5 B; P" E# q
                 UART_INT_RXDATA_CTI);
- z  C' q- a% \$ D    UARTIntEnable(SOC_UART_2_REGS, intFlags);
  z) z9 f# `/ b, i6 p) k* N}5 Z+ U1 F5 l/ S* k
. v0 F0 S- ^9 |: R0 l* X
/****************************************************************************/; u& j' i0 d9 H2 R& }, f- x
/*                                                                          */8 \9 g! n! o7 `( r; Z: d0 {
/*              UART 中断服务函数                                           */3 U5 N/ w$ u0 E  l" |6 ^
/*                                                                          */
) N2 {% l) A1 |0 |$ \/ G/****************************************************************************/. J- S) x$ K; E" i$ }1 K) T
void UARTIsr()
4 Z1 [$ k8 Z2 \& j" u* H2 x{
5 m' b- \* @) @6 i* M    static unsigned int length = sizeof(txArray);
) _5 m" {0 w  J    static unsigned int count = 0;
$ A1 M0 X' j! Z( i3 m. d, ]$ p    unsigned char rxData = 0;
# I+ l$ f% x1 G7 W! f3 N    unsigned int int_id = 0;  ]. ]; ~6 q8 W& V. I$ ^

5 s7 G( N8 p. B$ D: W: H; m    // 确定中断源
4 J5 F  s, }, d    int_id = UARTIntStatus(SOC_UART_2_REGS);- v% h4 v. l- Q0 q
6 s9 f) ]3 V  J; N3 Y3 W
    // 清除 UART2 系统中断1 Q3 h4 o$ s0 |5 M! @0 {
    IntSystemStatusClear(SYS_INT_UARTINT2);
2 g$ k# ~2 J: z* _! D% @6 j$ o( F8 `
    // 发送中断
1 y( c# G% \+ u9 B    if(UART_INTID_TX_EMPTY == int_id)' W7 J6 |6 F8 f% r9 G2 r5 O
    {% ]$ V2 l# V; ^* _9 a4 m
        if(0 < length)
$ `) b: x0 ]2 }5 i7 V. A4 F* ~        {
. G9 J6 c! c  U) o3 e% [9 r            // 写一个字节到 THR
& t2 |$ d1 N" ?            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);  Z5 e: N; q) ^/ m
            length--;
+ O8 g# P9 t0 m) m            count++;$ ]  h; W2 A2 j0 r' U
        }
+ M7 l( `$ r) _; K3 e0 X        if(0 == length)
; s0 p# z: k8 J, g. g        {' r0 n5 K- U! i9 x; \
            // 禁用发送中断5 u' a( O# a) K% e! A
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);: f6 l( `7 {" h
        }
2 l9 N, b1 O8 m5 ~4 G/ _- F  ^  F( j     }; H3 l2 K$ _2 b1 q/ C; V$ `. ^6 U

% I8 G( C/ r% Q2 ]$ u    // 接收中断
4 x5 I: W2 J6 d  _; X/ z4 d    if(UART_INTID_RX_DATA == int_id)
4 q. F4 |" S2 c* _% H- s9 D    {
, b7 R, J- \  b6 b1 ]- L. Z* S        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);/ w- ?* T5 B* n
0 q" E) p0 ^/ E! v
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
# z) ^9 e! A2 }, y# I    }# q& L9 Q6 ]& v* k2 G1 J# x; P5 k7 `

* t0 q8 P5 s/ J; Y2 w  i    // 接收错误
( B( z. p  o* {" W" D& {. C    if(UART_INTID_RX_LINE_STAT == int_id)1 |5 m' Q9 A& \6 P8 w1 d
    {) l: o3 Z: w- G8 b4 M
        while(UARTRxErrorGet(SOC_UART_2_REGS))
: [$ I" }) d% f; d        {
" M& Y- b7 ~8 E: W: N7 m            // 从 RBR 读一个字节" D& e# [0 B9 L* P+ |* t
            UARTCharGetNonBlocking(SOC_UART_2_REGS);8 \* f* b. B) o) ~) H
        }* H8 j' R6 P: B" g! ~
    }. f7 Z% H) D8 ]0 L. y% M$ ]" s0 y
    & ?# h1 u, G: p  t# c) a+ r
    return;
( h3 A: i6 Z' Y) J}7 I- W6 P5 o  D7 s' d# 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:254 j. n" ], @# P5 p+ ?/ I4 [
如果其它设备快速给你发送串口数据,你这边能正常通讯?
, t" ~3 t: q0 e& B! H
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-9 05:55 , Processed in 0.045697 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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