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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7347|回复: 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: `2 H4 H- F0 @, Y$ k

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

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

8 ^  N8 A0 U/ t5 D& r- M) [" b#include "TL138.h"                 // 创龙 TL138 开发板相关声明
& s" O1 i) _" {7 |! K3 U5 s* g+ b5 Y$ [# i9 H4 D1 |
#include "hw_types.h"               // 宏命令+ X* \  V( N& q5 \* ?3 n  g1 P! A  f# I
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
9 j1 W) s( I- ]  z& w8 U" I1 Q! i  D#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器' Q* W! t+ j" j9 R
! `( C' H+ m) ~0 ]) z. K
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
( K/ R6 e7 C( M" N2 H2 e#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
) |, M1 t( _5 G0 J. ]#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
3 b' q4 I, m9 a1 X' |#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义2 |3 W- I" D1 d9 p' R9 O5 |0 a

' I, c- }$ L* U) X5 h& ~/****************************************************************************/
' b5 b4 u5 ~- l2 a. [/*                                                                          */
8 [$ y; i$ w. U9 C8 C6 S/*              宏定义                                                      */  M$ A1 w5 m% u, i
/*                                                                          */
: W, M6 ~! ?) \  m/ y1 B/****************************************************************************/) k2 z6 {) }/ s2 z7 n
// 时钟0 k4 j( ?7 A" C( a! B" `; }
#define SYSCLK_1_FREQ     (456000000)
" d" d$ e+ A& p% r- [( V#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
; w1 y1 C" e+ V! d2 A#define UART_2_FREQ       (SYSCLK_2_FREQ)! G4 j4 b8 h" K1 F5 q8 g+ ?0 j

! P: Z9 S3 x: r/ X* p+ E) J/****************************************************************************/
/ T% K( @- I& B& g) S2 h/*                                                                          */
7 Z( i$ c  C# Q/*              全局变量                                                    */
% ^. ]3 z  A& [, I( I, ?( B/*                                                                          */& B8 y0 {! o9 f( O0 ]6 q6 ?  w
/****************************************************************************/
0 {, y0 Y4 W8 x- i2 \7 V& Jchar txArray[] = "Tronlong UART2 Application......\n\r";; D; D! n5 f" V( G# U. J

# P3 R- g- ?- I) \5 g( K* r/****************************************************************************/7 z0 s3 w0 C* l, a* h* o4 x
/*                                                                          */  ]$ V0 K7 P! y! n0 l# j4 f5 @4 D
/*              函数声明                                                    */
! O5 B2 l1 S) Q7 ~/*                                                                          */# x; ?9 p" T* l5 X9 O
/****************************************************************************/$ S* f2 d3 ]& W; m
// 外设使能配置
; N/ w6 j; E$ v' `. a7 s8 J* Rvoid PSCInit(void);
6 d5 A+ r! G1 N7 Y) K4 i" v4 V
. z# k7 `5 r0 w* [0 Y/ ?// GPIO 管脚复用配置/ x' n* q# G8 g8 Z  Y" q& Q8 r
void GPIOBankPinMuxSet();
4 X, ~: E) m* s- S
* x, B/ M1 n0 h" u( @1 I! H// UART 初始化1 E/ a3 D  J) _0 Z" A) g3 q
void UARTInit(void);- X( c. w; a+ y( B
// ARM 中断初始化
- \! B, ~: W5 K" x0 Bvoid InterruptInit(void);( N* h9 a& Z3 p2 W- _( \" S8 R
// UART 中断初始化
* b! q* ^/ j0 ~/ O# g+ i  gvoid UARTInterruptInit();  [/ z: I! W- Z7 K" ?
// UART 中断服务函数9 E& o) h/ ]" J
void UARTIsr(void);' F9 `' [6 C& P9 [
! ]! P. U; Z1 n
/****************************************************************************/
( ]0 P0 w- e/ e9 F9 n/*                                                                          */. P; k' o! o2 y7 J
/*              主函数                                                      */. I) n* }7 B6 x0 c1 V6 @
/*                                                                          *// ]6 K8 S9 G; U4 f# U
/****************************************************************************/7 t1 T! i% c  [9 n! ]8 I
int main(void)
' B& v( s. U' N" E7 W! Z4 d{
% j: U6 c9 h5 |3 ?        // 外设使能配置# h! E: s! k. v8 V# W7 g% m
        PSCInit();
% Y- P: ^; h) p5 \       
! r' }- v/ b% I) K" N! P        // GPIO 管脚复用配置2 }& G' _( d* \& z; W
        GPIOBankPinMuxSet();
* C, z& y1 i4 @3 Q. D* f0 S- u5 H
9 b0 @5 n# M, t        // ARM 中断初始化: p5 c$ W; w8 N0 z$ B# S
        InterruptInit();
" k" E6 S8 V9 ~$ \8 t3 o9 k8 M) I
; @8 @, v* k; h! v0 S6 a        // UART 初始化% u9 T4 v9 B7 ^! h4 f$ i: ^
        UARTInit();
- e- B* a& D, j1 Q  Q+ M+ N: _2 O6 l2 y5 J7 L7 F- N
        // UART 中断初始化
3 G% L+ W$ p" P- k& T        UARTInterruptInit();: j4 k- d+ G; Y* J5 b8 [

( Q% p7 }  O) \: V% {4 l7 K        // 主循环" Z- l0 x$ p: e& M" R, x: _3 g/ f# _
        for(;;)
) {2 Z+ y6 {* F% A% H/ m* p2 z        {
$ W7 W9 |) c; O9 N; Q  g/ s) u) H5 W( |
        }' C- Z; s2 \6 N" X
}5 W9 Z4 y* r" e$ t
, m. ]+ W2 |. ^: N
/****************************************************************************/( W9 @  D+ x( `8 |
/*                                                                          *// r8 F  Q  S" o
/*              PSC 初始化                                                  */0 W1 w# |. F8 X' j$ e  [  G
/*                                                                          */' v  p( j' w" H2 v( g/ w
/****************************************************************************/
2 m7 @: g7 q8 {$ |9 E2 [" V: _void PSCInit(void)
; B; w+ s0 ?& P1 F& {3 h8 `5 _8 \{
6 h. E. Z) i( `  O# `7 M  w        // 对相应外设模块的使能也可以在 BootLoader 中完成
0 O% R9 Q* Q. a$ ~    // 使能 UART2 模块4 q$ t& V6 E/ p' c+ E% y1 C1 Z
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);  Z+ R$ E; ^/ k1 H% s* |2 H! R
}2 D: {4 U, Q/ G( g7 v5 Z5 F

/ \+ j) n! C% v; z( P" H/ Q7 G# N/****************************************************************************/
8 o. f, V7 ~% C. u1 Y" U6 w) u/*                                                                          */; Q. l! W: ^3 Z3 U5 ~# a
/*              GPIO 管脚复用配置                                           *// c# y) ?  s) q$ O" f, \$ q' C
/*                                                                          */: [, W7 S' T- x% K( r6 x' P
/****************************************************************************/, X3 \$ {# H5 Q
void GPIOBankPinMuxSet(void)( r) q& I% E4 V
{
. R% M% `+ E: s+ z2 D  t! U        // UART2 禁用流控% b! ?% ~- I/ z
        UARTPinMuxSetup(2, FALSE);
8 W  F4 S3 U5 B1 x- L9 o% S7 H}
6 c: e: L6 c; H9 a$ S5 {
' ?1 N& g# s- v# {# U" u* W/****************************************************************************/, T4 y* G$ S/ ~3 O* M% H
/*                                                                          */
1 ^: _) O  V3 V: C/*              ARM 中断初始化                                              */8 O# O' @/ r% h( N
/*                                                                          */
' Q. {" _. a8 x5 ~: a/****************************************************************************/
: B4 o2 p) c7 u) R8 G  S' {void InterruptInit(void). _' x( T* u# ^# C
{) e! F- U. A" N0 ?8 h0 h
    // 初始化 ARM 中断控制器- {$ G+ s% o; `
    IntAINTCInit();1 ?0 d5 E  Z* x; F
! c8 s4 J0 W  S2 b: |
    // 使能 IRQ(CPSR)8 L3 L# c$ S$ R
    IntMasterIRQEnable();; h2 w6 \2 v5 j& q* }: l# s
; O9 s* `* T" S2 j
    // 使能中断(AINTC GER)$ g5 `7 ^; c1 R& O4 R5 S+ O
    IntGlobalEnable();: g4 @+ @" D5 F' L& B

7 h" V8 M% w5 H    // 使能中断(AINTC HIER)
. ~$ E0 U$ r- i0 f) t0 c    IntIRQEnable();/ u# j# K; Q+ J7 r7 R$ D& c8 M
}/ V) z* Y; Y8 Q" R! K. e! f% _

6 Y0 ^* [$ P% q/ c6 q  W/****************************************************************************/. w' Z, s1 P4 P8 l; O
/*                                                                          */$ x* t+ W& P/ y7 s2 z7 Y  I; d
/*              UART 初始化                                                 */
& _. G. O8 Q0 m8 x/*                                                                          */' q4 C" T3 N/ V* I/ p& |0 g  n: h
/****************************************************************************// l) A3 r: Z; k: I: d
void UARTInit(void); Q) e4 B/ v1 P
{" |; w& ^- X" y7 R8 B: K
        // 配置 UART2 参数0 c) w2 x# F" b+ v- a/ o9 x; v' w
        // 波特率 115200 数据位 8 停止位 1 无校验位
. h" r: E! B3 i, @6 J* M    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,/ p. E0 d; F" w2 L& a, U+ g3 f# g4 K, h
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);. ^) T$ h2 ?, c
        // 使能 UART2) }: @2 U) `( }* E$ d
        UARTEnable(SOC_UART_2_REGS);8 ^; J" [- y1 ^" |) f6 F

# H; @' c/ r) o; [    // 使能接收 / 发送 FIFO
5 ?1 ^* u' G9 v4 ?5 v! K) B    UARTFIFOEnable(SOC_UART_2_REGS);$ v) l( y$ K9 [* D* B2 H
% x9 ?3 A+ ~4 [
    // 设置 FIFO 级别: _+ R  E' Q7 ]$ B
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
9 V/ d' f' V% a+ T}
) e6 I. c1 S  u# ^+ v& M) w. U5 y. v8 i" g* v( t$ z9 P. B' M- i
/****************************************************************************/+ ]9 d, B1 ]' x1 n
/*                                                                          */
8 W$ Y( s. h2 s: q) I/*              UART 中断初始化                                             */
* z1 K1 ?6 j2 k4 ]0 Q4 ]7 H$ O/*                                                                          */. K1 U% j5 `8 p) W. _
/****************************************************************************/
4 ?1 _3 ~! D" }3 ]void UARTInterruptInit(void)5 {9 \6 }0 Q; M! D! m2 ~2 j  w( U
{# y0 j' \9 v* N. a- r' {
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
! P* t+ f1 m4 i& s- Z% p        IntChannelSet(SYS_INT_UARTINT2, 2);
, v  b# r! p% c0 D1 ~2 J        IntSystemEnable(SYS_INT_UARTINT2);! `  s) g+ u' b0 y; `! F3 j" L
- e$ f7 g9 C' B2 J1 Y
        // 使能中断  E2 S- E! H' Q8 B
        unsigned int intFlags = 0;6 X+ G. I9 o- d- g' ]9 Q6 G" l& e( e
    intFlags |= (UART_INT_LINE_STAT  |  \( A/ S; h9 p  m; z, P9 s' k0 Z
                 UART_INT_TX_EMPTY |    \
$ @  `. b0 N" q, [8 s6 D! z                 UART_INT_RXDATA_CTI);' }; }; @( v' H/ C, `$ Y
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
& ~6 b* A( ^" p2 d2 g}6 m, F$ y- |8 c0 t5 }+ g$ Q$ e
. P" P! N7 b# K. G2 J9 V
/****************************************************************************/5 F3 y8 F6 c9 ]& H
/*                                                                          */# h  j/ C1 G, W% t
/*              UART 中断服务函数                                           */
6 p7 ^, U% Y( F; J+ d1 X/*                                                                          */
: P6 [3 i! o0 {+ Y: f; H% c* a/****************************************************************************/
' n( _5 [1 k9 |void UARTIsr()' G- s- ^3 H+ Z. R' N# J0 W
{
9 R/ b. C' p5 r+ D    static unsigned int length = sizeof(txArray);, a2 \  W( k  L5 O9 u; W, ^
    static unsigned int count = 0;
# y# Q7 l- l/ O    unsigned char rxData = 0;4 ?2 R1 w. m' U" `
    unsigned int int_id = 0;, u/ U) O" }2 }, ?% G2 {; L
# `6 T, Q& |2 S
    // 确定中断源
0 H$ T3 e8 w3 E& i# @    int_id = UARTIntStatus(SOC_UART_2_REGS);
/ e: N1 h8 N- s* z
3 |- ?0 p4 ^7 b6 y  G7 |    // 清除 UART2 系统中断  q! E$ z/ @6 P; d: k: |! B) {
    IntSystemStatusClear(SYS_INT_UARTINT2);
' i- ]" J3 [: w3 F5 f; Z
% _1 J& R; e& S! Y    // 发送中断
/ a( [) z; N' V6 c1 q6 D+ b) x: v5 Q    if(UART_INTID_TX_EMPTY == int_id)
, W7 z/ h3 a& ?' p) K3 @1 g7 S: k  L    {' D) R( w* Y, `% `# ]' {- I
        if(0 < length)
, O0 e' K' ]& [, p6 N        {! h7 |4 Q6 \$ O, l" n
            // 写一个字节到 THR( M* Z8 H9 B) U. F" }6 o
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
4 p0 B, A! ^, U2 [            length--;
7 E4 W/ @! R9 T) h8 M# b( i2 x0 x            count++;
6 F" |  ~- N* O, A: ?        }8 B+ B: e$ R  ?9 P  u0 I
        if(0 == length)9 g- ^9 t9 N; N. x
        {( }: k  M$ H/ V/ v
            // 禁用发送中断  m  ?) `( l. k' O1 a# U2 W; {
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
0 E! G+ h6 Q  g8 V) R8 V" H        }
! W5 z1 S: \# }. o2 L% C/ I/ ]9 J     }" M' @1 y6 E! q6 c
2 {- }! O6 D  y5 Y( f. K2 D
    // 接收中断& ~) }1 g7 E. q* ]( [* D6 H4 S
    if(UART_INTID_RX_DATA == int_id)
, c5 Q6 r; ?. {    {4 N1 _7 z  [: G/ _" J; d' r
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);+ Q/ ~7 z' k( E' \% e5 P& Y

7 B, a' F; d4 {) o1 _        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);, r, |: w/ \; A% Z3 }& P7 N
    }% v: C0 K& r# l' Y( Y

2 m9 \& O; x$ q6 m. u& ]    // 接收错误% T1 u; L" x7 e# i2 U# M  |" G2 ?
    if(UART_INTID_RX_LINE_STAT == int_id)
2 ~( i- _) }+ g4 k& B/ A( ?    {& `- x& D5 `$ l
        while(UARTRxErrorGet(SOC_UART_2_REGS))/ E3 q( K- q3 p
        {1 I4 ]- ~% [! ~5 G* G# _
            // 从 RBR 读一个字节. a4 A' `' [- ?! ]
            UARTCharGetNonBlocking(SOC_UART_2_REGS);4 d4 ^) R; Q6 q: A9 |2 _
        }& v6 N; s  x- T: q3 z4 i7 B: W
    }
5 ]7 ?: r7 Q% p3 T$ U   
, }$ Q$ |8 @1 v& N3 C* s/ W+ S    return;
! ?4 Z7 l6 {7 D+ w7 g}' j0 K& ^  x1 K" s- Y" _1 U( e
回复 支持 反对

使用道具 举报

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
1 {3 I& P; t1 B; w6 w, m如果其它设备快速给你发送串口数据,你这边能正常通讯?

" m& O1 N2 G% d* S) J& i: ?! P2 e- ^谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 02:04 , Processed in 0.044306 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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