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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5584|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
$ b1 \# L7 m( q  p2 Z6 p5 k

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。4 [1 l( X' w1 n4 x: J, b6 J  [5 Z- J

7 R. D0 H7 a, m3 u. l& a#include "TL138.h"                 // 创龙 TL138 开发板相关声明
# z+ U% t) V9 a6 z! o7 Z; L# A  q3 e$ \3 K
#include "hw_types.h"               // 宏命令3 Q7 W, A% S4 i3 Z  y; ?, P" I
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器! ^/ Z5 `  J& P
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器: K7 }/ u5 r& P, a8 x! S0 ~, b

8 D: u) o7 t' H#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明8 R* L: J5 C3 J0 \
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
& M4 U6 a2 W: v9 y#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明* B0 O5 p3 T' L% d- F
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
" l1 @' A- G" `/ V
1 P$ G  s& a5 ?' n1 p, ~+ O8 e/****************************************************************************/# m8 n1 Z+ U! S2 m9 u. ?
/*                                                                          */
) ?* E7 X2 l# ?' N/*              宏定义                                                      */, I( \. V: M4 ^0 a$ K- {9 v# ]4 f
/*                                                                          */
( g* \4 K# v& }+ {/****************************************************************************/- X- U+ Y8 ]. M
// 时钟
- W& U0 c# o) c#define SYSCLK_1_FREQ     (456000000)& v, k" ]/ a* G9 z5 v0 ?( ~
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)# L# G3 n( u3 D" M
#define UART_2_FREQ       (SYSCLK_2_FREQ)
6 p! G9 X( |$ n% z/ Z2 v  S" k& v( }) ~7 f9 C
/****************************************************************************/
- {% ?7 i2 p- t. B/*                                                                          */
# @0 q( Y( M  B9 b3 }6 M3 f/*              全局变量                                                    */1 n2 j8 ~. \' @* o8 x; P1 C' s
/*                                                                          */
9 K/ W) ^" y! o* P5 l* {9 {/****************************************************************************/
- u) t" p2 I5 }) v! b5 Q. o; Y4 Cchar txArray[] = "Tronlong UART2 Application......\n\r";
$ Y/ c( w2 A  {; e1 z% U  W( X  J; V5 D
/****************************************************************************/
! p9 o1 ~7 k  a, ], y/*                                                                          */# U0 T6 ]9 P2 I$ I# Z6 r$ h
/*              函数声明                                                    */
8 ~$ h. t; G# g+ l& l/*                                                                          */; Y- b1 W/ I3 Y4 W& D/ @- o
/****************************************************************************/
7 k. O0 |9 x2 J' _( u3 M, l// 外设使能配置' C1 `  d% ]1 g( ~) P9 O- K2 D) E
void PSCInit(void);0 Y! @0 w. c! e6 _9 _8 O" ?) y& q/ R

4 I8 `1 s9 d7 X8 i+ t// GPIO 管脚复用配置
0 F$ f7 V/ J6 R/ J+ |. _- B$ Pvoid GPIOBankPinMuxSet();) F! v1 d; Q1 R2 z3 o! C" V

, U# A* i6 @7 c; `8 n. n' L// UART 初始化1 t/ {' Q' i7 |# n2 o/ E- b8 n. ?" H) x
void UARTInit(void);
# E. ]3 L, ^: y! b6 M$ N) [% @4 j// ARM 中断初始化3 r2 Y/ X" c. e8 q
void InterruptInit(void);1 t2 @; Z7 |3 }6 h" Q* `( w0 T
// UART 中断初始化
) y- ?1 J& W/ g" D1 Bvoid UARTInterruptInit();
3 m" h* N  o  Y4 ?5 a) Q" A1 H// UART 中断服务函数6 i, s# k. i, y& s
void UARTIsr(void);, X# N0 }! D6 e6 R& U

" {4 R( D2 s$ Y/ O/****************************************************************************/& }5 ^* O( r9 ?! k. }
/*                                                                          */
+ C0 W0 Y1 i" p" L, ^2 @1 E( u/*              主函数                                                      */
9 l" y- @0 A7 x2 \/*                                                                          */4 d9 r7 Q. s- T5 S, j1 K
/****************************************************************************/
( A( g! ~4 O4 t7 [2 b" [7 \int main(void); O- j# a  M# O! l9 @6 s
{! \& M2 G5 ?% j3 s
        // 外设使能配置
4 M: G! b3 d3 R8 N        PSCInit();
9 E# Z1 E. h6 w  b* g       
  W9 M/ }8 \. J! r( W# \+ \; u        // GPIO 管脚复用配置
) w- k+ K% o7 {- Z        GPIOBankPinMuxSet();4 _( Z7 d" h  \- b
6 a# Y2 s/ C& p& e; n! n
        // ARM 中断初始化
" `/ o4 c& q1 d* s        InterruptInit();
# ~  n& U9 ]8 ?% y6 P: g4 G$ `0 k
  K9 \0 S& S( U2 A        // UART 初始化# X1 `) S9 {; z
        UARTInit();# b$ J9 ?- C5 {* p# o6 _0 I

: N# Y8 c! Y. V) V/ G        // UART 中断初始化
# H% A& y! X* D+ r) w5 D$ [8 j        UARTInterruptInit();; s  ^; ]+ S+ l& ]0 @
7 |. t5 j0 t3 ?4 y/ Q
        // 主循环- h) d4 _: k: o' |
        for(;;)
; B) N0 R( {2 I( P+ W- n        {
8 v" C! J0 y& G4 t1 e2 V
! l. A* i0 T7 H3 {! y% N        }5 J+ g! a* a! m0 E2 Q7 z
}3 S  u) _! Y' e7 j3 m' V0 d
8 Z* v/ g& `) Q4 h
/****************************************************************************/
" g8 ?" k0 L; z) n( z/*                                                                          */7 x) Z/ w3 z% R2 V. |; E! t8 R% T
/*              PSC 初始化                                                  */# y7 v0 ~- I" K0 ^
/*                                                                          */
  K/ ^0 h) s" P  ]/****************************************************************************/: ?% C$ u# q. \5 s6 g
void PSCInit(void)4 `" W& F1 H6 d" i2 E; B' U
{9 m2 _. U0 z1 }3 |) @- k
        // 对相应外设模块的使能也可以在 BootLoader 中完成
! Y$ T  ~; R9 H  W9 D! E- C! O9 e    // 使能 UART2 模块
4 B9 b. k2 A- ]4 D$ ]6 C& [  h+ x  g    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);1 w4 z; ~8 `- c, ~4 h6 K- V% B
}
: d' r. o2 i6 d3 U( f# W' ?& g- x
8 L3 Z. M* T. ~  N# ^! k/****************************************************************************/
% L0 ]7 z/ \8 e4 \9 g/*                                                                          */8 [- ?" K. t: w/ ~4 |) `
/*              GPIO 管脚复用配置                                           */
0 U- l" c4 g4 R8 t1 ?/*                                                                          */# [" h. \3 z# [
/****************************************************************************/
  S0 ?2 M. ]0 j7 g4 X6 wvoid GPIOBankPinMuxSet(void), c7 ?' s7 y# ^5 m
{
8 a7 @9 M2 h0 ^( c$ l% N        // UART2 禁用流控0 l8 c8 H4 \: w, V0 O
        UARTPinMuxSetup(2, FALSE);( F; }; \8 W6 X; [/ Y8 J
}
, d% t+ h7 N( F- _9 h7 x
+ Z/ x' v' Z. M- W- p$ P3 v: I2 L" q/****************************************************************************/
, x3 @# b: W, P) S5 T( j/ K, Z/*                                                                          */( [$ t  B5 k) l7 u2 ?
/*              ARM 中断初始化                                              */
) r# e; x: W" p; {: t; k. C/*                                                                          */
$ q3 A- b% Y; e9 f& S+ h2 K+ B4 P  H/****************************************************************************/- Z5 G( N' @+ n
void InterruptInit(void); t5 v0 p& B: U! X. c
{3 h. r; a/ A- B2 b
    // 初始化 ARM 中断控制器
+ R0 w4 u. W* F; p9 l    IntAINTCInit();. j2 x: G# P4 B$ S/ e
) k2 M5 l' D% b: F& F* Y
    // 使能 IRQ(CPSR)
5 R9 b) Y) z0 I, D5 j    IntMasterIRQEnable();, E8 z. l. @. k0 a3 y! |
. z+ I- w. `4 u# @  r" O# p7 i
    // 使能中断(AINTC GER)
( D2 A+ K, A/ a" G4 x- ~    IntGlobalEnable();' |5 y, Q& G$ e0 t* Q

# N# _) {4 q( ?( g* H& m    // 使能中断(AINTC HIER)
1 D  [# |2 L7 [% M( S1 x+ d    IntIRQEnable();
7 p3 z: E! j9 _3 S5 m}- {" r5 f( K8 g' w5 `; e

) ~- M3 q( p$ q  e/****************************************************************************/: O1 C9 L, r. y5 ?' n+ C8 W9 I
/*                                                                          */% P! g3 m. P& @3 c* D. X8 V
/*              UART 初始化                                                 */  B9 P' y3 R+ z, V: v4 l  y
/*                                                                          */
: c) W9 n+ m2 [/****************************************************************************/6 ?* m9 X- e9 D0 b' k
void UARTInit(void)
* s' \3 A  K, H{
) W: g7 {4 Q$ _; n& M        // 配置 UART2 参数
/ Z6 C- m9 T3 r. U; u; ]        // 波特率 115200 数据位 8 停止位 1 无校验位5 S7 b4 z0 O6 i3 ?5 _! Q" Q
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,# j  w$ D2 Z. }" O7 }1 z
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);( W* u; C, }! ]* g' {* k" E' @2 @9 ?
        // 使能 UART2& G6 d% X. |/ D; j4 }3 c* m7 R8 _5 {3 a
        UARTEnable(SOC_UART_2_REGS);
! r. T1 N9 U  W  L" P2 y0 x. v" t
0 c* I$ U! K0 g9 k3 e3 r# c2 ~    // 使能接收 / 发送 FIFO
# s# R4 K/ V. D5 s    UARTFIFOEnable(SOC_UART_2_REGS);
; Q5 E: R9 B) {4 C+ E- N& @( F* D6 L
    // 设置 FIFO 级别
% Q5 n9 U+ _2 e! F    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);# g6 Z( ?' x1 ^9 }) a
}
/ m4 V2 \' e, w7 x
$ G! U' {& }4 E/****************************************************************************/
; Q4 k" n5 w6 r6 i' c$ Y2 y/*                                                                          *// F9 p) x* r# W
/*              UART 中断初始化                                             */. h2 U6 ^: ?# c# f4 M
/*                                                                          */
3 _& @2 x6 s% u% W! Z/****************************************************************************/( N0 ]- T. [0 o% {# }( E2 I
void UARTInterruptInit(void)/ i$ g% G3 L- O- C1 Q0 O: f; h. X) K
{; d# y2 }: r& O3 [6 [4 M
        IntRegister(SYS_INT_UARTINT2, UARTIsr);1 Y" m+ J3 s1 x. X$ B5 s
        IntChannelSet(SYS_INT_UARTINT2, 2);$ G! q' H4 d' ~4 S. m
        IntSystemEnable(SYS_INT_UARTINT2);
0 s0 `! U) X, j( y+ W  ^% d: `% R" Y& G3 a# F
        // 使能中断
' ~. ]5 {. B0 R# E$ J2 ?        unsigned int intFlags = 0;' e+ T6 n1 @( f0 e/ \7 f4 H* V
    intFlags |= (UART_INT_LINE_STAT  |  \
4 J" z1 Z$ [6 P                 UART_INT_TX_EMPTY |    \) M( I" L3 Q! k0 U3 b3 Z
                 UART_INT_RXDATA_CTI);
6 Y- k2 c# P+ n4 D0 H& ~! _1 X    UARTIntEnable(SOC_UART_2_REGS, intFlags);0 x8 o# i; G  l9 a; t: q  X
}
& |/ d; f- P  Y1 s& q% J6 V) @5 D: a, C% x& P# ^+ ]5 e
/****************************************************************************/+ F& n4 j8 |1 }" ^
/*                                                                          */
; f! I  k) p; S6 [, W/*              UART 中断服务函数                                           */$ }4 ^3 `% S  H- n  V6 K
/*                                                                          */
% [! q. y# ?" j1 p. p/ o3 d- e; B/****************************************************************************/& w" D& e6 p" s4 S5 |7 P% V, q
void UARTIsr()
. j, A) @$ q8 J' W$ y; d3 D  ]6 T{3 j1 v  j' Y; @/ i2 s- o
    static unsigned int length = sizeof(txArray);
; {+ A/ \  ^  z: `    static unsigned int count = 0;
% h/ h: P0 ?' |) C    unsigned char rxData = 0;
( S( h2 q1 |; [1 Y$ M( T+ \. h    unsigned int int_id = 0;: X/ p3 T; ^0 Y9 o, x

' z/ g' y  u2 ?* {: r    // 确定中断源
2 B9 ?+ g+ K$ ]1 u' `) j+ |    int_id = UARTIntStatus(SOC_UART_2_REGS);# Z- F7 L( k4 i$ u

" C7 `! u% P$ ^; ~( w! O2 X7 t    // 清除 UART2 系统中断
$ v" e+ p7 W7 z4 ~" @% _3 _  h/ V    IntSystemStatusClear(SYS_INT_UARTINT2);
" o: a3 \2 N; x
# f/ r# x/ b" l# `3 @    // 发送中断
5 R/ I2 _3 h" i1 C! _" W    if(UART_INTID_TX_EMPTY == int_id)- H& i: A) q( ?7 q: y( t1 n
    {
( M# B5 p  G: y        if(0 < length)1 L, J$ t& ^8 H) \
        {
! C0 [: z/ P1 r! c7 n            // 写一个字节到 THR
& R# j+ F3 M3 h5 I. Y) r- K& ^            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);8 {  X3 @( i0 y+ ?: [/ E4 Z4 l. r
            length--;' n2 t1 N! {. r2 h- l& k2 o- c
            count++;
7 p4 ~) [% R2 p( E# b6 I        }
. Q! s; d, I6 p: E- l5 C        if(0 == length)  ]& w+ a3 G# g5 V, h0 U/ x
        {- C1 r6 F8 a& }5 l: m8 _5 [2 O% z
            // 禁用发送中断, ], \, m0 H7 X/ R& A
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);. G: B5 `1 V, a0 E) _0 c& g
        }
% Y1 r6 x" i: m; u" _1 n! Z     }
  I2 k& t5 F# B# Z8 F3 n$ ?
  k* A3 \8 B5 A/ w) M# ?    // 接收中断
+ {; R" z* Q/ ?& G  A9 k    if(UART_INTID_RX_DATA == int_id)
/ L( C+ E/ |2 k0 e; o4 E    {4 P% G' A, U2 U8 a$ B: `
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
$ m% x" p/ P. h% Q( \+ l# d& L) R* g; Q* w, k( d7 d" E( T/ y2 A
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);/ I7 [* v; o, i9 G1 X$ X: n+ l
    }: A7 q" s1 t! i& t/ S
/ U7 U  X- Q* w$ @/ @! `4 \- w# o
    // 接收错误8 t3 s: Z' G  d$ L& E
    if(UART_INTID_RX_LINE_STAT == int_id)
$ l3 I, E# a% ]    {
* N2 g5 V3 C- K        while(UARTRxErrorGet(SOC_UART_2_REGS))
% e7 B( e! S+ F! K7 t5 E) t        {
; w$ o; J" a4 E& x            // 从 RBR 读一个字节9 I0 k3 M  V) e# Q6 ~+ M
            UARTCharGetNonBlocking(SOC_UART_2_REGS);$ ~+ `7 j  u# N: ]1 K- r- |
        }
5 o" d" Q( I0 ^  ^    }
/ e2 L0 k4 G* c, E   
9 e: m) c3 d4 H- w    return;* ]0 y  D& o8 _( Z. d
}
' M! `1 l1 V2 X) |: C
回复 支持 反对

使用道具 举报

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
! J: h" C2 g! ~+ r如果其它设备快速给你发送串口数据,你这边能正常通讯?

. D3 |3 s# g7 K0 a. E; ?+ E谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 11:42 , Processed in 0.044107 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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