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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5675|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
! n& O4 c$ d' K5 t; i* Q$ L: T- q

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。7 x, v, m. X' Y3 ]$ y/ W! f1 ^
( A% n& O* t! C
#include "TL138.h"                 // 创龙 TL138 开发板相关声明, p/ x/ M0 ?* v! S
4 z* t" _+ P: _( M" [1 N
#include "hw_types.h"               // 宏命令3 s: y- }/ m# p: J! Q9 A0 b9 Q6 u
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器4 e# y! J6 Q: }+ ~% K
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
$ F# F* g1 h5 X- g+ n  h5 ?+ B' A( c8 T  f5 C% m) W
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
' U  S, I7 k" q/ L7 h. l6 g#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
3 M1 d2 I& k7 J9 v/ v# j#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明9 F; t: e4 ?6 m
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
: }8 W7 e: }4 X9 M# s( j# j# F/ _( `, b& ^' I
/****************************************************************************/
5 h- o: X0 A8 P; x7 G/*                                                                          */
  @. |& I2 g- l9 |* l* ^/*              宏定义                                                      */. r: h8 N$ g; x
/*                                                                          */
  R( }- u2 \. k/****************************************************************************/; |0 K' }8 T- c6 U* ^
// 时钟
' ^, \0 K+ T: ~% E' |! V% q#define SYSCLK_1_FREQ     (456000000); k" ~& a1 ^- |$ g
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2): n( x* l! B( K7 i$ e* ~
#define UART_2_FREQ       (SYSCLK_2_FREQ)
3 M. B; w! A+ L; C( l+ z. i+ t
! q% q- B0 A, y0 m5 Z5 p/****************************************************************************/2 [* O+ a1 e6 L4 ]" l3 h$ M
/*                                                                          */
4 e$ B3 G. }3 U- ]: O; Z/*              全局变量                                                    */
6 E  ]2 D* t7 u; I1 f% B/*                                                                          */5 \' p- C# ^$ U% L. M1 {
/****************************************************************************/
: A" [9 ]9 ^& o2 {2 A( {( j/ `char txArray[] = "Tronlong UART2 Application......\n\r";
& Q) a5 j9 h+ X( A& Z
$ V/ I. }% O8 W( \8 k/****************************************************************************/, R) Z: v3 d6 t9 ~: S; c
/*                                                                          */. n5 j  P1 [% ]2 F) T
/*              函数声明                                                    *// z$ t% y, D/ Z3 _$ u2 r
/*                                                                          */
* F4 m% P% L5 D# `' Z' a/****************************************************************************/* `2 d, A) V. M9 q; _6 ]( s1 d
// 外设使能配置
1 [/ g; ^- |$ Gvoid PSCInit(void);4 t; k6 K' X& U' d+ h  @

+ A8 R4 x3 X5 F  O/ V// GPIO 管脚复用配置
# `& |  u' }, Z  d: o+ Avoid GPIOBankPinMuxSet();! O0 V4 Y% l& F2 _3 P2 q+ ?
% }$ q) G  n4 v0 M$ U" [" P7 B
// UART 初始化4 i0 N( z( {( y$ o% d6 U
void UARTInit(void);  R, D* ~! ]9 }0 t1 c
// ARM 中断初始化
2 P% W5 f& u( g! _" D  ?void InterruptInit(void);# h6 ?8 d1 L& c( V* U. T2 ?5 V& _
// UART 中断初始化
, F  ~  Y, R- V6 L6 _2 {3 M* mvoid UARTInterruptInit();
& ?, X- _( T! j$ d3 D// UART 中断服务函数
$ a8 L: A  ]" a/ V4 q1 p4 jvoid UARTIsr(void);% z0 d% l" Y. c. f$ d( a7 n0 m
& S6 a2 n; R* v. L' o
/****************************************************************************/
$ K3 A) L6 {  u' M1 F+ c/*                                                                          */$ o" O% j7 c. k8 u4 \+ L
/*              主函数                                                      */; G3 |8 B5 K- `& ^% E8 Y+ e4 y6 W
/*                                                                          */& J0 @& C" {6 v9 D4 Z! ]
/****************************************************************************/, z% d  _% n0 F4 f4 \2 T
int main(void)! G& B, ?. x# ^/ Q$ F1 I9 {- D1 e
{
8 F& H4 X9 D9 t        // 外设使能配置' e: j6 J' J* ?& R1 p+ }. J# U5 E* T
        PSCInit();) e' N( I: o( I% D
        9 I1 c' F8 J+ i0 {3 U% w5 {. _
        // GPIO 管脚复用配置
8 r$ M- W# v0 x4 W1 ]  u        GPIOBankPinMuxSet();
  R" H. I# T* o& J. u9 j# t1 w: c! n% c
        // ARM 中断初始化& R% U2 M% T; v1 ~4 b1 n6 u
        InterruptInit();
. E- a8 J, A; |" U# C; U
, \6 v" O8 Z3 m5 H        // UART 初始化
! l$ X- D4 }6 j" e; c- b        UARTInit();- l. z4 ?2 ~8 r+ |9 S5 k- d: B- z
7 }1 c  Q! y1 s; I' K
        // UART 中断初始化8 y- W5 P" x( E6 k' b% B, I7 H
        UARTInterruptInit();+ t  m3 n5 [0 W
4 \7 C$ q+ P9 V# O
        // 主循环
5 p2 \8 J; m( z, T' l8 e        for(;;)
$ y" P! {! N" `- e        {3 ~/ N3 ]7 e! U8 L. |# c  U
9 ]' a, V6 O' I' \# |# J" u2 n
        }: h; m1 \3 g- N/ F
}2 S% M  s- g' C8 u% W
1 `, q+ v: {- J& A; s
/****************************************************************************/
' k1 o4 X. q2 c" ^' Y7 V- Z/*                                                                          */6 k1 B: A0 f! S% b; Q6 R
/*              PSC 初始化                                                  */; H3 P/ n6 L2 n$ d( b* G4 ?1 C; J+ T
/*                                                                          */
: r% H2 H$ F4 p; o! o/****************************************************************************/2 M7 {2 r' t  Z4 ?
void PSCInit(void)
8 S9 i5 L  Q: U3 k{
! F2 T  i* z& r! y$ d, {. X        // 对相应外设模块的使能也可以在 BootLoader 中完成  J% s- H+ K$ p8 ?2 [$ M
    // 使能 UART2 模块8 m& g, z6 @3 f8 C: A8 r
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);: h1 O1 _- S5 o3 ^5 X5 K" F. w
}# L- [7 e1 H' \3 {
+ D4 J% [5 i  y- y
/****************************************************************************/
/ ?5 y$ t9 @9 w7 e2 ?* l/*                                                                          */
! G  q. L( h. C, P- n- e/*              GPIO 管脚复用配置                                           */* |' {; T/ R3 s/ [
/*                                                                          */
* J# F/ X, p) [/****************************************************************************/
8 e  G! r5 ]- u0 @+ `* Q( }void GPIOBankPinMuxSet(void)
1 C' L! C0 e& R{
+ w+ g' u- Y" O/ Y, r+ x) |! Y        // UART2 禁用流控
9 Q9 P: N$ o. V/ Z3 o$ K: b) a3 h        UARTPinMuxSetup(2, FALSE);
; W4 n+ j1 o% y0 n/ H+ A}
  O, v" W$ G. o; \6 q* W$ G, q: O1 n% o+ Z* M
/****************************************************************************/$ T' A  c3 r6 V  S; ]( l3 p
/*                                                                          */
, X! p1 B2 {! d/ X& m: W" `: s/*              ARM 中断初始化                                              */
. w! i. F/ q; ^: v4 u/*                                                                          */
/ x3 Z+ Y3 Y5 m7 _/****************************************************************************/
& \1 Q, T- [# f% N+ [void InterruptInit(void)
. x- E4 B/ g( j0 W) D5 g2 I9 ~{4 ^2 D  J0 R, i6 X5 L  i
    // 初始化 ARM 中断控制器' b& J* ^# _% d/ A% U! C& n0 E
    IntAINTCInit();
3 b" B8 u3 t6 t$ Z. y
* u/ l6 |0 t( x. m7 }    // 使能 IRQ(CPSR)
/ A! ]6 G8 o3 F! e6 Y/ g! u* D    IntMasterIRQEnable();
6 X% Y& b% k" o( |$ ~
1 \6 H0 M0 ?, P( G    // 使能中断(AINTC GER)
+ L2 S$ r: K8 ^, Y! ^# ]    IntGlobalEnable();6 O1 H( i; q% A3 o% a- ~

4 s& N/ c% E) F) ]; c1 j0 @( i1 I    // 使能中断(AINTC HIER)
" w# @5 N3 e3 V    IntIRQEnable();
1 K, O; e0 t' m/ z}
- O$ @0 R9 i2 m! u) c' m+ T
  P+ I5 H+ b/ ^! v/****************************************************************************/
/ d  C8 T" u, r$ Y' a; s! T/*                                                                          */& b2 Y1 x, c# w; v
/*              UART 初始化                                                 */
  X3 b% V) M4 L/*                                                                          */" O6 F9 m5 y! s& B) h& r
/****************************************************************************/
8 M+ x5 A; {. d: @$ g( @7 l' svoid UARTInit(void)/ Q, ~$ i1 \( M( n5 \- B
{
9 F: }8 M- P6 i2 M: b        // 配置 UART2 参数
; U4 y) N3 D4 A8 |$ N1 I( r        // 波特率 115200 数据位 8 停止位 1 无校验位
( g8 @3 R* K' n, m7 h( Q' ~2 m    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,1 B0 H4 J0 i  ~6 L- ^
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);7 |( N) v9 m: w$ Q- o
        // 使能 UART2/ T3 A, H+ K* ?
        UARTEnable(SOC_UART_2_REGS);  P% k0 y0 Z+ D) `5 |$ i/ i
. O# u  e* @4 O0 N8 ]8 [" ]* |
    // 使能接收 / 发送 FIFO
% ~% ?  ^1 E2 M    UARTFIFOEnable(SOC_UART_2_REGS);! l% y( ]0 F2 v' ]. g
: y8 a6 U* G$ l- X7 [$ W# w
    // 设置 FIFO 级别9 h6 D1 _: j# i
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);* Q; k) N0 o; k+ B6 C
}
8 t/ S$ L! l- m! j5 R2 |
6 n9 }& X7 F7 f/****************************************************************************/
: g2 q  \0 n) o; w2 H: h/*                                                                          *// q' j; [+ F: |1 L& B  s4 l& t2 `  v
/*              UART 中断初始化                                             */1 C) e- b! P9 E
/*                                                                          */
) }0 M; P& C: V  q' M6 W/****************************************************************************/' a9 c' K) p( [6 P+ i& q
void UARTInterruptInit(void)4 H1 R( J3 T/ n1 k1 F5 ]/ s5 y0 Z
{( u/ o, G  l$ m9 a! E0 a
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
9 E( G+ `+ A- d8 ]        IntChannelSet(SYS_INT_UARTINT2, 2);% T5 s: B5 x7 p' w: l1 l* S
        IntSystemEnable(SYS_INT_UARTINT2);* s/ x3 o: p6 w
3 D8 ^$ W/ A0 u9 ^9 X+ z3 _
        // 使能中断/ `! ^% k3 z4 Q0 l, n- X
        unsigned int intFlags = 0;
5 t( j! t) F: I; [$ X( @    intFlags |= (UART_INT_LINE_STAT  |  \
4 G( s; d6 ?0 l$ R0 \0 u8 c# ^9 q" w                 UART_INT_TX_EMPTY |    \9 L7 V, Y) E/ c; k8 b! v+ l
                 UART_INT_RXDATA_CTI);
( y4 R& l  |! _* i7 ]% P: ?    UARTIntEnable(SOC_UART_2_REGS, intFlags);/ |2 K; e8 D, b; {! \' H
}
: @# i; t1 s7 q9 h+ S! w1 ~4 N7 c5 Z* y6 N
/****************************************************************************/# S6 K1 A! N' c
/*                                                                          */( B6 B: _+ T, {1 O
/*              UART 中断服务函数                                           */
6 Y2 y) w4 a; E5 Z. q7 @6 V/*                                                                          */0 S6 H4 p2 A7 `' B
/****************************************************************************/
7 D+ i( Z2 T1 Evoid UARTIsr()
  `% u* ~" [9 u6 w2 K{
! M# H+ L- x. ~% z    static unsigned int length = sizeof(txArray);0 T4 s1 _9 C( c7 M* \- p7 W3 y
    static unsigned int count = 0;7 U0 {* z5 v! J" x9 l% d
    unsigned char rxData = 0;  s7 R- E, T6 U
    unsigned int int_id = 0;" T8 I. a! p2 R& o

0 A0 _! P; k2 O9 Y% ?9 x& V    // 确定中断源
7 b- j( b) v1 T8 n8 P- w* j/ I; c    int_id = UARTIntStatus(SOC_UART_2_REGS);7 t) }6 y4 L2 d: d. u4 I
# V9 ]) J- b& a+ `: `: v
    // 清除 UART2 系统中断. ~% R- b1 o$ x: \2 k+ m; x) t" K
    IntSystemStatusClear(SYS_INT_UARTINT2);  i# j2 r' H4 C0 f& }9 p

( ?3 q6 i4 [' G1 N& {. W; B    // 发送中断
$ o! ^  ^# H7 p1 v" }    if(UART_INTID_TX_EMPTY == int_id)6 ]! q! Y  i8 C3 X$ C( \& h# f
    {
+ L8 \& w- [1 C0 [5 }1 a        if(0 < length)/ ?3 T' O' m( q$ Y
        {
! L7 [1 W( |" r! g! k            // 写一个字节到 THR9 e) G, J9 y( }5 P" F
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);8 j! m/ m1 `5 O& l& f
            length--;
* O9 e* a. T  f0 n/ [  Q; l% H            count++;
6 [8 o" g* w7 N  I1 M+ _  m) \' o        }! H3 K) X2 M2 q* d# G3 e2 C
        if(0 == length)0 w& u% m+ e& G
        {$ `7 Q5 ?: m1 j1 i
            // 禁用发送中断3 H: w6 ~* q8 A# w  ?
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
& Z0 `" w* v- [8 W        }9 ]2 J0 j7 O2 m
     }
0 p5 {, V6 q7 R; T# D# |' [5 Z  H$ h
    // 接收中断4 O% k- w1 y3 w1 T# Q
    if(UART_INTID_RX_DATA == int_id), b1 s5 c  }2 `/ }# I
    {7 U/ p4 A" B: Z$ T1 X
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);. D2 b1 ]3 T4 F4 j7 h" J; r
) C9 s  H5 Z6 z+ W2 Q/ p6 h; u
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);9 H/ @' e+ C+ `9 v$ n& D; y
    }9 w+ P! {2 c( F$ Q% y
% @' G# G; i/ \# _& N
    // 接收错误
; ?( ]/ X3 t! M4 K  ~    if(UART_INTID_RX_LINE_STAT == int_id)3 k* J" [% g1 h  q1 C$ H
    {+ s0 T* Z# H) v) f9 H' s
        while(UARTRxErrorGet(SOC_UART_2_REGS))
/ x" D& n7 ^' A0 f0 ~        {* \( _1 K" P, t
            // 从 RBR 读一个字节8 I" Z% B+ K6 c% d
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
# ^. A& o7 Q6 l4 E' J        }7 A" R! [7 N; A; W
    }- B3 f' ?; ]5 f/ k
    , f' H8 C  V6 m. Y
    return;' H% A( m+ D5 ]. d' x( r1 Y4 O
}( ]! @1 C! m- w( R$ D
回复 支持 反对

使用道具 举报

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, w, V; z/ ~4 @! Q! m9 P8 Y" P" V
如果其它设备快速给你发送串口数据,你这边能正常通讯?
  A5 N0 ^8 H; K% A
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-30 00:29 , Processed in 0.041583 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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