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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5585|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。) B  Z+ r, T3 [1 b+ S

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
/ ]9 P9 a9 i9 h" F; O
4 @4 G$ S8 O$ S$ m0 d#include "TL138.h"                 // 创龙 TL138 开发板相关声明  N: z9 F5 S; b4 C- B3 N/ ]

5 G, o& d8 Y. K; v  e#include "hw_types.h"               // 宏命令
+ d  v6 x5 n0 M  @& C: ?! o: M$ c#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
" F9 q" [3 k3 O& Z4 Y7 C+ c% `% b7 G#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器# i+ k4 H+ i5 K* I7 @' F
/ x  x1 z& Z% K1 F+ L4 I8 H
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明) i5 c' H: U4 E( P3 |0 A
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明$ ?- n. y+ r$ t/ c0 X. l
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
: l! I6 x: L0 h#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
2 e) r) a& a7 o  l( @6 Q, m  s# M; @+ \8 y
/****************************************************************************/
5 \! v# ]& b5 O/*                                                                          */& r2 j; {% i3 \
/*              宏定义                                                      */- `6 ]( b( A; Z4 b% N; {9 ^
/*                                                                          */* `% D2 c6 `3 R5 h( O  n
/****************************************************************************/6 g/ m! Y7 y# Q
// 时钟. x& w8 p4 ^2 s  Y9 q
#define SYSCLK_1_FREQ     (456000000)0 p: `1 p+ I+ m3 U3 u
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
, g0 i6 k+ \- G& F+ n, Q5 K#define UART_2_FREQ       (SYSCLK_2_FREQ)
+ P' I8 r4 {  M( [# f* \; g! k; V2 ?) {' r. T* k6 V
/****************************************************************************/7 Q5 R) @& W% a/ e* Z4 F
/*                                                                          */
, v* D+ n' Q1 b; h* O+ S2 K/*              全局变量                                                    */
$ n* ]5 d" r7 D/ L; N! O! z# t. c( V/*                                                                          */! V1 c- \# |$ n8 q" T4 n
/****************************************************************************/$ N: A2 o+ ?& x# c5 K' n. O
char txArray[] = "Tronlong UART2 Application......\n\r";
9 m2 V$ v# ?8 i8 A9 E
( q  S* Q+ R, ~# |, H. _* h; J/****************************************************************************/
# ?( w( D+ D$ n2 E# G  \/*                                                                          */
9 V0 b1 F4 |0 r" C/*              函数声明                                                    */5 P/ l* o) W  X
/*                                                                          */% I7 X5 U4 Q, V4 h
/****************************************************************************/
3 y" u" A& q3 Z# W/ n7 j/ f// 外设使能配置
$ C" y: F: ^2 l% Q6 k: Yvoid PSCInit(void);
. V! ^% F- P7 T( u$ r
5 _$ ], b9 S% j1 z' ^  F+ @// GPIO 管脚复用配置5 ~  T% K# f& w
void GPIOBankPinMuxSet();
. m* [/ q/ G+ T9 ^& c2 q, A: I8 f, ?0 r+ c) F! q
// UART 初始化
# [2 L* D7 D2 v( vvoid UARTInit(void);
' B3 o; B4 ]* N2 P+ p// ARM 中断初始化, Q3 Y% |) H! S$ b
void InterruptInit(void);% l) a2 }6 U  b) y' y; b1 z0 l
// UART 中断初始化8 f0 n$ _! n1 E3 u" K; x
void UARTInterruptInit();& ]$ T3 C0 E+ U* z/ j, L4 b5 }
// UART 中断服务函数
. t' r6 S' X2 W0 Uvoid UARTIsr(void);
: F% }! X- g  v! S
4 x! J! x) S& F# a% A. F% z/****************************************************************************/
: g+ C9 c  m! k/*                                                                          */
/ J5 Q2 ]! `7 ]- c. Q1 m% }/*              主函数                                                      */
+ I) @9 o1 X( W) D2 c; k5 _& A/*                                                                          */
' R4 \- Z5 _3 s4 g. x& W; X" i1 l  l' Q: A/****************************************************************************/7 H5 g- Z/ R' ~3 ]2 s
int main(void), A, J1 l% x& v' s. x$ N9 I
{
8 ]( ^; h7 B* \0 m        // 外设使能配置" t$ n, Q5 E, E# r/ H3 s8 `! j
        PSCInit();
2 K- _4 g( O: A- h  D  z! ~; b9 ]       
9 H( K* T2 i/ T        // GPIO 管脚复用配置
& H9 w- N, I8 @        GPIOBankPinMuxSet();0 e8 {3 q! v7 Z: \4 x

/ X3 h1 W+ U# d* z8 a2 W  v        // ARM 中断初始化
* |' s- \" }! y, o: N. L' X        InterruptInit();( Y$ U; b" D% U+ @% X; O' H
# b. ^: L: E0 U8 p1 ], a
        // UART 初始化% _- S) F5 ]/ f0 P7 B. b
        UARTInit();; n) B1 d8 A+ |. `& F
2 R: E% H4 g0 V
        // UART 中断初始化- ~9 h) H; w4 s) n1 o" V
        UARTInterruptInit();1 y( Q6 v2 ^, w

- J' d5 z: f. V8 w7 Y+ h  s        // 主循环# r* O) z) s* D& I4 g5 P& r
        for(;;)2 x2 ?' a/ f  e% T: x5 D7 S( B+ s; v
        {
8 K- ~, N$ i3 `. ?* P1 ?3 R0 _& x- q" D' j1 a/ }
        }
* E4 Z0 m. ~7 Q) _, O9 a}
) p9 M- w7 B- i" z) I7 Z( u+ ]5 F- e  i" N
/****************************************************************************/' q$ t% @1 J5 M1 U/ T  ^/ w
/*                                                                          */
" _% u* x# O5 I, v/*              PSC 初始化                                                  */4 X* w% `/ P) C( r- l  y9 O
/*                                                                          */
6 \! L. L5 s4 W; z5 K/****************************************************************************/
  c% k) w$ O% ~3 uvoid PSCInit(void)$ R6 t* j4 W2 I! t( y9 v
{2 ^0 z, [7 z" w  t
        // 对相应外设模块的使能也可以在 BootLoader 中完成
& Q1 \) ~, }% w2 }4 H% `* {4 m    // 使能 UART2 模块+ M6 v6 e0 H( H
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);0 p" H/ h7 \1 `
}: `& n! Q* q8 B/ s. _4 [& p/ D

- \! |- Z4 e) {9 S' a2 ^* O9 Q/****************************************************************************/
/ e8 H7 V; l% r* A: G' r/*                                                                          */
5 m8 X/ B; u% \& G- T/*              GPIO 管脚复用配置                                           */
$ n* W7 A, V: J3 ^/*                                                                          */4 d8 W( m+ q- a2 K/ R8 B% \* Q
/****************************************************************************/6 v# S6 o' I& B& [6 I
void GPIOBankPinMuxSet(void)4 [: d$ w* J$ P" W
{
. [5 i- {% u/ h8 h; @4 f        // UART2 禁用流控
9 Z" W7 }0 _8 n) {& ]9 {        UARTPinMuxSetup(2, FALSE);
1 _* y7 v  h  b! x# P! L5 D/ X" L}
; j( @4 A& V& G( i2 d- ?3 s$ P1 @& T; [2 r3 ?+ @
/****************************************************************************/  U$ Z( b( ^9 l( f6 d
/*                                                                          */4 K. ~; Y* \( ]- V; l! o8 |6 V
/*              ARM 中断初始化                                              */; a4 p9 \5 D! Z4 q+ x8 j8 n9 k% L
/*                                                                          */$ d, W. j; v% ?9 T
/****************************************************************************/
2 A2 Q$ o# Q: |& `1 Nvoid InterruptInit(void)* ^7 N9 l3 l8 U: ^8 G
{9 J2 N" a) Q/ m* M* P
    // 初始化 ARM 中断控制器
% P0 n, t+ @; d$ n+ L    IntAINTCInit();
8 W, P5 ?3 a* o( R  c6 y' X& X
9 t  s  q: r5 X' I8 _- H" d% i( ?    // 使能 IRQ(CPSR)
% `2 ^" a) ]; L8 V/ H    IntMasterIRQEnable();! C) j3 W( Y; K( I5 K: S* T

; i9 j1 K- {) ~( o9 N    // 使能中断(AINTC GER)
$ t+ i& [0 R$ z" l4 M    IntGlobalEnable();
& i0 P- Y1 \% t, H. l  s" f, o  \! ~# A4 I3 D8 U
    // 使能中断(AINTC HIER)
& G- |: A& p: Y4 Y! \2 O" j- I    IntIRQEnable();
. m/ _! |, D, L3 R  f}: L' T# s, x& R9 j( I! @

+ {: G  J- B; G5 k: Q! Y/****************************************************************************/
# N' T. j7 |+ {- p- D) N6 _/*                                                                          */3 Y* F+ W- ?% J
/*              UART 初始化                                                 *// H; O1 K& N% v# I
/*                                                                          */
; G+ j) H) {& R, |0 K) N/****************************************************************************/# P/ E1 G, s8 W5 s# |" m
void UARTInit(void)) p$ `/ n7 K# Y8 }8 x9 C
{
; a4 [4 s8 z/ m4 X        // 配置 UART2 参数  x$ J* R8 a5 K
        // 波特率 115200 数据位 8 停止位 1 无校验位
  K# U. u( J9 N* E3 {1 t" _6 u    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,! X5 q; {. C) u1 @2 H2 a
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
3 V% b" f  |6 x* y9 H        // 使能 UART2- ]9 a- e% U( V% O/ U) v9 \. Q
        UARTEnable(SOC_UART_2_REGS);- \4 {$ U' I& v$ c8 k' `/ \
9 h& n  g: g$ W& n
    // 使能接收 / 发送 FIFO) s/ O: |+ n8 z3 Q6 r% k3 Y+ F, W
    UARTFIFOEnable(SOC_UART_2_REGS);
3 o9 H9 k, h( l+ T8 @# C+ ^% c- `5 S% I
    // 设置 FIFO 级别! ^! |. W! w+ i2 V1 `
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
% F, @- [7 L) M1 C6 E2 ^}
4 F+ P& o7 M! B+ s+ Z- a3 c
1 R, r4 e5 F) H8 F- v/****************************************************************************/
! ]1 f; M) M# C. A1 d  V/ L! l- ?+ y/*                                                                          */3 Z, B# r  x, [7 m( j  Q
/*              UART 中断初始化                                             */
7 Z) z  c) I0 h/*                                                                          */
+ u6 R9 n6 r  Y: j( s) ~" Z/****************************************************************************/3 d8 U" K8 s4 _# b5 j
void UARTInterruptInit(void)
. `/ h4 k; Q6 O$ ]/ L* [2 d2 c{
. W6 q$ w8 A- C! F7 F1 E5 d        IntRegister(SYS_INT_UARTINT2, UARTIsr);
7 o3 \$ S# e) i        IntChannelSet(SYS_INT_UARTINT2, 2);2 B/ L6 c" b/ |/ G6 L
        IntSystemEnable(SYS_INT_UARTINT2);
8 }) }+ t6 e( h+ e& o8 E3 c) E3 M# s+ [3 d3 h7 }
        // 使能中断
$ W8 Y$ r7 ?, B/ Z        unsigned int intFlags = 0;# Z* G( P6 h$ x* r, n, Q- @1 K
    intFlags |= (UART_INT_LINE_STAT  |  \
8 P* J& S" k: s6 X: X                 UART_INT_TX_EMPTY |    \& Q- c0 r3 H4 d# k& U! n
                 UART_INT_RXDATA_CTI);
* R  X7 ~" o" u1 l# z; X  Z    UARTIntEnable(SOC_UART_2_REGS, intFlags);) o2 ^0 s. K$ ?4 d5 d6 ?. [
}
2 K! D4 e8 w2 G# E" v$ l; G* I6 S' W7 z* w8 l) W& r/ g' B
/****************************************************************************/( V# i4 X" k+ q
/*                                                                          */* I" F' \6 r) |4 u6 d( x/ W
/*              UART 中断服务函数                                           */
' \3 b8 u) i' _! }6 d$ C! ]/*                                                                          */  p3 ~6 y$ f/ n' {9 y
/****************************************************************************/
' M, K4 g! L) ^6 P. M. Jvoid UARTIsr()" H' c" |$ }1 x5 r
{7 [5 ~2 i% |* _  \7 O
    static unsigned int length = sizeof(txArray);1 \3 d4 c. r4 |- F: D' Q
    static unsigned int count = 0;; e8 w7 `1 U+ J
    unsigned char rxData = 0;
2 f& H0 V6 k% a+ q; S$ w4 m    unsigned int int_id = 0;
$ E/ t* e9 n/ @3 t# b2 o4 L# P  n2 j' a% r) R+ F- T9 `
    // 确定中断源4 Z3 z' Q6 R6 d! }0 \5 N' [
    int_id = UARTIntStatus(SOC_UART_2_REGS);, Q7 ~; K! n3 ^
9 n1 _% d* n- S/ j4 ~$ o  X' q" o
    // 清除 UART2 系统中断& |: a! l+ D, I% ^1 n; U$ l
    IntSystemStatusClear(SYS_INT_UARTINT2);
7 c+ P6 K6 c( o; H4 M/ A  n( [
" x$ F2 S( m% l* b3 [3 f& F$ ~    // 发送中断- t" x, T& g4 H0 l; j, K4 \
    if(UART_INTID_TX_EMPTY == int_id); e# z/ V: l, y: t0 ]; x, U. r' [
    {
, H) T' l8 R. `        if(0 < length)3 ^9 \2 A' U. F; d2 }8 V) t! q
        {0 e# r% t& G0 z
            // 写一个字节到 THR% H  U; t0 b- f. x+ a
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
0 d' o9 B% b0 C) ]6 M            length--;
3 v0 t* P9 v" E5 U6 _8 M  w            count++;
6 v" J# Y+ k: y; {/ L6 ]        }
! K6 V+ w& Y$ x4 C2 e7 Q        if(0 == length)
. o& g+ m3 @) {& k% @$ G        {% ?4 Q# O6 Z) `+ l
            // 禁用发送中断1 Y+ P* w* h/ C
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
0 c1 A' B- W# d- v; I1 @        }" O' o- Z/ Q9 u9 R9 _) X
     }
1 X% ]! C1 \/ n# c  n& a4 E- V) e, k
3 m: Y6 F' x/ T& j& ?6 e( p    // 接收中断' I: O- k6 V: Q' x5 f9 W1 o) O
    if(UART_INTID_RX_DATA == int_id)
, M; Z" _! a; D  V2 w+ w    {8 W" f6 |+ F+ i! m5 q9 s) Q3 o4 i5 z7 X
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);0 b7 G! G/ q, I, q
0 n  c+ T; _. W
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
1 [% j8 {8 t  d6 D  [    }
1 {( V9 _8 o5 q0 M- B" L* j' O4 z6 y+ S  }2 [
    // 接收错误
8 c. p- [( |. @2 ^) d    if(UART_INTID_RX_LINE_STAT == int_id)
- f* l( _/ _5 k5 b    {
# b- \( J! g  m6 E( ~        while(UARTRxErrorGet(SOC_UART_2_REGS))( B& u6 }0 g3 X' S6 q
        {2 e% [* ^) ]# m7 A( |2 b
            // 从 RBR 读一个字节+ Q. N# x0 ]0 o8 U
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
: G8 x! W$ e$ b6 l) ?" \) c        }
; i# r4 b8 N4 L( y9 R% e    }
9 E3 p/ i- s( l4 k    ; w# n4 W% b+ Z
    return;+ C9 ~( z% p4 A9 U8 Z' ^3 c6 z
}* c' H) l9 K5 a3 x& k" \* S5 H
回复 支持 反对

使用道具 举报

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
6 e5 m$ Q4 ~6 j如果其它设备快速给你发送串口数据,你这边能正常通讯?

2 {& w% b$ F& w: r: w1 T谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 11:45 , Processed in 0.041893 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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