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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5644|回复: 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 d+ J8 {7 N; h6 K- @9 |5 s

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

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

. U+ X: t/ q# L, y4 i#include "TL138.h"                 // 创龙 TL138 开发板相关声明
, l8 ~: U: _2 F$ b6 B$ R
( s) i+ [% [2 x" q2 }, o#include "hw_types.h"               // 宏命令1 S4 i( l& o- n
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器+ n  j! V8 U( o1 I+ \
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器; m& ~( p7 Q6 R7 L, d7 c* S  J
/ h8 ]: Q. ~- Y# T
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
7 o9 \* y$ {5 e! u#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明7 l  e( x0 J0 @  r' ]3 d+ I$ U
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明+ l  ?. G# e& b$ x
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
1 L* k1 y- N# G+ _
" q% J/ |3 a& F. z) `; `/****************************************************************************/
, I% v- V" Y  M6 o; x- i. m2 n/*                                                                          */
, [" O/ s! F) L( I& b/*              宏定义                                                      */, n4 t9 U2 `+ Z5 B6 X$ A
/*                                                                          */
. H& G# }+ K* w- c/ q- \- I/****************************************************************************/
9 ^. U: ]- W7 O. V// 时钟+ s+ R$ j) q& O4 ^
#define SYSCLK_1_FREQ     (456000000)2 d+ T0 D5 M4 L( a( o
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2); e( x$ L2 W7 J4 {/ K6 L( L! K% }# n
#define UART_2_FREQ       (SYSCLK_2_FREQ)1 u& h/ k: n7 F- o/ D. r2 u1 _
( L1 U7 b/ c0 Y2 K" ~" E) d
/****************************************************************************/
4 H: L- n' Z. p" q/*                                                                          */) i% L9 r0 W5 X6 O4 E6 r" E7 z
/*              全局变量                                                    */$ A8 L5 S3 I$ p+ ]" L
/*                                                                          */$ _3 E) X- ~3 G4 j) p5 K/ `
/****************************************************************************/) {- s8 z: i4 C( S1 W& p0 k
char txArray[] = "Tronlong UART2 Application......\n\r";. O+ S$ }* l! F9 J0 U% x
1 i9 V  Z! O$ M- ]5 j8 e5 H* [7 b
/****************************************************************************// N% Y' _" t, V, o. _( I: v) E" G
/*                                                                          */2 C3 |  p  L) o6 S0 `5 Y1 @
/*              函数声明                                                    */4 p5 ~2 b( h& @* U* X
/*                                                                          */
4 V0 {% O3 w8 ^) X8 Q, j* n/****************************************************************************/1 m# k; b. h( H3 O8 B- w( B# A
// 外设使能配置
' ]2 u8 o$ C9 D" y! |6 r( ^# M& Xvoid PSCInit(void);
- t6 W* ^3 V4 H0 u  ~( r0 ]: {
; Z) P% `5 e5 b// GPIO 管脚复用配置2 t  |7 }( C7 Y6 {% O+ u
void GPIOBankPinMuxSet();
% V5 S5 e# O, f- B& J) a4 b6 P* R7 w
// UART 初始化6 j: ]6 [# ^: ?6 n
void UARTInit(void);, n8 o" J3 a' x& y! L
// ARM 中断初始化2 w) y5 X( \. l# Q( ^
void InterruptInit(void);' \; H2 ]2 [) B8 |8 [) I* [
// UART 中断初始化
. R1 I6 G* T9 V0 }void UARTInterruptInit();
: R' q7 w( Z* }5 E8 A// UART 中断服务函数
) C" C: F  ]  U* B$ mvoid UARTIsr(void);6 Z- |8 P' i6 i; k# t
8 F2 c7 q9 o5 c! [( Y1 C0 x
/****************************************************************************/
: ~# l, z: v7 d" w; w& N/*                                                                          */
5 T/ ]# {  z( F. B4 e! k4 P' I4 z/*              主函数                                                      */
  T# M; V  ^5 Y6 ^- V/*                                                                          */* ]5 a" j2 d5 |
/****************************************************************************/5 k5 Z% F! s4 r
int main(void)1 m4 o. A- l5 X. x1 t. z3 h( P, f: [
{! K8 d" E( ?  x# u% Y- R
        // 外设使能配置$ a" @2 f4 M* l& d
        PSCInit();
" n+ ^0 i$ `( m. U" _& l  Q" O        9 r8 P% K! f& F
        // GPIO 管脚复用配置
4 q* n+ `. x* \1 l% `; M$ V6 n2 W        GPIOBankPinMuxSet();$ C" E8 A% b" m/ V& m4 {
3 Q% g; r$ S" A+ z( Y7 k
        // ARM 中断初始化# U( K. J. v# `7 f
        InterruptInit();2 |" t3 L/ ]7 o% `& e: s

4 j. D" n; T6 K        // UART 初始化
' ^+ s2 R, n6 o: ^% _3 S/ }# u: m        UARTInit();
/ R* O5 }7 g5 d- T
3 u1 L3 l; m4 ~+ w& @# b3 M0 K        // UART 中断初始化8 T* F! {8 o  _5 C- M, u( {- s( ~
        UARTInterruptInit();5 T  K+ z0 k* e* {) \4 G
2 N9 v5 B7 q3 t
        // 主循环
/ ?% d& C8 @/ b" I" c* R        for(;;)
/ k4 ]4 P- d2 n        {
1 d% u9 U) C; `* `  f, k' }: y" h/ i8 @9 P) ?, T6 f
        }6 G" [( g( p  o
}
, y' c9 v& Z; x9 r6 e! J) q+ T
6 }4 d# s5 ~1 P5 g8 K/****************************************************************************/% {. Q/ Z$ x! b, G+ ^  G2 ]6 ~
/*                                                                          */9 B* Z8 n& I8 y/ _- E
/*              PSC 初始化                                                  */: P4 K" n5 q8 R( j8 X4 l
/*                                                                          */, }. n+ {9 w4 _) h1 F
/****************************************************************************/
& q+ ]0 s& k) e+ a( `; F4 {: Nvoid PSCInit(void)+ t! i8 n9 D  k0 x, g3 n' r% O" {  H; o
{
6 q3 L) d6 T$ j* a        // 对相应外设模块的使能也可以在 BootLoader 中完成) j# c$ z1 e7 n, N: }( u# G
    // 使能 UART2 模块3 c  @: F1 }9 _5 Y4 U- I
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
% z8 @) }- ?2 [& [; J. _}
% J! P+ a# r  m  \; G( f
. i. i, V( s7 |# o# P; `3 \# }" \/****************************************************************************/
' w# E/ K* R; S* f$ A/*                                                                          */- U) J' `' E' g. d
/*              GPIO 管脚复用配置                                           */
0 L6 p' v% F- X+ K7 C" ]/*                                                                          */+ Y1 D- {+ H  m5 `" d3 O3 L' |) e
/****************************************************************************/
4 d1 v6 i( T# ]+ U1 Pvoid GPIOBankPinMuxSet(void)
' P0 I" q& B1 N8 j( p{
+ e/ p) |$ }) j& G! w        // UART2 禁用流控2 ?# s8 T0 y, G6 m
        UARTPinMuxSetup(2, FALSE);
: B/ N% E  T) d" ~- J}8 g, N/ \! G- }. r% z/ D

5 q: ~0 n( Z+ {& h6 T/****************************************************************************/
' g- h% W6 [' H9 H( p4 k# q/*                                                                          */7 }0 L& _6 y2 E" }; N
/*              ARM 中断初始化                                              */
9 c' U2 _5 ~8 F/ D/ t) e2 F3 j9 s4 U  h1 N/*                                                                          */8 e+ R: y- j4 y2 M4 {
/****************************************************************************/' r* P& u* ^+ R3 s% Z% y& @$ \
void InterruptInit(void)5 M& R, v% n" |) M* T
{! c/ n" L3 p6 r$ I1 l3 p
    // 初始化 ARM 中断控制器* @! w8 j* N$ c
    IntAINTCInit();4 K2 l! R' R# V# q

( Z7 n3 T; O( T  W% r( s% \    // 使能 IRQ(CPSR)) ~& [! W1 O. S2 m, F. |9 G7 p1 Z
    IntMasterIRQEnable();: E) R" a/ z) Y! L5 Y" X1 \7 G1 a

! x) }$ P& y+ z" T    // 使能中断(AINTC GER)" T1 {0 D/ x0 d% v# x& l7 B
    IntGlobalEnable();& c" _! a3 I) h7 J: G: Q

% U7 N9 G$ ]7 R2 Q/ |2 {  d    // 使能中断(AINTC HIER)7 G5 `9 a' u. Q; }: b
    IntIRQEnable();' X5 g) a- P; {* s1 L
}
* L2 w( {+ t6 P; [/ L2 ?5 y& ]& D0 Z
& O& O9 h+ S! R  e/****************************************************************************/9 A' @, C' x- U4 a% i
/*                                                                          */5 j1 Q; c$ O, i& w, D9 Y
/*              UART 初始化                                                 */0 v  B' z  s' C( K
/*                                                                          */  M6 a, q% }& i: |& D7 S
/****************************************************************************/6 f" t4 y6 ?, S! w+ f
void UARTInit(void)
8 K) j% q) V# E% n/ s+ N{
( A7 N  p: W8 e, j! O. w        // 配置 UART2 参数  S2 q: Z- J6 u; a
        // 波特率 115200 数据位 8 停止位 1 无校验位% d  L9 |2 ], @2 v3 Z; q
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
( F" U- _+ ]2 }  S5 K+ H                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
+ x+ i; t" J- j  ]& b+ f        // 使能 UART22 z: O- c0 n; }9 _. j
        UARTEnable(SOC_UART_2_REGS);4 q' f- @: `7 }
( Q8 \; x7 h7 [( b2 W1 s
    // 使能接收 / 发送 FIFO: e6 {. P. C( W
    UARTFIFOEnable(SOC_UART_2_REGS);
8 S. V' m  }/ b' U# i, [! x. D" `; m) @9 ~! W
    // 设置 FIFO 级别
# ?# p- ~- `6 D$ c' U  b/ E# q    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);/ V! Y0 ^  d5 X: s: K; d' R  h2 F
}% ~$ [/ Y2 }$ S. F

4 ?9 V5 L7 y) j- ?/****************************************************************************/
8 D# @/ b: L$ Q0 L' l* _/*                                                                          *// y+ k$ u0 S8 d4 f2 U4 z
/*              UART 中断初始化                                             */- a7 i- F, m3 [) N0 K: J
/*                                                                          */: @1 i% U. W1 j' l9 n8 V; O
/****************************************************************************/
6 @( j/ O7 T, z: I( @: {1 Ovoid UARTInterruptInit(void)
8 A: A: z7 V6 M4 U: r' c{
0 V8 |! u% x8 G, C+ \. E        IntRegister(SYS_INT_UARTINT2, UARTIsr);
* Z& [$ y+ y- ~7 s1 k        IntChannelSet(SYS_INT_UARTINT2, 2);
2 h4 |3 z' _0 M; \; H4 e: \, u( ]        IntSystemEnable(SYS_INT_UARTINT2);* v, _( q* n8 i
/ m! B$ f6 Q; [! X4 h! b+ X
        // 使能中断
. M0 N. l7 h7 L+ C        unsigned int intFlags = 0;/ |, a3 K* z+ o) d# Z. ~9 f
    intFlags |= (UART_INT_LINE_STAT  |  \+ B$ }  r( O+ h0 z* Y1 O  H/ t
                 UART_INT_TX_EMPTY |    \
" D* w7 q$ ]& s6 M! e/ y. @, p" k" @                 UART_INT_RXDATA_CTI);
7 e1 ?) Q. `- @; A    UARTIntEnable(SOC_UART_2_REGS, intFlags);2 U( T7 S& J3 n' n
}. w3 o3 N& }3 G# _. v0 J! F8 Q) ?) C
- Y/ V1 W& R5 K8 E  q  p
/****************************************************************************/+ T) c0 ?* \, p2 V
/*                                                                          */: X& R* I, Z; J! v1 @" x' P' l
/*              UART 中断服务函数                                           */0 z- x8 T6 Q/ q) k6 \
/*                                                                          */
/ Q" i1 h7 S- ^4 x: z/****************************************************************************/
; s  u/ Y6 M% H# p8 O% xvoid UARTIsr()$ l' `2 O9 F) k; p( n
{) I2 \0 n0 Q0 n, j" G% k2 m; C
    static unsigned int length = sizeof(txArray);- b. i6 [8 Z, C4 x. c( ]  C7 r/ S
    static unsigned int count = 0;
3 x) t1 `8 L3 H) T. M$ Y6 J    unsigned char rxData = 0;
/ s* g- C+ }) C3 h! W8 X- ^    unsigned int int_id = 0;
1 V1 d+ S3 J# f- Z/ Q" O
$ Q# P/ |0 q$ ^; w5 R5 V+ }    // 确定中断源3 L% {2 p% ^; V; q  D
    int_id = UARTIntStatus(SOC_UART_2_REGS);
& Z% ^# o# \* @+ ]* O7 E( }9 n% X, q2 {- m' E! K
    // 清除 UART2 系统中断
- k3 W) R, e2 O    IntSystemStatusClear(SYS_INT_UARTINT2);
: T8 r9 H+ w: g/ a) A( ]
7 Z/ \' S$ {5 K, f9 r/ l! k    // 发送中断5 u$ f3 {2 _* Q) _' o" c+ t* G
    if(UART_INTID_TX_EMPTY == int_id)8 l0 h! F' U4 m0 l+ M4 C; m1 n/ z
    {7 E, I  ]- V$ [, u* z$ F+ C
        if(0 < length)
8 C) H6 Q) n9 h5 r) V- Q. t( m9 L        {
' V0 @7 X% W; V5 W! \0 d0 ?            // 写一个字节到 THR
! `- O0 T* Q/ h% h6 S% x! m, K9 }            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);4 B" E2 m' u% I8 S' d' O: _
            length--;9 f; c  W$ p( F
            count++;
( H( c" `; S7 ?) `1 I6 ^$ A        }/ g2 G) u- m+ q% w
        if(0 == length): U3 c! u' L( @
        {* Z" u4 c0 p& t: @
            // 禁用发送中断  C" x7 a$ p% W. d/ T( V
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);2 @% i! P( s6 }; f! p) D3 {( w0 H
        }) Y7 g4 o; j/ }6 a5 u: j
     }; Y- k9 m. L+ h; C# u

% c8 P2 K, ^1 P9 y# k6 n    // 接收中断& R. x0 J* u2 s# v0 w' O
    if(UART_INTID_RX_DATA == int_id)$ n+ x. J: C7 ~& N7 \
    {
0 a" h- m8 I: F        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
) B3 q( R5 W* @; b0 C; `! v8 L" G: P% G4 o7 L
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
9 B1 S# D  z. r' a5 H    }1 e1 ~$ t7 `7 _5 e  K) q) r
. o2 v  B. A0 d: ]+ F8 e
    // 接收错误
/ s( y+ j0 Z: @    if(UART_INTID_RX_LINE_STAT == int_id)  y( D) Q. Z- G
    {/ W5 `) b8 d/ f  e
        while(UARTRxErrorGet(SOC_UART_2_REGS))
8 ~/ }! }, o. \/ p# c$ G) ~  X        {/ J, ?7 d% R6 E( n0 J
            // 从 RBR 读一个字节- X3 Q+ q1 y, K# Z( E; v
            UARTCharGetNonBlocking(SOC_UART_2_REGS);% P2 M2 ~: w  h( K
        }
$ S& s2 E3 K! Y4 X: M1 R2 q    }3 X9 b0 s+ r( @/ k4 w
   
, d2 i2 {" F( m; r    return;
- h- v- q  s" m! y8 Q}
3 V  C( J6 b- _4 H& t+ {
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 16:35 , Processed in 0.044736 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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