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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5616|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
- K0 i9 E% \7 S! w

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
) r6 w* z* K! p/ [( l! `. b% F
: Y! X" {9 H3 F% w0 e* R  V#include "TL138.h"                 // 创龙 TL138 开发板相关声明
5 Z( h  b: d9 i9 z( G) E$ T
4 G6 c" C, M) t3 ~% Y- U#include "hw_types.h"               // 宏命令2 V0 P! r! b8 K
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器* V1 B4 _' A  ]3 q
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
3 x. h( v4 k* n$ N2 ]( |5 w4 R& E8 j1 Z! v/ |- h! ?
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明) C+ j9 [, b/ x! G5 q) D
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
, R4 T# U! a. X) \9 T/ G: K) A/ Y#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
! T* Y4 w8 v" w; D/ I' Y#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义; S( s  _/ H+ k2 m/ X

2 A6 X7 V5 \; l7 [8 ^# e3 f: h% d/****************************************************************************/
. d2 E. i- S% O+ U* X# Y/*                                                                          */- I# U4 L1 L! l" s
/*              宏定义                                                      */8 m7 _7 y5 Q4 T: E: _
/*                                                                          */1 \5 Q% F9 T& n
/****************************************************************************/
1 A0 [% V9 Z  B& `, `$ M! J# Z( O// 时钟
! h# V5 t. j/ H+ i5 `& b#define SYSCLK_1_FREQ     (456000000)
, b/ B- H1 u6 ~5 n7 \% [#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)9 _! K' o$ V0 W2 Q
#define UART_2_FREQ       (SYSCLK_2_FREQ)7 ~* W5 g9 s! U0 I6 p! s% e

/ ^7 s. G5 {% c' O/****************************************************************************/! W4 N; U" D9 Z- Z1 T
/*                                                                          */
# O4 z& E  D, U% H8 c/*              全局变量                                                    */
, v* q+ `" a% H, U! \8 k/*                                                                          */; y4 }  I& ?4 X* M9 i
/****************************************************************************/' g$ v: v- L1 R9 [1 `8 C) H3 Y& k5 w
char txArray[] = "Tronlong UART2 Application......\n\r";" f2 e" k+ f. J+ B
" |! E$ E+ Z1 E4 s
/****************************************************************************/
, T7 @# G' ^0 S, H/*                                                                          */
1 t- s6 o- B# Y/*              函数声明                                                    */# n; |& m. F6 j+ h! v/ E
/*                                                                          */! i* \! L" Y! C" n1 a4 o: K
/****************************************************************************/
1 q9 h$ R) P/ D7 g. g// 外设使能配置) f# i' o- W1 b0 R
void PSCInit(void);
& w- h- U" o- [" f/ s
- e1 t: _/ C; {0 r/ t// GPIO 管脚复用配置. u% j% ~4 S$ j4 v6 T
void GPIOBankPinMuxSet();8 K, Z0 e# R# l: M+ ~

. W3 T' K$ G2 y1 J! y- z3 j& D9 B// UART 初始化# s4 F! h& _  y/ c' f( ]  P
void UARTInit(void);% t2 U' H8 ~5 n/ ?  e* t: s
// ARM 中断初始化
# }+ [. D: I- }8 b( d4 Cvoid InterruptInit(void);: x, ]+ D% @' l8 K; V1 R6 {, |  x
// UART 中断初始化
8 U% a  R6 V# n6 z' Evoid UARTInterruptInit();1 ^& d  e4 G3 s
// UART 中断服务函数
+ {) d# i5 K6 N2 c7 C* Gvoid UARTIsr(void);
/ d9 G9 w& f3 V! d7 K; q/ k% _! c. N. W9 f' Z+ _
/****************************************************************************/
6 H" m9 v/ g  F3 Y# I: e/*                                                                          */" q9 Q1 {8 `0 U, n7 y7 Q
/*              主函数                                                      *// z9 G* G3 {( P9 a$ d; ?( U  y
/*                                                                          */
' B: O% L; F4 |! J/****************************************************************************/
5 o* P' K( ]! e2 j9 O0 l3 S& L* Uint main(void)# t; z3 `/ J; |( {, A
{
4 M; N( t: [, f5 d" `) p& X6 G        // 外设使能配置7 u  F2 F5 F) f+ K
        PSCInit();9 z, T/ V$ c- [' ~2 p
        : ]/ d8 [9 L/ H# {2 n
        // GPIO 管脚复用配置% N6 S+ s  Q0 f  [5 m1 U: m
        GPIOBankPinMuxSet();# }! T( {5 H2 w" p: {: ]

+ }$ a4 ]$ j2 x- @        // ARM 中断初始化; e/ p: n% u% ~, D; Y" t( ^* l! z
        InterruptInit();
# J1 p$ d* H3 f2 U3 u4 }4 F. ?- t3 C3 l3 d( y: D0 r" N
        // UART 初始化+ [  J, ?- _/ F- D* A( s! }/ m
        UARTInit();/ z+ a1 x. C$ j! T- i8 u' i3 T- {% B
; d9 k6 J; ]+ Q3 _, Q0 x2 h9 B! I
        // UART 中断初始化
7 ?) i, f3 m9 n        UARTInterruptInit();0 k$ [0 Z- f2 J& b9 E

8 z. z8 v+ J0 U! ?6 |) R. ]) A# k        // 主循环3 b$ |; y5 b; ~6 r% n
        for(;;)1 `  I% G" f+ U4 A1 B6 Y1 I
        {
) W- a  h$ L* G5 I- M: g9 ^; B% Z2 f  \7 p
        }
+ b. t6 ?1 N: K}/ i) q& K7 e9 T. }3 @) V& u9 y+ _
3 ^  P8 B* A+ A  `  Q
/****************************************************************************/
& D6 G+ l4 T0 X& \5 a( A- J6 J/*                                                                          */
, N2 c; N; C& T* D8 e- m/ N/*              PSC 初始化                                                  */
7 Z: P" V, x. E) b( ]3 {. }& _/*                                                                          */
: F" q. Z# N& x& L8 c9 T2 k* T/****************************************************************************/
- }6 a! t: o$ j, cvoid PSCInit(void)
" e* o! o& r+ L  M" A{
3 W9 v3 l' e+ |; H+ U        // 对相应外设模块的使能也可以在 BootLoader 中完成
, Q4 s8 B. M& W; b3 j- ]9 o    // 使能 UART2 模块
- G- Q% m; E* h+ p6 C3 l; z* f    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
, y" `8 c1 l9 B  F$ Z}
+ v. j9 l8 Z" m! L: Y
) ^0 s* m8 `! L; Z2 b& i/****************************************************************************/: \$ ~4 `: s. c" B
/*                                                                          */
  _9 K  Y4 k9 W) Q4 E/*              GPIO 管脚复用配置                                           */% }1 q- O% U3 |) @9 X
/*                                                                          */: [% |. w3 H6 K0 |$ W& ]( e9 b
/****************************************************************************/
! g% u+ j4 W8 n& M9 V- j4 ^+ Zvoid GPIOBankPinMuxSet(void)3 t/ C2 l  q0 A0 p
{9 p! d" B0 |- O7 R$ [" L+ {# u2 x
        // UART2 禁用流控% o* C7 \4 k8 o! c7 w) v1 W( n
        UARTPinMuxSetup(2, FALSE);! K, P! O- X' C2 b  ?- a
}8 o7 b. c9 `& w# N% q

1 ]8 _) j: t; j/****************************************************************************/- q; u* a; R! N
/*                                                                          */
* u9 p; _  ^/ i( u. M% n/*              ARM 中断初始化                                              */
0 T  D9 w+ e6 m0 m4 l/*                                                                          */% P0 V6 v' Z1 x
/****************************************************************************/! U6 z6 u7 G" `4 I  K. {0 z. p* c/ b
void InterruptInit(void)7 H2 U9 `3 [; h$ Y0 y6 X& C
{; g" F& S' ^8 e9 W
    // 初始化 ARM 中断控制器* y, X! q1 @" X( [$ k4 n
    IntAINTCInit();5 z0 q6 b+ Q2 L& M
& P3 b+ Q' G- F
    // 使能 IRQ(CPSR)' |# u1 N" Z9 X9 {& @; c, [4 u
    IntMasterIRQEnable();; `8 H% a. [% d" _5 U
: w; d* ^2 z, U# J
    // 使能中断(AINTC GER)0 y  F' c1 m( m- A7 p
    IntGlobalEnable();' U: X! P6 |3 R, i1 [/ R
7 w. W( {' }( U8 ?4 f1 f8 j
    // 使能中断(AINTC HIER)
5 m0 h$ j4 a, v: Y* \    IntIRQEnable();
: l6 p7 w. ~# ^) O- K}
* G( B4 w- [$ s+ v) H( W2 F/ a5 _) q
/****************************************************************************/
- ~* x4 |. q& J2 r5 ?& Y( d: t/*                                                                          */
, H2 u( e7 ^* R3 b/*              UART 初始化                                                 */  i, W4 G0 s% u! N0 Y
/*                                                                          */
  s% d+ [: }' J4 i/****************************************************************************/0 j+ R6 L/ Q& Q7 [$ H: l1 D. O
void UARTInit(void)( v8 j+ `; }, X- K5 s. y
{
# l/ A" x* a' o5 a% M4 H( A        // 配置 UART2 参数
$ p! ]/ O- s: R% ]) C        // 波特率 115200 数据位 8 停止位 1 无校验位3 |5 f# K# m4 R: C+ n# V
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
2 \3 G$ f0 g  f. Z$ z, `" D                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);8 V* M+ ?5 x* ~8 t
        // 使能 UART2- X; T* _) l; ^: m2 ^) t
        UARTEnable(SOC_UART_2_REGS);
4 [. {; U8 K$ H5 s7 I
% ^; _3 @% I5 w' A. M! q    // 使能接收 / 发送 FIFO
5 l* ?! T4 ?5 w& T    UARTFIFOEnable(SOC_UART_2_REGS);4 N. l8 [* _8 X* c' s% N7 {
% o# B) H0 X$ u6 i
    // 设置 FIFO 级别$ B! Q& @  N2 I/ S
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
4 x( q& C  q: y# R- s# D, H. S}
; G9 U/ y* m" Z5 M$ w! u
8 a' a' [2 M/ K* o  t( U0 P. G+ n+ a/****************************************************************************/
$ {/ e0 @2 F1 ^) p0 s/*                                                                          */. I) `6 l4 l: J
/*              UART 中断初始化                                             */  P" |- ~7 u  a( o. ^
/*                                                                          */
( H; B3 ~7 J. I6 {/****************************************************************************/
, r( J3 y$ R5 y2 B# h6 Avoid UARTInterruptInit(void)
# q5 m' w* T# S9 u{: u# e: y; |2 ]% Q1 L. S8 {: ]
        IntRegister(SYS_INT_UARTINT2, UARTIsr);% Z% @3 v# s) Q& r$ x: Y
        IntChannelSet(SYS_INT_UARTINT2, 2);
, Y3 y0 V  U, z: P1 m) Z        IntSystemEnable(SYS_INT_UARTINT2);
  \1 i0 M# }' w$ w: M" B2 J+ e0 {& w3 W8 V$ ^
        // 使能中断7 r0 X0 L3 h/ l5 s
        unsigned int intFlags = 0;! {! Y% B' h  [& ]
    intFlags |= (UART_INT_LINE_STAT  |  \  ]' D: ~; _; L; ?! \. N1 R7 `6 t% o
                 UART_INT_TX_EMPTY |    \4 Q) P# Y" |; _0 u8 H; D+ u
                 UART_INT_RXDATA_CTI);
; y2 M8 d5 b# Y# [4 i5 A8 n" B" B) W) C    UARTIntEnable(SOC_UART_2_REGS, intFlags);
- A) A- r4 N, H1 N7 h}
$ y; _% b: y) D" c2 v5 W& M! Y" z
$ @" x+ Q4 ^& V7 g7 G1 v, v/****************************************************************************/0 ]  m9 A/ f! b6 l7 `
/*                                                                          */
- W2 }  U) W8 X& X  a/*              UART 中断服务函数                                           */
5 c9 B3 K& E& G/*                                                                          */+ K, f5 J6 w6 I- c" a
/****************************************************************************/
! U% s. ?6 h, o4 ^: I. T2 T& {6 v: mvoid UARTIsr()2 S$ Y0 g8 Z+ q6 ?1 [% B
{
; J  M% y4 o+ J. V; l+ b    static unsigned int length = sizeof(txArray);( l% X9 k2 c" ?" f* q
    static unsigned int count = 0;
6 K: z- V: l5 u$ e' I" r    unsigned char rxData = 0;
: s/ f0 w- [3 L6 L! L    unsigned int int_id = 0;
. Z( G% G( y( }" {. _8 b( G
1 x/ W( C3 B) L' n1 }* e5 q  E; `    // 确定中断源0 H' u& L# u7 Q) q2 g2 s
    int_id = UARTIntStatus(SOC_UART_2_REGS);
! y6 i. G* L! x4 Y% C/ m6 F7 J4 v2 x9 A+ z; K
    // 清除 UART2 系统中断6 V4 X% v- E6 o7 B4 |& W! L
    IntSystemStatusClear(SYS_INT_UARTINT2);
. e, {9 c4 E) r# b$ z8 _+ C: @, {% q4 K: g! h6 B
    // 发送中断
$ w8 u3 b0 x: f- U: F    if(UART_INTID_TX_EMPTY == int_id)* Q2 P7 l5 f" q
    {
$ T. ^; Z+ c0 D) [! a4 o- m        if(0 < length)
& \4 j9 s  i( }! j' G0 Y# I9 {0 U  d        {
; ~# \& C- Y( g6 K/ d% _' ^7 p6 \            // 写一个字节到 THR
3 ^( C; X8 z1 Q            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
2 M  {8 {5 Q- W            length--;
! x# O9 ^7 X4 t9 t& b* [            count++;) j3 {6 r* w# }9 S- B2 d# v. f
        }% e3 f5 ^# h/ H6 f! ]# Z
        if(0 == length)9 c8 p0 X  }5 |2 L2 O( x8 B: k' Z
        {
* R# s$ \8 d; @+ c  k3 |; T7 U            // 禁用发送中断- ]0 Z' K+ {  C$ B- @
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
8 V' t$ m( E$ Q        }! G4 Q+ L8 B4 _! R3 t7 _
     }6 h. Q% @, ^- P* H) I9 s6 c

) m# a, m  ^. E2 q- x+ V; q1 }    // 接收中断
# T9 G2 b4 x) i/ [4 _3 D% c    if(UART_INTID_RX_DATA == int_id)
: Y& ^: F4 g6 f' R: Q- c    {
2 c5 s$ U8 }) e. F6 G& ?        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);$ B$ x& g/ H! h5 B6 J) n* s
2 c1 {0 K6 {) y! F, q/ v  ]. L; G2 `
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
# E! r0 d: o) G+ D/ f3 i    }6 b5 O$ `7 |  E5 j# _' J4 O9 F

$ @/ b, W. S5 }) `3 {. |% s    // 接收错误- c* D9 c# g1 R
    if(UART_INTID_RX_LINE_STAT == int_id)
! P3 ]! \8 b1 x, ~8 C    {
( d, F/ \% p; p) M+ s6 J' f+ ^% P        while(UARTRxErrorGet(SOC_UART_2_REGS))- P) N0 _7 I7 }8 l/ L# F. N7 Y7 ~, }
        {
1 o) }9 F! Z9 u5 W$ b7 M" o            // 从 RBR 读一个字节
, T9 `. F2 }7 |: w# u& H            UARTCharGetNonBlocking(SOC_UART_2_REGS);  C+ o' E1 B) Z
        }" ]3 Y0 @  R) J; k( }' Y3 X1 ?
    }: k: K: f0 \6 ~; h5 m8 j) [' B  s
   
; y8 w0 R% B9 C! \6 j    return;
# A! M; }. `0 _}
5 Y/ C9 Z& W8 D# G+ H
回复 支持 反对

使用道具 举报

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' p  m3 E* |3 ?8 k: `) l1 ?如果其它设备快速给你发送串口数据,你这边能正常通讯?

/ v$ y' a; ]" O, ?+ J% s0 ]谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 07:16 , Processed in 0.039889 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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