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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8309|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
% T8 Y' r  j: b, E2 Q' X; e  [

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
, w% E1 _' N9 C% Z  H# q& B+ C: b
! A# b2 `- v8 e/ b, e#include "TL138.h"                 // 创龙 TL138 开发板相关声明; ?% t: Y% R! A- r  E
! o' h. z" W; Y& _( S4 N
#include "hw_types.h"               // 宏命令8 r& ^' F1 t! q" L
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器. A2 y) r9 k  Z+ E
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器) r7 t1 F. R9 u1 M; C, S# ]

$ J) h% o! t% E#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
* b+ B. e( A8 I1 m# s#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
- f& `: z9 U+ q; |& J# Z3 W) Z#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明  E  P: f7 r# w
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义2 v6 f* I! O! e2 I
4 P' o( x% W% V
/****************************************************************************/
  B# m3 v- A! `( ]: a3 g/*                                                                          */' N5 j; ^' w/ I2 }% s
/*              宏定义                                                      */* x$ {& c8 M' r9 Z  {4 W4 z, g
/*                                                                          */
4 ]* i. k  |3 q; Q. v3 e/****************************************************************************/
7 O4 l# v0 f: v6 p  t: f// 时钟( `/ @2 d- x4 V
#define SYSCLK_1_FREQ     (456000000): n* _0 o, e9 F8 X4 m% I. H
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)! [" J7 A1 g9 H4 n! F) D! p+ N
#define UART_2_FREQ       (SYSCLK_2_FREQ)
  Q3 o) }/ x* c4 D
/ ^$ h: _6 f& |& L( V4 U/****************************************************************************/) D" n$ ~+ W- _& B0 X: }
/*                                                                          */; H# ^: W* O) c
/*              全局变量                                                    */- `% X' F! ^0 d- x% v0 P
/*                                                                          */0 I3 Q- v1 x9 o+ Q  V/ o4 [
/****************************************************************************/
, m+ \5 u- q0 n6 ~char txArray[] = "Tronlong UART2 Application......\n\r";
% Z4 p9 `: |: a; y
$ p( s1 U- J2 M/****************************************************************************/
/ B) }' T% Q1 B+ R1 Q/*                                                                          */0 P4 A  Z/ E& A5 y. a
/*              函数声明                                                    */
* Z+ N, G/ k. [, D* }- E/*                                                                          */
+ l, U) a& M/ O/ }3 y% N8 X* y/****************************************************************************/
+ F$ H, B" L) r( |// 外设使能配置0 ?1 R! ^5 ^1 Q+ Z* e
void PSCInit(void);$ Y9 x0 O; q5 i: Q, [% A) A
/ J# X0 W6 u$ H- I. _
// GPIO 管脚复用配置: F2 \7 V8 k4 P8 S3 X" }: O  y* k
void GPIOBankPinMuxSet();
: Q8 z- T! Z: t* p7 G0 z2 ~8 r8 {" u( k' {
// UART 初始化5 M4 D3 f* A+ y/ c0 D$ F
void UARTInit(void);
, j6 S1 L$ ^" \/ y/ G// ARM 中断初始化
9 I5 N1 s% p& i4 a: X. hvoid InterruptInit(void);2 V  k9 k% i$ I$ I
// UART 中断初始化' B% V# f3 p/ M5 R% u' q5 P; C" g
void UARTInterruptInit();' M5 K' R5 `# _: j
// UART 中断服务函数
5 I+ r8 v5 q% l( `3 o+ p& Xvoid UARTIsr(void);  b% E3 X5 L, H4 ~0 Y2 d" M; S2 u

( a* u! I: a. G* X* E/****************************************************************************/
5 y0 J, n9 c2 @0 ?! T/*                                                                          */
( M& Y7 Z% s4 g! I/ t2 z; v+ W/*              主函数                                                      *// Q& @$ ~2 W, ^; H( r( i& I; `
/*                                                                          */' G* v; I, p- x* P4 r4 ]# p1 W
/****************************************************************************/$ [9 {4 l; t. ^+ _) }! c& Z, Q. b
int main(void)" o1 H- H. q& u6 f) K9 t
{% h& I& X8 O* v
        // 外设使能配置1 S+ U! T, y& f9 G4 P
        PSCInit();4 B& d1 m. }# Q/ b! E  a1 a
       
4 K0 e0 `0 Q1 \: @/ D& Q+ g: p        // GPIO 管脚复用配置" a0 o; H& ?7 D% |9 W5 W) f" q- S
        GPIOBankPinMuxSet();6 |& p" R( t' K4 _# W

2 i! }4 I& M1 }, g        // ARM 中断初始化
$ N& _- _. I* @2 _8 L, C" S* |        InterruptInit();
4 [! y9 z8 }% w6 y$ \; M" P; x, N& }: P1 {" `
        // UART 初始化- X- _3 y7 M- w
        UARTInit();, T- O3 ?9 C4 B" T- V
4 C" x  R* F6 P. J) L5 W* u1 B4 R/ I
        // UART 中断初始化
# N# l5 V  \9 K        UARTInterruptInit();
! u& H* U4 {/ p, j7 S: I  {2 A/ |/ Q/ {1 ?2 B5 V/ M, J3 M" [
        // 主循环
7 L& Z5 O9 F0 z: E$ K$ u* m        for(;;)
5 y% O: C# A) _5 u2 d        {
7 Y' |/ @$ I* W8 R( X3 ?
: Y: e2 u$ t0 \; c$ F        }
4 J8 @, s. I0 H( i, d}1 t: t+ r8 v4 ?4 B, s

- u. i" G- n  M& D8 L2 H! Z/****************************************************************************/6 |$ A5 l' ~. Y1 m& D3 c
/*                                                                          */
$ F0 \' A. B0 z" E' z8 O! Y4 a" i/*              PSC 初始化                                                  */
8 y  B3 l- z  M# T$ Z" u/*                                                                          */. b  I" _; c- S' r
/****************************************************************************/; P% [' P9 k5 c0 W* C9 H( _
void PSCInit(void)3 `4 D: ?% f( L% ^
{2 W; H- [9 n8 J9 E
        // 对相应外设模块的使能也可以在 BootLoader 中完成* f8 @) p1 ]0 c8 t+ v; A
    // 使能 UART2 模块
8 w2 w- l. @1 q. O3 }    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);0 J* q2 U4 k/ N' `0 R8 k
}
  }2 a5 c% J; E7 u+ x0 [+ a
3 _- ^3 I+ j  x6 ^' h# s+ @/ |/ J2 m/****************************************************************************/
* h% Q7 W) q3 q2 x/*                                                                          */; @4 g0 s) |$ f+ I
/*              GPIO 管脚复用配置                                           */1 X% g1 J& W8 }/ q; w1 ]
/*                                                                          */
1 H. y& M4 {6 V3 Y- n) T- j: I4 Z/****************************************************************************/
4 n) w' O5 |! S" l& ^3 P) |void GPIOBankPinMuxSet(void)$ y5 T* e0 m. D; w2 r. S
{* e) Y5 v' B7 [0 `: K3 a
        // UART2 禁用流控
$ g8 g( ~# q+ O0 K, E  h9 i        UARTPinMuxSetup(2, FALSE);
/ t8 a- s; f2 A0 V5 Q7 w6 D}% D; y, N$ o, W
$ p, }  X3 G8 d2 G) h
/****************************************************************************/
6 A2 n9 U- r- p# a. I( R2 u/*                                                                          */7 n9 N3 E1 L6 `( K& ]# s* v; \
/*              ARM 中断初始化                                              */
* A+ d2 p$ ^" m. g2 _9 p/*                                                                          */
0 i0 \, R9 V6 I9 `9 j/****************************************************************************/0 m' z7 L) e# ]9 O0 [
void InterruptInit(void)
0 @. G( `5 ]( [0 {; Y9 R+ G7 j{
7 k+ l& _* J! D- P3 R; ~    // 初始化 ARM 中断控制器& n5 u4 K4 Y! w
    IntAINTCInit();
9 t! A: s; _. j  q9 B! a4 e% v' N& ~* B0 F
    // 使能 IRQ(CPSR)* ^9 G( y9 G& X6 Q3 n# T6 z
    IntMasterIRQEnable();
1 ]' e- L$ d5 X6 N7 T
1 o) N$ e9 K- ]" V9 K+ w5 C    // 使能中断(AINTC GER)
# |- b9 b- K9 C7 K    IntGlobalEnable();( f7 G3 w3 }5 V: n/ b" Y4 y
' s$ n) T+ ?. V
    // 使能中断(AINTC HIER)- Y) z, h1 m' h
    IntIRQEnable();
6 \" ]  k  a1 m! D. U}
- e5 t% v- O+ J
- J- @/ W: O! D/****************************************************************************/. J4 V  A8 a' X4 d6 M
/*                                                                          */
& \5 n( _! H3 |- f8 P/*              UART 初始化                                                 */
4 S* `2 J( X$ W: H% b2 w/*                                                                          */
% m. \! L& v0 Q7 c/****************************************************************************/3 a; w: I0 d# b& |+ a1 K
void UARTInit(void)
8 s0 W; p. H+ m3 z: B{4 |$ F& e) F/ q8 w1 A( A
        // 配置 UART2 参数
8 k8 ?5 b2 k7 ?3 J7 l4 V& \  u        // 波特率 115200 数据位 8 停止位 1 无校验位
& W+ B5 `6 U1 T6 z! }. f7 K    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,+ c# R. d* \  _6 d; g
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
. C6 K& r1 x, D( X* k        // 使能 UART2
3 N7 u  X3 A7 {6 O  [0 U8 j        UARTEnable(SOC_UART_2_REGS);; d' Q4 k1 O4 d6 W8 {" O

, k2 i" A; [& O4 F1 x. ^    // 使能接收 / 发送 FIFO4 L" \2 p8 A$ e) U# m% @! |
    UARTFIFOEnable(SOC_UART_2_REGS);3 \; y/ [( z3 s8 c5 g$ S

9 [$ h% k( m# b    // 设置 FIFO 级别" w" f) v5 ~7 H7 u6 }7 B% x& d# S
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);  S" V# W+ S/ G% H4 V
}
; [) B4 C) `  i& m* l8 p/ F/ a- N! B. H
/****************************************************************************/( x6 j3 q3 `  T: ?' g9 }7 F# H
/*                                                                          */
/ z& O3 K  l' M* l3 d- u6 O/*              UART 中断初始化                                             */
/ V: ]) r( b( r; k- I  R2 Y9 A, f9 ]/*                                                                          */4 E6 ]* a' G) W* D" d5 a
/****************************************************************************/
6 n4 m2 |8 I! u, dvoid UARTInterruptInit(void)9 y9 J; e; @* `+ H) f
{
4 S+ d  r5 p$ |( O% Q+ O        IntRegister(SYS_INT_UARTINT2, UARTIsr);
: z0 l4 p( x$ j) B$ U* d        IntChannelSet(SYS_INT_UARTINT2, 2);0 ~4 N8 ?$ d  `: t# D& h) r. W, A
        IntSystemEnable(SYS_INT_UARTINT2);
4 p' H" S% p  c6 }0 u6 |$ {
7 H) X; i8 |8 n2 ]2 c5 {- e        // 使能中断" {  L1 W( h) g& d  x& u8 v" p
        unsigned int intFlags = 0;  ^$ ?- ~6 @4 p
    intFlags |= (UART_INT_LINE_STAT  |  \  S7 S( K4 F; H1 Y  u5 y
                 UART_INT_TX_EMPTY |    \8 L! ?1 a8 L3 |5 o3 ~
                 UART_INT_RXDATA_CTI);# y/ R( o7 F6 O' s1 Q7 q3 j. |. b+ N
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
  F* A0 }/ H# b5 ?5 A+ f7 `$ V}! l4 `4 n1 N# k
3 T9 @  @8 }, Z8 n
/****************************************************************************/
2 X+ |  t. C- d, v  j  y3 S; `/*                                                                          */+ d7 G6 X# N( t% h% ]2 W
/*              UART 中断服务函数                                           */
! ~" C$ Z+ |  x) D/*                                                                          */
# `! @2 M6 K' o$ r" C( o- o/****************************************************************************/
7 ]1 R# k; o/ r+ D/ o, f0 fvoid UARTIsr()+ b. \" A, y6 y* z
{, H3 S2 |. o' a* A* g5 g% S, ?" F7 |8 n
    static unsigned int length = sizeof(txArray);
- j8 I7 W  C5 H5 D8 j8 ]; R    static unsigned int count = 0;
" I& E& \8 G! {- Y    unsigned char rxData = 0;
% M5 w' m& _4 _. k    unsigned int int_id = 0;, _' \$ P, U$ T4 g" d

+ J/ V" k0 D0 {, e& p    // 确定中断源
: \1 ?: v9 ~, V0 w6 o" ~/ Q; A& T# `    int_id = UARTIntStatus(SOC_UART_2_REGS);
. |5 C1 w  h8 h$ _6 m- a
9 o/ P; k& F$ s    // 清除 UART2 系统中断
8 Y& z( y* l. l) T    IntSystemStatusClear(SYS_INT_UARTINT2);* p' G- i# ?( k) v

2 F. R6 o  _4 M3 @2 p    // 发送中断5 C3 I8 j5 i  i: |! K  ~
    if(UART_INTID_TX_EMPTY == int_id)
% K: g+ ]5 ^8 e1 E% l    {
) r; e6 p& b0 r# V1 h        if(0 < length). a3 D7 k0 w& ~# z- P6 ~8 R" a
        {
: S% A3 k' R  Z, X; v- p            // 写一个字节到 THR! F" n3 C$ @4 Q; z9 }
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
! H* a3 C7 Z& M  v) ]' x4 s' ^            length--;$ A4 P" e6 S% ^* H$ k3 u! O
            count++;
8 ?# b; `. ~$ S9 U        }7 k9 X' ~- [6 p- J) B2 D/ }0 v
        if(0 == length)2 B  P/ u* @) j" s' @% X
        {
: P' J" l5 Q  F4 c9 D: c            // 禁用发送中断2 M, V" d0 w4 d6 c
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
9 q9 h4 o' }- I0 i. c        }6 S/ ^  ?* ?4 o* X" u
     }- x4 j; I) m6 g2 z" z. y/ i3 ~) P. [# j
9 |+ Q' l) X  I
    // 接收中断
: u: q2 r/ G! e1 T6 }    if(UART_INTID_RX_DATA == int_id)) G/ C- h9 B6 I% Q
    {$ x4 ]( {" z6 ~  {8 ~; t
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
, {8 Y8 x1 @9 ^) `6 |- S! E2 c, v% w' E# N$ m! Q. v
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);+ K3 V- ^! b+ T- ~. v0 g
    }
7 F/ l) T9 Z! o0 O0 C' [
7 P: R& n" i+ `$ `2 V( G    // 接收错误7 k0 W5 B0 I' A% u5 ~8 z. J
    if(UART_INTID_RX_LINE_STAT == int_id)
. U  U3 z$ A; V  p    {
  y6 q/ p2 b! ^1 H( l: {1 _+ `        while(UARTRxErrorGet(SOC_UART_2_REGS)); l% r% L- m/ Z3 L/ O; H. G
        {* C2 N9 @* H0 j; i( H. G, }
            // 从 RBR 读一个字节! m- O# x5 e. ?4 H
            UARTCharGetNonBlocking(SOC_UART_2_REGS);  z8 `( M+ Q$ Z$ K2 A/ X
        }2 q0 B" ~, r/ b( @5 ~
    }! B3 W& @% m9 V' h
   
9 c! k1 t- @) @) Y) m    return;
, j9 w  N. e2 H}; ^% Y. y; W, {& 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:25
  L9 r  [7 ^: {! S' Q& B如果其它设备快速给你发送串口数据,你这边能正常通讯?
* s4 Y3 z6 P* |: W- }( q; X
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-24 23:01 , Processed in 0.043254 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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