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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8412|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。6 s3 @8 E1 {9 n

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
. }+ b/ W8 q6 }4 [- h! d
& Y( T( _) Y0 w6 \7 e0 E#include "TL138.h"                 // 创龙 TL138 开发板相关声明
, F- _! t% Z8 R( x; i8 t
# t( a% G! m% _6 ?: t#include "hw_types.h"               // 宏命令
, T' G5 Z2 d5 n! d! w#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器8 `7 o; w9 X4 e; ?) x7 s
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
3 k: E3 h; I9 H8 f* Q  u+ b
- U" I  S+ Q, @8 p& B0 s$ {#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
0 c* s& o0 g1 u#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明7 N7 I0 ~* k5 y: Z3 ?9 ~
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明: d. y% V9 h9 w3 Q" g6 Y# C& r
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义- a2 i( i! {5 p- S1 w7 z8 R
; w( R6 J( M) ]: ?6 Z. n  @
/****************************************************************************/0 q/ w6 g% p+ X+ u& c
/*                                                                          */+ |( `2 L( G9 Y  m, E( R
/*              宏定义                                                      */
2 v* Z& o) c1 f6 J6 j/*                                                                          */
2 P6 B  ?4 R' o+ F- y9 w2 _( m/****************************************************************************/
9 T, X. |) X' D+ F9 z+ c. y// 时钟
! x. a# \: d2 b$ M; f; E4 W#define SYSCLK_1_FREQ     (456000000)9 u0 J1 A( E; V& f
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)! d( J- a; E6 K7 K! o* K$ x
#define UART_2_FREQ       (SYSCLK_2_FREQ)
* o$ y& N% j( U7 b* Q: Y0 C2 e% K% O# x. B/ P, Y9 P
/****************************************************************************/
/ `5 p+ f+ w% n7 c& A6 n% Z* f/*                                                                          */
2 Z) L# _9 j  N$ X6 J' {/*              全局变量                                                    */7 P8 P. ~7 g8 B' l; s
/*                                                                          */4 Y. w& j% @. Q# l% D: e
/****************************************************************************/  A4 w( e  O, V- x/ r$ Z9 I
char txArray[] = "Tronlong UART2 Application......\n\r";
6 k* s1 E, Z2 I& v2 t- z# A
/ f, o! F9 o& x/ T3 N/ T, h/****************************************************************************/
/ r$ Q0 H9 z# m/ o$ t/*                                                                          */
8 F4 f/ f0 L/ C6 R% o( `/*              函数声明                                                    */% K% e3 y4 M6 q0 Q
/*                                                                          */
( w9 A) {3 C/ b  ?9 c2 q; N/****************************************************************************/) l7 X5 s7 g9 x3 p& n# u- _+ M
// 外设使能配置2 Q! f" J9 w4 m6 q* m4 \
void PSCInit(void);8 k& a  L7 B8 a# O1 z
4 R. W/ J5 n" q  n4 J9 @
// GPIO 管脚复用配置
; B/ l7 E  j3 L: l: r7 d' [" W/ Mvoid GPIOBankPinMuxSet();
- v( a. X+ ]: X7 J& A# Q% [
  M6 j% t. }5 I% p// UART 初始化
4 {; z  x1 ^5 Y0 P, Z! Gvoid UARTInit(void);
1 w* B) s! X- i$ t/ V// ARM 中断初始化
$ @# u7 R3 s. K3 L, \$ {) ?3 Wvoid InterruptInit(void);) J; Q% J  w# h; `: r- Q$ p+ }
// UART 中断初始化9 ^4 d: P( Y0 e% K: H2 }7 g
void UARTInterruptInit();' [0 K4 y! i2 m, m! _
// UART 中断服务函数
4 Y! r, ^! N) ]* Mvoid UARTIsr(void);* M3 `! E8 Q$ x

6 j# X$ X) z# u( l  I8 T# _* o; J/****************************************************************************/
) O% X* q1 Q6 F/ \7 U/*                                                                          */# P/ T7 Z7 a( Z* _1 c# {
/*              主函数                                                      */
* G& E9 e, z+ q( I. _9 Q' a5 K/*                                                                          */' d3 b$ n  i7 p
/****************************************************************************/
! {9 a  [! J( z7 T" w1 uint main(void)
( s3 R7 W8 s6 _5 ?" e3 D/ V" E{
  j! d, a* ]+ J7 Z        // 外设使能配置
" Y! r% K1 r2 S        PSCInit();
3 |9 d* l8 A, w        - @% Y3 p3 W! ]) k0 r) H
        // GPIO 管脚复用配置  Q5 N5 W' n% E: I
        GPIOBankPinMuxSet();
+ _! F" }9 c" q! D" H3 q  ~7 p. g# \9 |; j: W" ?
        // ARM 中断初始化
* `/ \1 w9 }3 j% n$ l        InterruptInit();
: M3 n, ^8 Y, N  {$ [7 @8 A, b1 T# r7 [/ H: o( j
        // UART 初始化
3 I& C- x8 _, `5 H        UARTInit();
( ?9 Q" k7 ?( B; t  n# G0 A; k0 A6 m
* X- _% [. N% h. w7 i+ O6 C7 b        // UART 中断初始化
( u9 w% t0 k+ C& g, G, C2 _6 V        UARTInterruptInit();  U: R+ t, x$ ~& f4 ?4 k

7 e9 b2 o7 h+ \  J2 o: o  q' f        // 主循环
3 ?" [: f# L' L# S  [        for(;;), k) u3 ]0 M7 A( k4 O$ y
        {
! d# \/ Q% a0 \, W0 h3 c8 y6 ]* f  m  W$ f/ i; a
        }4 I, \4 a- S5 R: R/ f
}& g2 o9 s8 n2 Y" V) E; d; X
; j' i  e  Y1 O
/****************************************************************************/6 Y) u& R! \- k$ j# L. q5 h
/*                                                                          */( ~9 F! X) @7 C( \$ Q. \
/*              PSC 初始化                                                  */# Z7 w2 T, Y, e9 H! e
/*                                                                          */
) n. g2 c& k- g/****************************************************************************/
2 t9 ?4 J3 f9 _8 r, Mvoid PSCInit(void)* Q; F0 m) t6 |
{
( k* w# p1 R5 ~' }        // 对相应外设模块的使能也可以在 BootLoader 中完成
6 R6 z& H, i/ Y3 C/ v) f7 Y    // 使能 UART2 模块: F" I+ W8 o/ X. o" b7 k6 S
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);  |! F7 _2 o  C9 q# {+ J
}  t1 r+ O2 ~, S. ?
) B$ A7 Q) Q( ~1 p( ~2 V, {
/****************************************************************************/
! d/ {6 R& x5 |! T  f8 H/*                                                                          */" I3 O6 {- N$ t
/*              GPIO 管脚复用配置                                           */7 q$ V- r" L" o+ s1 A6 n
/*                                                                          */
# Q2 w7 I. U& t/ e/ V8 ^/****************************************************************************/
+ d" k5 N; t2 }6 ~8 S+ ^void GPIOBankPinMuxSet(void)7 |" H) r" D: _4 T
{$ v' q' r$ d3 l/ l* t; S& d' Y$ y
        // UART2 禁用流控
' {4 t/ V" B  C" O# ~# r        UARTPinMuxSetup(2, FALSE);
$ m* f3 A+ J. w! V" L}" ]' S7 k' I7 w4 i# u" f

: i0 N; g; t, L( v- A2 Q/****************************************************************************/, r% W4 w/ @: m7 b5 @6 X
/*                                                                          */2 D3 y- E- M, `1 G! Z, f
/*              ARM 中断初始化                                              */
: I3 ?0 `# M  e1 }+ l& U/*                                                                          */
$ M6 e7 d& t$ C" r; q9 C7 B) F/****************************************************************************/: L& t3 r3 T/ f( ^# ]$ x. _) h# w- l
void InterruptInit(void)
& b& W+ l5 E5 {% ^6 w{4 j$ n. n; m+ s; u
    // 初始化 ARM 中断控制器. ~' U  G3 }4 U9 P2 |' w# R' m
    IntAINTCInit();5 @, k( V' I0 n  x* b
# n0 V) _' o; w/ [5 ]% }* b
    // 使能 IRQ(CPSR)
" V- W5 ]; W( c5 q1 A    IntMasterIRQEnable();$ J* D3 a! O! M, M( t# n0 n7 g
. f) y  K/ F0 l. v& }! |
    // 使能中断(AINTC GER)
1 J9 [4 U$ k  w    IntGlobalEnable();
/ f4 a8 s5 Y0 {$ N4 Z& Z. P3 h5 C/ c
    // 使能中断(AINTC HIER)8 q4 c1 M5 J' L8 R
    IntIRQEnable();" w( a, U9 ?) S0 ]
}( J' M( ~. o9 O3 J% {

5 ^2 C! ~. x0 V  F2 E8 _; [/ r/****************************************************************************/% c/ L3 s7 E6 Z! m
/*                                                                          */& @% z# }$ A( M7 C7 k
/*              UART 初始化                                                 */: n" |% v% \: c0 d* X2 u8 P/ h% R6 T
/*                                                                          */
; {( {: j7 R" R/****************************************************************************/$ {( J7 O! \! W/ t* ?( _  f+ v) u0 N& a0 x
void UARTInit(void)
& M# k  M' [) Y, [' C/ e7 K7 T' {  w{" F& J" j; ~# b2 r. d
        // 配置 UART2 参数$ N# W* C: X  y3 S
        // 波特率 115200 数据位 8 停止位 1 无校验位( p" [) @7 P6 m4 `! e4 U8 Y
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
: r# q, B) I; @% g2 }( q                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
2 ^. j( l3 W% P2 N        // 使能 UART2: x; E) V2 h# p0 p( h: z
        UARTEnable(SOC_UART_2_REGS);
6 F. ?7 T$ h' \2 L! k, e, Y
3 C8 E" {0 `- k  {+ Q    // 使能接收 / 发送 FIFO
* m& O! |, z  ~: Y: h5 M  E" U; J    UARTFIFOEnable(SOC_UART_2_REGS);
) m' W5 t- `9 g9 ~! P& ]2 t, ]
$ e7 f: s) M1 K    // 设置 FIFO 级别. f( N$ H; x" U! _6 E
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
$ K, \% Q5 b! r- o4 p; i" M- S* w+ c}
7 j1 L0 k  U# _! D% j
& j% S; m2 A1 ?/ c! H/****************************************************************************// f( n! g; m" a9 P
/*                                                                          */
2 Q) ?# Z0 @# m5 y$ }- O/*              UART 中断初始化                                             */
& w0 J* l( c( P/ {! e/*                                                                          */& |5 b4 j6 y& I, I- Z! d
/****************************************************************************/
+ G- L8 e3 c7 j# S7 }$ J8 wvoid UARTInterruptInit(void)
! p- S) ]% m8 B' ?% r9 {, w{
5 D. u% i* S4 h' I; O4 t1 i        IntRegister(SYS_INT_UARTINT2, UARTIsr);
4 G2 r' G* r* G' q0 ^1 X        IntChannelSet(SYS_INT_UARTINT2, 2);
$ v  r, X4 @: m, R- S2 C! N        IntSystemEnable(SYS_INT_UARTINT2);- h3 ]5 z$ c( n; u1 l

6 U4 L# _: f! K! E. t6 P: D        // 使能中断
! A; n/ O! w- A, V        unsigned int intFlags = 0;
% o: t# x  q4 B5 ]% p  M    intFlags |= (UART_INT_LINE_STAT  |  \( o  _% B% W) r" K' h
                 UART_INT_TX_EMPTY |    \% O2 I# x; ~6 t8 Z  N. H" I
                 UART_INT_RXDATA_CTI);
4 @# I0 T& A% {, b, d" [0 y) E, a0 V    UARTIntEnable(SOC_UART_2_REGS, intFlags);
( {+ F4 I, s. @) I0 G}7 H6 w* L4 w! \( m  d

6 Z/ ]5 @. w4 k/ U, m1 k- K/****************************************************************************/; j) h  W& N* D. M8 _( ^
/*                                                                          */
- K, `% F6 ^  e; Q9 W" B4 |6 d/*              UART 中断服务函数                                           */
- k2 }( q) y8 x2 f; N4 b6 \/*                                                                          */' D6 X- ~$ @6 z; `9 I0 ^
/****************************************************************************/
5 b: H- B8 Z9 Wvoid UARTIsr()' H0 }: I/ p% V$ L/ ^3 L  H* m
{
4 y" ]) ?& W) o( i$ {! h2 W2 A0 D    static unsigned int length = sizeof(txArray);
* B: ^: @! `( [. N    static unsigned int count = 0;( ?& P2 t) M6 ~3 [' y6 M$ [$ S
    unsigned char rxData = 0;0 A4 L0 _5 G3 Q& {( j
    unsigned int int_id = 0;
, _7 O) d5 a6 E' R4 l
5 h% G& `, u& c* d; K    // 确定中断源/ E, {+ g7 |* G; C% B8 T' z
    int_id = UARTIntStatus(SOC_UART_2_REGS);
( m$ j# b7 ]- z7 v1 v& k
. t( {8 y! s3 I' K" P% j/ y. a4 c    // 清除 UART2 系统中断6 D0 R) Y( Q' ?& k' M
    IntSystemStatusClear(SYS_INT_UARTINT2);7 ^) `, x, D7 M* Y+ j! m

; P% [! M) P6 f$ x2 E4 s9 o    // 发送中断
8 r4 Y# }$ r$ t* y9 B) l    if(UART_INTID_TX_EMPTY == int_id)$ _% H. `8 X  w0 r+ B2 @
    {
- v. u5 y+ G' _  U' [        if(0 < length)
/ W7 a2 F& n) \; b  W: S# `1 h        {
4 n7 G6 p: x" }+ b/ P* v3 s/ E            // 写一个字节到 THR
! x# T( r; m' m$ U) D0 ?: U            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);( n8 D# r( n3 K- S! f3 p" E: k
            length--;* }2 T& x% A: m0 N) J, r- }3 s( P
            count++;
; S+ A8 L9 k6 G1 c% |7 `8 {2 A; K        }8 R! f6 _& o" z  T4 o) b# Z& m+ y
        if(0 == length)
, {9 R# \1 D4 U3 c* t        {
" O, h; P. U3 }8 u7 ^) M            // 禁用发送中断
% E3 `6 ?  g2 t( ^: o. x+ }% q            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
) J0 u$ R- l: f! c        }
  J# _# ?: ?+ Q& f4 j     }
( Q5 a5 `0 R1 U: S$ t' c0 O1 i. v8 u+ B0 t# z6 P% l
    // 接收中断' y* k, S7 ~/ Y4 M
    if(UART_INTID_RX_DATA == int_id)
: C, E, t" x4 T' r4 M' i0 y/ H    {
+ p; \; k: e5 d/ A* H1 E5 }) D  y7 |  j        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);$ {  G+ w! Z' u* l3 P

$ |  k+ L5 ]- j  R+ j  n$ [        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
/ X" v$ D& B8 j# s1 k    }
: c' \9 L+ K, h* `. z8 N, i7 o0 P1 B
    // 接收错误- j5 u, v9 V# b! g3 Z2 l, u# R
    if(UART_INTID_RX_LINE_STAT == int_id)
( T! B2 E" x4 L* |1 I  h* u- r    {
3 F: f' F. ~5 r2 v" r8 z2 E        while(UARTRxErrorGet(SOC_UART_2_REGS))! t  _& O  }- B- s0 u2 c. f  |
        {
- V$ q% C- b. {1 n. @: ^; B            // 从 RBR 读一个字节
- Q0 I0 z! e# I            UARTCharGetNonBlocking(SOC_UART_2_REGS);' f/ f6 V  ]" q
        }4 S9 \! g' U( ~! |0 ~* w
    }% b3 w/ P  }' o( P: E# Y
   
/ h# u& E1 @, G5 v    return;
: r( b! I1 y' x- w/ |5 n}
7 p. ^  c& h; Z
回复 支持 反对

使用道具 举报

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 ^$ a; S( e; }, L) v
如果其它设备快速给你发送串口数据,你这边能正常通讯?

/ o+ q7 i2 f0 U- H& D' F谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-29 16:51 , Processed in 0.046843 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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