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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8683|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。) V7 H! q0 i+ S2 g( B: l! E

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
地板
 楼主| 发表于 2019-5-5 22:36:34 | 只看该作者
785235014 发表于 2019-5-5 22:25
) S6 W5 }) ?2 p如果其它设备快速给你发送串口数据,你这边能正常通讯?
$ x- Q9 ~6 D- ?7 z
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

1

主题

5

帖子

1034

积分

金牌会员

Rank: 6Rank: 6

积分
1034
板凳
发表于 2019-5-5 22:25:37 | 只看该作者
如果其它设备快速给你发送串口数据,你这边能正常通讯?
回复 支持 反对

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。1 o$ B: D- s$ E/ \( m
7 a. p7 r  C; c* {9 p
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
3 [6 O; G. l; U/ Y4 E8 T$ z* u# _! Z: W
#include "hw_types.h"               // 宏命令
1 J) J1 K- k8 g7 |. \( l4 u4 w* z* y#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器* {" i" B3 J) {  l
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
& }, c9 l: O6 w& Y6 _& v9 F
9 n: G1 n/ D/ E) s/ I7 T#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明" Z4 ]9 u4 i: o* f, B3 J$ o* Y; |
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
5 t" G, ]! M( w1 z% f. @#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
# |8 m  Q- o/ k; u' z6 J#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
$ A; z8 l4 y: _" H1 w5 e
5 E5 D( M7 A5 l0 a' f/****************************************************************************/
6 A: `" i* v! a$ f3 k. ~/*                                                                          */
, r3 H; M8 x0 ^% r/*              宏定义                                                      */# B  W+ E' t1 C- c5 p7 K) A
/*                                                                          */
8 ]. U: e- {" G( D' {, Y+ G1 G/****************************************************************************/7 F9 w' s5 j  a' C
// 时钟
$ K, T* b* l( Z; B! y5 S#define SYSCLK_1_FREQ     (456000000)
9 Y/ F: A2 u6 y& C2 p( a#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
9 q8 J$ n* _$ {+ g#define UART_2_FREQ       (SYSCLK_2_FREQ)) r: n1 Z9 a5 g* E# ^

: }8 d" _/ |/ a$ J/ N# Y/****************************************************************************/% m. L  ?! L; G- \! w5 U
/*                                                                          */4 e! F( k! O" F! }) p
/*              全局变量                                                    */
% m# F, _7 ]* e3 ?/*                                                                          */
; W" \: Z# m: M3 f. _9 N1 N/****************************************************************************/
0 h$ C" u4 X2 s  ichar txArray[] = "Tronlong UART2 Application......\n\r";5 f2 d9 P$ p: G0 v9 T) G3 c: Q! ]
; b1 I' z1 d0 I9 X
/****************************************************************************/
( G" \/ t! A/ Y+ J9 i: ?2 z/*                                                                          */
3 x; R1 q) e6 b" P$ `6 Q/*              函数声明                                                    */
# v  i8 h5 b  g1 P/ a/*                                                                          */4 {) r6 m2 s% C$ A7 m) Y
/****************************************************************************/
9 q/ v# R- ?# c3 w/ t1 ]/ f// 外设使能配置, @& x1 J) H, Y. C! D7 W
void PSCInit(void);
: p/ L. \' P" R! n4 I5 S2 d
/ P* k) q) a7 V1 \// GPIO 管脚复用配置, C/ }6 j. L, A/ O3 B! k6 k' U
void GPIOBankPinMuxSet();
. i8 q# L+ p( x* |" R' T+ f
2 R9 e1 G& M9 u. S; X// UART 初始化
- V6 U1 J- f! a. Cvoid UARTInit(void);$ g# }4 A& ?/ N, N
// ARM 中断初始化
  }2 s, h/ c* v& q$ nvoid InterruptInit(void);" }# ^9 W$ v. H+ [8 [8 i
// UART 中断初始化
! U1 I/ h+ \7 N* s) t. V* r8 Avoid UARTInterruptInit();# v6 \; ^  a  M4 H. i
// UART 中断服务函数  |0 [6 D9 q7 X+ C/ [- d( H9 ]$ T
void UARTIsr(void);
* |+ |: B- h$ l
' y# b) V, i; j! p" X; h$ b6 _/****************************************************************************/
7 g8 ^) k( }$ [% _) X/*                                                                          */
: V* g# Q! J4 A  y1 k0 r5 i# D3 v4 g/*              主函数                                                      */" c( q* I. F/ @/ h  V2 c% ?
/*                                                                          */3 Z4 W+ m" e: Z
/****************************************************************************/
& Y: Z+ @6 L- L& dint main(void)- N+ ?* o0 q% R
{% e5 s0 V) k$ k1 S: y+ k
        // 外设使能配置5 l: O* N4 k8 c3 t0 c$ B
        PSCInit();
/ g$ Z; C$ j0 {        / F9 B! C6 w" w9 x# N( B
        // GPIO 管脚复用配置
) o2 R7 f# r( Z, Z4 S$ V# ^        GPIOBankPinMuxSet();
" X6 |# n1 x" q! G/ \5 e% T: n: [( g% I: I, |, c: p" w8 V
        // ARM 中断初始化
4 I8 V* {0 K4 J* a- x, a9 Z$ w        InterruptInit();; n4 k  \" w7 |& w2 F

3 U: Y+ s! B, G. w2 l        // UART 初始化
  g+ Z6 Q: @4 w4 @# ]        UARTInit();0 N9 G3 S& [) h1 r1 e; d

) B0 C; W- Q4 y! J: T( V9 P/ }$ m        // UART 中断初始化' u, N! F0 {! k, z, b; y: \- w
        UARTInterruptInit();# }- v6 o$ t  v/ z: `3 Z  N

4 r9 L, Y( O" p$ Y% R- l        // 主循环, b) ]- b6 t* N: P' D
        for(;;)5 C# @$ w% Q3 h3 Z# t
        {  t& J5 a9 D. K/ O5 S! [

" E1 q' {6 m9 h3 j: I        }; _" ~9 W5 b+ v- U6 N! Z
}  _( x$ |9 q0 t. l: n) S* x

% N$ u/ Z4 T2 J. |. A/****************************************************************************/
0 L# P( K) A% A0 d/*                                                                          */
% ~  H, Q4 S1 r/ `  Z/*              PSC 初始化                                                  */5 ^3 @* C0 |4 A7 A+ J1 s: V
/*                                                                          */
+ h2 w0 D% l3 B! g/****************************************************************************/: k: J& f" }2 n6 ]
void PSCInit(void)
' o0 r! u# A8 A( q* D3 n& D{
0 ]9 ~! A4 S+ e        // 对相应外设模块的使能也可以在 BootLoader 中完成
; [. G8 J  W2 k0 z    // 使能 UART2 模块: U) ~) c, a$ [0 o, y
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);0 M7 `8 e- a- i8 }5 h% s
}
( F: K7 F! Q) t3 W: T8 K, D4 |2 T" s7 z5 {6 R
/****************************************************************************/" G8 q$ a( V+ G3 x" O
/*                                                                          */9 s" U; L& X% i1 r; w; W
/*              GPIO 管脚复用配置                                           */
- I3 Z* I9 f! Y: U( `  h& I/*                                                                          */
5 I$ A8 K1 |% U/****************************************************************************/
7 h9 g& `3 q2 c  w1 T3 Hvoid GPIOBankPinMuxSet(void)1 Y- B( E# w, D+ l2 E
{
5 O) M' t, @- I9 }7 q        // UART2 禁用流控) @- f/ g1 O$ K2 R
        UARTPinMuxSetup(2, FALSE);
8 X3 w3 R  i, R# D}
# V4 T! J* I8 n  F+ ]  y  g8 y+ r4 {2 @4 h. ~- `: {
/****************************************************************************/
+ K+ |& C( F; x1 a1 h/*                                                                          */5 N5 N) I1 K) ]5 T  O$ ~% G# p7 x0 V
/*              ARM 中断初始化                                              */
, A% ~3 h4 z' c$ n0 z8 K+ m+ R/*                                                                          */9 E1 O/ v* b5 m( j9 |8 e4 }$ Q! q) p
/****************************************************************************/% c2 w' Q% v7 i
void InterruptInit(void)7 `0 O% _4 `6 Z0 S5 F3 j3 S
{
7 r3 B  _6 w7 o' v  o, \+ r, u; v    // 初始化 ARM 中断控制器
) D3 z& x9 u5 ^* D* b, \    IntAINTCInit();
- p" i% o8 @) k* k' G; _; S% j9 m0 ^3 k! p
    // 使能 IRQ(CPSR)3 e/ \8 Q/ G" B  ?) t# y( Y* ~* T
    IntMasterIRQEnable();
) Y- U: H- j2 Z
. E% e4 i( ~  P3 c, i% \$ h8 G( D    // 使能中断(AINTC GER)
/ B. v- B7 W) X, R1 @9 \0 M) \2 P    IntGlobalEnable();# n4 C! ]9 l* [4 B' L

9 @8 z; ~" x$ W6 V% v2 I9 L    // 使能中断(AINTC HIER)$ b% w6 R6 n4 t8 p  T3 n* y' B
    IntIRQEnable();" g7 l" W, a5 {/ j% Y1 v- U$ H+ |
}0 N. }% P- b1 H
- p+ W8 G9 r9 C; D
/****************************************************************************/
1 h8 y" b& i8 u/*                                                                          */4 g) z5 {# w% @7 f$ B% J
/*              UART 初始化                                                 */* P4 o  j7 y. b9 _- N) @
/*                                                                          */
# C4 @' X" I4 S2 V9 V! |' V/****************************************************************************/
3 k, E6 _1 N3 q1 p4 U) f" ^void UARTInit(void)7 B* _2 j- U( T# z( G6 e! Z
{
% b8 H( J2 {9 F# c0 a$ T8 }        // 配置 UART2 参数
7 f0 F$ B" D- J! E        // 波特率 115200 数据位 8 停止位 1 无校验位
; e( h! F. y5 c7 ?  m# G4 s) Q    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
8 X" ]/ ~; }& @# {8 I) H1 I. D, A                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);7 I1 w9 w, _  L! E
        // 使能 UART2
8 r  j: ?* E/ Z/ @' ~, M! d% N        UARTEnable(SOC_UART_2_REGS);
: l* D( E/ h/ K" [5 o5 F
, Q, {4 u/ d  x( D& Z. t; l    // 使能接收 / 发送 FIFO
, `1 H7 b; ^/ `4 }    UARTFIFOEnable(SOC_UART_2_REGS);1 @0 R# B# n( c: V; G9 r

: C; G( Z: M* }& \    // 设置 FIFO 级别
* q, e6 M9 F- g. V5 Z( `3 ]    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);' N9 y' J4 }& H3 P3 m7 Q3 `* U
}
2 A$ r" H/ g' x& a2 f, i3 T, ?
/****************************************************************************/
2 T" Y7 S9 P0 S0 z6 y/ J; r6 l/*                                                                          */
# h8 e& o% S# N) R6 L1 N. h6 Y/*              UART 中断初始化                                             */
' R. U. s, M( E; y( Y6 ~. k/*                                                                          */
7 p  F" o0 R7 B2 z; V1 h! a/****************************************************************************/$ }. G$ b& M* v. |4 r
void UARTInterruptInit(void)( R) t; ]# `( u9 N# E
{
6 s& F) B2 v7 y" V5 Q        IntRegister(SYS_INT_UARTINT2, UARTIsr);% t% [# M; b- B  o1 }8 E" J
        IntChannelSet(SYS_INT_UARTINT2, 2);4 X: d' }; T6 I1 f3 k/ f5 k, p9 Z8 c
        IntSystemEnable(SYS_INT_UARTINT2);, A  E, G' M/ Q+ d

7 l! R3 S( z+ {7 W$ ?        // 使能中断
/ K& d( v" k( |/ {5 B6 L8 C        unsigned int intFlags = 0;
) j6 Q/ U5 b* u9 g& U    intFlags |= (UART_INT_LINE_STAT  |  \' _- E6 x6 o* _/ P% c
                 UART_INT_TX_EMPTY |    \9 w) k9 Q! X1 j+ A4 B1 j. q
                 UART_INT_RXDATA_CTI);
2 r; i2 n7 @) a* h/ w& A    UARTIntEnable(SOC_UART_2_REGS, intFlags);
! ~2 ^4 X. G* k+ J# S* o}2 V) S) T- d/ J& W& R- a! g
5 \. @" h6 ^8 k& D& y6 H( z
/****************************************************************************/
; ]& E$ ~$ Z1 b) _7 p3 V* D/*                                                                          */
" [0 D( ?0 k0 r$ t/*              UART 中断服务函数                                           */' G1 }: w7 Q  Y$ W7 J
/*                                                                          */
; U( O( u4 a2 j- ?7 J$ B/****************************************************************************/
0 o7 V: y  L3 m; d5 g; {+ s6 `void UARTIsr()7 T; ]. q4 x8 W9 ~8 z8 @  V! g
{
6 ?0 L# p% J- K) {0 ?# y  D    static unsigned int length = sizeof(txArray);
( G" i/ n$ A( I4 `! Z8 U  M+ g    static unsigned int count = 0;" z4 B8 I1 Y3 ^) ^2 h; i" i) m4 h
    unsigned char rxData = 0;
5 U) j2 `; `  @) z$ e& r5 |    unsigned int int_id = 0;
. ?! h4 i- h4 B9 o) x! D" O
- M% {, Y$ J0 d6 y/ C: J+ z+ a    // 确定中断源
  @6 N+ `# l8 N: B0 P3 F* a0 K2 a    int_id = UARTIntStatus(SOC_UART_2_REGS);1 R  U3 B7 x. t* x3 i  [

/ X" h/ {: M5 \8 d0 H( Q    // 清除 UART2 系统中断& p! j5 J$ Q; e
    IntSystemStatusClear(SYS_INT_UARTINT2);
- a7 r) K1 x# N  d2 R- o2 B4 X: {0 c& F" T# |
    // 发送中断% k$ \2 M) n% z7 O( g
    if(UART_INTID_TX_EMPTY == int_id)8 O4 P) G; y3 N. t
    {, \# w# V" t* F, s
        if(0 < length)
/ s2 J/ a0 w8 Q, A        {
/ u. \" e- v4 O- G& I, Z$ X1 L. d, D            // 写一个字节到 THR
' E& Q' @& T# Q' p            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);; Y# w$ J9 U5 W7 G/ C0 y
            length--;2 \: b: c! }; ~* w4 L- |
            count++;
$ i& M, q; A, b  B- R2 n# G        }4 X5 u% f- R* Z# J% \+ N$ k
        if(0 == length)# W4 V- q3 k/ S4 ]
        {
# u. M  @0 x2 D% ]+ s: p            // 禁用发送中断9 G3 G1 w/ E8 T  A; n/ m' `, A
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);: X* S5 k& {8 I' h( B' y5 r$ E
        }
3 @( D- `7 `' W) Q' n0 m9 F     }
1 R1 m9 {! P. V2 W* \
8 |. g2 R7 R0 C* ^    // 接收中断
& q. `2 O6 y/ s/ i    if(UART_INTID_RX_DATA == int_id)+ ^, v% @0 ^5 G2 L
    {
5 h( h, S; L7 {        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);1 h' t  k* L' M/ E

2 \) B( n) T  B4 m. h# T        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);5 f2 X2 S! p% A% M7 D
    }
. P2 L8 G, V7 S$ @3 q: {) [! @* _6 M5 g, R/ b, }3 g& ?
    // 接收错误; l) e9 L; y) y4 C, p
    if(UART_INTID_RX_LINE_STAT == int_id)
2 c3 U' Q, J& f; h% y; w; |5 Z- v    {
9 \. i1 L7 {' \# \  x1 U        while(UARTRxErrorGet(SOC_UART_2_REGS))
' ]$ m" j9 L; Y1 r; ^" v        {
* V5 G! E* X$ o. v, n9 F& R& c            // 从 RBR 读一个字节* R  }- v4 @( |8 ?/ e2 O2 u
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
* h  [  T3 y! q# c; g% l        }& X& d1 ^& z; E6 S, k! g
    }
, `  `* f+ h/ {2 A    3 l: p( S+ R; M. a
    return;8 t" _" {  z3 t* D
}
+ P2 g: J$ v4 j; _. j
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-30 14:17 , Processed in 0.045141 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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