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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5597|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。  v8 x- [6 m) w# X) W0 a) r  O

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。  v" L4 B2 l, W8 e# Y- n, u. y

$ V; N5 j, W& V8 A  H2 z#include "TL138.h"                 // 创龙 TL138 开发板相关声明
- g6 X+ P" U) q: n: w8 o. A4 F5 s! n* Q' n8 S% B7 u! ^$ e! w+ O
#include "hw_types.h"               // 宏命令: m$ ^- q) x; b
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
2 {; r3 x, N) _+ v% P0 R  ^9 R$ m#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
2 ^" L8 n9 j2 k- N  i* {% @) C2 D. X8 b" G6 g
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明4 U* y, ~6 N; c/ X
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
3 j  ^% L! v3 Y  y) k% E3 x4 U4 f#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明* b; d) }0 v# V  y' c) a  W; L
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
8 c. J; Q4 |5 m' G* T! G  X4 R% v8 O# Q* h' D
/****************************************************************************/; Y* |! S1 @) x. x
/*                                                                          */
# x; p  V# b& i/*              宏定义                                                      */
/ r* a4 W; E- s4 p/*                                                                          */, W; f& n9 ]( T4 G$ w  E2 X+ }
/****************************************************************************/
# n% h4 e; ~4 A/ O( }// 时钟
# q" c8 n! q' M4 N' i- U#define SYSCLK_1_FREQ     (456000000), [* [; U! m+ v0 @' n5 r( W
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)1 O. Q+ F+ k9 \8 o
#define UART_2_FREQ       (SYSCLK_2_FREQ)
! t+ J! M- B( Q7 w/ v, n
$ F0 W+ @2 u2 B3 u  p! s3 u+ j, g/****************************************************************************/" U0 G9 x" s9 T+ ~
/*                                                                          */7 _. Q) l: L& m  q& T
/*              全局变量                                                    */
1 Z9 G+ D) x# w$ q9 d' B* s- V, K/*                                                                          */# \' B' e/ N" g1 c* Y+ N. _
/****************************************************************************/
5 w( T0 N  l+ u; bchar txArray[] = "Tronlong UART2 Application......\n\r";4 |2 D( b1 W1 }8 M) E! O

' q* \4 S8 c  C  x/ t1 N/****************************************************************************/
" @* b+ Q' y9 E+ e/*                                                                          */3 W  d" p) O; ?. v+ ?
/*              函数声明                                                    */
" R  v: }( F+ N$ C/*                                                                          */# A+ Q: {' {' h1 }7 k
/****************************************************************************/6 A3 _; n' _; {5 B' a! h
// 外设使能配置
# @  ?0 B% \+ E! h, X; Lvoid PSCInit(void);
7 \& o( ]9 q0 {( F9 }( f
; z2 a& m& e2 E: K9 y; {/ t# A+ Z// GPIO 管脚复用配置
% B2 X( ~" u: V5 w! T6 o% rvoid GPIOBankPinMuxSet();
! {( M4 S- o6 k7 y# Z
$ J/ N0 j2 S7 U0 n# y& h// UART 初始化
7 x+ y8 [" W$ g: o( x$ y2 L& `6 T2 nvoid UARTInit(void);$ \" M  n, Y/ [& m  V. \
// ARM 中断初始化
, L" Z0 `+ V# A, x! Y! i; g  ]void InterruptInit(void);
5 L. R, ?( D% T1 L// UART 中断初始化
7 l3 p! f) h# a: Kvoid UARTInterruptInit();
& C& v; l/ G% b# Q) Z8 Z1 L& R// UART 中断服务函数
3 g8 _4 r# x. s0 Ivoid UARTIsr(void);
$ j& {2 F. C- i9 G# q& w; c
2 y' E! g+ D9 A) `/****************************************************************************/+ B$ q3 ~# X9 n# t
/*                                                                          */; c0 N( ^7 U, F6 K7 x
/*              主函数                                                      */
6 b6 L+ i- @( W/*                                                                          */8 ^4 s* r. o. _  X" O5 `5 j
/****************************************************************************/
2 `  U: w& L& v$ K5 \+ m6 Zint main(void)
' y& P+ x8 o" `7 A{  C' Z' R6 ]" X  [  Q. ~( E7 `
        // 外设使能配置
8 E* k# ~7 n  I$ A2 y( x. b        PSCInit();$ K1 D8 y/ _+ X1 O" Q1 i
       
2 m4 p+ F5 l) n* C' T# e        // GPIO 管脚复用配置
; X# A% b; n2 T: U. C+ I5 T5 ~7 e        GPIOBankPinMuxSet();
9 o. _, {  e+ s5 H- [- X3 l+ i) R, ~9 \) B8 x( o5 v! L; y: b/ K
        // ARM 中断初始化
- c* q. e3 {- i1 j* p2 l        InterruptInit();) O9 E  z3 ?; ^& T! K
& f8 ?$ ?. w4 U7 I  O5 [" v  G
        // UART 初始化8 \3 s  `6 |# x( g# i. \
        UARTInit();
6 K# j- O! N! K+ m8 C
  s) T, S' x* d. K6 x3 L4 i6 ~7 d; u6 I        // UART 中断初始化" K$ e! v7 e% l+ Q7 O. M4 W/ ~
        UARTInterruptInit();0 \3 s; Q8 R, _4 R' _6 B1 d
! }. m. i1 ?7 r; M3 }
        // 主循环% G3 T5 U( X# Q  y
        for(;;)4 Q, U$ l' O7 x. D( P. p/ N4 N
        {
6 d& V1 ^  z0 y& A7 V; l# G" |3 `6 R
% f" z% p) S( M! w- T, q, n        }/ ^/ d8 P7 ~1 X7 V# Z2 J2 m
}
4 k, E* {' E0 c  i
7 O$ P* G, K6 I$ @$ a; F/****************************************************************************/6 b$ [4 S- f$ E
/*                                                                          */
& \# B6 Z  T- S0 Y: P/*              PSC 初始化                                                  */& L7 }+ d* J+ m0 C6 \3 W
/*                                                                          */
  a5 @9 W2 K' I6 I# k( ^9 ^/****************************************************************************/
- \) q3 O6 k, B- M( p( Fvoid PSCInit(void)2 e' m, H) y# }  i! U
{
6 \  k6 O/ J" M% D5 O+ \        // 对相应外设模块的使能也可以在 BootLoader 中完成. Q$ @% n: O7 m0 u" B
    // 使能 UART2 模块
. u% F5 M1 ^+ x3 g' D) R2 F2 {    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);( q: K! S% O0 I4 \$ T
}
7 B: Z3 i: e6 ]) R, L' @% e5 J- q
* x# Y1 q3 a6 p2 L/****************************************************************************/3 y: i  t) s7 S/ B5 r$ Y
/*                                                                          */% L4 ]: j$ U+ V! t( a; \
/*              GPIO 管脚复用配置                                           */
. D* B7 [0 q9 J1 a' t9 h/*                                                                          */
, ]: U; U1 c5 \9 H* P) Y6 T- W/****************************************************************************/
  Q" j( W/ B" _8 r# hvoid GPIOBankPinMuxSet(void)
; ?) Z  Q1 f4 J; w3 p( H" `5 |{) B! C$ \; J) M  r* W
        // UART2 禁用流控  q7 i' g) h$ X7 t- W
        UARTPinMuxSetup(2, FALSE);
% t$ P% W7 L5 W4 z3 c0 C* B}
0 z8 }8 M7 w9 [9 p, q" {% i! n* C& k
; T( d: j$ B& e( ?8 u* f5 B6 W) X  p/****************************************************************************/
! ^. ?5 ]$ [7 g3 B; i' F/ i/*                                                                          */
4 Z4 D- G4 ?) ^& {& d/*              ARM 中断初始化                                              */
9 {) [$ b# I+ \2 e4 t1 j( I+ J5 D) ^/*                                                                          */# Z* M$ Q1 t2 m, ?# y
/****************************************************************************/6 o/ P& l6 n6 p/ @6 [
void InterruptInit(void); V0 n7 `9 ~7 t' t# d; q
{
& c- v" ]/ m2 K    // 初始化 ARM 中断控制器
+ F1 v3 y/ t+ {. N    IntAINTCInit();
- W9 `* w: a# T9 W9 R  `
% q, T' f9 U! ^4 b    // 使能 IRQ(CPSR)
% g. }/ d( y+ w; b5 l    IntMasterIRQEnable();' J5 F/ @. d# W% I1 p

: W2 E* v7 D6 G1 m% [8 B    // 使能中断(AINTC GER)2 c+ t* I7 S3 \' N7 w
    IntGlobalEnable();
- A& J; U: c8 z9 f$ I1 x& B6 @1 k2 S% J& y+ e
    // 使能中断(AINTC HIER)
7 K  M( j$ J0 L$ J/ ]: R    IntIRQEnable();
$ X% d/ a7 W& j2 \1 z- d}
6 X& a6 K+ d5 r  t6 N, j
) ~+ l; q( y* j/****************************************************************************/# c( r3 y) _2 e4 x9 h+ s. L4 Z
/*                                                                          */
7 x- \* w1 L6 T3 i/*              UART 初始化                                                 */7 _( t$ k8 h2 W0 m
/*                                                                          */; d. z& H0 M6 X
/****************************************************************************/
# p8 d+ k( F- w" R0 ^void UARTInit(void)
0 v! o. c5 G, ~4 T' O5 u{4 x' e7 }6 y+ I0 s. ?  u9 w
        // 配置 UART2 参数
8 u* s* H8 a5 c* Y) y, l' l        // 波特率 115200 数据位 8 停止位 1 无校验位
4 X% Z1 Z( Y; b6 o    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
+ N) f; W; f  B. {+ b9 h                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);" {% @! t! }7 a
        // 使能 UART22 f' A3 a7 u- G& c' _7 m
        UARTEnable(SOC_UART_2_REGS);$ z' [2 O$ M8 ^' P# y3 A' U
/ T. F% g# _+ H) H: W: L
    // 使能接收 / 发送 FIFO4 K$ q3 O1 ^. }
    UARTFIFOEnable(SOC_UART_2_REGS);
2 q. H% b7 u5 p* d7 K6 O# R2 F
2 H+ Y8 ~& l# ?  o0 V/ z+ W& ]    // 设置 FIFO 级别( Z! C: |2 [! u8 T$ Y1 ]$ {  u# P
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);$ T6 N: {8 t: @; j1 W1 a" B
}5 N% |2 g  t) \

; Q+ Q. W+ L" U# f% E/****************************************************************************/
* ~5 k# n" W& j6 B5 k" `/*                                                                          */
8 h) b, R" X" a' y% C/*              UART 中断初始化                                             */
4 ~. I' ?/ u: @/*                                                                          */+ P$ `! d2 b( U1 ?, K$ q! m, j
/****************************************************************************/
1 _8 ]/ U# q% ~. t( U' C- Rvoid UARTInterruptInit(void)
; _; W% @: V0 F; O. n9 A{  R* I9 `5 ~( V! }3 n% g& P9 n; E" b
        IntRegister(SYS_INT_UARTINT2, UARTIsr);8 L& a" L& p% Q0 H, K
        IntChannelSet(SYS_INT_UARTINT2, 2);  O( `8 D3 V3 p) f4 Z" i
        IntSystemEnable(SYS_INT_UARTINT2);
1 Q* K- F" o; z1 h
9 ?" V8 S3 x3 S, N0 b' v        // 使能中断
+ o0 s+ x7 o( U: B* w! b- b1 V. \        unsigned int intFlags = 0;- @* _( X1 V9 V9 Y; U
    intFlags |= (UART_INT_LINE_STAT  |  \
" Z# Q; P  @$ a: ?& \                 UART_INT_TX_EMPTY |    \4 g/ i7 U  f1 Q5 T& M$ D
                 UART_INT_RXDATA_CTI);+ H1 _0 n# i$ v4 v$ P/ s; G! r7 z1 ~
    UARTIntEnable(SOC_UART_2_REGS, intFlags);6 n, _, B$ [3 W
}4 H, p! {7 ^8 X9 K1 t
5 a( @, R5 Q% }6 l
/****************************************************************************/
8 w$ d6 q* H* v" P. d/*                                                                          */
  D. F' C# F4 F+ o; H/*              UART 中断服务函数                                           */
5 k9 N) ]- M  |+ y" o5 T/*                                                                          *// I4 l6 X- F; i1 s3 ^5 ^
/****************************************************************************/: S' d- p' ~3 e) f8 b
void UARTIsr()
5 @: M9 d: ^  A. j{
- P6 E# f/ U; b# g    static unsigned int length = sizeof(txArray);9 s$ D9 l4 W" v0 k" u  W( z
    static unsigned int count = 0;
1 x! \) q" Z1 C7 w, ?    unsigned char rxData = 0;
( Z; \+ M( m& f' m) u/ k3 `    unsigned int int_id = 0;) T, t) n' j9 M' d3 Q
! q4 h9 \% |5 W) J
    // 确定中断源0 Z( @+ g$ e7 m* R7 P, _/ r' Y6 d
    int_id = UARTIntStatus(SOC_UART_2_REGS);% V% s8 P  j8 r: O3 {
% W( n2 s- F: u. Z& H
    // 清除 UART2 系统中断
! V/ i& p) }- ]1 {! K    IntSystemStatusClear(SYS_INT_UARTINT2);
5 U9 _6 x. r2 M+ w7 z5 Q
, ?  e' p( d2 m0 R& K, t8 H    // 发送中断
0 l% N8 q1 U( N% u    if(UART_INTID_TX_EMPTY == int_id)4 C0 k  F5 D, k% s# R& u) r" ^
    {
8 o0 t  e3 D6 k$ A4 X+ S        if(0 < length)) c( a. i2 U& d# f+ i" L* z# ^1 [
        {; p2 ~0 h  _9 X5 X6 I3 F+ F
            // 写一个字节到 THR5 U/ N9 w9 _+ M% C: d$ Y
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);4 N$ d( _; Z% W0 a3 |5 x4 J
            length--;1 a: k* P( r# N" d
            count++;+ d2 a/ z: T" n8 C
        }' G. g4 K" O8 J; \3 l& y9 I6 Y
        if(0 == length)
. b. k8 M4 g% L$ U1 \6 |        {2 w, ~' m. |1 r0 d$ ?" |4 e
            // 禁用发送中断
0 p6 k  C" s! ]- W            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
6 A6 b( ~/ ]+ d# `2 j: u) L        }/ S' P/ ?7 ?+ Z2 m
     }! A4 g& P. z2 a' j# }
4 k6 p0 z" s8 q' x9 w7 }( B4 I
    // 接收中断  q# G/ ?8 f5 C
    if(UART_INTID_RX_DATA == int_id)
7 I+ ^- w- c; @    {
1 W( k. E9 H5 N: `0 E; O6 }        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
% P3 r3 h9 N. X9 h  Y* O0 ?) R& u+ A* z( Y! C$ u  t; M
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
1 a6 H3 H4 c) m    }
) O( X! c3 c: H6 ~9 N* F+ K$ g- `, q7 k3 q! j
    // 接收错误" d0 K8 o0 A- e( a* {3 G. f+ L
    if(UART_INTID_RX_LINE_STAT == int_id)% d/ V# L$ D4 w& }, V
    {
7 w( R* x% Z, w/ m        while(UARTRxErrorGet(SOC_UART_2_REGS))
7 ~0 l7 N6 Y7 [3 z        {8 \. f' T5 h/ F) ]3 ^6 [
            // 从 RBR 读一个字节
. B# v! H2 w( |" t' q            UARTCharGetNonBlocking(SOC_UART_2_REGS);
$ Q' e6 V/ i) t1 r: C7 C- S        }
: A0 H" v0 V8 @2 \6 b& Q    }, z3 t7 O0 `1 {$ k
    : _! f8 t; g+ |9 x5 C5 y% w% X
    return;1 x6 |$ i( m4 r0 T' D
}
3 {, b4 {! R4 r. [
回复 支持 反对

使用道具 举报

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
' G, d) B& N5 w% B: z如果其它设备快速给你发送串口数据,你这边能正常通讯?

; ^9 a& z9 V, s" R, Z! a谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 07:30 , Processed in 0.041450 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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