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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8601|回复: 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, K' n1 Z% |- k0 I% K

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。, t' c! F# O7 O& ?2 t7 _9 _2 @
4 ]' s* a# |+ w6 M, \' X; ]# h0 V
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
# B( Y5 k" c) @2 r0 w; T3 f" p/ T, H
#include "hw_types.h"               // 宏命令
' |6 b9 |1 Z% p8 O#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器$ v8 s4 {$ `. w4 g/ D
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
: y  J9 M. a2 x# O1 z. g* l3 w- _/ c0 P/ z- T* W* C
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明& d+ o1 u* d) g# E% r6 X$ ]
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
, j- ?: `5 V2 J#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明& o( |2 v, N9 G0 Z5 p9 O& \
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义8 C; S: h1 y: d8 J
, m) ~+ G* e' w
/****************************************************************************/  ^; S1 j1 A2 Q; n/ Y: [# p1 G
/*                                                                          */
9 ^0 f# W; }4 d: I. S; Y  o) u8 y6 T/*              宏定义                                                      */. @+ Z; q% c3 t9 U2 `. m# v
/*                                                                          */6 B: F+ T( ]2 u% B, i) g
/****************************************************************************/0 t  a7 o' f9 k: R5 Y
// 时钟. P- k2 P# H$ m0 L/ A
#define SYSCLK_1_FREQ     (456000000)
7 B3 g1 I1 h2 t; D#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
8 z5 a: B% V0 p9 @: N#define UART_2_FREQ       (SYSCLK_2_FREQ)) V( W9 Q9 q& B$ @" Q

  S2 \" ?' a% C7 ?/****************************************************************************/
) s+ v1 K) R8 G0 X6 e/ D+ B: d! P/ X/*                                                                          */
% D2 Y- n, u6 A' n2 C: i/*              全局变量                                                    */
# j3 b! v5 ~% D! J5 N  ?/*                                                                          */
6 s7 n, @+ D3 X. S2 V  d/****************************************************************************/( F  U0 m+ v- y/ @$ G
char txArray[] = "Tronlong UART2 Application......\n\r";
, D7 O+ a  |  M8 @( B
* c. ]2 u5 v8 \. c/****************************************************************************/, i4 X0 S! F, F7 I
/*                                                                          */
. M6 q9 U6 n; G6 l1 s/*              函数声明                                                    */1 N# ?, g1 x/ h4 f
/*                                                                          */  `% D( |0 H4 B) m2 }% `
/****************************************************************************/* F( s; c7 y5 B8 E5 E/ {
// 外设使能配置7 V" y5 T4 s  D. S0 T
void PSCInit(void);
# _8 m' o4 g. R" p( g$ y% U
' n4 `  |# C" `" ?; ?. M4 g// GPIO 管脚复用配置
, V& j6 V( M. V* wvoid GPIOBankPinMuxSet();
: u# \; r5 \2 R/ `1 c5 c& O( l) N& V
( A- i4 e/ J$ D8 ~/ t3 H4 w- @3 O// UART 初始化/ b! V& J* Z1 m# k- c4 ]* R! d
void UARTInit(void);- ^5 A, A- |- E% N$ \4 \* Q4 @. g- n% T
// ARM 中断初始化' O# W+ J2 f, K+ z' \
void InterruptInit(void);
. w1 Y! ~. m! D0 m// UART 中断初始化
) ^# n0 F  }( X/ l  j  kvoid UARTInterruptInit();! l8 f' i( z6 @* s
// UART 中断服务函数' R5 d  q! x9 @) n
void UARTIsr(void);
7 Q: O8 Z  U* s1 T' U
) x2 ^" ]/ o  X) V. |. v7 [, R  `/****************************************************************************/5 h1 |1 S. ]2 O- K
/*                                                                          */; v8 Y0 O7 M8 T# A
/*              主函数                                                      */
9 k& E" @4 U$ O% p1 D8 I2 u4 C! }/*                                                                          */
& Y4 K( b3 S* z/****************************************************************************/- i' G/ N8 R- G/ m1 j2 D
int main(void)
) k* d* j  a! A# ?8 r" l. c{( }& ~5 d/ S+ R' s2 x% Q& |
        // 外设使能配置
" [; g; C8 T( D' [. _        PSCInit();
+ z' v+ ^' g% r' [) m: {       
; D% s! m: \: A        // GPIO 管脚复用配置/ t+ B  S/ p& x
        GPIOBankPinMuxSet();
8 k3 Q& `& o: h3 B4 S( |0 H0 s. c" a/ U* F$ A( d. Y  K" c, S% y9 W
        // ARM 中断初始化
, ^: {# _/ U& f) n        InterruptInit();& N  ]4 P& w) s1 F& Y
5 s* m% ?2 o3 c+ t) ~+ h1 C' y
        // UART 初始化. g1 T. X9 k/ k$ n. c" k
        UARTInit();
( U; i; J# a# l4 \; e5 j5 D, n) X' s. E% z$ U0 p# q- v" s) F
        // UART 中断初始化
: j% z* m& A" [9 k" V' q        UARTInterruptInit();& S! U, G5 P9 _) I* Y8 ?
7 @6 `5 Y2 J' o! F. X
        // 主循环1 `% r- j+ q" f8 S: S9 U, \
        for(;;)
# k" `/ R; c1 L3 [' P        {7 _. W% m( x) K7 l0 r' m; J' {
$ E/ j* @2 P) l" K* g4 k/ R
        }. _0 k" H- J5 d) c8 a" q
}
  ?, b) w- I2 L* k4 h$ d' h2 _* z# r7 B( w" Z5 k
/****************************************************************************/
+ o  J1 P' U7 c8 f# o/*                                                                          */
! Q, V& w% i' B0 t( f4 D/*              PSC 初始化                                                  */
8 z* y( T$ o% i- N4 l% \4 E/*                                                                          */
. W& }. h  U6 _/ `1 p4 A4 z/****************************************************************************/
# a0 F$ T" R4 C$ w& l* G% svoid PSCInit(void)
2 D, [4 z, A* X3 V6 j{
( b; B# z  T  x$ x. t/ n) R. g7 t! T        // 对相应外设模块的使能也可以在 BootLoader 中完成0 L0 N% g, `7 j
    // 使能 UART2 模块
5 G/ @7 ^7 y& [6 d    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);3 F  j, [4 u# Z4 K6 C
}
0 l" N. P- P/ T4 \1 C- S0 o# N# Z) B; V) ]
/****************************************************************************/
+ u0 K. J4 r5 `- C/*                                                                          */
, k5 _' ^; g; I8 {3 p1 F* x/*              GPIO 管脚复用配置                                           */
" J5 q& {6 [2 H# }/*                                                                          */7 c' a, a+ w/ [+ X  @8 q4 J
/****************************************************************************/! c; B  b. y4 ~, @: `* x6 V
void GPIOBankPinMuxSet(void)/ Z* ~* G% ^5 K; D7 u7 g2 Z
{" q) _* p6 V/ Y- Z; ?# }4 k7 t, G* g
        // UART2 禁用流控4 e2 j& x6 M0 v7 Q( Q  u2 r
        UARTPinMuxSetup(2, FALSE);
6 v' A3 A! l& P" U+ c8 C6 U}
! z4 h- Z; U7 m$ b" q/ m. X6 \# R% l: Y+ O1 [/ Z2 W
/****************************************************************************/
( j' _2 r! c4 U' ?8 {) Q/*                                                                          */
2 A8 e$ Z3 ]- Y1 {) t! g6 i/*              ARM 中断初始化                                              */
  @6 ?! M6 F) |2 a; D( S* P/*                                                                          */
' Y& ^4 {' X* V/****************************************************************************/7 B' S% P; g8 N9 ?# }1 [: G! _
void InterruptInit(void)
: i* D+ U* W: J  B4 d{7 l& p# Y% h# b; ]) T& K, w
    // 初始化 ARM 中断控制器
7 ^* r9 N$ X7 Q0 ]' N0 }    IntAINTCInit();
, I- b1 F, p0 |# ^3 Z" Y" @8 S7 w1 R# ]# R% ]& F8 o
    // 使能 IRQ(CPSR)( j  c* a9 X. _# u$ W
    IntMasterIRQEnable();$ T8 v. N! F& q+ C* u4 A% W0 y

: K% M; a. H* G. g, H9 `0 _    // 使能中断(AINTC GER)
  }7 h1 K/ M& x& \7 |6 [    IntGlobalEnable();
, t8 u( z% k" Z6 c' q) L3 {1 A1 O$ w( n: n( z8 W/ O
    // 使能中断(AINTC HIER)
: ~+ o& q' b2 \5 O; `    IntIRQEnable();
2 ^* m9 Z1 w  O( E( @4 [1 U}) E" K2 V. N1 m; L1 O; _

5 L+ F" W+ W& P2 k: e5 X; Y) E, `/****************************************************************************/5 f. w. t0 w1 @/ X, I( Q5 f2 X
/*                                                                          */
7 E9 L5 W+ x( R  ^/*              UART 初始化                                                 */
5 V- X. N8 {2 q/ [# ?, C* E* R/*                                                                          */% p9 r- V" O1 l% [5 e6 C
/****************************************************************************/
3 ~  n! u/ X+ Pvoid UARTInit(void)6 ^* _0 D  {$ @8 Z2 m4 l
{
. |( ^( ~' G3 ]        // 配置 UART2 参数
) O( U- q7 X9 R8 L( W6 u        // 波特率 115200 数据位 8 停止位 1 无校验位, y: n) \2 D. X/ U2 [
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200," ]& E/ Z, g! ^5 W
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
' E0 Z1 t% N2 ~3 U6 ]        // 使能 UART2
" a  U& B5 z0 x: t; {0 c        UARTEnable(SOC_UART_2_REGS);) E$ s. I! h/ i
  X# a5 }3 S0 a% P+ ~3 g
    // 使能接收 / 发送 FIFO  p3 p& p5 p9 ?& i% z
    UARTFIFOEnable(SOC_UART_2_REGS);
* c% @0 G8 Q- Q. \. w# }* v9 W' F9 P) |/ R. j1 t4 {& c1 ~+ C: {" g7 T1 o
    // 设置 FIFO 级别
" m* J8 V8 a& F/ ]8 s    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
, o0 f0 w: \/ C2 y/ E7 g6 [}
1 `: I1 u' u# H# Z7 I, n( {3 n
8 j7 x5 j* g# E" r' z, ^  a" K/****************************************************************************/2 a7 u- S8 e8 H' P6 \
/*                                                                          */
$ z) f" m0 d9 ~3 u6 R/*              UART 中断初始化                                             */" e2 k( ^" D4 E( L
/*                                                                          */
+ H& _$ w3 {& S( b7 @/****************************************************************************/
3 o4 C5 _( \6 j) ]void UARTInterruptInit(void)6 O8 D* j+ h+ z! B0 d
{
5 n9 ?/ w( y) Z) Q# C. P  R' G* b0 s        IntRegister(SYS_INT_UARTINT2, UARTIsr);
. q' G# Q( G0 ]6 T; n$ e        IntChannelSet(SYS_INT_UARTINT2, 2);: `1 P5 O( r" [
        IntSystemEnable(SYS_INT_UARTINT2);
& k3 Z  C) r& b% Y4 b6 x/ _6 \' F
. v8 }, g/ I% _* ^        // 使能中断
4 z/ q: Y% u' v; k        unsigned int intFlags = 0;
0 }8 ]" @, v( b6 s- S    intFlags |= (UART_INT_LINE_STAT  |  \% x8 X/ m4 n7 T8 O$ T
                 UART_INT_TX_EMPTY |    \2 N* B7 V) E  ^( @! Y( B1 T
                 UART_INT_RXDATA_CTI);+ O" N/ |+ ]/ O
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
% ]+ r8 u0 ~/ ?4 l}! D! a9 L. `  t$ s0 y) ?% E4 e

( d7 X* A& b' k$ t/****************************************************************************/
7 Q6 W2 R' i9 K9 ]2 {6 E/*                                                                          */
7 ?. H. X$ b+ o  T" k) I/*              UART 中断服务函数                                           */, z8 E; e1 a( d4 s
/*                                                                          */
& Z  h# d& R% a; x6 L0 ~' f* B/****************************************************************************/
7 ~' x2 r3 z- Yvoid UARTIsr(). j$ ?; [9 P" R+ M* b$ {
{8 M- O/ K' s3 E) |
    static unsigned int length = sizeof(txArray);! G) N! B, x1 d1 J* \3 c
    static unsigned int count = 0;
$ R- t! j, u! |    unsigned char rxData = 0;- v+ x9 p; b% n
    unsigned int int_id = 0;- Y7 ~+ K4 ]5 M2 U

! a( @& R5 m& J, c2 K    // 确定中断源
% V8 f& S8 C: v9 T+ i    int_id = UARTIntStatus(SOC_UART_2_REGS);
; b' I& A/ N' r+ |9 E
0 u5 `! j. ~& ^9 t% p1 v+ k8 D    // 清除 UART2 系统中断
3 W6 u; s3 O% Z0 M    IntSystemStatusClear(SYS_INT_UARTINT2);
' l& ^5 `, x0 A6 b3 f& D0 g+ H0 n- o+ M! _/ ?
    // 发送中断1 _  @$ K8 g9 M* L6 a
    if(UART_INTID_TX_EMPTY == int_id)6 }( `9 |4 q" k3 N1 m; a# G
    {
9 f  C1 x; C; a: o# W7 y8 O        if(0 < length)
" b$ G; }4 j- G. [0 q, |        {
, m' R; H; X6 ?$ ~# n1 ]            // 写一个字节到 THR. d- h" |( E$ a1 s$ }
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);7 l" V1 E) r& [8 \; @
            length--;
+ _9 s7 `4 w) A            count++;% D0 w( w3 u5 ?' ^5 V  D* y. q2 A
        }
+ D( [3 b2 Q; U        if(0 == length)& y% w. t& E# ]8 `0 C5 y2 g
        {
  a/ A4 J! V' ]0 S            // 禁用发送中断, H8 t3 _* ]$ h8 Z9 H
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
+ z; [% M7 K' S2 I        }
2 s& L4 f4 ~' D# k7 y# T( ?! W     }
4 l" e' z& }$ G' s3 N& Q( Q1 _9 Y: P: T/ D
    // 接收中断
6 I8 k5 K6 q% X  y4 h    if(UART_INTID_RX_DATA == int_id)" l6 x. X0 o& {6 l" K
    {5 E! M7 K: B% u6 J% Z
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
7 }4 g7 I3 S5 k2 O& _- Z: p! ~1 D; x, w2 m! c( s  S
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);2 m: |; |& Q7 K, T
    }5 w) F9 P: x* g/ P
2 L# h+ p8 {/ U3 T& c6 U
    // 接收错误; a. S0 S. j; R  U- Q3 R  `" y* w
    if(UART_INTID_RX_LINE_STAT == int_id)( o9 f0 u4 I0 x2 l  X' @, A! M$ N
    {
1 K1 k7 ?' P% Q1 b9 J" F' T+ U        while(UARTRxErrorGet(SOC_UART_2_REGS)). G7 @# d7 u1 @; L1 R
        {
" O/ V" {- q: K; {4 B1 T            // 从 RBR 读一个字节
0 w' p9 d7 x, y' ^            UARTCharGetNonBlocking(SOC_UART_2_REGS);) Z& F1 ?1 G/ b9 ]3 U+ c0 C, n5 V
        }
/ o4 N7 i: j" u' b- H( N7 ~) `" p    }1 _) K/ _! h5 n, T* d' Q7 t% d  O
   
( q6 h  f  B& i: |" w; k" H: Q    return;# z# R* ~  a9 Z% c0 T
}
: a4 C: y9 S: Q
回复 支持 反对

使用道具 举报

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# w2 y# u' F- y" X% K0 v
如果其它设备快速给你发送串口数据,你这边能正常通讯?
/ A  L8 _3 u- k; x3 S  N
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-10 02:37 , Processed in 0.046461 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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