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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7367|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。, l0 G% R5 S( ~2 J

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
1 B' [* j: W5 y& @3 O+ C4 b# P2 y1 e$ ^! u. l" f; e
#include "TL138.h"                 // 创龙 TL138 开发板相关声明! K2 K" D- V3 j. a/ C, M( ?
! K# k7 l' J% T
#include "hw_types.h"               // 宏命令/ [% o6 _+ e+ X0 D  D* f
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
. m% a  x; \& P#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器5 R  R6 V6 b* ]/ t

, v, z7 Y* t) C& b, g; X- h#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明4 {. @6 J/ Q( L5 {( v9 F6 \8 [
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
6 h$ s) `+ a  D# q, C- X#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
( }/ J+ j6 g: O3 @1 N, O#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
) K! z; ?# y+ I  S1 E* k* E, I, c# ~' x9 s/ j( q' w3 |! L, \% y
/****************************************************************************/' J, D: \! O5 t  B
/*                                                                          */* F% o$ O+ e6 r" A8 V7 b; f; ]0 v
/*              宏定义                                                      */
6 z/ E4 ]$ U/ n  f. l/*                                                                          */  C8 i3 Y0 Q$ g+ E, V; X  Z) z) n
/****************************************************************************/  \7 f+ H6 [0 V8 ^5 _  x3 r
// 时钟* t5 k0 q, ^2 k% F9 o$ p* C
#define SYSCLK_1_FREQ     (456000000), Q! `8 d4 }. E. i$ K; e
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
5 D8 a2 H7 U2 d) q% B#define UART_2_FREQ       (SYSCLK_2_FREQ)
! Q4 R2 E( |4 T( [
* a  K. M& r' |. s/****************************************************************************/7 K% Q" Y! k/ B9 C; m& @4 U% o
/*                                                                          */
2 w2 r$ C# J, I, H) q$ X/*              全局变量                                                    */% F7 y0 `! u* L, V& |! s8 v/ B% Y' @0 E
/*                                                                          */) E. s( T# f- A
/****************************************************************************/
9 \1 K4 X$ ]7 k; ?/ g' Cchar txArray[] = "Tronlong UART2 Application......\n\r";
" Z) L" B8 x" \$ O: q& X- W; _3 {8 U( [# z, Z9 T
/****************************************************************************/
9 o( B- p5 a& {! O  ?' E/*                                                                          */! O% f. w" l4 j- T' S" s
/*              函数声明                                                    */
+ L4 j8 S( p* f5 x( L/*                                                                          */
3 V- `& @( q9 O6 ^7 W/****************************************************************************/
6 h- N* D: d* O: ^9 l# Z// 外设使能配置
: r0 N$ g4 Y7 h9 Zvoid PSCInit(void);
# h) t. e; i# u. R* o! q. C* @: V
8 S, J4 [7 h, J% y3 L) E- W// GPIO 管脚复用配置
; @! F( G6 ?, ?: R! w4 zvoid GPIOBankPinMuxSet();, F5 g" R) X" s. h5 p! Y

1 V. E7 R/ `, k1 N/ N// UART 初始化
) h* B3 r6 L. z7 M$ e8 q9 rvoid UARTInit(void);( F' Y8 P( t+ [5 H1 W- @
// ARM 中断初始化/ b  h2 g+ Q7 `# Z; J& L9 N; u+ Y) ?6 M
void InterruptInit(void);( ?5 H' f) V4 s
// UART 中断初始化
% L0 E1 R- }# [# ~void UARTInterruptInit();
$ P! v7 J. O4 Q) \; B% j// UART 中断服务函数4 X- H! D  y* ]/ P# e- E& W
void UARTIsr(void);4 F( X" Y/ O/ c3 g! b
) [: N4 F  s- V8 ]$ ]
/****************************************************************************/
/ \7 P. T  u. j0 r0 j9 l5 Q* s/*                                                                          */
4 _9 O' i5 d3 }6 I# R6 h/*              主函数                                                      */
- H  ?  r# w5 h$ e4 i$ m9 r/*                                                                          */) Q8 e% A& d3 c6 Z7 ]% [  ^
/****************************************************************************/4 p& }0 Z8 f& B2 O! l
int main(void)
0 s5 H  U; S+ Y4 g2 v# l{
" L. x+ ?9 d% T( A7 N  h, I        // 外设使能配置' r; c9 f- j9 |+ N* c. `; r: J
        PSCInit();( T+ [! g9 H8 g2 p3 l- |2 W
       
- l: u/ a' H0 V' Q. y        // GPIO 管脚复用配置" j' D' \; N6 Z: I9 H( J
        GPIOBankPinMuxSet();+ }# d  M" R% x. t4 P$ F1 t: x

, Y& k! r! \4 \9 n  f        // ARM 中断初始化
/ S5 H$ d. q! n, B" Y( K        InterruptInit();" m4 z# p' O4 {) @' O) K$ a

# w( Y2 j6 f% b        // UART 初始化) m. j; x9 T1 M$ L+ v9 R
        UARTInit();
9 P" N. ^9 v5 l8 L- C
3 A% Z5 |; C2 x  A# j; A9 p        // UART 中断初始化, N8 K; J0 b+ }0 ^: F
        UARTInterruptInit();! K2 @" i9 h( [+ Z$ Y* {! l1 Z
: A$ [/ ?# p9 U5 @5 L9 D6 Q
        // 主循环! i, {$ p! z" J( i+ u5 \! w  y+ p7 N
        for(;;)4 e2 Q' y) V+ [5 }; `* E3 |
        {, F8 F5 \4 ?4 d, k

7 t, W" k; p. r% Z$ V- i6 |        }3 n3 L7 P6 M3 ^
}
' K- P5 b* Y5 w$ \2 V$ C
5 U0 Q* J8 \! l# [- T: H: ]/****************************************************************************/: \: t3 y6 @0 c) H
/*                                                                          */5 ]& g# {* ?, S( P& ~) [4 R
/*              PSC 初始化                                                  */$ y+ |2 e/ A& t2 }/ U  {% Y1 v  E
/*                                                                          */
0 o; z% F: g' L3 F. P& E+ Y/****************************************************************************/2 m/ ^7 x8 _$ W$ n
void PSCInit(void)9 W5 h  {9 E- L
{
7 N! L8 g& |0 t( X        // 对相应外设模块的使能也可以在 BootLoader 中完成
6 ^. @. {+ l; V9 G. ^  u    // 使能 UART2 模块" e" T  O0 o9 u% V' ^! e% o
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);$ i. }3 i0 F9 d. o5 R1 G2 T
}
& @! U* L8 |' e) z# ]- D4 c, ^8 p# d( U% P6 X3 @( H
/****************************************************************************/" _& m& R( y& A) M
/*                                                                          */
" Q- u1 F  `0 Z/*              GPIO 管脚复用配置                                           */) l% n7 Z6 C- D) H8 V, L
/*                                                                          */$ c3 U- {7 y& v, Y3 f
/****************************************************************************/& [1 D, o5 X' _1 y
void GPIOBankPinMuxSet(void)
) e" A1 r! Y& P# n  L{9 T% e$ o4 Y  T' W- H5 p8 \% }4 c
        // UART2 禁用流控8 ]% b0 h% q, U8 g. h
        UARTPinMuxSetup(2, FALSE);
& C& r! l3 n. x+ F: |}4 E* i0 W7 w( i2 Z0 J7 R7 k5 i3 ]

7 X# n! m( i. g3 V9 w/****************************************************************************/- ^% k7 f. V: p- d" g+ \2 g
/*                                                                          */
/ i4 a2 h9 n" C, D/*              ARM 中断初始化                                              */& U$ a  [7 }/ k+ W& n; U
/*                                                                          */9 a$ Q9 G! T' E
/****************************************************************************/. L, p0 {7 }: ?6 z& M- }+ t
void InterruptInit(void)
; R" |  Z, C6 v, A* A{2 k  P4 e! `+ V6 `
    // 初始化 ARM 中断控制器( }( `1 x& Y& Y4 w" t
    IntAINTCInit();6 t( o8 P* @: Z# C$ J9 R+ n/ I
% f" t1 f$ D$ B) i' a! L: j
    // 使能 IRQ(CPSR)4 e! ~; o6 Y% J1 V% s1 Y. L
    IntMasterIRQEnable();
9 h! Z8 W7 t! j" h( Q+ Z( e1 ~1 X
' p; h7 \2 N2 o; M8 y* \$ k    // 使能中断(AINTC GER)6 f+ a2 q3 h1 G; I
    IntGlobalEnable();
: V+ K5 C8 v3 @6 S2 u2 H, f3 c( e6 c" A
    // 使能中断(AINTC HIER)2 m$ o5 z  t, T! Y- R
    IntIRQEnable();( k, u. n" [8 t) A1 e" _7 Q3 k
}
: x) R. u5 \2 g. I- S: I% Z9 R- i2 S8 F  Q2 B  R
/****************************************************************************/  [( P  m4 O9 t7 I3 U
/*                                                                          */4 r, W9 t5 q9 h
/*              UART 初始化                                                 */
8 @; z% M$ q* |/*                                                                          */( C0 O- J1 _5 ^+ H  s  K& j
/****************************************************************************/
4 _; S4 l( f5 ^# F) a( C6 ^( Rvoid UARTInit(void)6 s, c% M3 j7 l9 P9 i$ M" u
{8 F7 z- c; J8 H3 s' Y
        // 配置 UART2 参数
% Y1 |, L/ y! d3 J3 y, b' l        // 波特率 115200 数据位 8 停止位 1 无校验位
5 _6 P/ V, \+ ~' _- D    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
/ p( t) D& A8 ]2 z; U$ J: d                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);. s0 B0 `) X5 g. O4 u
        // 使能 UART2# m2 `0 e% h% b- _( Y8 p
        UARTEnable(SOC_UART_2_REGS);
+ d" }6 @, E8 @0 f4 p
6 l+ R& G- ?4 A) R" H! p/ H0 ^    // 使能接收 / 发送 FIFO" J6 w# r1 J& u5 a! B: T0 [1 d
    UARTFIFOEnable(SOC_UART_2_REGS);
! }' `  r+ R: z* n- U
8 ]. d/ V- |; h* i8 h3 T0 c    // 设置 FIFO 级别" j- R; _( z# u6 ]5 W
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);% b6 F, _8 @4 q4 y  }. l3 S! C
}
% O: O2 C; @1 Q+ O6 }
5 K2 r/ B+ C- f4 s! S/****************************************************************************/
! @0 h- m* G7 n; R/*                                                                          */
& R# }" d- @6 u1 r6 G7 \/*              UART 中断初始化                                             */
7 T0 w! x9 _+ G, b# W4 ?2 t  }/*                                                                          */
. l4 c5 z' w& q, G/****************************************************************************/
6 _' \9 y4 _/ I5 g* R9 e$ ivoid UARTInterruptInit(void)' w/ O: q" C" ]  P
{
9 C# @& S. k% n3 I        IntRegister(SYS_INT_UARTINT2, UARTIsr);
- Z4 K+ ]0 J+ b* O* I: _        IntChannelSet(SYS_INT_UARTINT2, 2);# h; z# \; B! j, P$ D2 ~: E
        IntSystemEnable(SYS_INT_UARTINT2);
* d) ~. O9 S9 X
5 l* S9 V; Q" p6 {        // 使能中断
6 {3 f' X! _7 G( ]( C1 {9 z        unsigned int intFlags = 0;, L9 W, U. c7 L
    intFlags |= (UART_INT_LINE_STAT  |  \4 x1 z: r% G7 }- i* [! k% R
                 UART_INT_TX_EMPTY |    \
0 X/ i: Z. {6 b% D3 _" E9 f                 UART_INT_RXDATA_CTI);
3 r. t6 p2 Z; G" \$ u    UARTIntEnable(SOC_UART_2_REGS, intFlags);
# j0 S. t5 V& G# T" n1 S}
1 M0 {0 R) g! y" L0 r
9 Q% F0 q3 j! R( \- S/****************************************************************************/$ N/ c$ r3 u, f0 ~" D# T+ @
/*                                                                          */
6 W8 F3 ~, q. D6 x/ Y/*              UART 中断服务函数                                           */2 \, }/ }$ U# L9 b( L! |
/*                                                                          *// z  g9 X' q, {* ^3 v
/****************************************************************************/" i& F7 A& `7 c6 s
void UARTIsr()
. p+ e6 h% N7 e# |/ a/ G{
& a6 _9 Q- R. w# H+ Z: v3 K    static unsigned int length = sizeof(txArray);1 p# b# c4 [) b, `1 m
    static unsigned int count = 0;
1 p0 U, ]# J! Z( ~) }    unsigned char rxData = 0;5 A. A* j) N  t! m3 u( X) P4 E
    unsigned int int_id = 0;
  L& U! Q* B( f+ l5 E; U8 H+ }- C, m4 m7 A8 w9 o# g% q" d# Z4 {
    // 确定中断源
9 _0 J2 D( r" ]9 V1 l7 I    int_id = UARTIntStatus(SOC_UART_2_REGS);
+ P% z0 o$ H8 N1 ?3 i9 l
7 \' Z8 y4 ~; D+ E9 x; N    // 清除 UART2 系统中断
) B! W7 h& M, R    IntSystemStatusClear(SYS_INT_UARTINT2);9 D* n7 K1 F9 H5 j- ]: m$ F* ]
- C. Q; R& v- E( \9 ]2 \$ n. s
    // 发送中断
; n- f" V" X. H. j8 V; O- @: M' F    if(UART_INTID_TX_EMPTY == int_id)
4 f8 ~) Q1 m* ~    {
" |" b. u7 L9 P4 c        if(0 < length)
" j, q$ Q( n, O* |: D. u# v' `        {
, A* l" O- |) \            // 写一个字节到 THR: D# |& N; O& S: A; L
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);9 u& i; P# x' m) d
            length--;: l5 i9 s4 g& f" C& c
            count++;& m- U1 M1 Z& r' P2 |6 \
        }
3 f: n3 V" f+ h, a3 x6 S6 I* z        if(0 == length)
7 ~/ h" f- ^3 S7 j$ i        {
6 z8 K0 k" N! d' ~6 x/ b            // 禁用发送中断
# ^" Y0 U: f+ x6 o) z7 J' ~& {            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
% @8 A+ W7 ?; _* ~        }; X( m) [7 {$ X2 n
     }
7 d; u5 k9 R, O" A; R* Q0 J# z7 X' e0 A* d! k% [
    // 接收中断
0 E- n$ P  j2 F5 t9 b. s, i8 G' _    if(UART_INTID_RX_DATA == int_id)
) ~8 Q' t* K: x2 J# g# Q3 R/ g    {
* C! h+ u+ p1 q& i2 ^" t        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);4 z9 I& X$ [+ E3 P

1 k+ z4 y: I: [* G+ F8 t+ f* x% [        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);7 [" ?3 Q4 I/ P
    }8 a+ z/ @' a: e9 A( g- M1 U

. u/ P5 t8 Z& M; Z3 I3 o    // 接收错误
  d' |: r# B8 @( g    if(UART_INTID_RX_LINE_STAT == int_id)
3 R* |# w2 u2 ]: F3 O  Q7 c    {2 o1 D# e  f) v$ [4 p( y8 ], {5 a. W
        while(UARTRxErrorGet(SOC_UART_2_REGS))2 z4 F) z9 R0 [% Z
        {
7 S+ g  k7 Z4 f+ ]4 z            // 从 RBR 读一个字节
2 X4 U5 S. `) t            UARTCharGetNonBlocking(SOC_UART_2_REGS);- d" h1 d3 x% H# _6 X1 _
        }
6 Q4 [5 w, Y+ p3 z9 I    }
2 s( L5 |0 O; m& u! L   
- I7 L% y% I) W+ R' ?8 y0 R# F% D    return;* U8 {# `2 Y0 e: P& q
}
" t# N. }( ]" p- K5 T" O
回复 支持 反对

使用道具 举报

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' X. o$ U3 c! `; W8 p: b( k2 j
如果其它设备快速给你发送串口数据,你这边能正常通讯?

* y1 y' L* f1 I0 j谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 18:26 , Processed in 0.042918 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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