串口发送中断触发条件 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8705|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。- m- g  r* d% r: T  h

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。' a- |, s$ v% d& ^, h  n

- O3 N5 A. h+ n& s#include "TL138.h"                 // 创龙 TL138 开发板相关声明; F9 ]# {7 K: Q& d& Z0 j4 ?: R/ R* I

0 ]& w; t, X8 q7 V#include "hw_types.h"               // 宏命令
* O5 {1 A, [, k% U' U#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
- ?! {6 i/ T: k9 `4 Z( f. g#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器* M8 e/ u! K! T' y6 k/ H8 c! d
/ o4 V8 F" b4 f) M; \8 W$ m
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明1 C% v# S' F6 s# s( |
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明! R! j. P$ g& R: D7 s! P# C
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明; y2 u# z6 J4 O& ~- ~5 M$ s
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义$ T) ?  N. U7 o# B
  P" ^! g, K# O* R% e- @
/****************************************************************************/. w- _( k& C" }  q* i. ^
/*                                                                          */8 I5 [! o2 J+ p; l$ ^, `
/*              宏定义                                                      */$ W- x) R5 U2 A
/*                                                                          */
( m, c) J0 s9 E) X* r/****************************************************************************/
8 S4 {& r" ^+ e: q) w! f$ E3 a1 ?// 时钟+ |0 t) Y+ b% z) L: w+ O
#define SYSCLK_1_FREQ     (456000000)( ]  u$ @. f$ p$ G% e# f& [
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
' R; d5 O# C! C+ e6 I0 }. o# p#define UART_2_FREQ       (SYSCLK_2_FREQ)1 U2 i6 t, ?3 ~8 M

! D7 R8 Z: p! V9 l) u$ F/****************************************************************************/$ |/ O' j0 y/ l+ o
/*                                                                          */0 E/ f0 v7 B- l$ N2 E  r& b) u
/*              全局变量                                                    */
7 @5 t% u% U2 ?$ O& X; Z% v" b/*                                                                          */& O* p. T4 ^# s+ |; i* n# B9 ~6 U
/****************************************************************************/9 r' Q. m. x' g2 A" x
char txArray[] = "Tronlong UART2 Application......\n\r";
; w. Y5 W9 a6 q1 ^8 Y$ O
% s- t9 P9 ]8 q/ ]* e& j/****************************************************************************/. A7 I% f1 T- s5 o2 s
/*                                                                          */
8 D; m+ v2 D0 D  O# y) L/*              函数声明                                                    */* ^8 L* p3 c1 L! r2 M1 m
/*                                                                          */0 [) ~2 K7 h. O  L
/****************************************************************************/# U: a$ [: {+ Q4 m0 M0 @
// 外设使能配置
0 `. ~8 f/ d' R9 Rvoid PSCInit(void);
; {6 W* w& V( P% e1 h( G7 E. Q; B0 }0 Q
// GPIO 管脚复用配置
$ _6 ]0 Z% L% ?$ x$ Mvoid GPIOBankPinMuxSet();
, b% _! H0 B! I8 y' k' `5 ]' n" O8 R, N* r( p) T5 Q/ o
// UART 初始化0 E& Y* O4 _0 @
void UARTInit(void);. `& D; i) E1 c0 a' q
// ARM 中断初始化# W. A- s% M5 I0 x- z& }
void InterruptInit(void);2 V7 J2 v( X1 ^$ t( c5 Q/ P; r: S
// UART 中断初始化% G( e2 u  W7 P) j/ A! j0 x" @
void UARTInterruptInit();, z" k) R0 A# ]  ^, n; Y( t9 S& _
// UART 中断服务函数' u4 _$ _% a2 F( B
void UARTIsr(void);
% i- R' X2 ]+ ?+ u. V8 l( n, S8 T% C9 ^' M4 F
/****************************************************************************/
3 |  e- w3 C  C) J8 q5 ~8 s1 o5 b/*                                                                          */
. z! |6 ~' M* D1 p9 a7 h$ ]/*              主函数                                                      */
5 b4 E4 s$ r5 a+ q& i' k/*                                                                          */
# q/ I" q# \# H6 {& Q/****************************************************************************/
& C, O3 w9 e+ p5 l' _int main(void)
* x5 L; }$ d/ ], y{/ p. }8 V2 J  _- y& n- m
        // 外设使能配置
4 S5 [+ A, V8 c* h& x5 ~# l        PSCInit();
: _* X+ I( d/ o3 d/ S- x- \        2 z# c* _5 ~- u8 G7 q  H
        // GPIO 管脚复用配置
5 [1 N% w+ p3 ]6 X, r, r  i        GPIOBankPinMuxSet();
7 r/ q- J7 p1 b$ v1 ]; ^, ]& k! E: I7 E( Z; U9 a, q0 Q$ h
        // ARM 中断初始化. E' b, d3 r& F+ @
        InterruptInit();: P) h. j+ B. G$ A7 Z

, q" A" T" |* W9 h  D        // UART 初始化7 B8 |' f, q  x; A+ ]4 d- L
        UARTInit();
0 H) _/ P, h$ L! S- |4 {- K( |# Y& _! U  e/ g
        // UART 中断初始化! b! ?- A5 I- i% @; q# [
        UARTInterruptInit();
4 J9 x1 G  G% p3 T0 h  P! ]: X: T' B$ B: }! J
        // 主循环
5 |6 ?9 l2 q: Y( s- x8 l        for(;;)% W; o7 c+ T) M0 {
        {, ]. F1 w. i3 n, V& v- Q

# v9 }$ h! Z  C0 U+ O        }
# E8 x" p) x% ?7 l) D  p0 n}, V8 B2 n5 D2 g9 A
% [4 J7 G8 k9 |1 r# v) p3 N. T
/****************************************************************************/6 h5 Y2 I7 q$ p1 v
/*                                                                          */. [8 @/ o7 Q  W( c' G; X
/*              PSC 初始化                                                  */: H  A- F, d$ y' s
/*                                                                          */# K: H! ~; Q* r2 w3 u; g( A" j
/****************************************************************************/& x* I# `- h8 u, g% S
void PSCInit(void)2 e( H* G- \+ x7 C# R
{# p, \! l( z" |5 p, `
        // 对相应外设模块的使能也可以在 BootLoader 中完成
9 b$ ~+ V/ W+ o% Y4 d& A    // 使能 UART2 模块$ m- I& U. U% _+ d; y0 I
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);0 K2 [+ B+ T/ g7 ~
}
( J( x& R9 l5 E8 A; v& b
  B/ p- C5 A8 Q/****************************************************************************/
) g! U/ b1 K$ {/*                                                                          */* Y  d, k/ a0 K' `! H
/*              GPIO 管脚复用配置                                           */) j5 f+ `* ]4 D# Y3 U
/*                                                                          */; A- }( A% W4 s1 O+ t8 ?  E
/****************************************************************************/
4 H/ C! ^; E* _9 Cvoid GPIOBankPinMuxSet(void)8 x3 r/ [5 U5 B8 ^. {3 g) H
{
9 J5 Y/ y& w/ S+ O9 v9 x( S8 I3 p! n        // UART2 禁用流控% U; T' J2 C& q+ I9 W
        UARTPinMuxSetup(2, FALSE);
) S2 _$ ?- H) J  `}
5 U6 e; O: N, J" Q/ R4 D
2 r' y/ j* l) w! F/ Z& j9 I/****************************************************************************/4 i: U7 f- A; R3 N% T; K& C
/*                                                                          */
; T# y0 W" }, C* T/*              ARM 中断初始化                                              */, B  y+ ^% ^: W( Y/ V, H. d/ T5 ]
/*                                                                          */0 a: Y  {: Y. S$ l
/****************************************************************************/# r; A8 v5 y$ D. ^* L2 G
void InterruptInit(void)/ A% C* [0 ]6 l5 G
{' [. \- Y1 h+ a3 w: O1 h( A
    // 初始化 ARM 中断控制器
) V/ T" @- X6 M  r    IntAINTCInit();3 y4 X% A0 F6 I/ C$ T( ?
0 t6 g7 g5 ?3 B9 ~9 A
    // 使能 IRQ(CPSR)3 h2 r9 J5 y% \- Z. Z- l; B
    IntMasterIRQEnable();) |+ ]5 b6 J0 i. Y5 m

7 @3 j& R( [. ^# s6 J8 [- l    // 使能中断(AINTC GER)
) q4 L& @- A+ P; k9 W; ]    IntGlobalEnable();
* I9 ?' v, i  w- e
) e# \2 j: l: i    // 使能中断(AINTC HIER)
4 I; [  r% M( H# m" n3 u: @    IntIRQEnable();
1 L4 g! s) S! H4 M, ~* n: v}# M5 l! Z, U& h- F# J
; j0 D7 v% G9 S" r
/****************************************************************************/' ~0 B  M! X( h  S* m" g
/*                                                                          */
' h( g5 c0 R- r, n% @  _( l/*              UART 初始化                                                 */; p. H1 ]+ B! A. L
/*                                                                          */
! ?/ w6 H2 e2 y) u$ y- R" n/****************************************************************************/
5 P& A( A. V, R! t% Xvoid UARTInit(void)
  r6 i( Y7 Z# U{
0 Y' O* F: d5 k        // 配置 UART2 参数( a( h- S5 w$ E. I% q
        // 波特率 115200 数据位 8 停止位 1 无校验位4 `/ R- z0 i$ ^' B& I
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,9 m: P* M2 _9 r6 U7 h% H' _! t
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);! v' X7 R8 u/ Q
        // 使能 UART2
6 ^& g  Z/ n/ y- L        UARTEnable(SOC_UART_2_REGS);1 h. a2 d- U7 L. U/ s$ {2 U  a

3 q; r2 }2 l  K    // 使能接收 / 发送 FIFO
' k8 l0 X7 ]3 s8 b/ b    UARTFIFOEnable(SOC_UART_2_REGS);6 t$ W, @% ?, y8 ?2 H/ O  j

, y1 B( C2 n- m. v+ o5 D    // 设置 FIFO 级别
" g& p  _4 @" [/ b, O% y    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);( ]( _0 b% _, H+ k9 F
}0 Z, \* ?1 p  b
, {( [" o4 Q5 z5 C. E( p$ o
/****************************************************************************/& K) h3 x- O6 M7 r  {* l- a
/*                                                                          */
# k4 q1 \' @3 n9 b/ L/*              UART 中断初始化                                             */
* H( c$ `. |$ s* E/*                                                                          */' e* h# J: h$ X$ }
/****************************************************************************/
9 \, b& ?, \  x) wvoid UARTInterruptInit(void)
! w, {' R9 g+ k$ `* V! z2 I. y{
/ d) \- Z+ g9 D2 u1 a        IntRegister(SYS_INT_UARTINT2, UARTIsr);
# \9 _, Z! `3 Z$ b        IntChannelSet(SYS_INT_UARTINT2, 2);
0 k: S- N+ h8 y) x! F        IntSystemEnable(SYS_INT_UARTINT2);# Q* _' K# V% M4 o9 i
4 B9 P9 I, s1 D$ X
        // 使能中断
) ^9 n2 ]9 x2 {. ~5 Q/ F7 D        unsigned int intFlags = 0;4 _6 ?+ Y" E" x7 Y6 j! ^1 W
    intFlags |= (UART_INT_LINE_STAT  |  \
  P  o3 E- a  w3 K. H/ V: |                 UART_INT_TX_EMPTY |    \1 P& y  t* N- L
                 UART_INT_RXDATA_CTI);. _% l* m4 k: g! q
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
/ w: K- p5 b6 f3 ]" G, o+ ^' i/ z, X}* q: Y- X2 U6 D7 t: c: C' Z% h, G

% r* @+ F+ E: z9 z+ h) g) E/ Q5 _& M/****************************************************************************/2 Z  V1 n; j* }( w9 ?* I8 p# L. q0 A
/*                                                                          */3 e5 y& v6 [; b) W
/*              UART 中断服务函数                                           */
% _$ j7 H2 n8 V) `; L+ b( U/*                                                                          */
3 S& c$ c. J& \/ W5 C& t/****************************************************************************/* w$ t- I. y+ d6 l, c
void UARTIsr()
  J3 S0 D' u- y$ y/ k- ]3 e/ |8 L{: o7 d+ ?9 X  ~) e/ L
    static unsigned int length = sizeof(txArray);
' d2 f7 M6 w; ~) q+ n0 v    static unsigned int count = 0;7 F% R$ E2 V$ Z1 a
    unsigned char rxData = 0;
" ~, v7 `4 k+ \1 o, }% X  O5 G1 `! n    unsigned int int_id = 0;
$ {: i8 I, m5 D! @1 Q+ R9 B+ Z0 O  P" s- F7 c; {2 u  x
    // 确定中断源
7 c, u! K4 C5 V1 W    int_id = UARTIntStatus(SOC_UART_2_REGS);6 j2 M/ ]1 b! C4 R2 p( }

' r0 v# N8 h! E+ ]: Y' q9 @    // 清除 UART2 系统中断5 O4 K+ ^1 i( i: i  X2 V2 o2 B
    IntSystemStatusClear(SYS_INT_UARTINT2);
) X( |' A+ E: x; R5 Y, W( @* O6 s- t) T4 @1 a  o' M! M) t
    // 发送中断7 O: p5 _; o6 u- S; v' N
    if(UART_INTID_TX_EMPTY == int_id)
; k2 x' {% s% r+ c( {. s3 a5 f1 i    {
5 s  `0 G5 M) Y, Z  X        if(0 < length)+ J: o2 N& j& f+ [4 m% H
        {2 m  G. M+ ]( W' t/ P+ S& @
            // 写一个字节到 THR. n6 f! R! J: Y$ e% ]3 t
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
3 I2 g1 |; S6 ^2 V9 [4 _7 p( Y, c0 v# ^            length--;# u4 b* R+ C* O, H6 f
            count++;0 M1 D9 ?$ b# \, c3 ~3 D: f' p
        }1 K, |7 x9 Z; `, x4 J- W0 r1 q; c  a
        if(0 == length)' D$ W" u6 j8 f; k' |
        {4 x8 Q) I5 B; `5 p. a" Y- d; }: R8 r
            // 禁用发送中断( ?, @4 H0 @' V  K: H" s: b' i
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
/ y! j, n$ Q" Z1 c* [* B        }
3 ]7 o' w5 v* I     }
! w5 |3 E& x" M( C! Y! t# p' }0 m
! d8 K6 q- @; b: y3 E9 \    // 接收中断* \$ w" n" i' B# G! d5 h* ]
    if(UART_INTID_RX_DATA == int_id)3 A" z" u. a; x2 w7 K6 i" T
    {  N5 v/ F. W; F1 o" v
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);* ?2 |( w# i; m

  b) W: e+ P" G6 I3 t        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
8 s% }4 e5 E( D" E) C1 A    }
0 ]* ]  ?- l9 a) a
( f$ h& ]" L" q+ v2 I8 P2 ?    // 接收错误% V. f+ y" V2 [+ B& b  G, B
    if(UART_INTID_RX_LINE_STAT == int_id)7 U* P% f9 q# {5 V  c+ x
    {5 e8 C" J% _  x$ U( R( t8 R
        while(UARTRxErrorGet(SOC_UART_2_REGS))
; ?' C% j  p+ }- O0 @        {
  S* a& \" K7 I8 `4 p            // 从 RBR 读一个字节
. R5 y* C0 x, ^9 v* F' P/ R            UARTCharGetNonBlocking(SOC_UART_2_REGS);7 @1 X: T! {6 r
        }
" R) M# Z2 Y8 X  `1 u! s7 x" A- Y    }3 _1 C3 u* H% M2 j! l( a
   
4 y$ S+ g8 t2 Z    return;
6 d+ Y2 @( G  w/ z( n4 p3 \}1 o& M/ L: _9 |' _
回复 支持 反对

使用道具 举报

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
0 h4 b: Y& b% r如果其它设备快速给你发送串口数据,你这边能正常通讯?
2 Y" q! Z5 M/ D1 u) Q
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-4-6 21:41 , Processed in 0.045148 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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