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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7258|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。% E7 |1 n! [7 V! {4 O1 ^+ g

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
: w4 e4 o) {- {7 o- N& _, B, N7 A* K+ L, I
#include "TL138.h"                 // 创龙 TL138 开发板相关声明' A% h5 v, A* V0 @& l

+ X& M" b* w* @# k. v7 R#include "hw_types.h"               // 宏命令2 I2 s* \# s- ~9 g+ ^
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
9 _# [, U- C* T5 O#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器0 l: Z" j$ s, X2 {9 a+ O
7 n2 o/ j4 ?5 ^8 K" w* b
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明5 G0 `0 \) l6 g: l% [3 @, V% ?
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明4 S& `' B$ |! D; J. {3 ~. p
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明7 Y) K6 Z  Q" I$ {
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义  b; e9 _# l* E* O# E$ |  o

+ v% I& R0 p' L1 k/****************************************************************************/
* ?- i2 c- v& U/*                                                                          */. j3 u' v8 h. i; a8 _
/*              宏定义                                                      */
3 q$ c) b2 d/ G4 g& f; S$ o# d  s/*                                                                          */
7 ?1 T$ ^1 v, K1 ]6 h: O' I# [/****************************************************************************/
5 ~8 E! v8 G% g+ A2 ?// 时钟% ?" |' W5 w, F; \5 b
#define SYSCLK_1_FREQ     (456000000)
1 o$ {& e' \9 J4 {/ B  G! a#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2), M- G- v1 z- Z' e
#define UART_2_FREQ       (SYSCLK_2_FREQ)
% Z2 Z2 N: C6 c# N; B2 o4 w" J8 @$ I: J% s4 }* N0 s
/****************************************************************************/9 Z& R( ~; T* G
/*                                                                          */
$ K! w% w5 R! L+ G/*              全局变量                                                    */
  D! {. S" c& C  \2 z: K" @0 n0 h/*                                                                          */
% G; w4 ~8 r( d. M6 U$ k( Z/****************************************************************************/
! O. J9 q$ M- _# D2 h3 |char txArray[] = "Tronlong UART2 Application......\n\r";
5 D: b6 p8 p/ G2 M! j3 k# p+ x% z
/****************************************************************************/
) t' Q( }9 I2 M/*                                                                          */# p# C( ]' n1 A7 W6 H
/*              函数声明                                                    */# t$ Q% ~" b( c; f' g5 U) W
/*                                                                          */  A3 n2 t% q0 K; `9 L( L& Y$ M+ L
/****************************************************************************/7 J+ m- t" c6 r  {, e) u* P" }# T
// 外设使能配置
8 d2 s$ V' J5 s8 [" Svoid PSCInit(void);& e) s* }  d0 k* g

' `4 y7 n- n1 ?6 L4 M// GPIO 管脚复用配置
% B3 N% l3 ~; e' A! q: X  Yvoid GPIOBankPinMuxSet();
* X" K5 h5 V5 }  T. y# a; x! @4 j# b6 c
// UART 初始化. ^/ U8 M" \' j& C
void UARTInit(void);
- L. R% W# d2 E2 [// ARM 中断初始化3 O& X8 x1 m; d0 k- S7 ^) m* Z. H" g7 n( {
void InterruptInit(void);) v+ d/ ?1 \8 V2 i6 K
// UART 中断初始化. O5 A3 l' V, q/ j7 y0 l$ n7 ?( g
void UARTInterruptInit();" Z7 w- E7 ~! I1 R) k8 v
// UART 中断服务函数
1 H/ Y9 B# S" z! L. ]9 ]void UARTIsr(void);% Q. g, b0 p" T; S

7 a) L2 `4 i( A6 t# E: J0 z2 A2 q$ b  ^/****************************************************************************/
+ I* n+ t/ e- R5 ~  z/*                                                                          */9 G2 A+ m7 s; I8 d
/*              主函数                                                      */
& p4 `! I* k; Z. R, I8 w+ I& B/*                                                                          */5 X3 s( [$ \' \8 G0 ]: G- n! {
/****************************************************************************/* }! E! E, B7 w- x2 D' J
int main(void)9 M7 y) O8 P* N
{% J9 u( u% @- r+ k
        // 外设使能配置
( X7 t0 M8 g8 V, R        PSCInit();  {1 w; f# i& f, L# d
       
2 U% z4 @: G0 t& O6 Y8 _        // GPIO 管脚复用配置2 Q, N- D  h% A
        GPIOBankPinMuxSet();
/ ]3 S6 _2 P4 F/ m+ K' Z4 R  @6 W' a' C4 y
        // ARM 中断初始化. S1 d* ~, d) z4 B
        InterruptInit();
% a4 j3 R" O. y9 J7 e0 L6 B( F- V" e. B8 v2 J/ U
        // UART 初始化
$ [0 U" A. e+ K        UARTInit();, m/ Q7 Z1 c$ m# N- f! V! W0 y* i
9 }5 M" Q& J0 s! K5 u4 f, L2 a8 U* V
        // UART 中断初始化
; U! f$ ^3 j% y" o" V. L" b        UARTInterruptInit();* a4 x5 \2 s8 W* w# Y
' {: z; N1 }. w5 h2 A) z7 C. T1 X8 ]
        // 主循环$ m/ A& u1 O6 E; E4 o6 h
        for(;;)( H! i* t' I, }- B1 W: H& u0 e
        {& N& x  e: \5 o$ E

! m' i" J6 O% U2 L- }  `        }
. B' y$ @  D  M  ^& K/ g; E}
- m& F! U1 K- m. N9 E& G: |$ r" J1 N  z& H4 }; h$ B* v) B
/****************************************************************************/
8 b+ S/ P' D0 V- B- M! A* H/*                                                                          */' e3 G6 C$ V+ p) K, V! y. d$ R# L% Q
/*              PSC 初始化                                                  */0 R5 h3 B* d3 v) N$ }
/*                                                                          */
4 F/ n" F* Q# P/****************************************************************************/8 j0 p0 H8 L; I: u
void PSCInit(void)
, _( y6 n4 D# S& @2 K6 L+ p{  C" N! j" q/ u5 @
        // 对相应外设模块的使能也可以在 BootLoader 中完成/ u5 ?. {- @& g# D
    // 使能 UART2 模块' P1 b1 s( Z( n
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);5 o; Y- H( t& m! {
}% g% E0 F! h2 N

$ F' K( J: g8 j! b/****************************************************************************/) I7 D, q3 k* V0 O" ^8 R" E7 R' T
/*                                                                          */
: `4 }: g$ t: X) }/*              GPIO 管脚复用配置                                           */
7 t0 w) P7 }. e% I! d3 ?* Q/*                                                                          */
1 z; H$ J4 p8 ^; j' ~" R- }3 W/****************************************************************************/5 ~: f* p9 x( p' d7 n$ U: Y
void GPIOBankPinMuxSet(void)
/ R: H2 ]. Q' N9 W' f* c& _{
4 r2 E2 F" J9 s0 J8 U) Z( N! S        // UART2 禁用流控
+ z7 k/ I3 e* z  h/ {        UARTPinMuxSetup(2, FALSE);* g5 A) |* d, ^! M$ o
}) S4 U7 ~  g7 d2 Y$ |

( l- ], B: l6 J6 W$ n/****************************************************************************/9 e# f' [, Y- a4 E( |
/*                                                                          */" Q& U- U6 T' T1 G
/*              ARM 中断初始化                                              */
5 L- p0 q5 v7 x1 K) e  e. q/*                                                                          */$ J  z4 J6 I8 v$ ]" }: k( a2 @
/****************************************************************************/
! W' u/ D3 g, E( Uvoid InterruptInit(void)
7 p8 m* m6 m: _, B4 z+ w- ~: v# R{; n: |; g+ J+ O6 m/ \# A! E
    // 初始化 ARM 中断控制器/ o2 r0 [, T" W+ ~' J" e" I9 ~! a; h
    IntAINTCInit();
+ J! |4 \/ L4 ?% w5 A! M
. l+ [, ]$ q5 S    // 使能 IRQ(CPSR)
. n2 C+ W, u+ e, [( E) A* H    IntMasterIRQEnable();
$ C: i1 @5 n% M9 K" x, M9 x  G. g( o& y. F; S0 P2 k. p
    // 使能中断(AINTC GER)' E" P" i7 P- h. x7 Z6 Y7 |
    IntGlobalEnable();
& M  L1 s2 }' u4 V5 N) v1 n
& P- p/ b4 _' ]- Q9 ~9 |, W- }1 U; Y    // 使能中断(AINTC HIER)
6 \* l8 `% E( W% v    IntIRQEnable();  c: |8 p; [5 K, ~9 ^+ ~
}
# Z$ W5 [0 k1 q3 f
  |* e0 d. m6 u+ L$ X# Y8 M9 B/****************************************************************************/
% n  R6 |4 c! o& q/*                                                                          */
9 [4 m) ]) z) `$ x$ L9 V/*              UART 初始化                                                 */
, `* b6 e0 g7 n* S0 ~7 s/*                                                                          */- y+ K( E* m- Y1 s6 s& b+ x6 p
/****************************************************************************/
8 }* x3 O( [. |4 K) N1 v5 z7 tvoid UARTInit(void)
0 |' K! L1 X4 U* V8 I7 n+ r/ E: v8 R) o3 z{% {7 W4 H( w4 f" [/ |# A" d/ E: s! G
        // 配置 UART2 参数# @9 |9 w+ f% T0 b+ M2 a
        // 波特率 115200 数据位 8 停止位 1 无校验位- m5 c4 A1 R$ L4 @% d3 n& N
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,( e1 B: n, g/ ~% u
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);% q* M% z* ^( c' W
        // 使能 UART2+ S- W6 v' E) _  |3 I5 U3 q
        UARTEnable(SOC_UART_2_REGS);( o$ }% U+ }+ F0 f$ D/ l

4 {" r9 K+ L5 Z8 w  Z% o    // 使能接收 / 发送 FIFO
% v. q2 l( f4 E) z    UARTFIFOEnable(SOC_UART_2_REGS);
; e$ A2 ~" F& a" T. `( m
1 P7 j: i! y/ P. @    // 设置 FIFO 级别; b1 q$ X" R" e' @- A
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
; W( l6 m$ E' v( V}
" o. e  p# p6 W1 j4 ~
, g( P2 i( o" _/ Z9 B/****************************************************************************/
  p) j7 K; z3 Y: m' U1 J. J: q  l. N/*                                                                          */  a) W* J0 x& }1 o' K
/*              UART 中断初始化                                             */
5 H; }& X: ^( p3 v% s/*                                                                          */
- }# L4 j( A! S1 }/****************************************************************************/- d  _, }) v% s
void UARTInterruptInit(void)/ R/ A! @1 _! Z# z- H/ H. T6 A
{/ P4 @0 E$ m! j: ^9 j% Z- E3 N
        IntRegister(SYS_INT_UARTINT2, UARTIsr);% d* C  {1 D$ _6 p; ]8 i
        IntChannelSet(SYS_INT_UARTINT2, 2);
3 {0 X) n4 A0 ?- d& k1 U        IntSystemEnable(SYS_INT_UARTINT2);9 [; H( T& |# g+ F' [8 c

) F9 A( ^" u! s) ~        // 使能中断, t( B& o; X8 g* o% z; W) R& ?8 o
        unsigned int intFlags = 0;
  T; N) X0 J/ r    intFlags |= (UART_INT_LINE_STAT  |  \
; O: R' x9 X$ x" c                 UART_INT_TX_EMPTY |    \
: b6 V% k  d8 I0 z                 UART_INT_RXDATA_CTI);
2 w' G2 M# k& T3 ?9 a    UARTIntEnable(SOC_UART_2_REGS, intFlags);
' X5 L( f4 }' b% C}9 d9 F6 ]* q" t
5 Z/ j* `- {  P7 Z8 O  i( Y
/****************************************************************************/
5 u7 A* ^3 v5 H* L' E, s/*                                                                          */
4 X5 k/ u' P8 v0 \& }) P9 ?- _" }/*              UART 中断服务函数                                           */
7 v+ R: m6 y0 D& [/*                                                                          */
/ Z6 f. g; z. b' V/ V/****************************************************************************/( i6 b3 g2 p8 s4 k
void UARTIsr()* P. o4 F7 E+ e* ~, E: j' N& V
{8 J- J( `) N& i6 S3 Y  b5 W
    static unsigned int length = sizeof(txArray);
) ]. t4 ?" a1 g) t    static unsigned int count = 0;- P. @3 ~- x6 s4 T. E6 u
    unsigned char rxData = 0;
) B5 q4 y  ]! C; [    unsigned int int_id = 0;
  g1 W) \7 m3 ?; R3 H1 I- N5 T: n/ O* `! T
    // 确定中断源
$ z' T( v* q2 e5 x4 _* o    int_id = UARTIntStatus(SOC_UART_2_REGS);
7 C$ h2 c; X0 j9 |% k9 R* T6 `9 F& u" s8 ]1 b
    // 清除 UART2 系统中断/ C: R% o4 w. Q% G9 L- Z
    IntSystemStatusClear(SYS_INT_UARTINT2);; |/ y. z, Z! @1 e% P3 p
& V1 `/ {, i' Q( C/ t
    // 发送中断
# s$ D# b$ a& G! v( |6 c* e    if(UART_INTID_TX_EMPTY == int_id)
. U0 \" W0 c8 Y6 ~+ H  o    {+ o, }$ a& n0 D/ Z
        if(0 < length)
8 F# |+ Z5 A6 t  G- D2 ]' @# v        {
' c7 Z' Q$ O5 M  [$ j            // 写一个字节到 THR
* T, X3 x7 h" G" O. ]+ c- {            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);; d/ K- P' n, T, ~: d' L
            length--;
, t% s) r: J0 ]# ], ~            count++;
( t- l- j* {/ ^" B8 h        }
1 s2 m- D/ g0 g/ d; Z0 R: i        if(0 == length)
3 y9 @: `- [9 C' i2 p2 `% ]        {
/ H" E6 K$ Z; k6 ]: m            // 禁用发送中断
) e8 x  l: v! W* q+ ^: v            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);3 o6 |& t" _# K1 J* v
        }* L+ |+ n6 m- E$ U
     }
6 \2 G& V8 @8 s# q/ I; e) @9 H- }1 P
    // 接收中断
2 r! h( |5 \4 g+ l; v/ j( y    if(UART_INTID_RX_DATA == int_id)6 A8 [4 `0 {" U; g; h" s
    {' B1 o+ Z7 @2 l& g
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);6 b6 S7 L7 U" G  m/ d, i" w7 O

5 P( r& C; G5 e        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);1 I- Q" s8 I8 X2 \- N# n) p
    }: d- z% _9 @9 @: _

4 d  l7 f6 T( R) }  `- p. l% c    // 接收错误2 j9 ~4 C$ h. a0 n6 t( @" b" `! G4 \
    if(UART_INTID_RX_LINE_STAT == int_id)
/ g/ J9 e7 |4 W, Q  ]( X    {4 R# ]/ u% |2 N& Z! t. j+ O& [
        while(UARTRxErrorGet(SOC_UART_2_REGS))
; F; m5 j/ \; d2 j/ h+ t* M/ _        {
$ I' e; M" I, u" P% x6 }            // 从 RBR 读一个字节
* N$ x6 i9 N- v- l            UARTCharGetNonBlocking(SOC_UART_2_REGS);4 B% [* N- p( t
        }
7 r) ?. O3 N' f! s" B) i    }
; }0 R4 S3 j; K" Y$ s; E4 A    & Z& E: n% p" F3 a
    return;
; |. x- L, I; L}
# t3 D4 Y+ O1 R6 J( d
回复 支持 反对

使用道具 举报

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
" x$ E# T3 R8 Y& n" y如果其它设备快速给你发送串口数据,你这边能正常通讯?
0 Z8 D2 S* K! I. w$ a
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-14 18:52 , Processed in 0.042397 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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