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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5645|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
; ^! Q1 u1 `9 m& n9 ?

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
/ K/ q$ Q4 N; A+ K
  N9 t$ k  L# E0 f5 V7 M- f#include "TL138.h"                 // 创龙 TL138 开发板相关声明
# Y  k  t; o9 R. @& ?# I/ O2 R5 y9 C$ f' E7 \) H* N4 o3 s
#include "hw_types.h"               // 宏命令
: x0 z3 T4 B4 J2 `7 A/ R/ f- n& O#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
2 C) P6 T( N9 w3 P1 \  k% R#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器* `& V8 _" ]: D( y1 d

5 o% X' C: _. U3 I! L#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
/ R5 R! K, _( P- y+ w) J* @2 O#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
% g5 B7 m2 e) K* |. {#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明  `0 c) k! n% f- r" g
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义# N  h3 o, c! i  T, h9 M+ Z' n
3 K- D$ l$ ?; m0 n  ~  b
/****************************************************************************/
. y4 F( J8 _& j8 F1 l/*                                                                          */7 {: z4 p5 i5 k% m0 o+ W# N
/*              宏定义                                                      */3 e- ]$ h! N) n6 [' }/ q
/*                                                                          */
' f5 @* R# |+ m: [/ r; _( K/****************************************************************************/
! d, e$ B4 a: R( d// 时钟
  d  r1 r" F  Q9 `. |" E#define SYSCLK_1_FREQ     (456000000)
( G; J6 J& |6 Q7 c- a#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
' m: n, X2 Y! Z3 i7 A#define UART_2_FREQ       (SYSCLK_2_FREQ)
* Q& L% l/ m# e9 B9 ?/ S4 h  k" F2 I
/****************************************************************************/
* ~  x5 V( X0 W/ w+ j/ S/ S' k/*                                                                          */6 y' w) n% {0 v: A8 \) i2 u
/*              全局变量                                                    */  i( s2 L) z! p5 p; P. k, I
/*                                                                          */3 U5 B1 D, n% S6 J6 d$ |; x5 O
/****************************************************************************/
+ M6 \  D5 d) j2 `. ochar txArray[] = "Tronlong UART2 Application......\n\r";  j7 B# J4 z# Q3 }/ O
, D3 G- i! U7 M& [
/****************************************************************************/
. a% g6 T# `8 @" V+ m; x/*                                                                          */
" E; f( H: w! |8 d  A% B+ d! W/*              函数声明                                                    */
/ a9 C" _1 R5 u5 w+ F/*                                                                          */7 q9 C0 u( I# c% b6 T6 _
/****************************************************************************/
9 J$ R. u( _7 Q' ~3 h0 z// 外设使能配置; [/ U, C8 ~& o( V
void PSCInit(void);
) q: Z; r; E. C# J" e9 U
; T' L/ v$ w( O// GPIO 管脚复用配置
1 x/ U/ O7 n- ~void GPIOBankPinMuxSet();
4 L' J6 V* A2 G. f0 f% `, a5 U/ u6 G
// UART 初始化
) S0 ]0 L7 B) hvoid UARTInit(void);) x! K2 u0 o5 O  L# _2 w, H- A6 D% h
// ARM 中断初始化
% Y' c4 g# T+ H$ m( g! r  {void InterruptInit(void);8 B& c7 p1 g* x. H2 ^: Q4 P! s* s
// UART 中断初始化
7 l0 b4 Y9 F4 \9 z# P) m; Z6 y. Rvoid UARTInterruptInit();1 P$ b% N# {2 x' F( \
// UART 中断服务函数
1 C2 G$ N; r. k6 Y4 X; D8 ivoid UARTIsr(void);# _) _' q5 O3 \. F3 ^/ q3 j/ e

" H, A( v* Q- P* b9 ?/****************************************************************************/
5 K( m7 i+ i% G8 z/*                                                                          */
( p; t8 }* d6 m" B. E  K/ q" a/*              主函数                                                      */0 L( s5 Y6 ?, Y& X
/*                                                                          */
; t( X' ~8 R5 C. p/****************************************************************************/6 U. _* q3 s  z! _: r  Y" l
int main(void)% o6 k! `: V, P- J
{4 C3 Y. `5 V; _! r: A
        // 外设使能配置; N/ i7 R; J0 ?; U
        PSCInit();! R- F2 J6 Q1 ~* N( B! x  Y+ d; b
       
# @$ x, M% T0 J9 L' b        // GPIO 管脚复用配置
8 o5 j: s7 h# u! Y/ E        GPIOBankPinMuxSet();
6 C) o( e8 r9 B0 R  q" q
* Y& o+ u. K) j! b' D* a        // ARM 中断初始化& L3 x9 d  A1 Z/ b6 V  r0 `! y
        InterruptInit();
' G/ r0 }$ S: i' ~0 ?9 F" M) X$ h5 v3 H5 R0 l: f& Q: k
        // UART 初始化
  q" s8 D+ b1 w6 i, k/ U6 S, V; S, b, G) @        UARTInit();
  L5 z5 w/ t! o+ W: z+ A
# x# K: `; w, ]" n5 Q        // UART 中断初始化7 y4 b0 @3 i1 _6 E, q
        UARTInterruptInit();
4 y: Q4 K& V& P6 _  n+ P* x$ C7 v" W, y6 ~5 N
        // 主循环5 \3 ?2 B$ @' N* ?& Y$ ?3 x
        for(;;)
5 g7 M; S1 m( Y  M& H2 T        {+ _7 D* N5 r( M; \" K- ~4 m
( H# X0 a. ~. l
        }: X0 e6 {# L+ i* k- W$ q9 z$ h& e& X
}
7 Q: d" c5 T! b. C1 G- {5 q7 u9 Q8 S) t! t/ f
/****************************************************************************/: e2 ~0 r6 l! M* ?0 X/ w
/*                                                                          */$ ^8 _* O. \+ I1 H5 I: c( X! [1 n! s
/*              PSC 初始化                                                  */) N( ]* ~9 n) B) g& M
/*                                                                          */
2 Q  ]( I  T$ f  K/****************************************************************************/
0 m5 b$ t, b2 m$ r* T" hvoid PSCInit(void)
6 K6 t6 b9 f8 w0 l{
' a  b- S$ I8 o. C        // 对相应外设模块的使能也可以在 BootLoader 中完成# {, Z: E( L, Z8 }7 @% ]
    // 使能 UART2 模块
+ J/ @* H; H. {+ @- b; Z& y    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);3 `" ^% y; q, A9 k, M% c2 u# Q; P
}
& W- `5 s) u* S! F( Z5 P5 h2 c
/ E, y  j$ q' d/****************************************************************************/
( R' ]5 R0 R$ J! M$ C, h/*                                                                          */8 E$ `/ |; p5 T( P4 J0 O
/*              GPIO 管脚复用配置                                           */
$ I0 [3 g7 Q6 d8 [- }3 M/*                                                                          */
% L$ W. }% Q% q0 ~& i7 x/****************************************************************************/
+ N9 s. I3 e% nvoid GPIOBankPinMuxSet(void)
; s" Z2 ?3 f# R+ z{
% E1 ?/ e; y* |  l- T        // UART2 禁用流控8 @& g  j! d8 I" P' L, N
        UARTPinMuxSetup(2, FALSE);( `. \: h! {) O4 W- \
}1 e6 k- F6 D$ U* T" L
# A& \1 l* W7 R& v
/****************************************************************************/9 x# M* w/ S! W, N, W# m
/*                                                                          */
. _( R4 B' m: }- V/*              ARM 中断初始化                                              */2 o8 K* _+ o; B" p7 A, b; N  u
/*                                                                          */' }$ V/ h: q$ ?1 k5 r/ G5 b
/****************************************************************************/$ r2 e; k  A$ U: T$ n
void InterruptInit(void)
. U. R2 h9 v6 v/ ], v{
" }* b1 n% C1 G" b    // 初始化 ARM 中断控制器0 n0 [7 c; U/ C" Z! u( N
    IntAINTCInit();+ e# Q' m% k  e. U+ w
, Z/ P) P) A) V& k" `4 Y
    // 使能 IRQ(CPSR)
" Q) Y, w+ M7 x- G$ p$ l: g    IntMasterIRQEnable();3 h& x2 K& \8 w: j3 R+ V4 t

& `" M, C0 P+ f    // 使能中断(AINTC GER)
  s# N9 W# W& F" u; }" B4 c    IntGlobalEnable();
- H; S3 I& }' B/ Q0 E2 t" L1 W& o! d" i  s" g' W
    // 使能中断(AINTC HIER)$ H( m7 i/ J- F# Z4 l  e
    IntIRQEnable();
2 m8 S9 Z6 M! r: ~0 Y3 T1 H* Y}
  F* ]! ^, n4 N
6 L& M# b5 J7 r3 v& U  |& k: X/****************************************************************************/4 |. G' K1 v# d, V3 N
/*                                                                          */6 Z. V! G/ Z; ^( i9 o+ V+ G
/*              UART 初始化                                                 */
6 A/ G  H  j* j( R/*                                                                          */6 F# V& R2 Z& Y% F/ N/ g1 J+ W- {
/****************************************************************************/4 ~3 ~3 C8 i' B/ l
void UARTInit(void)
, c: [9 O) E& v' G" p{: w( w4 h: v' V( t! i0 i
        // 配置 UART2 参数
) k, Y5 j8 B3 z        // 波特率 115200 数据位 8 停止位 1 无校验位
) u) [& m1 n* V: i  G5 o    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,6 v' K' R2 b+ T1 p0 a" J
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
2 }9 @5 h4 Z- t9 K7 }1 V" j        // 使能 UART26 S1 ?: R/ Z0 t8 v$ _7 |# [
        UARTEnable(SOC_UART_2_REGS);" h7 p" E8 P7 B" U4 i: |! e& p
" L) n, @4 w) k% ^) U3 w5 s: X
    // 使能接收 / 发送 FIFO6 y  P) N) P, \$ W
    UARTFIFOEnable(SOC_UART_2_REGS);
8 ]$ D1 ?; q/ t! d' t% s
8 Z, x* Q7 [. T3 j* |    // 设置 FIFO 级别. S) a4 q; s" O! L9 J. b, X
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
2 b# ?9 [* Q. [# y2 \5 n( p/ u}) _' C. U1 a3 @

" ?4 V/ W% O1 {/****************************************************************************/
0 e6 ]9 t& a0 y( w/*                                                                          */
1 Z+ B. @% R1 ?- |3 C4 X/*              UART 中断初始化                                             */
$ K' Q2 t% K3 Z% \/*                                                                          */
. L# O; g$ `- v. E' [+ E+ d/****************************************************************************/- b: t9 z3 t, J* \! Y' B! T+ T5 h
void UARTInterruptInit(void)6 n) y  t# F9 ^! @: G9 U
{
% h3 |$ ^8 b, ~7 ~. m; u        IntRegister(SYS_INT_UARTINT2, UARTIsr);
, y" q0 k/ }& b3 c1 V        IntChannelSet(SYS_INT_UARTINT2, 2);
, I; a. h% e. H; Z9 v        IntSystemEnable(SYS_INT_UARTINT2);
/ ~: q- N4 ~- J, P4 S
2 X' ^* O/ g5 m: T. ]1 C8 U        // 使能中断
  o. a( {* z' P$ f! Y) f        unsigned int intFlags = 0;
' `! Q9 T' D: ]  S; i    intFlags |= (UART_INT_LINE_STAT  |  \
/ {: P. }2 j6 V/ A! `5 X+ _                 UART_INT_TX_EMPTY |    \' ^" r2 p* M$ x- y7 u( e+ {9 q6 V
                 UART_INT_RXDATA_CTI);
$ O, R' n, a/ e& K# A( W    UARTIntEnable(SOC_UART_2_REGS, intFlags);
( ~4 x- O  h: [) Z  `}
6 l/ N+ `" R8 p' T: F( @) M, X# E+ j' f, B6 K+ f# Q- C' x
/****************************************************************************/' R! \- W7 {: t, e/ H9 A
/*                                                                          */+ l% }) E$ x7 `2 a- n, u3 E
/*              UART 中断服务函数                                           */5 ?1 m2 }( {( W0 ^4 E. k/ J7 t
/*                                                                          */, b8 g2 e. W( U& P
/****************************************************************************/
" b- a5 u, ~, Q. C6 ^void UARTIsr()$ `5 w- m- {" H
{  H) @+ H1 A; Y/ |$ N2 c6 u
    static unsigned int length = sizeof(txArray);, N9 W6 }/ \7 q2 b
    static unsigned int count = 0;
7 e/ b* l4 n7 d1 Z. ^' u2 a6 b    unsigned char rxData = 0;1 F) |( Q. C5 j( p9 q1 w6 l' Y
    unsigned int int_id = 0;
2 I+ c( ~0 a, I" V8 ~; @, B7 M: \4 z5 A# p. |
    // 确定中断源
3 ?7 [9 j2 }1 t7 @, g& \% T    int_id = UARTIntStatus(SOC_UART_2_REGS);
4 z+ u: d5 I) D# e4 W% _% Y7 B
9 U0 _* D4 I" V) Y" r+ Z. Q; H* l    // 清除 UART2 系统中断
; R/ L2 Q7 T$ H9 d" A/ b8 L5 A    IntSystemStatusClear(SYS_INT_UARTINT2);
$ s! K$ P. r/ r  L) S, o- [( E+ Z+ j9 c5 ~3 T$ U
    // 发送中断8 W6 W# V5 ]& Q$ Y7 o, Y
    if(UART_INTID_TX_EMPTY == int_id)
* P9 V% k% }: U    {
) |0 t, H+ _- J2 f' s! x  V9 @/ u        if(0 < length)
( b8 F! p, x) w' m2 Y) M        {
  u9 b4 I. _+ h' X1 {6 D3 Z+ N            // 写一个字节到 THR
8 D/ x) V$ I$ _- A* [  {% y            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
! Y$ F+ A9 \% }& L! m/ n9 v            length--;
& c& {* m2 N  t, Y* @- q/ d, W            count++;
8 p( S" ]+ |# `5 o        }
* [8 A9 i$ F& v" h. w        if(0 == length)/ ?. g! N  G% U, d' C* }
        {
; W4 R' D6 r$ \. w' ^) k            // 禁用发送中断
! g* b- M5 m% u  ]+ w5 I            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);1 F- P+ M) n. q9 \
        }& c0 K& a9 q0 k8 s1 L
     }( E$ e7 x, ]# c( k) n0 r; B  V/ B( _
2 K$ O' A" ]( j* G+ }  J1 {2 G
    // 接收中断
/ x; Y6 P+ g8 X% P! g1 D    if(UART_INTID_RX_DATA == int_id)
# z' [9 D4 c: ~1 T2 \* ]    {
* t+ F0 q* g2 |& m$ \/ H2 W        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);* s+ `4 A; f/ i0 |$ ~: v& s

, b7 V2 d4 H4 l- _4 `        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
0 [% F, s# \& t6 {    }
/ V) A8 q5 H, Q3 ?9 f/ d4 B4 o% O; P9 C; e
    // 接收错误
3 i5 t$ n: @, k: `  I3 w    if(UART_INTID_RX_LINE_STAT == int_id)
& J, H$ u$ a7 S; S8 _    {* g* }# {- Q% M) h$ p
        while(UARTRxErrorGet(SOC_UART_2_REGS))  T% ^, d' h1 Q, u1 K
        {
4 f! {  S) g) [/ ^            // 从 RBR 读一个字节( F, {5 W5 `) l" y$ f& s  y# J, s
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
; Y1 D% x" ~( k4 E        }
( L( h: r( s5 G) h2 B: k    }
, ~1 ^+ }: \! k# V6 K+ b+ S    1 `, ?/ N2 p6 F  H% w2 C
    return;
+ a! w* u; j( ?1 r}
  H: Z3 r# i7 y. l. ?) y- ]% E1 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
0 n/ w7 D# Z6 j* j如果其它设备快速给你发送串口数据,你这边能正常通讯?
+ e) h" k3 w4 `
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 00:12 , Processed in 0.043106 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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