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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8499|回复: 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 B6 r/ T6 _# Z( }

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
, U8 o. @1 i. p9 B- j: X" _" d) t9 f; A! |5 N9 k" U2 e! k
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
/ F% Y" @  S8 G7 a& y" X" \5 [/ o" \3 Z/ n+ F
#include "hw_types.h"               // 宏命令
1 e4 [, F1 M4 C; q/ a: ?0 k#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器) ~$ i3 D# h2 F9 Q4 M0 j2 e/ o
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器6 a' C/ X* c) r1 M% z! P8 ]1 l0 V$ T
2 j, H2 v" y& A# N- d
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
" O" i2 ~1 v/ s4 P% _9 _; B3 g#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明) p, @" L- R9 V, t! G( D, o% @
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明/ F) B, `1 q0 A
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
- T0 k, y$ ^& O% @! e1 {1 B) L* _' O* U; S( v* h
/****************************************************************************/
+ [4 v, O. E0 w6 }! z# W9 }* R/ s/*                                                                          */
# w3 J" g" w4 S% U/*              宏定义                                                      */8 a* V2 S$ n" R; A  a! _; d
/*                                                                          */
0 q1 d9 O! F9 ~; ]) q/****************************************************************************/% ^. b$ _6 Z  s& x
// 时钟
; W9 }9 C/ y5 Q# n7 a#define SYSCLK_1_FREQ     (456000000)( F3 N* m1 t. x3 T1 X
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
/ @5 V$ |2 [6 J( D: J#define UART_2_FREQ       (SYSCLK_2_FREQ): {0 y" t" i2 m4 o; H& E

2 E. x( R  A( x/****************************************************************************/' i8 b: D$ n+ I, A6 V
/*                                                                          */& I' n; I* F$ a3 G7 ~% a3 N
/*              全局变量                                                    */
8 ?3 p5 l# T8 U2 _" a/*                                                                          */- j( x) ?5 a  Z& V( b
/****************************************************************************/
5 |4 _3 T. U. t. M9 U/ Tchar txArray[] = "Tronlong UART2 Application......\n\r";
' ~% t7 T# A, z# P8 x$ m- m8 @+ I! ^! y! e* n
/****************************************************************************/5 W; q! a1 F3 r
/*                                                                          */
, K! q# L( I) Y4 o/ E/*              函数声明                                                    */* m+ V- c; o1 d) A7 K# L
/*                                                                          */# l/ k2 W1 ^! a& p
/****************************************************************************/
& d/ u; y* \) }+ R' b3 t// 外设使能配置8 R9 t: [3 [4 t- w* W! S
void PSCInit(void);
8 l3 o2 Z* r* r' b9 ?6 X  @
/ E- Z& H$ [$ }) l6 |// GPIO 管脚复用配置
* I7 a) `5 B. n% H- t$ O5 Ovoid GPIOBankPinMuxSet();1 }+ `% ~, `( c; ^1 Y0 \' V4 g. W

( j: I0 I7 `2 W. e' N) n3 u// UART 初始化! ?3 s% i9 I2 f( B$ S/ _
void UARTInit(void);% z  d4 l$ O. e2 u" x' z
// ARM 中断初始化1 ~9 V$ }8 e5 N& K$ x
void InterruptInit(void);
8 E/ \" J2 ~0 l: w4 p// UART 中断初始化7 P/ k+ Q5 w: r; ^9 J. ^0 y5 B% l
void UARTInterruptInit();, y- t5 }3 F/ m, ~
// UART 中断服务函数6 G( k* S, g$ b) p! X" v
void UARTIsr(void);- K) y  A+ p# m+ f7 @

1 _) j% @1 \4 x# M  s6 U& N' x; Y0 K/****************************************************************************/  [+ M- |' g! m4 V( q- y2 a
/*                                                                          */
) C2 Q( _- I" c1 s2 R; [/*              主函数                                                      */
! r% W5 d0 K6 |- v/*                                                                          */
6 r* I3 Y: E3 w9 E4 F* t. N/****************************************************************************/
$ ?1 }- p+ w0 X: k# u% Tint main(void)
: f1 E% F# c" e' Y  V{
) R: h" G$ `' U; M/ a" E        // 外设使能配置2 |+ C' o9 B( ]" l  |0 S
        PSCInit();5 r. F7 T5 o6 B$ ]& X7 t
        ! i. x4 T/ f$ @
        // GPIO 管脚复用配置$ @8 K0 F) ~6 G
        GPIOBankPinMuxSet();) g3 P4 Y: a' R4 y" l

1 g+ M8 q' O" H- B$ A8 v$ c+ c        // ARM 中断初始化. `* C# T6 S7 Q" j6 w1 q
        InterruptInit();$ `  t) w$ `; m, O9 \7 \; r

, q, Z  X: n( `4 |- `; H: T: f% {        // UART 初始化
4 s& M* V; v) O/ R9 V5 W- a6 X$ U' X        UARTInit();( R8 o; F2 |' l6 H9 o0 J

, ]3 V8 t( W3 m) p- \        // UART 中断初始化
& @% O- R% C4 H& t* u$ o; U        UARTInterruptInit();- A' @7 F! ^  i; q% n9 V

( k4 H, Y: A2 A4 N) H- d; i- z        // 主循环
) S$ j$ a: p- C+ p        for(;;)
( h: ^7 m: n- y& b2 N8 y+ }% q        {
: T+ }5 Q( W4 I* T, {8 T" N( }
. h1 X+ W, L' N        }
1 G1 _" |. i6 F}6 n  R3 a; F$ n+ \; p2 Y

# B5 w3 b9 S7 p" l/ n+ g8 H/****************************************************************************/9 B6 y  d( A3 `4 ~3 k6 I1 {
/*                                                                          */3 W) b  ?8 y7 c' q
/*              PSC 初始化                                                  */* v6 E! l9 F4 ?) Q; t9 u2 a
/*                                                                          */, Z3 w: I( d+ V; Z
/****************************************************************************/" K& i8 e/ S7 V. q
void PSCInit(void)
  v' L6 W6 R- k" H{
  a  X! D8 o9 V        // 对相应外设模块的使能也可以在 BootLoader 中完成
4 f: l4 i$ c7 Z: i% q* u( b    // 使能 UART2 模块
7 \8 `4 {! Z9 `6 S2 C- @    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);( m$ s, W2 o/ G6 V
}- x8 s8 I5 H# b

8 K- i( P$ ~  D: O" |9 _' |) c/****************************************************************************/
5 D1 L5 \' p* a5 W- c! X/*                                                                          */
/ x6 e! |0 g9 v: c4 Z- {7 l! ^/*              GPIO 管脚复用配置                                           */
0 l: K1 j; K/ `9 u/*                                                                          */
/ I7 o; i2 l' ]1 O9 T/****************************************************************************/
5 p0 O1 t1 l" p! f5 M# Evoid GPIOBankPinMuxSet(void)" w, O9 p" {% k, A) ]' S+ d3 z
{
5 a+ s. [* E8 e' A        // UART2 禁用流控
/ m* [* P9 o! m        UARTPinMuxSetup(2, FALSE);" O/ s/ L$ v* v8 \' u4 g4 M* G( U4 y5 C
}. |4 }' z8 n2 F" K' U6 g/ V
) D+ ?( D  q) h
/****************************************************************************/
& N8 y$ c3 o  Q; I* \, m" Q: _/*                                                                          */3 Z" p  p5 D4 g7 M  }
/*              ARM 中断初始化                                              */
) h# A3 V5 \7 F' r+ ]/*                                                                          */7 d/ Y* m. l* l2 H8 P
/****************************************************************************/
4 ]" ^2 [) b# P5 s0 Hvoid InterruptInit(void)
. H; c9 Q  u6 @{. {" Y4 b5 d) i4 t+ t
    // 初始化 ARM 中断控制器
# d; |; |# \+ s5 T. b    IntAINTCInit();
/ Q* y6 u8 z1 H1 P  N1 w, U
+ w9 t5 i, F! d& F    // 使能 IRQ(CPSR), g1 L" I( p7 ]' J
    IntMasterIRQEnable();4 X6 `0 `4 _. D9 `' G& j) b' s2 g

' D0 h4 O& }  e, i1 D1 w    // 使能中断(AINTC GER)
) e/ h) m- ]' m1 Y) U! P    IntGlobalEnable();1 ?* D, t, G  T! I; y
- y/ h8 j+ J7 s8 u% Z' n& s9 P  l* d
    // 使能中断(AINTC HIER)
7 A3 t2 \& d1 N" Y* t+ ?' f    IntIRQEnable();' K' W) t% [" i! H" m
}$ W* \) ~, {  `6 G. i: Q

9 z# W1 Q$ I5 A& t4 a/****************************************************************************/
& q/ x# {6 x" g% d9 S/*                                                                          */
3 J# ?5 }2 `, U( G7 `3 S9 ~, i/*              UART 初始化                                                 */8 f- s* g  P/ B# M) h. ^' f& L1 i
/*                                                                          */
9 Z" c+ d& o7 G/ s: \5 N: A/****************************************************************************/
' C$ i1 Z  m1 w$ e8 a7 ?void UARTInit(void)" V6 X9 L: M; l9 |
{
$ w+ G, I9 J9 ]& `  P) ^9 d7 W( z: V- t        // 配置 UART2 参数( Y9 w& t+ S) K# |: v, @2 Y1 h$ M
        // 波特率 115200 数据位 8 停止位 1 无校验位' B4 z4 U+ K) _8 S* V
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,; k6 R; O9 X! u# q  \
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
  \& ]( @* d. H) U% g' Z        // 使能 UART2
0 p  e3 V- L4 Y- W- ]' U        UARTEnable(SOC_UART_2_REGS);
  M5 Q2 n6 H, c+ _
( T* l+ ~* \. K! y/ g; H# ?    // 使能接收 / 发送 FIFO; H3 O' I4 @+ a3 z* p
    UARTFIFOEnable(SOC_UART_2_REGS);
* ?3 `" ^7 s% G( ?& e/ Q; g9 A. ~8 w
$ H3 {0 F. ?$ |4 k/ S    // 设置 FIFO 级别6 }# u5 Q" J" f
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);1 f; t# M' L$ k2 ~- _$ y0 I
}0 _7 I. c8 d2 S9 v6 k2 w

4 J/ Q/ G) a, L0 S8 J1 X4 [' a! S/****************************************************************************/
6 s1 P$ [4 |* x& L/ t. K' a/*                                                                          */
- j* {) |2 p; `5 @5 {" U6 r/*              UART 中断初始化                                             */) Z, s7 ~& P$ M& J( j$ C9 r+ A
/*                                                                          */2 H; I5 B' G. s; B
/****************************************************************************/6 U3 f1 |8 l2 v7 W" Q
void UARTInterruptInit(void)% b" i* w8 Z' ~/ \) _/ ?
{
9 V( U( G2 I( N, J$ g+ Q& o& P        IntRegister(SYS_INT_UARTINT2, UARTIsr);2 o1 J$ T; F" T5 m6 h0 J
        IntChannelSet(SYS_INT_UARTINT2, 2);2 L  f7 A  [8 `' _4 G) V
        IntSystemEnable(SYS_INT_UARTINT2);
* P0 b. w% t3 ~+ D: z0 K& R5 X: z  c/ g4 @+ V" L
        // 使能中断
3 ^* d/ }* j& T/ U: {+ H3 b        unsigned int intFlags = 0;& {9 R9 U" s* ?
    intFlags |= (UART_INT_LINE_STAT  |  \9 I' r) K: Y& o) S3 k# b
                 UART_INT_TX_EMPTY |    \8 ^1 h" G9 }. @' L
                 UART_INT_RXDATA_CTI);
( P& i  }. f8 m) A+ @    UARTIntEnable(SOC_UART_2_REGS, intFlags);: b& R5 w2 \+ ]* T0 o0 ?9 ^
}
- M8 {1 W! O1 O6 g( h- n3 S' @' X3 N& q, f9 z/ v
/****************************************************************************/
" G8 f& |5 e+ Q# |/*                                                                          */
8 u( z& n! y" X# X/ J4 M/*              UART 中断服务函数                                           */% t- A" y0 g( }% |: D+ U
/*                                                                          */
4 v( q3 Z" K1 f% C1 o5 o/****************************************************************************/. r( Y( J$ X! z% k( v) w
void UARTIsr()
& Z! D; e3 j! I4 y: T( G8 I+ O{& ~2 t# A4 s8 [% G% h
    static unsigned int length = sizeof(txArray);
" c5 k4 b5 w7 d- u    static unsigned int count = 0;
# F6 B  q. D+ I5 B- t! K. M    unsigned char rxData = 0;
& {: u" x+ o- q2 Z    unsigned int int_id = 0;/ z( r- s- j4 h3 h& w* M

2 r+ _1 K3 i; M    // 确定中断源, t* M8 K+ {/ F7 N. p
    int_id = UARTIntStatus(SOC_UART_2_REGS);
% x, x6 e- |( |+ B$ ~. P3 i* H; Z. d0 z0 D
    // 清除 UART2 系统中断  I0 {+ E1 Z  L/ d! o: B# m4 u
    IntSystemStatusClear(SYS_INT_UARTINT2);& [) _) Z$ |: ^  ?8 _& ?& p5 C
! X9 r' }. S& T: s. T# F2 v
    // 发送中断, W' u" v, _$ a3 d4 u
    if(UART_INTID_TX_EMPTY == int_id)
, e" d" b) }4 M# w* |. D    {
, I5 |  E  N6 {9 s' D        if(0 < length)+ M+ P  t* A2 N! Q; l7 Z; U5 I4 G/ l
        {
/ P6 E/ j& o) _8 h% z( I            // 写一个字节到 THR1 v0 O+ x9 f4 q+ N  o3 W( n, M
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);" ~$ w" k0 Y: J4 d" V4 a/ }
            length--;
! g6 A- Z- v9 O1 T0 |) e0 ^            count++;
6 ~1 ^) `- r4 T! z6 R        }) O5 y% }$ \/ z  l& }
        if(0 == length)- Q, H4 R" r# g& U  C# D2 \" t
        {' A: N; K) M2 e/ N7 R$ Y- |2 S
            // 禁用发送中断" V5 l, U; |1 ]" \" i8 h
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);$ ?0 |3 ]* l: x7 C3 L
        }
- l& \$ }- x7 V9 _1 t     }
4 N; O6 j, j" o0 W# j7 Q) D, z& |$ i9 _6 a3 h
    // 接收中断
$ L$ [/ o9 d6 P! T8 F    if(UART_INTID_RX_DATA == int_id)9 v9 B  D0 j! Z7 N7 q" {) d, a
    {, @. {" F( e+ h3 ?& s0 _" ^6 D
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);0 R6 s! N2 Q0 P% \+ T9 P% v) F/ y1 |
( S9 c: Q1 X6 I/ p9 y
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);0 q/ h0 L0 S+ h9 ]9 D
    }; |: b5 z' @$ e8 h6 C2 H* }
, ~+ _! ~  E) \1 K! {6 Z1 A5 v$ w
    // 接收错误' _5 v/ r+ Z, z, n5 K
    if(UART_INTID_RX_LINE_STAT == int_id)$ q6 I6 B4 m9 I, N+ S( |# Q
    {
' {  N, Q4 N: l" A& Q, Z        while(UARTRxErrorGet(SOC_UART_2_REGS))
0 {; q, g+ a0 g        {
6 T3 G2 E8 i0 d            // 从 RBR 读一个字节
$ F" K' u- b# Y4 G            UARTCharGetNonBlocking(SOC_UART_2_REGS);
1 Z/ S/ M% V; b5 c9 ?) m        }
9 q+ L* A5 f$ ^' ~; ~4 [    }
% d& O& O& J/ p* [5 t. b7 C   
4 u$ q! L! l+ L2 |    return;
9 Q. ~, L  k% q* y* \. }4 W}
1 b7 U' k/ U; H2 \/ r
回复 支持 反对

使用道具 举报

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; L- {. m# j' \$ A* z( h
如果其它设备快速给你发送串口数据,你这边能正常通讯?
# {- V2 c$ [. X8 D1 M
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-16 06:14 , Processed in 0.046587 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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