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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5672|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
0 M8 B0 P; N& z; o, c7 f5 P

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。) ]7 t# p$ x& q2 G7 D

" Q; r) j5 O" i: G#include "TL138.h"                 // 创龙 TL138 开发板相关声明
2 S5 P: I$ g% {, A( b
3 T. p8 q+ S; E7 a9 M# W, b#include "hw_types.h"               // 宏命令! h& v+ S0 k3 s0 ]- t( T
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
9 D+ M* N- M2 m! Y#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
5 Y% S$ x4 `4 ~- e! p  h
6 A* W2 S+ @) ^+ k3 Q5 `8 s#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明$ H  \$ i& b# ^0 l3 r0 @8 U
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
% |) E) F" Y, b3 v' {1 J#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
. [) |/ Z! s7 x: x+ E) {#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义( [1 X* L. \( ]
" ^4 ]2 s( P3 i, Y+ e) @
/****************************************************************************/
$ `( h; g9 ~  o/*                                                                          */% ^, V: f& I9 l; ^- ?6 ]( i8 f
/*              宏定义                                                      */
1 @7 j+ R; r. g, n4 t% M/*                                                                          */
3 G8 C& V) Q+ A! v" d" \- b2 W/****************************************************************************/
% S! Q3 `, p  C0 H7 J# P* b// 时钟
2 R8 T" H1 d1 E9 f$ S# J5 e! R+ G#define SYSCLK_1_FREQ     (456000000)5 H0 ^' m8 X" K6 d% I8 I- o
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
& v( j2 {8 w6 K# p5 E8 x0 G#define UART_2_FREQ       (SYSCLK_2_FREQ)
* [/ u: B6 Z- Q9 z
2 q" R5 O# N+ z6 w9 ]/ ^6 b+ I, t/****************************************************************************/9 V& s9 C- x6 h! s4 n) O
/*                                                                          */3 |0 I5 q5 Q6 q4 c! M* b3 k
/*              全局变量                                                    */( F! E/ h: a& s4 y$ T" _
/*                                                                          */
6 S( A9 k7 h9 n) @* t/****************************************************************************/4 G+ u5 l. r, f5 ~
char txArray[] = "Tronlong UART2 Application......\n\r";0 a3 j( s4 @0 p0 E, d
; Y% \) f4 B1 X; Z+ I" b( X
/****************************************************************************/
. d) g5 Z1 x; z4 y3 S2 L( f/ E; P/*                                                                          */7 n1 p0 }# b/ j2 F8 S) u( N
/*              函数声明                                                    */# a' L: `6 \$ r/ x' g
/*                                                                          */& A# `7 }' @. p2 l8 a
/****************************************************************************/
, V2 F' b2 I* G0 c7 k// 外设使能配置
3 V1 n, m, W4 e) v/ p4 o) z6 N5 d4 N- cvoid PSCInit(void);
  v3 R2 f+ ]8 h
9 k2 L! N1 ]- K$ }- {0 T2 F// GPIO 管脚复用配置3 F! D5 [, w& F2 E$ R5 A* ^
void GPIOBankPinMuxSet();
- ]8 v) u. _! ]4 _$ }; x! `$ `
+ D# C5 `( y  M3 k// UART 初始化
- B& n- V8 f6 ~" L8 ^void UARTInit(void);% ]6 c6 M- `5 Y2 U" m9 L4 o" R
// ARM 中断初始化
& _% V' J* ^4 [* A4 ^6 E, Mvoid InterruptInit(void);
( X+ z' H; @4 M2 J0 A( K8 n// UART 中断初始化* W# T5 n: }. b4 @( n& k
void UARTInterruptInit();8 \; H# }9 X6 h( ]+ S
// UART 中断服务函数
4 X0 W  C& P% |$ R+ d6 Hvoid UARTIsr(void);
- f3 d. h/ j' |4 Y3 }  ]) m
$ ]/ j& h! i; a" F! J7 P/****************************************************************************/  J6 p" C+ |+ R3 Z) ?1 M
/*                                                                          */" n0 R2 @  V; q0 k
/*              主函数                                                      */: l7 B0 m( G! s) h, r! {2 |
/*                                                                          */
" \% m$ |! Q" T- o, U0 x- t" v6 v/****************************************************************************/
6 V0 l# |! Q+ Q, Aint main(void)9 r! E# J. r+ S! m/ `8 D
{9 ?4 X5 t. \  a
        // 外设使能配置, v# j) x" c! P2 T% Y4 t. g! v
        PSCInit();
: k- n$ w6 P3 m$ A) u' q        * n* @1 O( x' N
        // GPIO 管脚复用配置$ z: x7 |7 x2 B6 F
        GPIOBankPinMuxSet();
, X! N2 W; k3 T9 V  W9 K& S: [  H. p( _* G; C4 E/ |, o
        // ARM 中断初始化$ k* r/ p7 @8 L* W! ?
        InterruptInit();
- d  S* [( C8 M) N8 F. @6 g0 @, ?3 |
        // UART 初始化( T8 ?, A9 D2 l  S, q3 b4 N- h
        UARTInit();- W4 C; Y2 `6 H6 I

. o/ Z* e) L8 N% k        // UART 中断初始化
' w4 H- X* F5 c8 e+ g8 ?9 `        UARTInterruptInit();8 X: H$ f! d/ y1 Z; R

, z* t) Z' P/ v8 v: K# e  A        // 主循环2 D" q1 O9 C( \' J5 }
        for(;;)( _: S: X/ P3 b3 R* {
        {2 R+ I$ p8 t# g: x- I/ ?

5 M( W/ o, o& O8 p        }
) Q1 ]0 ~: W+ ~( a! z}3 N+ ?  P' c! Y' n$ f; I5 I; {/ X
% ?- X! q6 N( l+ i" Z5 D2 W5 b
/****************************************************************************/
) I, e$ R; l( P3 r0 V& b# q/*                                                                          */
3 p" ?, u4 t. r4 C/*              PSC 初始化                                                  */
' e; \# |. y( T- B& y/*                                                                          */
4 X7 K: G) D. e7 T% Q1 f/****************************************************************************/( ^3 B5 k8 ]% u6 b0 v
void PSCInit(void)
, x- G( R8 p+ C, t{
( j' ^# g8 {5 L7 V7 Z. V2 {        // 对相应外设模块的使能也可以在 BootLoader 中完成
3 h$ U, z' T# S    // 使能 UART2 模块5 j4 C% k7 G; V6 p( l. O7 T
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);1 Z/ f/ o) S  R3 b. _
}; W0 q5 L7 M- a' ~! p+ H& J

" U: |, U& P4 L/****************************************************************************// a. C0 H) V  ~% {& Q
/*                                                                          */9 m9 g1 D6 z* s4 N) h- x3 @8 G- F) m
/*              GPIO 管脚复用配置                                           */3 i& w: c/ o* e7 ]# |
/*                                                                          */
- o9 h/ B/ ?. j! t" E/****************************************************************************/
; B& I8 f' ?7 ^) ^# @1 D1 [6 {void GPIOBankPinMuxSet(void)
1 v: r! r- j$ k4 P9 ^{
% Y: O7 g, K8 t7 V' r4 l        // UART2 禁用流控9 o( S, B8 W0 B, p6 I
        UARTPinMuxSetup(2, FALSE);
# b- c2 g9 m0 \& i}+ _9 V8 E3 q5 |2 q: K
, {# t) ^. |  ~# O( g% g
/****************************************************************************/2 q, z! T$ |: Q7 U7 H
/*                                                                          */3 @5 {- E2 O) V0 E6 m) R
/*              ARM 中断初始化                                              */
3 \9 @+ i# f5 S) C6 _6 @/*                                                                          */
2 M+ [! k8 H7 F& `1 `# m: \' ?/****************************************************************************/
- A( X9 D5 B& u: e( @2 [void InterruptInit(void)+ l9 T0 }* }& s# K/ R4 g
{
: g$ y( H" N+ p! R) ]    // 初始化 ARM 中断控制器
" B* R4 E* }0 M/ ?) i0 m    IntAINTCInit();( N" g& T  S( f/ n; H/ w
* }# ~7 v6 T7 E  A
    // 使能 IRQ(CPSR)# `4 k5 G" ?9 }3 e. \' E6 Q' _7 G7 F
    IntMasterIRQEnable();
5 r, x$ K% q! v5 H: g* F2 M
( `8 u" B# [; P7 J$ F! C! K5 P& X    // 使能中断(AINTC GER)
3 o" S2 |  S1 b. O- a4 U    IntGlobalEnable();
9 c9 A0 f; g" G
7 C' t' c1 @1 m+ c1 o: r    // 使能中断(AINTC HIER)) s% Z# v! @8 u8 A: G1 ^
    IntIRQEnable();/ r  C6 m. b7 A% t
}
9 h1 n$ _! U8 Z# p! m. {7 _6 u& c4 O7 f* I1 I( s% ]6 ]
/****************************************************************************/* u) I) c* S5 D4 y
/*                                                                          */
* w4 r! f" f. ~8 h. A6 B4 Z/*              UART 初始化                                                 */. G. K. g: y: _. z9 l4 g' _: ]
/*                                                                          */
5 Y) y8 ~  F) V: D+ u. {" i/****************************************************************************/
5 B6 n: x; ^, f6 {void UARTInit(void)
2 O8 w* b# n3 h" \  C{8 O7 S8 Z* L) X$ x' M
        // 配置 UART2 参数
" R+ c, J" K0 X" j        // 波特率 115200 数据位 8 停止位 1 无校验位4 F2 f# X0 y; A+ S% Z% w* L
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
+ k# [' s$ n. M# o7 I+ c; H# R                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
- T: n6 @6 j2 x  f1 b1 l        // 使能 UART2  W" e3 k% w: M# R/ f! k8 E, Q
        UARTEnable(SOC_UART_2_REGS);' u' Y/ f  |- M- `
1 E# u  M0 N1 o" Z
    // 使能接收 / 发送 FIFO
0 W( b  I! d0 A7 y    UARTFIFOEnable(SOC_UART_2_REGS);  A$ J4 Z3 R$ p+ p# g8 `7 C5 p
; l7 S& @% g& q/ _$ L0 ]
    // 设置 FIFO 级别- h  ?) p  n- p' q
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);5 z# C( e1 Z* A' T1 |
}
$ v  E4 d; v3 j3 @2 Z8 }; R4 i' Z, c, V2 H
/****************************************************************************/
) Q! V9 l/ x& P6 l* ^: U8 r/*                                                                          */+ q) g; E' K% t3 E. Y1 N+ p7 a3 ^
/*              UART 中断初始化                                             */. J1 p! |$ o  X1 D/ s! k8 m
/*                                                                          */( J! H: v- D  U
/****************************************************************************/7 U+ _$ d! Q7 k6 h! C
void UARTInterruptInit(void)- E  b  P) F2 B1 B3 o1 p) X
{
! `) z5 i) e' y2 \        IntRegister(SYS_INT_UARTINT2, UARTIsr);6 k4 e' P6 v0 P# E1 M5 J
        IntChannelSet(SYS_INT_UARTINT2, 2);7 S6 [: T! @$ L
        IntSystemEnable(SYS_INT_UARTINT2);
7 V9 S5 ?/ \# }: o: @- s2 [9 m# E8 _" k( V+ I5 q+ g; ]
        // 使能中断
- s7 w1 a) }& t1 E' [, G! Q& R        unsigned int intFlags = 0;$ v  F+ U% a2 C3 C
    intFlags |= (UART_INT_LINE_STAT  |  \9 h) c/ G& M8 V5 ~  I0 \- C" e
                 UART_INT_TX_EMPTY |    \; p. s* j/ t1 s( `8 F8 A- J( y- f
                 UART_INT_RXDATA_CTI);
  p+ y  D6 V0 S+ N7 Q% L5 h1 ?# Z    UARTIntEnable(SOC_UART_2_REGS, intFlags);
, A  Z9 N9 R, A) G: }) q}7 {* O" Z  [6 M
8 q* ^3 O% @4 L6 _
/****************************************************************************/& M" a) ~, R& t/ |5 _3 B  T  y% R
/*                                                                          */  @) n  z, r) c9 {/ Z: C" p
/*              UART 中断服务函数                                           */
! Y1 }$ u$ H0 F" a1 v4 \% f2 W. Z7 z/*                                                                          */: g2 h' h! n# e9 v2 c  V
/****************************************************************************/+ `# p( L) b5 C0 E& j1 }  c
void UARTIsr()! P* L* q6 i+ G, Z4 `  f( k  V) I
{  N; V3 x- A- O9 K% G, R8 O0 M
    static unsigned int length = sizeof(txArray);
  ^# e4 ?0 R! A% |2 p    static unsigned int count = 0;
( l4 [3 K$ b5 P% P, _/ m    unsigned char rxData = 0;( o# r& G8 n, U2 k, W  @
    unsigned int int_id = 0;
$ X6 ]! _$ T$ |
: L' H; [0 r% ~" T7 l/ @1 C/ I    // 确定中断源3 _2 u( O4 q* u
    int_id = UARTIntStatus(SOC_UART_2_REGS);5 J* t5 q; S/ |: F; ~' |
! G* B/ h. `: e
    // 清除 UART2 系统中断
9 O- B, Q+ A' S; V: g1 u    IntSystemStatusClear(SYS_INT_UARTINT2);! ?# c- N5 j! ?! ?8 ]# j
/ j3 d# c, {, t
    // 发送中断% |- l0 K# q# x  c6 f
    if(UART_INTID_TX_EMPTY == int_id)& |4 i) w( t- @/ H& X/ g3 t5 a; W, `! w
    {
+ L0 X$ f0 J5 k  s0 u! ]) g" d  D        if(0 < length)* Z$ a6 u8 r7 z$ E
        {
0 j( j, Z4 J: p: o7 d, f4 O            // 写一个字节到 THR
2 l* T7 V; m* K; j+ A            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);9 D- v% F0 r8 R8 x3 t% c3 ]
            length--;
. `$ Y1 P0 M: r! `7 b, X+ k/ k            count++;
" e7 H/ a& m2 Y, I0 ?3 L        }* D/ Y) z+ T+ X& L& G+ f
        if(0 == length)
) R8 B, }1 u1 d; K$ b        {+ I4 J% i$ E) O! D& m9 z& K
            // 禁用发送中断
  W1 l  Y2 b: R# {- C" d            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);) P$ [& _: {% L& i! |! a0 b
        }$ W3 R1 W/ l( v1 N) t3 U
     }* f- V! t& i  ~& H

: q& h7 S5 D" Y9 U! U; c$ c# [. c    // 接收中断/ m7 }* [# z0 `; ]
    if(UART_INTID_RX_DATA == int_id)
( l& ~) m* t0 Z# G. }8 t( r    {* A% c9 v8 L% e2 [5 U3 P
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
: v) G/ H+ k' C* C& V2 }/ ]; T0 I2 W* P
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);- z% C5 o# W: f! a! K: E
    }
2 Y, A" p2 L9 c; s2 l) P! b6 S+ x# r+ m# w
    // 接收错误
: i/ H$ j* H- g    if(UART_INTID_RX_LINE_STAT == int_id)
1 _, N3 p3 I( f; w    {0 m4 L! x; S: y  s" {8 Z
        while(UARTRxErrorGet(SOC_UART_2_REGS))
4 M! |4 s) H5 E$ X1 {6 y% W        {, a5 V! E  @$ J( [3 _
            // 从 RBR 读一个字节
- ~( S0 L* D. j4 y            UARTCharGetNonBlocking(SOC_UART_2_REGS);2 x5 U4 E3 n- b4 ~1 O
        }  z$ f* X3 z7 V% Z% I
    }$ u  d  v3 e: Q
    5 k& |6 Y. @9 I& r1 g4 B/ @
    return;2 V" Y. L/ Y) T$ D. c
}
2 Y, I7 o5 c$ g: W/ i) A: A
回复 支持 反对

使用道具 举报

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% o& @- _$ {8 @/ N$ L
如果其它设备快速给你发送串口数据,你这边能正常通讯?
: k- s, A& O- N3 ~0 T
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-29 13:47 , Processed in 0.042273 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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