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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5596|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。8 E# V) ~+ r' _* w) Y3 z

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 显示全部楼层
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。! q  c8 I8 M6 c. h9 w6 L& n

  a+ ~/ k5 ~: W5 N0 x#include "TL138.h"                 // 创龙 TL138 开发板相关声明$ W+ E" f7 I) S# D6 r

+ D% i' h* N5 {0 @; `#include "hw_types.h"               // 宏命令
- t  @& C" V* J0 `" b* |+ Z#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器) S1 S( G/ C1 w
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
# m- d) a8 I+ ~3 X& j) X
% T* J7 }% q$ M: q  g$ l#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明+ V( r7 W  O7 Z6 ]( n
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明3 N& r: d& N1 i+ G1 A
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明$ U" M  G. k/ {) m, i; f
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
( \/ O0 o! w8 s; h/ R
* p  I/ M2 J7 s' \" K/****************************************************************************/
! {: a: E* R( P3 z* l/*                                                                          */0 @0 }6 C/ a" ~* d: |7 p0 {
/*              宏定义                                                      */7 o, n4 j) v3 M) b3 o- q. F+ ?
/*                                                                          */
& z! M4 ?2 Z' F" L/****************************************************************************// E- @0 L: j4 r* }. ?
// 时钟
; P7 J# f" {: l+ ?; s% u& n#define SYSCLK_1_FREQ     (456000000)
7 a  A2 |. o3 E#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
# {* r! \: Y6 R/ N: r0 L+ j. _% n#define UART_2_FREQ       (SYSCLK_2_FREQ)) P; c# p" H$ }, S  E. X

* Z/ v3 I0 x# o/****************************************************************************/
& b! F9 a7 w1 ~" u( R! w, y/*                                                                          */8 ^  m" g) j: V9 _
/*              全局变量                                                    */
3 M, ]8 s# P! b! y/*                                                                          */  `3 Z1 s; U. ^3 c. [( v: C! h
/****************************************************************************/6 Q6 P1 U8 I+ n! O7 O4 m0 t3 w
char txArray[] = "Tronlong UART2 Application......\n\r";
: ]2 n1 f9 w6 H7 N4 U: A" A1 ~& F3 V3 O! c9 s
/****************************************************************************/+ C% v, J1 N0 l3 L% z4 v2 u
/*                                                                          */
' |) B7 d1 h) ^2 d4 d7 z/*              函数声明                                                    */
) r+ S+ A( M1 m3 A9 i/*                                                                          */
3 ]1 \+ P7 Y- }, ?9 l/****************************************************************************/
" e7 _( h" [( A9 ^2 ]+ D8 p- J// 外设使能配置, a5 @4 V6 y( L' l. y2 t. c
void PSCInit(void);
3 ^# Q& ]) h( h3 t% L* G
) |% J* G; `- v4 p7 V4 ~// GPIO 管脚复用配置
  l. r7 Z# H) R2 C! V; G: }void GPIOBankPinMuxSet();% x2 L8 N4 X' c% B! c/ j# n6 C4 V

% C4 J, @6 e8 B; O, E  p1 {: B// UART 初始化& z2 l( O% I& O$ ^$ L" [
void UARTInit(void);" C: T. a* a: G
// ARM 中断初始化+ @. r* `% z! a; @/ \4 \" R
void InterruptInit(void);  t9 Z* b3 f" S
// UART 中断初始化7 l/ u& a( |0 A; a# }; N
void UARTInterruptInit();
3 |% V1 g; y7 Q$ D5 g// UART 中断服务函数: G# a/ u/ l. f
void UARTIsr(void);) y4 U+ ~: K2 a( ?

2 ]4 c- h8 H2 Q4 k5 G/****************************************************************************/3 G* D" X9 N/ o7 o2 R- P' b
/*                                                                          */  K4 V  v: @4 w+ v. R) d4 z. L
/*              主函数                                                      */! U% L3 |; F5 q
/*                                                                          */
! o* V2 I# s2 Y/****************************************************************************/
" Z& X7 [; F4 B/ y! p/ Gint main(void)
  ~' k) P0 V# A5 Y. W  p& X+ N  t{
7 Z) R! L9 i& a& ?+ F8 `        // 外设使能配置% X+ @) `/ S; ]) ~0 w: ?0 S; K0 b
        PSCInit();
0 f) |. a3 c/ }; |8 v: [3 c6 ?8 t! T; L       
" P& f% Y+ R) n5 S, K, O        // GPIO 管脚复用配置4 D" p* d+ h4 a; ?) ?( w
        GPIOBankPinMuxSet();
) o8 {  k9 M0 r2 C$ }) t7 U6 C' m$ }2 A
        // ARM 中断初始化, E' V0 [2 b, e$ M( N% z" J
        InterruptInit();: W/ {  K& q$ I2 u0 w$ P( g
9 T0 p* a: y' E; s; ^9 _
        // UART 初始化
/ J/ l# f1 [  b; r5 n% L        UARTInit();
  t3 T9 M! z. _, z3 R
+ @0 x* G+ }& k2 m) |" s# F        // UART 中断初始化9 f1 v2 I6 n$ ^' C( }6 U
        UARTInterruptInit();) W# O: n8 c! \  J

& J" |) D4 d) _- Y# e: S; `- ^) l        // 主循环
5 o0 X2 ]; Q# F9 ~! D6 T8 l        for(;;)* r3 n- N+ ~; W
        {* L4 o- I/ N$ f+ L$ X

# T* H% F+ z! A        }
$ b4 ]! K: P7 D6 m0 h}
0 t* ~3 b4 @* t' `! v7 F
9 |0 ~+ q5 d( o. ?7 b" F7 a/****************************************************************************/* |2 C4 {9 Y6 C: u, i  g
/*                                                                          */
& R+ O4 [9 J4 f/ i  t/*              PSC 初始化                                                  */* Y: H. _/ e# i
/*                                                                          */' i( B' C5 `2 w. a' E1 t; E
/****************************************************************************/
- o5 q7 X7 u4 @* fvoid PSCInit(void)% E6 _. Z4 a& _! z
{
* _8 w" _  |% [1 s* a$ v        // 对相应外设模块的使能也可以在 BootLoader 中完成. z! @' \% D7 O2 ^  Q# F
    // 使能 UART2 模块" T9 a/ O) F* m" f2 X% k0 R  ]* B
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
/ ?% [7 Q: |, Z4 Q) L, Z% g}
; F7 S/ R5 x0 d9 Q2 L
* p. A- |( d% ?/ h0 w* L2 F/****************************************************************************/
) }: C+ G, V4 }0 G1 _% G' G/*                                                                          */+ D/ b+ q5 i+ N) }3 D* H
/*              GPIO 管脚复用配置                                           */& ?0 g/ K8 p* m
/*                                                                          */6 M# @) _* ]% o) Q" w& D! x
/****************************************************************************/
2 O- C; c4 ?2 G4 b" C$ {void GPIOBankPinMuxSet(void)
& O' X* I7 o! Z5 H; U- x{* @9 v8 s: B, _! T% r
        // UART2 禁用流控7 @/ c$ @( u+ ~
        UARTPinMuxSetup(2, FALSE);: g) P; y' R2 _1 p7 U: f6 E
}
* B  |7 E: C, k& ]7 A- H- `# |4 Z2 H& {, A- h' F
/****************************************************************************/
7 ~0 g* N6 _  d+ L- P9 d; ]& C/*                                                                          */
0 s$ z+ O* z0 [" T* N/*              ARM 中断初始化                                              */
: M, m" _( Z- L8 `  @. r/*                                                                          */
& \) T) f( o0 `# Z* Q/****************************************************************************/& v; q' C; m% h5 e: G) L: E
void InterruptInit(void)" q3 w  j$ T; F
{
- i$ Q, x1 \, A! g    // 初始化 ARM 中断控制器  c+ ?( e9 R2 \1 }9 h) L
    IntAINTCInit();
- z6 B- k, Y7 V/ ?2 h0 J8 v6 A- ^: \
    // 使能 IRQ(CPSR)
6 e' s2 c8 c- I4 k. ~) ~    IntMasterIRQEnable();
' M- U( G, k$ G4 \6 X9 F, \- R$ y
  f/ L; Y1 v+ A, B+ v; Q7 o    // 使能中断(AINTC GER)2 M0 Z6 R6 x/ {; O2 |& H, h
    IntGlobalEnable();
; h) ~1 f# `6 y" C
/ v: I" A- X8 C3 @/ Q9 r    // 使能中断(AINTC HIER)* `" S; w, ?( |# D
    IntIRQEnable();0 R3 X( Z, i! P" F, l
}6 o# \$ r" q$ J( G

( t, |) U% w# K: I6 @" N3 |/****************************************************************************/
$ K8 _3 L" S9 m8 M1 Q; _4 M/*                                                                          */
. o* g+ ]2 t  j6 C5 b+ t# V/*              UART 初始化                                                 */
1 U8 |2 k( P& X0 O8 s2 {. Y/*                                                                          */
) C! F2 b1 g9 f  |  M( g7 B8 r/****************************************************************************/  j) H# [5 c" N+ h
void UARTInit(void)& [1 v0 s8 i5 Y1 R/ X& @4 N
{
2 i5 c3 X% u$ g, ?. g        // 配置 UART2 参数. _% P6 ]. i1 O  `1 I5 ]6 A
        // 波特率 115200 数据位 8 停止位 1 无校验位+ z8 y  `4 m' `1 _* L
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
8 Z, v1 g, z1 ?9 ~+ `- x                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);* k) [2 p* b! w
        // 使能 UART2, x. D9 |9 l- D
        UARTEnable(SOC_UART_2_REGS);, u4 n& y6 O# W8 U% b& u
0 E2 Y- ?! A3 A7 V8 m
    // 使能接收 / 发送 FIFO; p" ~! g: F" R! c6 [% j( p
    UARTFIFOEnable(SOC_UART_2_REGS);
$ b/ ~% M/ Y5 _; r) Z5 h+ B
9 k1 z' K; a, I! L, {' w  {: p    // 设置 FIFO 级别
0 Z5 Q1 W/ ^/ h9 r+ C2 Y    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
& z& C8 W  Q3 M5 P) Q}4 E) o8 N) x. y0 }* I
0 i2 n* q  T; E3 I3 C6 |, n5 {) h
/****************************************************************************/1 f  o* D8 X9 j; U/ i
/*                                                                          */) G2 v- \; _" ?* a( [
/*              UART 中断初始化                                             */6 C7 @, E' [, L% R% a' a: J/ N
/*                                                                          */& |0 [: @+ W# Q0 o8 e9 L
/****************************************************************************/
8 ]/ d/ e  x7 Gvoid UARTInterruptInit(void)
7 b5 A0 \' v/ U5 A8 _{* Q8 P/ Q/ |. L; U' k
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
8 {% V6 h3 {7 z        IntChannelSet(SYS_INT_UARTINT2, 2);$ P5 |' v0 A* m8 ^' f2 L
        IntSystemEnable(SYS_INT_UARTINT2);. v4 |( ^& Z$ Z+ j6 [8 r+ q# W

( d5 I4 S9 ?, v# l+ l5 ~" }0 _        // 使能中断
5 s2 R( u  d! G4 m, S        unsigned int intFlags = 0;
* H, H# A# O& @1 m* v$ W    intFlags |= (UART_INT_LINE_STAT  |  \
+ s( e  A$ l' P1 P/ V                 UART_INT_TX_EMPTY |    \1 U, I) i. g1 @% r
                 UART_INT_RXDATA_CTI);
2 i/ W  Y& {' E4 Y: ^  d3 ]    UARTIntEnable(SOC_UART_2_REGS, intFlags);
' c# [9 {6 B9 j$ L' x1 a( I) a}  \' R2 w% O6 A4 s6 ]* U. C
: e7 W8 m& V5 r1 t
/****************************************************************************/
, k8 X! m( R* a7 S7 X3 a) M9 t/*                                                                          *// p" s" A/ v+ M/ t
/*              UART 中断服务函数                                           */
* i$ v) ]0 ^" S+ d/*                                                                          */+ j0 ]- }4 K. {0 w& M1 R
/****************************************************************************/
# I* n+ F$ ~4 K. o! Fvoid UARTIsr()
  d! b) j. A* g) T% b4 W{* H( T  n4 _( G: t6 F$ _
    static unsigned int length = sizeof(txArray);6 }  c+ v, {  A
    static unsigned int count = 0;
+ L+ E6 i9 Z3 k0 ]3 {! y" H    unsigned char rxData = 0;+ r, |$ _" p" E! [* F2 b+ r3 Y/ u
    unsigned int int_id = 0;
5 T2 j! h+ J5 x0 D; N7 Y# r, S& ~% O$ D8 X" M
    // 确定中断源( r$ c5 y$ W, a; q$ z- L4 {$ Z# y" K
    int_id = UARTIntStatus(SOC_UART_2_REGS);
8 c" @. `- S. ]
) }' @  U6 \3 N* a3 o    // 清除 UART2 系统中断
2 A/ c5 \' _- c4 v7 T5 \) e  z    IntSystemStatusClear(SYS_INT_UARTINT2);
, t# }, S5 C( }7 ]" \: Y; [# L( Z0 ~, y
    // 发送中断
+ a# O' @* G. ]; \    if(UART_INTID_TX_EMPTY == int_id)! k) m9 ]6 x7 g( c: c. G' Z
    {
! E# S. L% l; A4 Q        if(0 < length)
! e" w% }- A) z% V3 f/ x1 _- o        {
9 h0 r% t* A  `) R4 d            // 写一个字节到 THR
/ I/ \6 @3 F! U            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);% b0 Z' Q8 L4 m% b' I  X/ ?
            length--;' h& r6 i- H; G1 w
            count++;% [$ T, [% q5 k) k, D( L
        }, b. p& A- ^; p
        if(0 == length)5 u3 y6 \: _; a- j. L0 m
        {
% p! f) i# b: H, N7 [' N9 X3 g            // 禁用发送中断4 y( ~" [1 S0 `' Q3 T
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);% w0 D" S+ E4 D4 B3 L
        }
0 p& M7 N8 s2 H" j/ U& A6 b* m  m# ?     }0 p" @' O; Y4 G7 D* c

9 e, {, o: }. h( M7 y    // 接收中断, k% z/ h' J1 A
    if(UART_INTID_RX_DATA == int_id)& ?3 Y  f/ q3 ^9 w0 Y
    {
& N+ {; L7 {& N2 v        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);8 ~4 s0 W: j) ^5 @" e% B
7 `- c  I2 L3 ]$ w, T& @, F: _
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
* C8 z" s5 E% a* i1 n    }
7 m3 u) x2 W: E& ]: X8 [. H9 X) Q+ \2 R1 l9 x( M) G
    // 接收错误
2 v% h7 ]# v2 M" l- X2 W3 j2 u9 p    if(UART_INTID_RX_LINE_STAT == int_id)0 H2 M! T" ^$ S7 e8 m; X
    {" p# o" p8 d7 N) z- h- f; d
        while(UARTRxErrorGet(SOC_UART_2_REGS))
# ^. q  U5 G( }( K        {
$ r7 J- g. h" x  d            // 从 RBR 读一个字节
( {5 U2 l! j! B3 X8 A; Q/ f1 C            UARTCharGetNonBlocking(SOC_UART_2_REGS);
) Z9 |  f$ P1 }$ Z0 _' e- O        }4 D+ U3 V# c( b6 a
    }
# g# ~' _4 P% q5 ]6 K: l+ J; d    + }& k8 D# j; I6 [
    return;
/ p! F# i4 }2 K; j9 |, I}
; U; k' C) V* f- E2 }( I) I
回复 支持 反对

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
板凳
 楼主| 发表于 2019-5-5 22:36:34 | 显示全部楼层
785235014 发表于 2019-5-5 22:258 r' m* o% O( L- M: f$ l; |
如果其它设备快速给你发送串口数据,你这边能正常通讯?

5 G; D( z$ a3 L) w$ A6 i! X. ?谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 06:55 , Processed in 0.043928 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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