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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7586|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。5 O% ^$ u! v  ]$ I  Z3 E) ]! s+ f( A

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
地板
 楼主| 发表于 2019-5-5 22:36:34 | 只看该作者
785235014 发表于 2019-5-5 22:253 m6 j; `: p8 o- o
如果其它设备快速给你发送串口数据,你这边能正常通讯?
4 ~& G# K% v% }) \* O9 T. [$ `4 O
谢谢,已经知道不是程序的问题了,但串口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 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
. {" |- O5 C2 Q0 S
( ~6 T/ ]! I. A4 G. Y* ?#include "TL138.h"                 // 创龙 TL138 开发板相关声明; j: P% U. K' [  k

, E- R* a8 L, ^" u, D- F1 @#include "hw_types.h"               // 宏命令
* E' z% `( r4 j+ x# M+ I" j4 g#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
. n4 L* V1 A+ `' k$ k4 c#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
! q  j. Z& R9 Z/ i0 d( R- B& Q% o" ?0 C' B: N5 c, S
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明' t9 E% N5 M( l: E' k: k- z
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明$ ?# \7 I9 r9 G3 N/ i  y5 w
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明; R' K* f; b; N/ z  L" }" @
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义5 ?8 n) c* r, W5 j% Z- c9 f

  \% Z1 @9 ?; P/****************************************************************************/) Y8 e: C7 S5 B, F" W/ R
/*                                                                          */
/ F  ?" K( [  U" u8 U# J6 w/*              宏定义                                                      */0 I6 B5 f5 H  O* D" h
/*                                                                          */
$ Y/ T' r: J5 {9 v+ d9 F/****************************************************************************/. z& B' k! e9 b
// 时钟
# \: M) N/ h) Z. W- c#define SYSCLK_1_FREQ     (456000000)$ f+ w9 c4 R! C  E7 ?
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
' b9 |5 q- d. A; ?% t#define UART_2_FREQ       (SYSCLK_2_FREQ)
! T: C9 U. Y" G7 S; }* q3 [- m- h( m3 W
/****************************************************************************/' c+ V" {/ s/ n1 x* h8 U  d
/*                                                                          */% A, J. ~: G! p. i
/*              全局变量                                                    */
  j2 H9 A! T- d  I9 n+ {/*                                                                          */- n9 ]/ J) j8 b% h4 S! a" \: e# Q
/****************************************************************************/
) @% I; V. f8 H8 lchar txArray[] = "Tronlong UART2 Application......\n\r";  d+ h. w3 f! f. V+ H. p4 O3 [3 j

3 A% F5 a7 {5 w- c/****************************************************************************/
; P5 y2 C9 Q4 u, |/*                                                                          */
. s/ |3 z+ J5 \/*              函数声明                                                    */$ ^& ]& n# S! {) M2 X5 K+ E0 g
/*                                                                          */
( T) U2 p: l* ]: S9 t/****************************************************************************/" b, }4 C1 F8 _* b  _# K6 e
// 外设使能配置0 g4 I: O8 F* `( q/ u- m3 s( [8 |
void PSCInit(void);4 Y& F# g2 x) R& l3 d
- J9 k* J; t5 W# ~5 M/ g! ]* X
// GPIO 管脚复用配置" Q! e* d# p! m+ \
void GPIOBankPinMuxSet();
" K* U* N" s5 l! [0 P& W3 m9 e& T7 }5 e' R9 |2 m
// UART 初始化$ F' \* d" S" ]% H+ b3 s
void UARTInit(void);
% y' s! X5 v+ T3 c& Z" Z// ARM 中断初始化
4 e- p1 h6 _8 ]6 Gvoid InterruptInit(void);
4 X" s3 w) |. o8 @. {9 E  U// UART 中断初始化
0 J' [2 q  Y+ ~: s6 u5 b+ b: Kvoid UARTInterruptInit();
/ W6 P6 k& d6 x( N7 d// UART 中断服务函数
. o& _! ]( t" J. Evoid UARTIsr(void);
- d6 \; b' u8 o/ U6 q# P( {, l) ]) C8 _6 l0 ~4 c7 {
/****************************************************************************/
. f& u# l8 j  z) M3 |4 D+ f* K/*                                                                          */) k% E# U" s9 M1 y& M
/*              主函数                                                      */4 r6 y. F8 R/ i: I5 L+ j4 ~
/*                                                                          */
+ i' Q# d, P; x, L6 M* t/****************************************************************************/! t) r- c  ]+ _4 l
int main(void)
. [' _! T7 K- j{
8 q$ J7 R! H4 W2 n7 M" d; b, x        // 外设使能配置: N8 @6 h6 ~! r; N; i2 N" j( U
        PSCInit();8 n. ^: U' a* q2 ?# r, P$ R
        . I3 I0 n3 n3 V) Z$ G9 z" v) d
        // GPIO 管脚复用配置5 v0 O2 f$ o8 T2 m6 z' y
        GPIOBankPinMuxSet();
4 G4 y' f% }; \3 g; N( Y" k; ]: Y
  ]( Y0 C; M0 `1 l0 ^' g9 u        // ARM 中断初始化) m' F3 L8 C2 i7 O* c$ v% Y
        InterruptInit();9 U. ^3 j* {0 R9 D

0 s' {  B% M) n, [8 D! V6 M; S        // UART 初始化
: A, G( s4 }1 k- f$ N% O- g        UARTInit();4 Q4 i$ v! [. _+ Y
+ j% g; |3 H# Y  q
        // UART 中断初始化( H0 O& M, \/ _+ Y3 c! \8 j2 i5 n8 N
        UARTInterruptInit();, I1 t8 E+ j4 Q  {; K

) h  e. V4 m+ m        // 主循环- y0 J# b, I  G
        for(;;)6 y# `$ B! e2 n# P! V8 L! ~
        {
. a$ k0 T+ F+ ]- J" B% n+ y0 w/ W1 O! W/ \4 k6 N
        }" t( w9 c7 I& `: A
}% Q8 i" Z( X3 N" E2 m
5 @% ^& J$ X2 j) U; e5 F1 s/ I
/****************************************************************************/! w: f+ Z& O! x" h4 y. E
/*                                                                          */. W, e+ P0 c: \; q8 a* m
/*              PSC 初始化                                                  */3 q7 e( {; h7 p  K3 B
/*                                                                          */
4 m/ Z$ e; a$ f7 r. S/****************************************************************************/
* M( d1 e! ~' Hvoid PSCInit(void)
3 X7 ^# E$ f. X8 P7 z0 n{! d) X; ]9 l+ G: ]  y! _3 h9 G
        // 对相应外设模块的使能也可以在 BootLoader 中完成
( p( @2 ^( _! W    // 使能 UART2 模块/ s: ]' o2 d) Z
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
0 r1 j9 A5 b- j}
1 H0 P- Q. M3 E  X  X- g3 x) s; H1 w
# f# N9 i0 D3 i- v1 o- E/****************************************************************************/
- Q7 q, u% Q* {& s( k, L+ V, Q/*                                                                          */& `% w4 X. l1 q9 d: l! @
/*              GPIO 管脚复用配置                                           */
; e2 q& l- \* w2 W0 l& U; ^/*                                                                          */
+ j" C" e' T) v: y( @/****************************************************************************/' v0 |9 G" z- B, {: j# I
void GPIOBankPinMuxSet(void)/ \; U# t- g' }
{
5 d' |6 r& m) r; c        // UART2 禁用流控
/ L; u8 l% p1 b1 E        UARTPinMuxSetup(2, FALSE);
8 U, x3 G7 I( |! c3 E7 ^4 W}/ X  {$ @7 O/ ?! w- @9 A+ L1 q

& a) v* T& ]0 |$ }8 x. E. w/****************************************************************************/
) ]9 O- P) L/ u9 a/*                                                                          */( q. W# K: p' t/ E% \9 Q* X
/*              ARM 中断初始化                                              */) |( U/ ^* T/ ^+ K* c' ?# _" O
/*                                                                          */* t: T: E+ T: u
/****************************************************************************/3 \8 I. d4 k3 C& K: d
void InterruptInit(void)
+ N# N1 \4 N& }9 v' _8 _: u{
/ V, R% M" q+ V$ t: \% m    // 初始化 ARM 中断控制器
/ S! Y0 ~1 `7 u9 n    IntAINTCInit();. ~. \. W6 y, s, S/ _) X

( V& Y1 C* _% D8 L    // 使能 IRQ(CPSR)# m+ Q# }% A# m! O' e9 L) }
    IntMasterIRQEnable();
' `& t6 y  J0 q0 T
8 H$ T; _4 ]/ u1 b/ Z& Z    // 使能中断(AINTC GER)
5 X" V/ e. t! D" {/ D    IntGlobalEnable();5 j  J0 B& c& Z5 _5 X1 @
6 {: u7 t9 l& R
    // 使能中断(AINTC HIER)# j' |) B9 ~6 L
    IntIRQEnable();
- G/ i/ @; w  T9 _  t# \}
" x/ N$ }8 z, Y9 d: Q! @& D" |( d: @, e# }; f7 U- J
/****************************************************************************/
6 [' M/ \+ C% R/*                                                                          */8 p; {& |* W' @9 y. m
/*              UART 初始化                                                 */
9 Y7 e  Z8 ~0 E; C0 B/ x/*                                                                          */* B6 e# w$ F3 N5 ^$ \0 t( [% m1 N
/****************************************************************************/* V( s0 h8 p6 |0 b' u
void UARTInit(void)
: e' b$ e$ U6 p% @8 b0 p{
2 p( ^) N2 B& h( t! v' L( A        // 配置 UART2 参数
7 G' E4 }) {5 p3 k6 m9 E        // 波特率 115200 数据位 8 停止位 1 无校验位. S5 v4 ]* U$ ^
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,1 i3 k/ x! G. Y: U( e! x
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);" R! O0 I6 |& D' ~
        // 使能 UART2" v; u' A4 {* @/ d, _  `
        UARTEnable(SOC_UART_2_REGS);; y: E$ L. ?* Q

0 D/ d7 Z: V5 j( ~    // 使能接收 / 发送 FIFO
: A. r2 ]( n+ ~6 g; |    UARTFIFOEnable(SOC_UART_2_REGS);
  T; J( r. a6 W: _
/ \- H% w9 B8 N( [9 g    // 设置 FIFO 级别
6 ?9 b  T3 ]6 e5 K, z) f# u    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);7 a/ U& H! A) @+ Z% d
}2 n$ m4 y4 e3 s" l; Z) J: h7 ^1 h
7 J, [4 p8 B' a. F; d' `
/****************************************************************************/
/ }6 Z; |5 N( p7 n  a# |4 I/*                                                                          */2 Q  r. v2 N  A9 }+ l" t
/*              UART 中断初始化                                             */; e9 d3 y( ^6 v( }! r, L
/*                                                                          */
$ [# J: O: c+ W: B7 P* Q/****************************************************************************/
2 H2 }, J/ j" i- ]void UARTInterruptInit(void)( c9 ~4 W6 X) ^3 m
{: u0 {5 U! }8 J2 A' s& Y
        IntRegister(SYS_INT_UARTINT2, UARTIsr);) ~% g" R8 H4 q! q) j0 M
        IntChannelSet(SYS_INT_UARTINT2, 2);
* ]: R1 w% k! }& u  P5 c3 g        IntSystemEnable(SYS_INT_UARTINT2);
8 C% v4 b9 ~/ y- H1 C+ `& y5 E" z2 U. i% p" I$ J- f
        // 使能中断& i8 s- I( r0 ^+ ^$ W
        unsigned int intFlags = 0;
  {) o& b; C+ y, ~    intFlags |= (UART_INT_LINE_STAT  |  \
9 q. S, J" x/ u! T+ Z! M2 {                 UART_INT_TX_EMPTY |    \
5 {0 v: {& p" d! Z) M                 UART_INT_RXDATA_CTI);1 @. H, `6 D" A: A
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
& X4 S/ l$ b1 F, B6 C# v7 V}
6 I9 A( \" H+ Y  J: o# W; S' N' F7 p0 h
/****************************************************************************/
# t0 q8 c1 G& D% ]4 X. e+ n5 r/*                                                                          */
9 ~' n0 K  b5 {5 [2 j* \6 S/*              UART 中断服务函数                                           */
1 o; H8 N9 t/ D* j/*                                                                          */! a1 u/ `& k8 k
/****************************************************************************/2 ]+ B) I2 i. h% @) q! N. t6 u
void UARTIsr()
& c" Z7 O+ C2 [1 g! S3 S3 S4 w{9 p: D2 u; V! v/ s* S
    static unsigned int length = sizeof(txArray);
+ V* N* O0 L$ K8 h    static unsigned int count = 0;
6 z8 f' {1 ?" o0 L- g: I2 W! s: }6 J, n    unsigned char rxData = 0;' E6 k) M0 g* u
    unsigned int int_id = 0;. E/ E# Z* b9 j5 ^, ~" `+ O9 b
; c# i% k# P4 l$ F* ?) p
    // 确定中断源7 H7 K" S% J! I) K1 G
    int_id = UARTIntStatus(SOC_UART_2_REGS);
( d4 a8 h" i% @, v3 E, @" D
* ^# K  F* x& I8 N- l    // 清除 UART2 系统中断' x  u$ ^5 I+ O8 f1 X% M) C! R9 D
    IntSystemStatusClear(SYS_INT_UARTINT2);
0 J4 ?/ g0 w$ U7 @  t% ]2 R
% v1 y- G2 v& r# m3 \. }/ G* V    // 发送中断) l9 Q& a# W' g' {
    if(UART_INTID_TX_EMPTY == int_id), n' }5 q+ @  N) h
    {9 m& R! w9 N4 ^) h2 @/ ^
        if(0 < length)
' M5 c' F. s7 F5 b        {
" z8 r3 |4 N' X/ ?3 \            // 写一个字节到 THR3 L$ _$ p/ u8 w
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);8 V3 f' Y  A7 W4 @
            length--;5 l  G. A2 d: G+ O  n
            count++;
0 K5 w3 P! z9 j( V/ u        }# H$ C/ m1 K. |7 N! I
        if(0 == length)
+ _/ e( }! I- u! l3 O* b9 ~        {5 V: G' K& A; ]) @: l1 p
            // 禁用发送中断8 b# [+ `1 T& `; B6 g& l
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
& ?8 Q7 b: i. Z# ~$ L        }: G% f  D4 f7 L- s' b
     }
3 x8 M* H, i! g4 p, A5 L2 {& G' h; w# U7 C2 F, w
    // 接收中断
/ `: w. r3 {( D# p8 W8 f9 [    if(UART_INTID_RX_DATA == int_id), l; Z( o6 a0 O/ u3 r" A
    {4 E8 [6 T3 j( P% W' d1 [* \) b; l. `
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);% A& q# e- ^* o

* ^& e2 b% `" W: ^) U        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
; ]4 e' Q' L5 C- N7 O" A    }( U$ u" W! A( H* H

7 m  l2 I2 @$ P" N    // 接收错误  T' z0 E  i  \. x
    if(UART_INTID_RX_LINE_STAT == int_id)9 {  g( s4 v8 @
    {
/ r7 Z# @! W: S! N/ O: u        while(UARTRxErrorGet(SOC_UART_2_REGS)). E' C! M+ V* ~& O/ _$ i& H6 V. S- i. Z
        {
4 O% ^  K" \- m9 N0 m* o, e/ {            // 从 RBR 读一个字节
) X  O: f( M3 G3 G1 E% [& F; E) W& O            UARTCharGetNonBlocking(SOC_UART_2_REGS);6 C+ u( a8 F& K' D) W! [. _
        }' O4 @# @( @1 O% R; R0 A6 V
    }
3 y7 [+ z$ q, w  F7 |/ m    # G( |5 s; \( V' @* {. A
    return;
* ^! M! [. a5 [5 `& F}
) i( M2 K8 h; Z; N) o
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-2 19:46 , Processed in 0.054616 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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