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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5595|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。# G: a2 ^. I6 _7 f

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。. ]5 y5 |) ?0 L! H" _/ \) f$ U6 @: o& U

, J8 V+ [. E4 j$ U) f3 a, W8 `  o#include "TL138.h"                 // 创龙 TL138 开发板相关声明
1 o# f: s; k' ~: O' A8 w
9 X, @/ C; G1 ^: ]2 t#include "hw_types.h"               // 宏命令8 J1 C* v6 k: H( U
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器$ l  L- B% W* T* M& K* }
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器# E# i* o2 ^. Y' R

& G- A' L0 F1 A#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
& U0 A* X5 i% P& I" o% O#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
3 T7 k! g- i  {, w/ U: }#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
$ x. C) ^( [7 E- K7 {#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义" o5 R7 A1 W* N1 Y5 x) Q  m1 |
2 ]2 b) g. A' m/ G/ t* A  K
/****************************************************************************/
( B$ x& Y% s+ r* ?3 A" U8 h" b/*                                                                          */: C/ A: K( @& G: v$ X
/*              宏定义                                                      */. m# [9 c: G& o" ^% j5 T( l
/*                                                                          */; a7 r: S* M/ y+ h
/****************************************************************************/
* J) s8 n3 h8 H  _  r1 [& a$ V// 时钟0 Q9 A0 {1 m8 C% t  x
#define SYSCLK_1_FREQ     (456000000)
. T8 i/ U5 `/ U% g  W, d#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
/ r: N+ }+ ]8 @. {#define UART_2_FREQ       (SYSCLK_2_FREQ)
, W) D2 |) G" r9 P7 @7 C( M7 p. Z4 K$ v- ]/ `
/****************************************************************************/5 Y' n3 b8 m. N6 r0 e
/*                                                                          */8 P. Q7 p# @. z
/*              全局变量                                                    *// t: P& I; P0 a4 w# i4 |1 m; T
/*                                                                          */
0 o" {& \% M! k" G- [. }, u5 |/****************************************************************************/
- |; \  v# k* b2 s# \! u0 l3 R" j* Bchar txArray[] = "Tronlong UART2 Application......\n\r";! H4 s; x: H7 A" m- M$ u+ `

+ Z7 ~. ~" W/ s$ F# z" s0 U9 |: q/****************************************************************************/
2 D. Y+ X" E) l3 J/*                                                                          */, |+ U% ]' ^2 f; F% d' I
/*              函数声明                                                    */
& k# d; d; S6 |/*                                                                          */0 _/ x- P  s% R; _
/****************************************************************************/- ?( p% j* {7 u& h8 z  [
// 外设使能配置4 N' k7 N; h% k) l6 X& A
void PSCInit(void);
, H1 O0 T& `" T
; T  G2 y% ?4 t, L7 Q// GPIO 管脚复用配置
* d$ B  `2 i5 F( K& Q* nvoid GPIOBankPinMuxSet();
$ e5 A4 `1 [& f- ^2 \- o" L; z  Y* h# m0 S
// UART 初始化
" S3 A* @/ h+ C  @! F( N" w2 |void UARTInit(void);! r: J, D8 V! b2 S9 B$ P; b
// ARM 中断初始化1 l) `- f/ i- \6 Y7 u: p- \
void InterruptInit(void);
: L% X/ `) J9 [! m- k, H; g. o3 s// UART 中断初始化8 E9 |9 }, ?* T/ g
void UARTInterruptInit();
  A" c6 W- f% |; E; g, w// UART 中断服务函数5 n6 p  B: Y2 r
void UARTIsr(void);3 {# [8 \& n' {7 l- J5 [7 t

0 g" f" w: m. y* |; {& f6 [  [9 L/****************************************************************************/
! K0 v8 F, Y# `9 Y2 B! ?) B/*                                                                          */$ h$ X0 r- H+ j/ ~  W) z
/*              主函数                                                      */* B9 v( H  t4 o( C9 B
/*                                                                          */
; B2 ]$ C# ~" Q" Y; t2 ]& ~  W8 y/****************************************************************************/
- K: s& R: V- aint main(void)+ f3 P, W2 a$ c
{9 }4 b5 A8 B! E" [
        // 外设使能配置" ^& Q2 e) }! Z
        PSCInit();, A* Q4 ~% c. \$ I
       
5 ], p+ `8 z; t9 y, ~2 g        // GPIO 管脚复用配置: O$ V1 [$ v4 _+ g+ @9 ?$ V. d7 v
        GPIOBankPinMuxSet();
  P6 ^+ ?' K8 |) U, `+ B1 F- A: ]; j
        // ARM 中断初始化7 P1 s% r  i2 ?0 h1 f
        InterruptInit();
- B' m8 g- ^! ?7 _/ l
7 G, S% e% x' r, |        // UART 初始化
0 S; J" X! u; s8 A1 W        UARTInit();& Y0 Z; B  N# y* A) S

6 `* j% E* K6 u- C% `        // UART 中断初始化+ g: \/ f* b' O) h. ]
        UARTInterruptInit();- z* D& G# g0 J- B0 B1 L4 o
" C" C! H8 Q4 C$ _6 k+ K7 [
        // 主循环
: m9 j7 _+ M% L        for(;;)
- r0 t" k& R& n  [% I4 f: o        {
5 \6 a6 z- C$ `: D7 V2 E5 e6 M! I
        }0 Z; J4 ^4 A4 {5 @- Q
}
% }/ J' q1 L* r# e5 j) \) a0 V/ Q) |$ _4 v0 B! Y) P7 q0 |8 B
/****************************************************************************/
2 F- A/ i- A, l- L* t% j/*                                                                          */
0 V# h6 B1 F) K7 n( a3 }; F/*              PSC 初始化                                                  */
4 q  @/ s* ~0 k% ~" W# M/*                                                                          */' Q' X3 b9 M# [4 Y' I
/****************************************************************************/9 J- f6 M6 e/ c, f
void PSCInit(void)
( x% r0 P* k2 U9 T0 A{
7 D7 ?2 B3 S; S- j; D! ^3 a        // 对相应外设模块的使能也可以在 BootLoader 中完成
% \& L0 x% K4 P  z0 o    // 使能 UART2 模块7 {# K& e$ w* L. P7 Y7 h
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
5 x  j' `" b6 ^! u}
" {. `% C% F( h4 @; y+ M) }2 p8 x; x* |# C5 N  [
/****************************************************************************/+ f3 d, d7 s, I: `4 C( W
/*                                                                          */: H& [/ j. m0 x
/*              GPIO 管脚复用配置                                           */. E+ @* b7 C! u+ Q! [, V' q
/*                                                                          */
  e$ _1 U4 K0 g4 x5 T/****************************************************************************// u$ p! w# t% j
void GPIOBankPinMuxSet(void)
+ w* k# r& }! s5 l; R, V  G! n{' R9 n# ^& e( t7 x" m( V4 J
        // UART2 禁用流控8 k  b3 f  T/ @$ e
        UARTPinMuxSetup(2, FALSE);
% u+ H$ N- s; e& C' M}' \( O* F( S0 n7 a
) q! `5 q5 y( i  E5 a. s; X  F$ T
/****************************************************************************/
; @% _: p# T2 x5 G0 R! f3 q' k$ v/*                                                                          */
; E) P0 c' A0 q+ _) f( R* H4 C/*              ARM 中断初始化                                              */& {  d6 J+ R* n. S7 l
/*                                                                          */$ `5 j2 Y6 i/ {$ H# p
/****************************************************************************/9 g" I* A6 }% Z! b7 B: S
void InterruptInit(void)
7 B, G+ Y* T9 N4 N4 r. }{
5 L0 u4 @7 w5 W" p  d+ @& {    // 初始化 ARM 中断控制器* N3 S& L7 ^, B; l& \; v7 m+ D
    IntAINTCInit();
+ G8 S; }% b1 ]: v5 {5 J; j/ m+ @4 ?- X2 v; `* b
    // 使能 IRQ(CPSR); [) x9 V; y: y
    IntMasterIRQEnable();
7 t$ V5 v6 s! ^2 V4 r: h( e: h
1 i% \6 l% T- K    // 使能中断(AINTC GER); u& J7 E3 ^" T; |# \& ^2 z
    IntGlobalEnable();
. u/ `: |) i8 h+ \, R& F* N- C& X. f% K3 |: s
    // 使能中断(AINTC HIER)( L6 v. |% |- ^* c2 H' F8 D- x( x, w
    IntIRQEnable();
8 \' H7 P8 ?9 _1 P}- ~" s# x) m8 c" v  ]" ~8 T/ Z
/ F. ?1 K0 G( Q& n. h. D
/****************************************************************************/
- S7 p7 ?- ~" M$ U% {7 Z3 y/*                                                                          */
# d) P. U* T; R6 C; A' C/*              UART 初始化                                                 */# N3 f! `2 z- L4 d1 L) c
/*                                                                          */
# M; E' ]. h! {% G/****************************************************************************/
3 ~9 m# R- F# [7 C3 e3 ivoid UARTInit(void)
# H, f' `7 j! o9 d  z  ^( E{
. t. p7 K( P5 b- g, K        // 配置 UART2 参数, p9 s, B5 v8 B
        // 波特率 115200 数据位 8 停止位 1 无校验位
% u+ V+ H0 f& L6 J2 X    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,9 |8 a* G; |9 ]2 A6 m( _4 x: X
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);5 S  a4 ?# x  v- a
        // 使能 UART2
( o. h, [! B' h8 \6 `! U        UARTEnable(SOC_UART_2_REGS);9 \- f( ?* f7 a) c6 Y! E

7 \' j$ n6 x! M4 h) u5 [    // 使能接收 / 发送 FIFO
* v" p* ?5 [* V; [/ z! S    UARTFIFOEnable(SOC_UART_2_REGS);
& R' t5 p6 T  Y9 w; b: a
! o" B( q/ S6 z$ f+ ^) t, f7 V    // 设置 FIFO 级别
; |  Z7 B& g3 }0 E7 v" z6 q    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
7 }6 f3 I( p# z! n" B; q}8 G* R* M4 V! E7 x# d
5 O; T# O# Z  k' {1 s& f, a
/****************************************************************************/% E8 o' B; e' W5 D5 e
/*                                                                          */7 U: O) D2 ^# b3 @" e
/*              UART 中断初始化                                             */" K+ |6 K1 Q6 ~0 U6 F
/*                                                                          */
; y# ]7 j( U5 A9 f! [9 k" q" m! \( ?/****************************************************************************/
  d/ l+ a* {. z) U" T/ M3 S# E1 gvoid UARTInterruptInit(void)
" ]4 a" G" E! T5 ~0 x% ?# }{
: A& G5 j5 y% f. F8 w! R+ z        IntRegister(SYS_INT_UARTINT2, UARTIsr);
" E7 _3 x! _! S: f8 |! N        IntChannelSet(SYS_INT_UARTINT2, 2);
3 W9 c! Y& G0 S' S8 N        IntSystemEnable(SYS_INT_UARTINT2);% m. o9 ~# L1 r. k
* a8 G- [2 [' b0 z+ x6 r- p5 R
        // 使能中断
+ ~5 w3 s. l2 v6 e5 X/ I8 E        unsigned int intFlags = 0;
. j* R, S+ D  A! V5 K/ j% S    intFlags |= (UART_INT_LINE_STAT  |  \2 L. o# e* A5 N0 N' N
                 UART_INT_TX_EMPTY |    \$ b: e( w0 }' o2 ?
                 UART_INT_RXDATA_CTI);
( H/ }& ?( U8 H7 ^! d    UARTIntEnable(SOC_UART_2_REGS, intFlags);
- e, i* z  B( e$ C}
% j' e" R6 N: f# L
' z3 V! i" w* ?& }* @$ ]/****************************************************************************/
. v" M, L$ n; m$ Q1 E, L+ m  ]/*                                                                          */6 ?* J5 r# c- V+ W! n
/*              UART 中断服务函数                                           */
$ S4 O) u' |& @4 u2 x6 b6 U: m/*                                                                          */
0 Q1 ^9 W/ I: C9 I1 I) v5 }/****************************************************************************/% Z$ g+ `  x: E; T6 L7 D; }( l" }
void UARTIsr()
7 p  B7 `; R! Q0 W" u{# ^* x& f$ u& c8 _3 H4 E
    static unsigned int length = sizeof(txArray);- `2 |6 h" ]# T) p! T' K) {+ h
    static unsigned int count = 0;1 h0 s7 Y5 F7 D; S2 q% [
    unsigned char rxData = 0;
2 f- v# Y6 X  Q7 k* R3 v; b, j    unsigned int int_id = 0;
0 Z; z0 |5 Z7 x8 A: C0 Q
( r" A8 t4 A. d: q+ c1 ]8 i    // 确定中断源
% \  o% ]- [; Q5 d- r) e5 B" I    int_id = UARTIntStatus(SOC_UART_2_REGS);! t9 j& T5 v* I2 _
: l# Z5 v! R- H' a
    // 清除 UART2 系统中断3 E3 u, p7 V! A% g+ Q8 \% \0 E
    IntSystemStatusClear(SYS_INT_UARTINT2);
- Y0 E8 r$ g* |# \5 M6 d2 s/ D- ?! |4 @, j
    // 发送中断
* `7 g2 S$ N5 b0 z) o, D! g2 A" d    if(UART_INTID_TX_EMPTY == int_id)
% X6 A7 X* L# K. k    {
! p2 z( F3 O* u! q& _: Q        if(0 < length)
6 D; \, ~  i! O4 x; J% I        {
; u" H$ k4 j! U1 o3 c- S$ F            // 写一个字节到 THR, B9 `  r1 @! {# }& ?/ v9 P4 u
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);, x& M5 f0 M( ^( ~6 \
            length--;3 M4 c. w, G" O1 k  S* V
            count++;
3 z$ z" W7 B" K1 U        }
" G' c2 @% d  Y2 c0 P        if(0 == length)8 B7 O  ?- a  a% l/ ~
        {( l- ^! a) T. s. Q
            // 禁用发送中断
& h- _+ i8 v: n! A) {2 I$ c            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
$ q9 d: m+ T% a" S- T        }- T  U/ m# N# [9 S8 W3 s/ y7 D; G
     }
- N, x% Q$ e& a+ M; E  L' B+ @  t3 l  J
    // 接收中断
* t1 [$ ~, T9 f5 p/ Q    if(UART_INTID_RX_DATA == int_id)0 ]: F$ A6 J" E1 N
    {
0 j, O  j! A9 m  h        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
- x+ `4 B3 X! q* @8 x; S1 n& {! w. y  D2 X" p" v4 s2 h
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
& t8 o2 T" z: B1 ~* E    }
% B0 e( X$ C9 X9 L" d
' n" s- z: ]9 i' |$ w9 p    // 接收错误2 ^' R5 _& u# g5 l% R+ v; ~/ u- ]
    if(UART_INTID_RX_LINE_STAT == int_id)
; x5 _, g8 R' v( _: V    {& @0 Q9 Y4 ~" i$ W6 g* |# n
        while(UARTRxErrorGet(SOC_UART_2_REGS))) n$ m! U' m9 T& b6 Y
        {
, w6 A3 V9 E; i6 ]* b: _            // 从 RBR 读一个字节# ~1 k  v* b) i$ r. z/ Z: S  N
            UARTCharGetNonBlocking(SOC_UART_2_REGS);. L! @! ]) v+ `, L
        }4 a4 Z- a: m& D: ~7 x. T% R
    }
) D: K$ v& Y0 u3 }% O) d' v/ k   
, a  e+ g% s. R4 n6 q    return;: Q0 O* f' {; h, |
}
# F' ^6 L0 ?8 C" v% 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
* e6 h' _' _/ H7 y如果其它设备快速给你发送串口数据,你这边能正常通讯?

. O+ X( |7 v- r谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 06:10 , Processed in 0.040173 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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