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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7793|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。6 T" @. q1 L7 H! D! A

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
+ W4 `) @) j  K; J7 ~, u  I% X& ^% U0 I8 j( g- y9 c, M4 d
#include "TL138.h"                 // 创龙 TL138 开发板相关声明% n! k  J6 j8 e7 L* m: O
! p, G# T# e! P, z; |! w
#include "hw_types.h"               // 宏命令
$ E5 o! g% s5 `; O* `( R#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
2 A. K( }8 e5 E3 n#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
1 R+ g; J; v# l, }/ Y. J8 m- U  k- B$ F9 h
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
$ p  T0 R) [0 y/ d#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明  j$ z; {0 D7 W4 j: R8 C' [
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明% S- s+ e+ g* Z8 N* x9 `
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义5 }4 c5 P0 {3 F7 Q/ F
: A  n! `  T6 P% E: s0 ^5 c- \0 b
/****************************************************************************/5 k. F7 X8 m9 Z: V( V
/*                                                                          *// s4 z% k% N: @
/*              宏定义                                                      */
0 |' @2 E+ C# _4 F% j  Z/ f) A: H/*                                                                          */& R: @/ v: K4 ^7 U' o1 t
/****************************************************************************/
' f+ p8 l! S' o' }" ?// 时钟  L5 z- {. g9 q6 I& k' P( w
#define SYSCLK_1_FREQ     (456000000)
$ D7 C0 y. N6 {. z#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2). m) t# t: h1 a) F. K' z/ l% Y
#define UART_2_FREQ       (SYSCLK_2_FREQ)
- ?  x. p/ E: M8 ?* J2 u6 C: a% b: N8 S3 L% {+ L0 y0 {
/****************************************************************************/
! \  W8 e% {) W& c/*                                                                          */1 s0 f4 S% k* G3 t! r: d
/*              全局变量                                                    */
& k, t+ w& O- c1 i4 O0 W/*                                                                          */6 d6 u  F1 S: s" W- c# U& q9 Z
/****************************************************************************/
# l0 K# p/ g" V0 E+ E! `char txArray[] = "Tronlong UART2 Application......\n\r";$ B! {# x2 \, D  G1 z7 I) w

5 u4 ?6 [+ m# C' d) z/****************************************************************************/
% h! o. J: {0 \3 c* [3 d+ b4 X9 D/*                                                                          */7 r0 I+ K& b" z9 E7 W4 W2 V
/*              函数声明                                                    */+ {. \! p# }. t' U
/*                                                                          */4 n) v6 L# h, H: w1 G3 o2 C; e6 r
/****************************************************************************/) K: e# u: c5 Z+ @$ @9 S, i2 l
// 外设使能配置
$ z1 j" P1 |6 d3 \4 L5 d* wvoid PSCInit(void);
( ?2 O, F0 Y0 S' t. D
0 h/ K7 i$ |2 q// GPIO 管脚复用配置
5 D- |9 S' A' K+ U4 N( Nvoid GPIOBankPinMuxSet();
- L! P; l# K" o) @: K7 w9 x
. ~( e( r; @' y% _' Y* z// UART 初始化
0 w  T- k1 n$ @  Z( A- dvoid UARTInit(void);
. J7 `7 Y4 h! d: K% l& `// ARM 中断初始化
" W1 H; O5 t- r2 h+ Fvoid InterruptInit(void);( }! P, v/ t) T7 @+ U
// UART 中断初始化
6 z: o5 W8 e1 fvoid UARTInterruptInit();; C; f  y& _' @: z. p
// UART 中断服务函数0 S' N3 q+ p4 R. Z: B0 E2 O
void UARTIsr(void);
3 H* U$ E/ i4 A( X" f7 ^: k( X' k! u1 N+ _  S" x  D+ t
/****************************************************************************/1 D& I. `6 g& f1 p
/*                                                                          */
# [* c/ l" `- v+ g+ D/*              主函数                                                      */. b8 l5 J0 |: |+ ]
/*                                                                          */$ A8 @' g' h( G0 p- e3 w; Q) B
/****************************************************************************/
8 V5 h' W; p4 f4 b3 E: O3 @int main(void)- }; N$ ], W1 H/ I& }. q8 k; Y" _
{9 N1 K" ~& @$ W7 y1 M6 N0 ~& y
        // 外设使能配置
9 ]4 t$ o3 p; D6 a$ `# ?/ m: q+ m        PSCInit();& R  q/ r* F0 r
       
9 X; c1 M9 c# I  H, t        // GPIO 管脚复用配置3 u! W  S! l( c& k. ?
        GPIOBankPinMuxSet();
: p0 l: M) G% _( A- \1 T
6 g: F2 E) e4 O, i9 O# n8 C( R2 L        // ARM 中断初始化
# \8 t/ T) q& h0 w) Y3 w2 z        InterruptInit();0 `( A8 y4 u5 w+ ]8 ^7 n+ {+ q2 o+ F
# j* z7 G; k0 i4 [# s( h
        // UART 初始化* o9 N3 y% R" b/ t9 s8 [4 P3 y
        UARTInit();2 m, k; T3 D' g% `

- ~2 g+ ]7 y: s( v        // UART 中断初始化
7 t( [) \) B3 O+ l  D        UARTInterruptInit();
" i* C- y. D$ o* S7 f. ?/ R) D+ _# [( l- q, s$ A3 B
        // 主循环4 Y( B9 C7 I7 A$ o
        for(;;)+ I5 Q* h* ?) r9 `; S
        {
0 P2 l- j( P; a" r- {1 Z' l7 D; d  S2 E' `$ j9 W: C0 v
        }+ c7 k. u7 }4 t# f2 I' {
}
, ~- ~( D7 g8 t8 q/ I/ i
1 W" A, U1 v" C4 h( O5 n4 J; t/****************************************************************************/
% a! z' y( A! F, X* m) ~/*                                                                          */
1 X  G+ f1 m, z9 @. G( q2 \% X/*              PSC 初始化                                                  */
# Z2 {- Y! K: }% u! {6 ~5 J/*                                                                          */
' O4 r+ W/ X  ^7 x) A/****************************************************************************/& o+ G: C/ ]) c/ u
void PSCInit(void)
1 E. g$ W, u0 N, M4 n1 i; L8 {{/ y" x- O  p8 n3 b8 v; D2 H
        // 对相应外设模块的使能也可以在 BootLoader 中完成" v; Q6 W$ i6 `, Q3 F' R! N
    // 使能 UART2 模块$ b1 w, [8 q) X- o. Z$ d
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);6 S8 a, u7 M1 X3 S. c
}+ D9 D7 ~! q0 G, V4 {$ E

$ B* z: ~6 O! G- R! Y/****************************************************************************/9 S* |9 W1 z) N$ d* Y
/*                                                                          */
" p7 d/ {" _3 g( r$ M2 P/*              GPIO 管脚复用配置                                           */: H! b1 w1 h8 p1 r+ {. W" e- T
/*                                                                          */
8 `9 h- K2 ^2 ?4 d- K& U' c( A7 M/****************************************************************************/
1 w; I& k! N, O6 G  l  b* C% @void GPIOBankPinMuxSet(void)
$ ]* R2 q, L1 ?$ e3 ]  H{/ e: N( h1 x9 X8 v# N- m/ p
        // UART2 禁用流控
1 s; p% z# r- D2 s8 _        UARTPinMuxSetup(2, FALSE);2 ~. a: M# E( s4 m8 O  m) W+ D
}
# h# l' c6 \1 s+ t6 u# y- }3 Q* k# e
, {) p+ d: {' N) c, T4 K8 h* f: f/****************************************************************************/
7 n' J( E  T, f. X  u% G/*                                                                          */) y! m0 Q  r5 l& A$ o$ ~, I# F
/*              ARM 中断初始化                                              */
2 q* M) E4 o! ^/*                                                                          */
) T$ ~% o/ {7 K* i* i5 p$ M& z/****************************************************************************/' j7 ]" @* {' a' G) q
void InterruptInit(void)
2 M$ \6 t. P4 @' w{. ]9 ^. ~* u0 j6 y" o
    // 初始化 ARM 中断控制器
. b5 K& H" w% L# T9 c, r6 ^    IntAINTCInit();
+ ~$ S+ i4 l) P* P* f, o  F0 j( ]# f; H/ H7 ^5 Z& l
    // 使能 IRQ(CPSR)
8 h5 q6 ?$ V8 J$ S    IntMasterIRQEnable();7 b* u2 }5 @' k, p

% Q1 v; X% a! J3 [: G- A    // 使能中断(AINTC GER)8 L8 T& I- T* q) i7 ?
    IntGlobalEnable();
: N( a/ A: \( L% p" L2 O7 @7 y/ P
    // 使能中断(AINTC HIER)
# L4 O! b+ \+ R' O: s    IntIRQEnable();
1 c, V& O- ]# g% v0 V}/ e+ U: h4 m6 H3 F, F( I. ?

- C" U8 w& `, o/****************************************************************************/
$ R5 P& x. f' {' @. B/ Z/*                                                                          */0 T' ]9 f" ~# ^3 x
/*              UART 初始化                                                 */) \2 z7 [: |% B' W
/*                                                                          */) H: w3 H0 {) C) j
/****************************************************************************/7 V8 J# e3 h) ?* @' f" E
void UARTInit(void)
* ^# ]4 P9 b' Q) T{
; \* t& J. ~8 x7 q( B        // 配置 UART2 参数" c, t! ~7 [9 f! }1 j5 V4 I
        // 波特率 115200 数据位 8 停止位 1 无校验位, y' s+ F  l5 B/ Y. W
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,' e3 ^- W8 t# a" p
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
4 ?2 l$ S' b, d  z* j        // 使能 UART27 \& n7 Y2 L3 Z  N5 y; S7 a  s  d: W
        UARTEnable(SOC_UART_2_REGS);
0 c  J) b& X/ ~0 Q) q  k
- }; y# T% D: \! x( ?2 l3 p    // 使能接收 / 发送 FIFO# e7 r( n) z8 j! U7 X# B
    UARTFIFOEnable(SOC_UART_2_REGS);
0 c( `, e% S0 ?) c* s- `: ]7 K: g8 B0 I0 v
    // 设置 FIFO 级别
) V5 v1 l. t7 J" X* i* y3 m$ Q    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
/ j5 a: R$ V  r5 Y1 d}6 z! s8 \% E  i
" _1 J; B% ?; j+ @, W
/****************************************************************************/+ @4 ~4 b1 I; r- M2 ]
/*                                                                          */
2 \5 \# X, j5 H/*              UART 中断初始化                                             */
) o. a8 f, G! B9 x6 ?9 j' H/*                                                                          */7 J- }# T' h4 h
/****************************************************************************/
3 E. _. g0 ^/ {7 U0 ?3 V2 z+ {' G6 h$ bvoid UARTInterruptInit(void)
2 y8 {  j; W  u) z/ c{8 f. b" \7 l% S# i! T
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
! K- g) W7 G; |7 F        IntChannelSet(SYS_INT_UARTINT2, 2);) \; f# M5 w8 K9 a; M$ q5 s
        IntSystemEnable(SYS_INT_UARTINT2);
/ d- S* J3 L- b8 u- t( Q+ q' O$ r
) b9 \" I8 o* k! b        // 使能中断
+ c: j( R2 a5 h  O! x, V        unsigned int intFlags = 0;. I; T( z3 ^4 A+ U
    intFlags |= (UART_INT_LINE_STAT  |  \
5 K. P. D( ~8 Y0 C  w                 UART_INT_TX_EMPTY |    \; n- @- ?! v) i
                 UART_INT_RXDATA_CTI);
8 R6 j) G1 E! C% e3 U5 _  X    UARTIntEnable(SOC_UART_2_REGS, intFlags);2 _7 |. ~4 z* Y4 x9 H. G
}
. l; U* K) W5 d, {; w0 E- c# c, ~% j7 ?# l" M* c
/****************************************************************************/
! K. H7 v5 _8 ?5 a+ i/*                                                                          */) G$ M1 [: |! @2 V* Z
/*              UART 中断服务函数                                           */
* c( X5 d7 R& i" Z1 Y7 N' v/*                                                                          */2 Q5 {( i1 u% i7 M+ G8 p. T
/****************************************************************************/5 m3 @% L9 Y  W3 Z
void UARTIsr()" W# [& b: b+ h  b: M8 K" j9 @* n
{) V+ F8 K0 I' R- a3 [
    static unsigned int length = sizeof(txArray);
- p7 M9 \6 v% O# u! u    static unsigned int count = 0;( V) t- o5 w  [! k
    unsigned char rxData = 0;1 }) B0 k! b+ O9 r( s1 @
    unsigned int int_id = 0;2 O5 ]1 A8 M" e: @; k$ y( t
  k3 j8 ?% V7 i( z0 B4 Z, Y4 p
    // 确定中断源/ \/ x& ?! r# ], T% x  m, m1 d
    int_id = UARTIntStatus(SOC_UART_2_REGS);4 e/ w9 Q2 l9 c/ E6 T2 A: X
: w8 F; }! v& T( A5 {
    // 清除 UART2 系统中断
! r, S" @6 {' U  |2 u0 V( s8 C    IntSystemStatusClear(SYS_INT_UARTINT2);
5 B& o$ A2 _, `( w! \$ ?* j9 r+ Q2 L. J7 n4 h, j
    // 发送中断
( R; g  a+ x+ z% a* E    if(UART_INTID_TX_EMPTY == int_id)
& v6 I& t& ?3 y( c* w' N    {
, c9 X$ N( R  J- ~( U        if(0 < length)
3 j7 ?8 d: r' e% H2 Z3 L        {: M! A( R/ O- {) w9 n
            // 写一个字节到 THR
3 p8 [& f( ~, z: `2 p! n            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);" @' C$ I7 ^8 X! W
            length--;
- V6 ~% {. W) f. g; }  L            count++;
1 e6 C, I4 ^1 S1 c5 w' T        }
9 s6 {9 _0 i+ b9 Y( _- u$ U8 S        if(0 == length)
& x( w$ |8 O1 K0 [        {
! G) g% R& L" R( x2 |$ @; R  T3 q            // 禁用发送中断# n+ T6 b3 q+ L2 A# ]) s( m% M* B
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
2 C" A- y& a7 l( I+ M' N        }
+ U, {4 P0 ?5 U: B     }
+ ?/ ?! y0 O9 t3 u2 q6 @5 _
5 E$ M2 J: [" B3 H* ]3 H' @    // 接收中断4 X) O) P# f% B) \
    if(UART_INTID_RX_DATA == int_id)! s# C/ W5 l2 t
    {  m- Y  J6 S; V1 U
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);  b; g, ?6 u9 c) {6 N3 h; w+ x/ K
3 k0 Y# R0 v. r$ S2 d# g1 |) e  `
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
$ U1 c: A2 i! t    }
  P$ U( m& m' [
/ o& ?+ \1 l5 X    // 接收错误# X3 h0 F/ m, v4 b* Z/ n2 |1 E! ?3 i
    if(UART_INTID_RX_LINE_STAT == int_id)
$ i" |- N" S% o/ q2 t    {
/ p5 {$ `6 _. c& A" y        while(UARTRxErrorGet(SOC_UART_2_REGS))- Q$ @2 |3 G5 z" ~7 W+ t# ^: ~
        {; u. D% d; E6 O8 Y$ P+ v$ ]$ \
            // 从 RBR 读一个字节1 Q% P3 F* [' D
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
6 }- T  h# W6 N        }% T4 I9 X# c4 r& a* |" @2 w
    }4 s* k3 w+ k  H& C& [' y. T0 A
   
7 x+ V0 }0 o3 {* ?. G3 h    return;
( Q) M7 o& S& A) R}8 }& U6 D; m: G
回复 支持 反对

使用道具 举报

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
* w$ R7 y7 l# E# i如果其它设备快速给你发送串口数据,你这边能正常通讯?

4 w! W- a  ], X( G谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-16 02:07 , Processed in 0.047445 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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