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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7368|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
/ ^: L; k! |) T* f% X# v

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
( N1 S) e  x1 k7 _; {9 Z% u
' j( o9 W! k% j#include "TL138.h"                 // 创龙 TL138 开发板相关声明" h. d# B) P" t
: R! h0 I: e8 P5 o0 O4 b6 I
#include "hw_types.h"               // 宏命令
" S- b: S0 ^! I( S& U2 v/ N#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
9 R0 ]. D+ d0 g#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
, r. u6 ?9 d; q6 I. ?' V; X2 a5 }7 a  r
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
+ C" H( r' n! }! U& t6 h#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明/ Z9 c( w8 E& v; w; D0 Q
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
5 J' q) A6 j8 \6 H0 d  Q#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
. k) L! P" N: P/ F  b
5 W' f4 Y' f. K7 v) b/****************************************************************************/
  v5 d8 x; M; F/*                                                                          */
& `9 `: A* L: k+ V( J7 R/*              宏定义                                                      */. b. K/ }7 ?) M
/*                                                                          */
3 u. v* [; i% d8 [9 Q. d  E4 V/****************************************************************************/
/ X$ w6 f$ h+ `// 时钟7 n+ Z) W  L  q2 W+ e- d7 X' D
#define SYSCLK_1_FREQ     (456000000)
* U. C2 q7 J" n( O4 r4 p: ]& W#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
8 L7 ]$ t+ `3 G% R+ I2 K6 @#define UART_2_FREQ       (SYSCLK_2_FREQ)
8 i( n; P6 U; k1 r$ \' O, L* q! x0 @. g- _$ _
/****************************************************************************/
4 x# z; ~2 F+ _& x* s/ g/*                                                                          */
& I( _) o0 C; E4 Z) C5 ?3 X: F/*              全局变量                                                    */1 u% U3 z# t" t$ [7 Q0 z
/*                                                                          */
, d7 G7 Y  ]( H* @/****************************************************************************/
4 _* R3 z1 k5 b" ychar txArray[] = "Tronlong UART2 Application......\n\r";
1 a: g! _! T5 U9 W: u7 H
1 m6 W$ f! Q' I/****************************************************************************/
- j3 U* Y3 K9 [% o& Z/*                                                                          */& c9 m! f5 o, [) z6 f
/*              函数声明                                                    */
/ n% V( n; Q0 K5 j* q/*                                                                          */
: ^% q/ @2 M" t& ~+ z/****************************************************************************/2 k6 M' v/ [4 G2 y+ i1 T. R
// 外设使能配置
: i6 v& O. l2 \2 |void PSCInit(void);
5 W* Y$ }" d. Q' W' ?4 ?9 i) N% V% k6 v  ?/ l4 [/ G2 w2 `9 w" B
// GPIO 管脚复用配置* T! U8 \9 Z6 T( m
void GPIOBankPinMuxSet();
5 B6 Y  n5 p  {+ v, K& P, J$ m, C2 t2 _0 c# a7 ~
// UART 初始化
6 t, B" n( u- q4 j9 f1 h8 ]3 `2 x* Wvoid UARTInit(void);" e3 r5 [  ?7 f+ y6 i% ~% G( r
// ARM 中断初始化
0 Y: u* U' L5 |9 F1 w. Avoid InterruptInit(void);
- l7 }5 S' W# b: V. S! m' j// UART 中断初始化
; L: T/ g9 p3 d5 |: T, Kvoid UARTInterruptInit();' d+ l8 g% g5 r+ l) o' |
// UART 中断服务函数
4 s7 H; D) I! G4 ?& zvoid UARTIsr(void);
2 }1 w0 h  ?4 e: v( U& U2 ^" f9 j4 C
7 Z" W) _, n7 L) a# m. @/****************************************************************************/
  c4 Q3 \! c% J! E# R: U6 b! T/*                                                                          */5 P! x+ W) m2 p/ r" r
/*              主函数                                                      */6 Q' t1 e3 G8 q% d: `
/*                                                                          */  a  N" j9 }/ y+ `9 i2 \  D" Q, d
/****************************************************************************/+ _2 x: D' x& A1 a" o
int main(void)$ Y5 A: ^" A9 n0 Y
{3 m) q( P2 a5 v" O6 k
        // 外设使能配置4 H1 }( n! d; t7 B% G- K6 E
        PSCInit();# a: Y7 k# \: u9 p. K2 U# Z8 A$ x
       
) N) c/ l# O/ l' q        // GPIO 管脚复用配置- w2 J7 Z5 W5 ^6 P: N6 T
        GPIOBankPinMuxSet();# R* _& u3 A$ H) B0 M

# b. }1 I  o$ I" Y& y# g: D        // ARM 中断初始化# z1 i1 y/ {" N- l
        InterruptInit();! Z/ B4 }- J# B$ m4 |# \$ N. ~4 V

  M! x- k8 h' a9 \& w        // UART 初始化
  m9 m9 r4 C! T" N        UARTInit();6 \# g  z0 _8 |/ T
/ a9 L/ z0 M( c3 L  o3 S0 `1 U: r
        // UART 中断初始化
8 X4 F! O8 U) G% r$ v3 {/ a        UARTInterruptInit();/ M  R3 p" V6 T" h- {
% D; o( e/ ?: G
        // 主循环3 e6 }/ i  L5 o8 D
        for(;;)
2 O: z3 s# Y, G* f$ l        {
5 \; H1 A0 X0 `  m0 N5 P% K8 x9 w  D+ L8 Y# U0 D) x
        }& k" R8 N1 A7 o& V1 F  K
}
5 R7 e0 G7 p& c: {& O6 X5 D* {8 v% S" j4 K$ P" o8 `# b. L" i
/****************************************************************************/
3 r6 S% j, G( H* g9 C/*                                                                          */5 n7 }8 b5 r* c. R7 c9 V& b
/*              PSC 初始化                                                  */
2 [2 K& [7 X# q, p6 ~' g: |/*                                                                          */
2 r7 U2 j7 i! e) B/****************************************************************************/; d* I  L/ R5 t0 H9 N" P
void PSCInit(void)( v4 y( Y9 q- c' A2 O1 p
{# I( H) |" e9 B. N4 f
        // 对相应外设模块的使能也可以在 BootLoader 中完成
; t! ]; o  e0 `! d, X* X, A    // 使能 UART2 模块
; P( _/ o9 B, \0 Z    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);. A- H0 K: V# o* t( x+ j- y2 N
}- d0 i) X( H8 M1 u9 @5 b
4 m: @5 i$ ~/ |) \) x7 r2 P+ N
/****************************************************************************/
2 w3 a5 {( ^1 p' m% G& O" P/*                                                                          */
3 |$ I0 r& g" A3 p0 G8 w' I/*              GPIO 管脚复用配置                                           */
% o1 s' K" R  Z3 Z/*                                                                          */
4 u. h! ^& G! ~) O/ a4 J" g2 {7 g/****************************************************************************/- _0 k4 [" U) q5 v3 L  @2 D
void GPIOBankPinMuxSet(void)
; t+ e- P+ ~4 V& x  W, ~{6 I0 n3 I6 H, X- ?/ q0 W
        // UART2 禁用流控
$ v$ ]+ ~( i! p/ c7 p        UARTPinMuxSetup(2, FALSE);; A8 l5 h+ t* J2 b
}6 \9 o5 W; M) Q
! T- w5 A) Y- H
/****************************************************************************/8 ~! O3 D+ g4 ]) Q/ m/ G
/*                                                                          */
% h9 P" @6 ^8 i/*              ARM 中断初始化                                              */
. c: P' j) {* O2 Q% G/*                                                                          */
! i  ~* c  {  ]7 B) v7 g4 N/****************************************************************************/- _% Y# u! B2 E9 D# [$ U; E+ l- x
void InterruptInit(void)
, N3 n7 ~( j4 h" t0 Y/ i- |% _2 u" O% L" v{
9 L# j6 U+ b+ x& N6 p* w    // 初始化 ARM 中断控制器0 b( i5 Y5 i7 i' K, a6 b
    IntAINTCInit();
6 H% m! M* k  y6 ?8 `$ Q1 I' ]0 V/ u2 |5 w( j) S3 D2 f3 `
    // 使能 IRQ(CPSR)
) H6 \5 O/ s4 q. K# f% i    IntMasterIRQEnable();
) ^* Z  a7 y& a+ E6 \, n2 B* `7 ?4 ~
& j6 v+ Y! j, v7 M8 V    // 使能中断(AINTC GER)! F. k+ g7 w8 h: I* I, l! h- w* ?
    IntGlobalEnable();
! \" Q2 i" v2 B8 l; C) I* r8 S/ P- m+ v1 Y8 p: i
    // 使能中断(AINTC HIER)
! N9 W' _" d) F( U; q    IntIRQEnable();
% E- i6 @) P2 _7 Q}
7 O1 ]1 D$ \0 A. X; s8 `+ Q
: L3 J" C4 V1 R, d" y/****************************************************************************/
, u/ ^1 d* F1 a. o3 f& t9 j: s/*                                                                          */
3 N; N' |- p0 Y9 n/*              UART 初始化                                                 */
% V+ O) n" A/ q0 `# V/ ?) I- y/ T8 @/*                                                                          */
& \# X: K2 _: q) C/****************************************************************************/
) s# o' _: d9 }5 }: Cvoid UARTInit(void)
7 U7 f, J- D& j6 r9 x{
) t7 t) ~+ g. h2 P        // 配置 UART2 参数
) c9 ?; V; c/ n# }$ i        // 波特率 115200 数据位 8 停止位 1 无校验位8 y8 F, ?  J. N& U1 E
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
$ W9 B# D/ x; p" D; J                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);$ F! T+ S" L1 Y; D9 \
        // 使能 UART26 R2 M" g& z. K% s
        UARTEnable(SOC_UART_2_REGS);1 j( d$ m0 |) T9 N+ I. i- |& T  ?

/ Z7 D' W" Y+ B9 X2 p8 j    // 使能接收 / 发送 FIFO) I" B" C% j5 E  G+ \
    UARTFIFOEnable(SOC_UART_2_REGS);5 |. e  A6 C/ ^  m. ^: m3 U3 n/ P

) n4 l7 t3 Q8 N9 ]0 o3 h  h    // 设置 FIFO 级别2 t* @. W9 }  c8 I
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);1 P5 e+ I: S$ \2 i8 K
}* C8 `4 {! G( ?

- c3 l; K  f( y& z: M/****************************************************************************/
6 Z9 ^3 q" a* @2 {& j" Y/*                                                                          */; ^1 _3 x4 X' \% z  O0 n0 E% K# F' ~
/*              UART 中断初始化                                             */
/ `  e# w% ^" ^+ P/*                                                                          */
2 N' u5 I. G( M2 C7 V9 z* G/****************************************************************************/4 h' G' l' z" p0 m' l
void UARTInterruptInit(void)/ r# k% n" T) g9 T: D
{
" d# P1 ?" |% _. t+ ]( k7 X- s        IntRegister(SYS_INT_UARTINT2, UARTIsr);4 c7 R2 f! K; N4 A8 H  u" N9 R, ^
        IntChannelSet(SYS_INT_UARTINT2, 2);! f. b1 @5 L2 ?* S( s1 m  _
        IntSystemEnable(SYS_INT_UARTINT2);
8 b" q/ E) M) Q$ h3 d+ b3 E/ z+ N6 G: U+ Q( T7 ]# F1 O
        // 使能中断
1 x2 o7 v2 U$ Z/ j        unsigned int intFlags = 0;6 T( b0 d$ O. q& S  ?  M! G2 h$ F
    intFlags |= (UART_INT_LINE_STAT  |  \, \4 l, M% q9 v8 ?# {+ t4 h- q
                 UART_INT_TX_EMPTY |    \
' x) L' g5 ~6 E* P" ?4 w                 UART_INT_RXDATA_CTI);
5 {+ y. s) q/ d" O" e7 Q  [    UARTIntEnable(SOC_UART_2_REGS, intFlags);
7 p! B" `  R% T  m4 i}7 M) B/ }( M7 \3 @

5 Y- U4 [4 k3 Q/****************************************************************************/
5 ]2 t! o8 N5 z/*                                                                          */& ]1 _- `1 S$ B: z" w
/*              UART 中断服务函数                                           */
& ]& F+ L1 s8 t7 ?/*                                                                          */
' G5 Y* u% G  [( ]. o/****************************************************************************/
2 n7 K+ d' Z6 ]void UARTIsr()$ x6 A- c/ e  ^' k' ~; n  f
{
% J# I) ?; I' v' B    static unsigned int length = sizeof(txArray);
5 U; X1 E1 L: O/ {/ _# c    static unsigned int count = 0;
) c* G5 {+ t1 u9 f- a7 R- Z    unsigned char rxData = 0;
9 t% q5 _" Z7 Q. Y% u    unsigned int int_id = 0;
6 @# k. [. |$ H
2 {4 E: h8 p# m% u0 J    // 确定中断源
2 F: @. b% @# }/ b8 ~' q, J    int_id = UARTIntStatus(SOC_UART_2_REGS);
1 h2 h' @9 U7 j1 [) c+ B. y: S1 x% I+ L) `9 C; G4 N; S* v
    // 清除 UART2 系统中断+ a) j: m# {1 b# B& t4 ~5 z
    IntSystemStatusClear(SYS_INT_UARTINT2);: Z' ?& ?# y, v5 i
' q5 T) q" ?0 O
    // 发送中断
5 |" k  B5 p9 v1 y6 d    if(UART_INTID_TX_EMPTY == int_id), w/ ~: D# Y( I4 q
    {0 v/ f2 j/ ~1 t: ^* S, `# K
        if(0 < length)+ n0 S) G* K1 o3 i
        {+ {" f" S2 b! x$ e5 z
            // 写一个字节到 THR
4 b, y8 E2 ~8 Z( q            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
! o& A; g: U, |8 R( [% q1 |; Y( [            length--;# }+ p5 w* J+ n1 q: b* |; \
            count++;
9 M1 D2 w" p& N0 D. y        }
4 I5 ^* V! @9 w5 [1 P7 P        if(0 == length)
" @* o6 J. N+ W; U0 F# O5 K) v8 }8 H        {
% a" y) d. g! d' U) P            // 禁用发送中断3 A  Z) l8 @4 \6 Q! b( }2 Y
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);: \; V' o( i- o9 F2 @  E
        }
# H- ?: Y" N& \6 k     }3 ]/ W! o# K: F4 q+ p; _
' x+ d% h0 T3 g+ i# Y
    // 接收中断
1 _" J, v& Z" n4 M. h, U9 n2 H    if(UART_INTID_RX_DATA == int_id)% l4 p( G( j5 }0 C8 |/ z) P
    {
0 V3 Z5 N; g& n0 C' I        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);' y+ b5 F4 }4 F- _( C3 ^
7 p' ~1 X4 \* `* r" F1 p5 H" Z2 E
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
1 b( V3 u1 W7 Q    }# t1 o8 b9 ]# ]" h9 f9 A5 ^
, t5 _  G* J) u: k5 ^
    // 接收错误
$ Z9 D/ ~* Q: G( ^. b* Y4 e5 O    if(UART_INTID_RX_LINE_STAT == int_id)% _7 I7 a3 x) ^; g( _  o8 i2 `
    {
3 e7 F3 W2 b# G; J5 Z. ^        while(UARTRxErrorGet(SOC_UART_2_REGS))5 f1 M; h- u" O7 @. z, a1 B, B6 D0 ]
        {7 x  f' U3 _# m+ j* ]( L
            // 从 RBR 读一个字节; ?$ p# ]2 V4 Q! C4 M4 P/ h/ t
            UARTCharGetNonBlocking(SOC_UART_2_REGS);8 B2 ~( Z& x1 e1 E; A: z
        }) a& M; _7 U0 d
    }  D0 ]: W- |  o# Y0 |
    9 T9 P* K+ L. V) S% _+ _/ W
    return;
7 ]; U5 W5 O1 W7 P+ N0 b}
! l+ P5 ]: T. |
回复 支持 反对

使用道具 举报

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( M2 K1 X0 k, B
如果其它设备快速给你发送串口数据,你这边能正常通讯?
0 a" F5 S& b2 \# H6 z: }& h" f+ @
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 18:29 , Processed in 0.044916 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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