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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5619|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。* ?' k, w9 E% V9 _

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
' j1 c# K5 Q, d  o9 l- d) q$ z
4 r% I& v2 y8 I& |5 G#include "TL138.h"                 // 创龙 TL138 开发板相关声明
: u0 t4 z9 ]3 N4 h1 b3 [3 y4 i4 t) ^$ i# L6 g4 w9 f- y1 t, ~! p
#include "hw_types.h"               // 宏命令
7 _: K% _0 |" M. A$ O/ G/ j3 m#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
5 Z( J) O2 E/ Q# Q9 \" P: Y#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
, ?" b' r- [" E7 v  R1 B4 Z7 s  \: l  ~: K6 M* h5 R1 g' r* Y1 w) q% \# f
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明& a; t0 y% ]  N, U' b
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明2 M" P# t/ J+ C) c1 @, A) @4 j
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明. Y) B# e6 r5 o3 [0 C& K7 Y
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
/ ]4 _) i  E$ C( j/ |. A, Q) M
' }$ p* Z& h, h  E/****************************************************************************/
( @$ e3 l4 b$ B  ~/*                                                                          */
2 F; y* m! U. q# u/*              宏定义                                                      */
6 q1 j9 ]/ s8 E. S0 E; n+ ~/*                                                                          */+ X+ `. q( L1 v0 D; a+ l( W3 b% a
/****************************************************************************/
4 c- V6 f2 I3 Q% s// 时钟5 t  E  |% Y" ]8 D4 ]2 ]
#define SYSCLK_1_FREQ     (456000000)
& h" z$ ^1 ^" h) l# z#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
8 b. t( V+ R- V% r2 J, \0 ?#define UART_2_FREQ       (SYSCLK_2_FREQ)2 k8 T0 V6 |. U/ @/ W
# G" o3 q, j( g5 V
/****************************************************************************/% ?: K6 d0 d( }! m2 ^# p) V
/*                                                                          */4 [8 v' u/ L0 u0 b5 k0 F* ?
/*              全局变量                                                    */% \6 c! h  J0 T; U. k+ O# z3 @
/*                                                                          */# e( T( f  u( |" K
/****************************************************************************/
8 O, m9 v& U7 q/ T9 m+ u& Schar txArray[] = "Tronlong UART2 Application......\n\r";" e' r% L2 u. F
# v7 W1 `! x3 R# S" }5 u9 i# p' c
/****************************************************************************/9 }3 \- u" ~4 i" F
/*                                                                          */6 |/ c- u" s1 s$ C( u% @. L9 f
/*              函数声明                                                    */
" g8 Y+ a" k! G5 D/*                                                                          */
, e8 Z, n; Q3 h" c( h7 b/****************************************************************************/+ S% k; S, H+ F8 v2 G
// 外设使能配置
- S* W5 s- l5 C7 [void PSCInit(void);
. S- J% g5 {1 K( c! `! i( I" p/ I8 F- s
// GPIO 管脚复用配置
& c! [  F* u1 ]2 m! S* dvoid GPIOBankPinMuxSet();* e: q( \8 ^, c7 _
) E$ L7 N/ Z6 {! |$ ^
// UART 初始化1 u( l& Y6 g! R, f; x, C
void UARTInit(void);
. D, H/ \, F2 c" E% T8 x2 |4 g  U// ARM 中断初始化5 k& c/ [' v2 V7 u: J4 n, I+ r
void InterruptInit(void);
/ Z3 `% b! U2 J, Q. T// UART 中断初始化
" n" B9 R) b& ivoid UARTInterruptInit();  a6 V% N# Z) Q+ h) J
// UART 中断服务函数/ x; l( ]; ^! T+ @& p
void UARTIsr(void);
2 d1 l' A2 A0 n* I* X' e; F, w3 A6 q) k) a& r4 D# ^$ i
/****************************************************************************// m% K  r; b  A; ?! X
/*                                                                          */" s3 L  e" u) J3 e; q0 Z, x
/*              主函数                                                      */& v6 T- o- t9 T/ d* ~9 g, z
/*                                                                          */; [9 C; V! [' K& T
/****************************************************************************/+ I+ b! G7 E! q
int main(void)
+ t$ C) G% [& T. G3 {. A{0 q' J) k& z- L$ `* n/ M% l' |1 m
        // 外设使能配置% O% Y( O& M6 N& c, G# e' F* ]
        PSCInit();6 f! a2 e; H% P
       
+ j8 y7 g  T$ K0 `( y        // GPIO 管脚复用配置
1 y! V5 X% r/ a2 y1 \, k        GPIOBankPinMuxSet();/ C* n! x1 f1 U5 X0 W0 b! @3 Y8 h

" r2 u( t7 g) j/ c6 D1 j% U! X        // ARM 中断初始化
7 p0 E9 @4 \2 K4 @8 ]# W  R        InterruptInit();7 o. F5 q9 N( t5 E
; G2 R2 s# u9 [
        // UART 初始化
- q/ o5 @4 J$ e7 E        UARTInit();
6 m4 e' |' P: m
5 U: s, }6 O! j; N! i6 q0 g: N        // UART 中断初始化
$ f( p6 W. j4 s6 S0 s        UARTInterruptInit();
6 G! {6 {% ~8 \, t! [7 O, ]
2 P+ n) ?8 C3 {+ T  f" u# f        // 主循环8 l( @- X$ w6 v& |
        for(;;)+ G7 i- {  n: P8 r; B* ~- t
        {
9 r1 H% w7 j5 j" u# W2 Q( f8 M
8 _9 F! v# Y5 G" b0 J        }# M/ l# \0 N- Q- O( E$ }
}
  U% ~# d7 [2 m- H4 c$ x, Q, g% T3 B$ g1 s  @# {( d
/****************************************************************************/
- ]2 Z$ `/ ?  B) K9 E/*                                                                          */
5 `' U; S4 G; x0 a* ]! \2 _. c/*              PSC 初始化                                                  */
3 a, X2 J  V4 j. I$ k/*                                                                          */( x# n3 |+ I$ [/ F4 Y2 p  l9 u
/****************************************************************************/
- T+ f' {3 e& C" X% ^5 G% N/ wvoid PSCInit(void), c5 r3 k1 @  ~- ~: c
{" V  n& ]$ ]& E+ ?- B! C  Z/ D
        // 对相应外设模块的使能也可以在 BootLoader 中完成% Q% @  X. y: @: x9 G; f
    // 使能 UART2 模块
! J, E2 E+ k0 [/ M/ w    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);$ G% x7 i8 w5 `& [! n0 R, b- \
}
, W2 N; V: @( V4 m# K0 {
+ M. I8 f$ {; m5 [( t/****************************************************************************/
' {  q: N  C# T/*                                                                          */
& N% [, ~, n6 c, ~- S/*              GPIO 管脚复用配置                                           */7 `: n: A8 ]- C) Y
/*                                                                          */
5 `# ^5 B& {6 M! p; Z/****************************************************************************/& s9 o' f: r. _8 F% [
void GPIOBankPinMuxSet(void), C8 A/ V+ z/ m& d/ s; s4 B
{
% e& J% x& f  K  x) n4 ~; T        // UART2 禁用流控
# t% c! b( J1 q3 t3 u! y8 F        UARTPinMuxSetup(2, FALSE);2 ^% n/ O4 {. s5 Q- q: J7 b" c, l
}
2 H6 D8 B1 o/ j. N. }
( u4 h) P# Z/ N3 S/****************************************************************************/4 J( D7 P4 V5 r& }/ K1 D4 s- c2 M3 X
/*                                                                          */6 j" I2 \% i* f( l8 v6 T
/*              ARM 中断初始化                                              */
  Y3 a# R! p5 F% Z$ u- [3 u/*                                                                          */
3 F# U3 p, i! _1 z( ^1 D/****************************************************************************/- e5 b1 N9 P( L, Z) X
void InterruptInit(void)) Y' h/ S; G! B# P2 C/ S
{0 h! z6 q. W6 I1 M: M1 H
    // 初始化 ARM 中断控制器
3 y' |# ]' \3 c/ U    IntAINTCInit();
  W5 M4 |  n( L* ^+ H, W) v& V
: R1 J6 E. I) i! }# }* ~% _    // 使能 IRQ(CPSR)
# @: N5 _$ m1 Q" Q$ N. G4 }& _    IntMasterIRQEnable();
& m" k0 S  V9 |! s& i2 w4 B: H8 [; X0 w4 f* \" v- P0 j! B1 ?- N
    // 使能中断(AINTC GER)
' \7 U; Z* H% {1 \    IntGlobalEnable();
6 Y7 f$ @  `/ _4 h
; {: ?" p* Y; K0 ]    // 使能中断(AINTC HIER)( Y: S  t* l; x# w
    IntIRQEnable();
6 a+ X, M7 m; e8 u9 T- f5 g. p6 ?}
9 H3 j) n# N) D
8 H# I( }9 O9 ]6 n% j/****************************************************************************/
' ]! r) ?3 r- ]' ]6 t' n/*                                                                          */  |" ?4 j1 R' q5 t1 s0 V
/*              UART 初始化                                                 */
6 |2 e0 I# ~" y3 s# ?( D7 J* _0 l/*                                                                          */6 w8 Q; q1 q% D, r4 B. O7 g
/****************************************************************************/
4 H5 I, y$ J# z6 V: ^# U8 L/ G. vvoid UARTInit(void)3 d, {( S# ?% F9 ~0 r' q) o& i! C
{
0 p4 {1 V" f6 I9 \9 ?7 l7 y. c5 _3 |        // 配置 UART2 参数
' Y9 Z% S0 O2 k, U* J4 S        // 波特率 115200 数据位 8 停止位 1 无校验位8 n9 m# {# ^2 a3 O% S
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,. d3 s9 M% g: R! }- `' ?8 c2 S6 i
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);- m% r7 D# |- o. c5 B7 L: s
        // 使能 UART2+ A% |; `; t# C3 \- K9 f/ n; [
        UARTEnable(SOC_UART_2_REGS);
. G  D0 c" z; Z" f' p  N6 R2 T; B1 Q" f6 ^
    // 使能接收 / 发送 FIFO
/ d. g! i  ?) k7 f! u    UARTFIFOEnable(SOC_UART_2_REGS);
6 E. H( @& a4 n/ H3 J/ h" E4 v, _7 }+ w  T1 g3 c, d( u/ d
    // 设置 FIFO 级别9 ^: F0 t% z: k9 J
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
+ I2 u8 C& I2 n5 y}
* _+ B. M  j, s" `
$ i- m; _( `1 L" |5 D/****************************************************************************/7 _$ E. Y# X5 H  m, o9 d- o
/*                                                                          */- ?) E" s3 o! G2 Z
/*              UART 中断初始化                                             */
0 m0 E; V8 _4 `& E  B; f. n8 W' E/*                                                                          */
( x6 U: b& V9 n. ]! E3 E7 M/****************************************************************************/% t& z, m! {5 a8 u* Y: E* \
void UARTInterruptInit(void)" w# {6 G4 O' Z
{3 v$ m( `% ^: n6 g  h
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
. U# k. Z' A# z) H8 k+ g        IntChannelSet(SYS_INT_UARTINT2, 2);2 O( Q( ^  L$ e- Q9 H' J- m+ T
        IntSystemEnable(SYS_INT_UARTINT2);
1 V0 ]( E8 f2 ?1 y4 `6 A) p* G& c2 g# H9 o8 p& N$ M6 L# m. h
        // 使能中断1 U* Y9 ]0 R3 X' [3 G: R) O) R
        unsigned int intFlags = 0;
0 S  w0 _& x3 O' ?    intFlags |= (UART_INT_LINE_STAT  |  \+ N& e$ R% I  Q8 m
                 UART_INT_TX_EMPTY |    \
9 N; C* R" u5 `                 UART_INT_RXDATA_CTI);% m3 N4 m4 H- B- S
    UARTIntEnable(SOC_UART_2_REGS, intFlags);1 o. E* H7 v, v+ X0 v+ x4 b
}
! x2 w3 ?/ F6 u- ?$ [: Q+ V$ M% }
/****************************************************************************/9 d4 h/ f9 a2 x/ _% }
/*                                                                          */
' ]4 ^7 |+ x1 h  k- [3 P" @, R/*              UART 中断服务函数                                           */6 K- ]& _# _( g; i! e, W: W
/*                                                                          */
* @! k; ^. n9 \! _; h/****************************************************************************/& B: A. \- l6 v7 S3 w0 H
void UARTIsr()
2 `1 N: L' j' @* _0 |* [{
4 k# H/ h+ o0 i1 x1 y/ C    static unsigned int length = sizeof(txArray);2 H  M. J6 p4 z5 y- s6 g
    static unsigned int count = 0;4 q* n. q2 ~, d0 |, x% J
    unsigned char rxData = 0;$ L. e! D$ O1 s! b" ?' Y7 P4 L8 h
    unsigned int int_id = 0;
1 d% {+ _8 G3 i+ F
6 f2 H9 g( G5 H- r  Y. j    // 确定中断源2 s, _; O# C5 r
    int_id = UARTIntStatus(SOC_UART_2_REGS);
! z3 d* O& P5 G$ s! g1 ^
; O) a% Y7 q( G  ?. G0 R: U    // 清除 UART2 系统中断. K5 Y; I! j5 b% h' E* t; M
    IntSystemStatusClear(SYS_INT_UARTINT2);, l8 n$ Q, v  g# G- c- |$ [9 \
4 F% [1 I6 G( X% o$ P2 Y5 P
    // 发送中断
' m3 w( Y7 c! d    if(UART_INTID_TX_EMPTY == int_id)
1 o+ m' w$ Q9 Y5 a1 A    {2 q% r% Z1 a2 F2 R( L
        if(0 < length)
7 v5 H, Y: N2 I7 J$ m2 ~7 E- q        {- V6 U. q  x# S% y  N
            // 写一个字节到 THR
% V1 V* a4 M, O            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
$ C: P0 c( n( F: y% j# J. E/ V            length--;) p% r! `$ M# w
            count++;# m  ~, n# f: B( ^  H0 v5 }* Y
        }6 H6 O3 Y6 c2 m; N+ U3 C: {1 N
        if(0 == length)
: r' ?; u8 j1 y        {( p# m+ N& ]- p9 v0 f! H, b: l" P$ J
            // 禁用发送中断, G0 U" \/ F; ~, c
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);4 ?3 S: e2 P/ q; \! V
        }( V- w; D9 B  C* M( B
     }6 o7 l4 B) O* T5 @
' p5 |+ E& J: v
    // 接收中断8 w/ m4 g$ G) U) C9 @+ D
    if(UART_INTID_RX_DATA == int_id)7 T+ y) `# k. ?- k5 o
    {
1 S* `/ P0 ~# H* Q! R7 t# k        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
4 W% j) s) p5 H: ~) N. K: X; F9 p" D; [/ J4 r2 _4 i
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);2 W/ ?& b+ ^  [( q1 b7 x5 ]4 r
    }  V% `& ^2 D0 o7 P3 P1 }6 J

% Z0 ~! @1 K4 a% C! P0 R    // 接收错误2 F$ ]9 E5 Z- Q: H$ n1 P4 @" S
    if(UART_INTID_RX_LINE_STAT == int_id)
* N' K1 j: C" R; x, H+ N4 H( T: W    {# K/ d, Q! `* D' e! \/ N
        while(UARTRxErrorGet(SOC_UART_2_REGS))
3 d% d% t9 y0 W9 Y* d        {
* _; f; P' v+ V, G8 \) e/ k; g1 M! J            // 从 RBR 读一个字节8 }$ Y4 T0 l2 P8 w
            UARTCharGetNonBlocking(SOC_UART_2_REGS);( l+ R. x1 S) U3 x4 [
        }
2 h6 W6 F$ N+ }, s( k    }9 p: I& z1 E- y4 h* ]
    : S) D" C! v6 Q  |- M+ i
    return;" _- [1 @; a5 x0 K; H
}
  U2 |7 G+ W4 T5 H8 s9 j6 j
回复 支持 反对

使用道具 举报

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
6 R7 O+ ^6 @, n( ?5 `: o如果其它设备快速给你发送串口数据,你这边能正常通讯?

6 N2 g- {3 \! c0 }& P( K谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 19:44 , Processed in 0.048042 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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