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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8825|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
& S+ x) |5 G, g  C

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。# u* _2 u" _4 N3 X0 e8 k1 r/ Y9 w
. g2 r1 A4 s- \" Y
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
6 l  e2 d: Y: }0 y% q# U+ n8 S0 w! m: k8 E9 Y1 A) u  Z% B
#include "hw_types.h"               // 宏命令
1 b, }3 T3 X" v, _+ o4 E#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
/ a8 T9 }% G5 F7 h" q' _" }#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器+ A, U1 {3 O. r" A! T6 |

) J6 m% K& t: ^, @#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明+ q2 b* s/ y7 _+ V! ]/ l
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明( T! ^2 {* P( i
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明4 D% t+ ^' i5 J. |: n+ X' k& M3 Y
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
; {: F: h5 m2 |; Z& v+ s# X' j) ]! I7 @1 Q5 O  Z
/****************************************************************************/
; t! V( \6 _. D- j/*                                                                          */
% v/ V4 C) A7 ^/ Q/*              宏定义                                                      */$ {9 x. v$ W6 z. f( y- O! x$ k
/*                                                                          */
: v2 X9 y# p3 l2 D5 t- R/****************************************************************************/
0 a; P) N- ~3 s' \' k1 L2 d// 时钟  Z% Z+ v2 v  q' R
#define SYSCLK_1_FREQ     (456000000)1 ^( q; W; f7 N+ K* ~
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
! o( @2 l& e4 Q2 L4 O#define UART_2_FREQ       (SYSCLK_2_FREQ)
7 e0 B9 e$ H7 k6 \( M' d0 K2 ^0 c' S- F
/****************************************************************************/
8 `2 Q+ u. w2 [0 \' Y! ~6 j1 {* ]2 V/*                                                                          */% a* Z2 r. s. [) c4 p
/*              全局变量                                                    */
- O  ~- G) u6 ?; B, t0 Z/*                                                                          */
6 s4 d4 ]/ [( T3 ?& E& R6 N/****************************************************************************/
* v. S8 S( f4 ychar txArray[] = "Tronlong UART2 Application......\n\r";
# e6 C2 j/ a: a8 H" q5 x% g1 \2 u$ j
/****************************************************************************/
$ d( \& {. n9 W( q: m, Z6 R9 Y; Q/*                                                                          */4 f2 P! h0 e! n' X
/*              函数声明                                                    */
% _* ~2 M6 S. m' ~) J. Z' H/*                                                                          */' ]/ P: j2 N' P& |. Y
/****************************************************************************/: ~2 I- y% [& e) e( M  R
// 外设使能配置5 s; K) m7 d0 Y* f" U+ Y
void PSCInit(void);% L: e: @$ D  o6 k7 Z0 `) h
: J5 k$ ]" E4 H# I
// GPIO 管脚复用配置3 F; H; u0 h' j- l5 ]8 m
void GPIOBankPinMuxSet();
. X, K0 ~" b  H0 T& z. I9 O) ?5 ^
) @+ q! Z  F" h/ G// UART 初始化; o) ~6 R: Y7 p: y, N# N( J
void UARTInit(void);5 h3 o. v, n! N: E" n, A  T. L
// ARM 中断初始化
: F) O# S& A* r5 }6 [. fvoid InterruptInit(void);0 z6 a0 `2 E$ s/ G) B3 S6 e9 V
// UART 中断初始化
) q+ Y8 L- E0 g+ b6 h' s  S8 Mvoid UARTInterruptInit();
, e0 k# R* ?" t: [) R// UART 中断服务函数
2 P7 c8 X- _" F# v# kvoid UARTIsr(void);
* g1 v! _& S' w1 C; W
, g( ]& d7 `/ X) x& b/****************************************************************************/
/ s; `5 k* o6 }" \6 k( ~/ e/*                                                                          */
9 P/ F3 A' J1 w4 V/*              主函数                                                      */9 t9 L+ D8 K# A
/*                                                                          */
, w) b6 J" d0 h/****************************************************************************// G& `9 |" c( T, c$ d! E0 n7 h
int main(void)( g% \# m& Q8 ?1 F1 R6 h& M9 _
{
2 d2 ?" V$ u6 m, U  v        // 外设使能配置4 [( o% [+ I$ [& `4 d* @6 @
        PSCInit();! x3 b; B- |7 v& t* _5 S
        $ E- o/ x+ U" I2 g
        // GPIO 管脚复用配置  a* _& c$ ?; a( f* g+ c4 R" b. E" A
        GPIOBankPinMuxSet();
: k: f' w* E( v& c9 N! x+ [) M, W. C5 A# V  U
        // ARM 中断初始化( v' k4 l8 T+ x) U/ G6 R9 m4 h
        InterruptInit();
+ k) I; {/ B! Q' d' `$ R. ~2 Y- A3 J' {, B7 B" C
        // UART 初始化
" [2 W' M3 `+ S3 o* F0 C        UARTInit();
7 C  ^* u% `+ ]# |6 q( ~7 U) X$ ~0 U  B5 s: j# ~$ F
        // UART 中断初始化# H' w+ @" H9 ~' W2 `% h/ T
        UARTInterruptInit();
1 f3 _7 h# r' L6 @4 J
, i! x6 m8 S: ^+ L# s1 y        // 主循环
5 f$ C. y" h5 H% a1 J' J6 R        for(;;)- x! Q* X* Q/ G- C# R
        {
- g8 _/ P, n. a$ b- R( T, k0 ^- [
# r& c! ?- o4 \: z6 ~- y        }
+ o7 U3 Z* `5 K' ]}3 S" a& x$ o4 s3 q

% z2 E5 j$ \( E4 f5 v/****************************************************************************/% \8 P# O1 v# h- S: y# T1 X
/*                                                                          */
" t. P! b8 o8 x6 M4 ?, Z8 l/*              PSC 初始化                                                  */
' [8 k" H+ u/ L: ]/*                                                                          */
/ m* Z' H2 Q2 M( b7 e1 v/****************************************************************************/
3 N# w4 e; {! cvoid PSCInit(void)% [/ M: y) Y& F
{5 F1 t7 z+ g( C' B3 p0 d# ]* o  l+ s
        // 对相应外设模块的使能也可以在 BootLoader 中完成6 I4 P- t% M$ ?7 ~. }
    // 使能 UART2 模块
7 Q1 L1 h, o( W    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
+ M" o- ^4 U6 ?2 I: e}
2 p+ U( v' B( T- Z& l6 I
9 z7 j8 m( ?9 S! j( i6 s+ G5 Q/****************************************************************************/
0 T& b* z) r" Y! x( J/ e, f# f9 @/*                                                                          */
- x. i3 P- Y! B9 [/*              GPIO 管脚复用配置                                           */
: @/ E. H8 t; _! V; S( u/*                                                                          */" B, g- [' k  E) A4 l- X
/****************************************************************************/
" D4 v9 d# K3 N, G# L0 dvoid GPIOBankPinMuxSet(void)& u: t9 }* @) l
{$ @, ^0 h2 I9 a: y8 S
        // UART2 禁用流控
( o/ X/ D  s0 |8 U: I        UARTPinMuxSetup(2, FALSE);
1 G% I7 F# G: G# J}
( A# h: p. K' X; V4 q$ }* C: E5 R  }* c
/****************************************************************************/
* X6 N5 G7 e3 u. ^" j2 I& V. G* U4 j% n/*                                                                          */
1 v4 U! L# v; |' V: Z# R/*              ARM 中断初始化                                              */
2 ^. G+ z1 g9 Y5 H, Q$ o/*                                                                          */
; a1 V5 t/ ?/ n0 M( A/****************************************************************************/
( A3 ]4 t) Y1 T& f7 r8 A( h) |void InterruptInit(void)8 m+ _5 b* _2 j. z( s
{
; b" X/ ~$ q! X3 B" Y1 w; r( ?    // 初始化 ARM 中断控制器
9 M' w0 A6 R& n/ d  F    IntAINTCInit();
9 B9 F8 b; w2 _( K- ?7 d3 q9 d
5 A# `, g& ^1 Y    // 使能 IRQ(CPSR)5 ]7 W( n6 ]8 X, R8 Q/ I; O
    IntMasterIRQEnable();
4 C$ T2 F4 r& h7 d0 S* |# W* @) r: H4 U  X
    // 使能中断(AINTC GER)
  _% C! a) {! d% A- w, Z    IntGlobalEnable();0 P: x- d0 y7 S  \, g2 \

- i" m* v" X5 u% l6 C2 i) Q7 \  H    // 使能中断(AINTC HIER)5 i! t# `( S3 e" m
    IntIRQEnable();
) B( M: z2 \, S. ^) C% z+ A! E}* S5 w# [) X5 s/ H7 K

' {% F( m  t% }/****************************************************************************/
) |! t9 i  C$ N: f$ Z0 h3 g/*                                                                          */
, k- ~" f, ?4 h) w6 R/*              UART 初始化                                                 */
$ i* r( F$ E9 D0 a. h) a( ]- f" W/*                                                                          */9 V6 @' O# `' ^5 Y) x8 K9 c! K
/****************************************************************************/
) D: y* X5 u* \5 M+ Ovoid UARTInit(void)0 u6 E3 F% r' ^! D
{
* X- n. `3 c! Y        // 配置 UART2 参数
+ c+ W: O8 e' r# A2 {$ d) p  D9 m        // 波特率 115200 数据位 8 停止位 1 无校验位  x* O2 {+ I. f! ]4 v: Z7 Y
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
) H% i+ g3 l( [( F3 m                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);: n+ X+ b# Z8 l* O0 Q9 W& y' m
        // 使能 UART2
5 K, i( f# Y$ s0 [6 x9 d        UARTEnable(SOC_UART_2_REGS);8 _) [  v* h4 P
0 w# R6 i; s5 f
    // 使能接收 / 发送 FIFO/ g& p$ A) ~  G( r! @% r" s
    UARTFIFOEnable(SOC_UART_2_REGS);1 M5 B, Q3 A. B% s
- \2 @* f$ B1 O) c; y  N  n8 s# \
    // 设置 FIFO 级别
" r6 M7 }0 b9 Z2 Z5 l3 K    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
4 ^' U) V& x$ W9 q3 P# s8 c- d}
8 M/ s8 }6 D* t; X
1 U; Y2 A, S' p8 R' L# k/ p/****************************************************************************/; r0 {& v/ o% m1 o6 U% X4 N# M; W
/*                                                                          */$ S; ?  P! d, n0 Q! N0 J& I! B
/*              UART 中断初始化                                             */$ b. y  D" B/ D$ X
/*                                                                          */
! f" @& _4 L8 X) H/****************************************************************************/' ?4 V  ~8 J: p# O3 w
void UARTInterruptInit(void)& T- w6 `8 _4 I' n
{6 q+ ^- ]3 v7 s7 b3 D: y2 Y9 q% q  s
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
+ ?% k6 N1 ?. c: b5 H; Q        IntChannelSet(SYS_INT_UARTINT2, 2);
; [+ H- z5 d5 G        IntSystemEnable(SYS_INT_UARTINT2);4 c' l. Y5 n& ]

0 o3 z7 a. `9 V- g& [5 _        // 使能中断* e# V. L$ Z0 f0 p. c8 \  T6 a; {
        unsigned int intFlags = 0;6 f/ ~: `. J; g6 N, J
    intFlags |= (UART_INT_LINE_STAT  |  \
2 J3 T6 f! c2 ]% x. l                 UART_INT_TX_EMPTY |    \; X8 d% S2 h3 I2 b- [/ @9 w" [
                 UART_INT_RXDATA_CTI);2 z; L: O6 g) T
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
& g7 r. E" h4 i/ O0 y: f}
2 j7 g0 I7 z0 j" U
* U, }' X* d* z7 O+ v5 A" p: T, f/****************************************************************************/( W7 b" x3 W+ N
/*                                                                          */1 \, G7 w- N1 E% w- [
/*              UART 中断服务函数                                           */
6 F  {( d% c7 i/*                                                                          */
; H) e0 R5 y0 O, f+ C: |/****************************************************************************/
3 \9 ]8 h2 B3 H# l' ~3 F* uvoid UARTIsr()
, B/ ^5 n* W- s  d8 C{% f8 `  w8 S; I1 i  H. b
    static unsigned int length = sizeof(txArray);
7 i7 d& h1 _0 q& o3 R0 p    static unsigned int count = 0;, U- R8 H8 U1 U! s! C' V
    unsigned char rxData = 0;5 b* Z" I9 M4 v4 R
    unsigned int int_id = 0;
  D0 i1 `/ K8 Y9 i6 |: n; U. V# B7 f+ Q; _2 q
    // 确定中断源5 k# }2 @; i7 Q
    int_id = UARTIntStatus(SOC_UART_2_REGS);
1 N0 Y+ g0 w7 x. I6 u6 u* s9 V/ Y" V8 A0 z% ^! h: y9 E7 p6 Q  S
    // 清除 UART2 系统中断, S  h6 W" H& x4 i$ @8 U, j7 }6 R
    IntSystemStatusClear(SYS_INT_UARTINT2);
0 C+ h( T& s: R
, U3 {$ r! s, Q# Q    // 发送中断! R3 _$ s0 K1 N  z: ^
    if(UART_INTID_TX_EMPTY == int_id)- x- B' m2 i/ |
    {* o1 k- x& G2 h: N/ o" q7 z6 f
        if(0 < length)* z6 K4 ~: N) v9 @( I* z
        {4 \  ^8 o3 U8 P) A( {; ]' ]% E3 a( }# ~! X
            // 写一个字节到 THR
$ Y' C8 W2 T' b# W+ w! E            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
! S  F5 O: E! L' a/ Z+ H            length--;
4 D& j7 p5 I7 s& s5 a' A; b            count++;' x+ k5 ~1 f) u% j: V( i4 X5 y& f& G
        }
: S% D7 o/ u3 {2 C6 K        if(0 == length)
  h9 {1 U0 K) ~8 ]  V: n        {
6 `/ N7 B+ z$ r* H            // 禁用发送中断6 }# o9 b& w. A1 D
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
2 w. `  ^2 ]3 s- x& u* |. h0 u4 ?8 |        }; @0 P7 f7 _3 H$ V0 j
     }
2 c$ S+ i1 _) N) T: W7 C* z' d: @6 y0 p$ c8 [/ F" j; _
    // 接收中断% W* `0 ]5 p& F8 y" ^7 n) K# F) G
    if(UART_INTID_RX_DATA == int_id)
) T+ h5 D4 X6 a8 N" z- J    {
* \; ^/ M! ^: w0 h6 R        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
; p. x; x/ t0 h; O+ s) {& d0 H
: f/ C0 L; n' r! a7 O5 a        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);4 S1 m8 |$ H$ U5 }0 A7 b7 L5 Q
    }
/ h, ~9 u1 x, Z7 e: j- J
- z5 U- d$ ]$ J% |3 z' G    // 接收错误
- D' j/ V5 ?9 a2 d- b    if(UART_INTID_RX_LINE_STAT == int_id)
0 R* @0 L7 Z: `- l    {- g# h/ S# h0 d& U/ K
        while(UARTRxErrorGet(SOC_UART_2_REGS))
# f& m% ~  [( t, D) _# v        {
' K% Y5 @- P8 I' D2 K1 E4 b) a" i6 @            // 从 RBR 读一个字节
' @/ W, x" E+ d$ m; N3 b% j            UARTCharGetNonBlocking(SOC_UART_2_REGS);% \; x9 ~" H' G9 K7 l/ A& o3 J2 V
        }
- p, T5 O5 i4 ^$ e# l/ e    }
8 F) M1 I& U: u9 y3 |: `   
  [1 P6 B* U! P7 _! f* [    return;' z% x9 ^: v. w. m1 |) W
}8 A+ w1 x2 F3 H+ _  |4 \6 l
回复 支持 反对

使用道具 举报

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
0 h/ T# d; n9 V/ V如果其它设备快速给你发送串口数据,你这边能正常通讯?

+ |4 X, b2 c. a4 A' u, s谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-5-31 08:45 , Processed in 0.044944 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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