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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5599|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。/ [  i" o- q& B& T2 l( E' S

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。3 B/ f2 M" s% u3 e
; a+ E4 i- s( L/ S2 d3 X; P. D
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
2 y+ ^, V$ U4 {4 @
# y; k- F0 B9 I5 b; |  _1 O( a#include "hw_types.h"               // 宏命令
. R' k9 \; q3 z; y+ m- ?#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器" g+ G7 q% x& ]6 _
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
: m, w% A4 v0 x0 h% q' t# t) K) r# X# e) n* K1 E8 I
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
7 F' M5 V5 W( W+ M& F# }, m- d#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
' ]; U2 v; }6 t% @2 P% m#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
% K8 l" X9 r6 q$ u# K. ~$ M: O#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义* ?" [/ `+ g* D  N* {

% o1 Q  l2 @( c( B. h/****************************************************************************/8 X/ F9 a2 P# d/ i6 j* H) p
/*                                                                          */
- D& |' i  g9 @* i0 y/*              宏定义                                                      */1 r& |7 T' h' ?6 T
/*                                                                          */7 o! [- c( l8 z9 x
/****************************************************************************/; l2 t% l. Z$ H( d
// 时钟
$ @3 Z, Z3 i' s8 Z#define SYSCLK_1_FREQ     (456000000)
) F, u6 y! I7 V2 \#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2); l# g0 I+ r# x4 H3 X
#define UART_2_FREQ       (SYSCLK_2_FREQ)
& i$ [" k. h: b+ r' f& B* S# _' R2 N6 C5 ^. E" ~2 {9 Q9 V3 M+ N
/****************************************************************************/
6 L3 G# T& A' R% G' g/*                                                                          */
; k: ]; Y) L! K/*              全局变量                                                    */- N) |- f1 C7 P% E  b
/*                                                                          */# T, S3 P+ ^2 z( ~' D& o
/****************************************************************************/
1 N. a9 q) a' @# ]/ ~8 [/ s; g7 D& Jchar txArray[] = "Tronlong UART2 Application......\n\r";
4 @: |  ~; r: i6 Q% W$ q) w- O* P5 h5 w7 u" K7 D" t0 y" b; q
/****************************************************************************/
1 T0 a* R; P8 b3 m' v/*                                                                          */
1 l3 {) h$ s( r; ?; T: I/*              函数声明                                                    */
2 h+ R- j5 |5 q5 j1 H/*                                                                          */
) r2 Q- n5 e3 G. i* U/****************************************************************************/1 U4 f5 I! }$ j0 w! `" ?: ^, [
// 外设使能配置
8 P1 @5 \* W/ bvoid PSCInit(void);5 _1 X+ M! l  b! o/ i
; G! w% m7 c( n$ }8 h  o' {: ^
// GPIO 管脚复用配置; @# F. n& V: w9 E. k) ~6 L
void GPIOBankPinMuxSet();- b+ e; F5 q/ U9 }$ b6 }
0 k" H9 z) o1 i. Y; a; A
// UART 初始化
" K" A  Z+ K, u! v6 ~) kvoid UARTInit(void);
  c, Q5 n) j# |2 V; H. y: T$ w5 P3 C// ARM 中断初始化6 U; Q9 ]! q. Y( _( H# E* m
void InterruptInit(void);
& C9 k- G. D' a// UART 中断初始化/ W8 q6 O9 W2 p
void UARTInterruptInit();4 A* P# W4 K. N: ?: N
// UART 中断服务函数
+ U5 x6 U4 `; w- vvoid UARTIsr(void);
2 B; `- j0 h( i" s* v& D/ a9 s  c1 C4 j* X! q3 \
/****************************************************************************/
) T6 d4 E# K+ X; k0 L# H/*                                                                          */
6 O6 ~3 d& d. r  y* V7 Q" k/*              主函数                                                      */
) l5 s# r; T4 u( C! ?+ I/*                                                                          */# ?4 y7 _$ c) Q0 `; C
/****************************************************************************/
$ M# ]  ?# Y) w5 h6 Y3 Eint main(void)) v1 D4 {- M. q5 W- `
{
, N; z: J1 {8 q        // 外设使能配置! g9 I; W8 Q) V4 J9 @7 |* {" s
        PSCInit();/ z6 }) i* J& g) C) U% m6 D5 {
        5 X" Z& {& p$ a7 K/ h
        // GPIO 管脚复用配置/ a3 i; H+ K0 J
        GPIOBankPinMuxSet();: ]- D" b1 u8 a

) I0 d& w6 h; d" ~! S9 U        // ARM 中断初始化, M$ V- I4 ~+ F( u6 m- L/ @
        InterruptInit();  V4 d; i  o* [( V
& N: Z& M2 X4 P0 ]
        // UART 初始化
$ L2 g$ Y& O& `+ ]        UARTInit();* Z0 n( n/ B- [8 I% O% p+ o

7 W- C- S1 q& [+ {* |2 j        // UART 中断初始化
9 C2 A) q6 |: s+ P" u/ h        UARTInterruptInit();2 g4 V$ S8 j  H5 Z' ~, F! o! r! W

! g5 y* }2 }7 h' A, G1 I        // 主循环
# v/ j+ z' M9 P5 t& e  ]        for(;;)- d& p) ~8 Z) b9 Z4 k! Y& }2 \
        {8 m! F: p$ M! y; m& C4 _& z

  k1 A8 c3 M$ [$ D        }
, k0 C. U3 A' z; h! Z9 |* B5 U% s}
8 \, Z3 h$ l+ t" W+ r1 \" i4 `  r1 V( u
/****************************************************************************/
& s4 F; f7 m+ L* B. [  O, p/*                                                                          */5 ~' A" I0 _& w( v/ ^5 r0 _
/*              PSC 初始化                                                  */
  r- y2 w1 F) W- l  N/*                                                                          */
% D5 P9 ~) F* F+ d/ x3 M1 B9 c/****************************************************************************/) G0 @( G, d9 ~, ]8 g
void PSCInit(void)
4 W3 p5 Z3 e1 H0 x9 j4 `2 f) g{
+ V9 [  W- N1 h2 \        // 对相应外设模块的使能也可以在 BootLoader 中完成' [/ ^) P1 m5 {9 Z) f" {1 Z$ |
    // 使能 UART2 模块5 m8 j9 C) U$ j$ ?/ e/ R0 q' l
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
7 t) G; a1 `. X! F}
4 z; e- N1 ~1 ^0 d3 o6 }9 T9 j$ p, j& |6 K6 ?
/****************************************************************************/
+ e0 t1 L- Q, d1 ^; L% R/*                                                                          */4 J6 h, x5 P0 X2 N
/*              GPIO 管脚复用配置                                           */
: h# q9 j# D) h) Y  e- P0 ^/ V$ O/*                                                                          */
' i/ x2 _! w, t9 r' ~1 e" P; m/****************************************************************************/
2 V! T) F( w0 J6 D3 l! J: U; Nvoid GPIOBankPinMuxSet(void)6 \$ z; u( _* Z1 N
{7 `8 k/ H/ i8 z0 X) z
        // UART2 禁用流控: W1 ?; N3 O& B# {% p1 A# [0 E
        UARTPinMuxSetup(2, FALSE);# T; k( |  J5 Q) `& D: u
}
3 \2 \. v, c) O. j; Z  B, u) T$ q' ^& ]# P: R& D: g( X% G1 N+ O7 A
/****************************************************************************/
2 T# D9 w: ~. J% A% r5 y1 O/*                                                                          */
, y, `0 T: V: y6 g. c/*              ARM 中断初始化                                              */6 f0 y/ m, L2 {$ t7 T
/*                                                                          */% W) x/ v  _, `3 ?/ I
/****************************************************************************/
6 f1 V. G* ^8 ?8 Pvoid InterruptInit(void)
4 h' I4 v2 ?( @( I9 M* @{( T  K+ K" |0 I, t( a, v
    // 初始化 ARM 中断控制器2 M8 ^' i' d5 p% }
    IntAINTCInit();
5 o  v: S# h) M: q/ R# |& j7 Z
6 X! }- b  x& g- N9 \: l! n    // 使能 IRQ(CPSR)% L7 s4 g$ S- b7 _0 Z
    IntMasterIRQEnable();
' q3 m4 q7 t$ n+ \' E& a) B! A. z. U* `/ M5 T
    // 使能中断(AINTC GER)
  G- \( h, ]. Z4 Z    IntGlobalEnable();
8 c  Q) R; {  s: |" _0 R# \$ d
1 z* w4 ]; ?+ X4 P9 t& l    // 使能中断(AINTC HIER)
' h6 m" R2 Y; @/ K. e    IntIRQEnable();" o1 m. F  d$ ]1 E% F( ~
}
, N( J' i; @$ j9 p% j' W6 y# T  T: W5 ?9 q, U" G
/****************************************************************************/
# Q" o: e4 l, E1 c3 J5 u* x' S& e/*                                                                          */
- ?# u4 _$ T: x: Q  e/ |  l/ O/*              UART 初始化                                                 */
  e6 j  g& G8 |+ u# c& R/*                                                                          */
0 h. A% D% i/ {2 |6 ~2 T/****************************************************************************/0 U' M2 N$ N$ ?) D: n, X
void UARTInit(void)
; P7 G) k3 K( \' Q{1 R% |% ^1 u8 l3 g' Q
        // 配置 UART2 参数8 \/ k5 A, T  Z7 g2 C6 @
        // 波特率 115200 数据位 8 停止位 1 无校验位
; s/ M' o- b% [. i7 I8 g    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
" o: m0 ~/ H' g3 q% o                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);9 }0 n. g$ a- E# u+ h! p- h
        // 使能 UART2
# f5 v. a, `" R* p4 V        UARTEnable(SOC_UART_2_REGS);+ G$ l( i' l) }" r, f4 b2 p
' O( @+ C& K; B0 L( F' v* c
    // 使能接收 / 发送 FIFO! I2 N, k0 E7 h. a
    UARTFIFOEnable(SOC_UART_2_REGS);
( L% O2 `# h* Z: j: g
5 W% Y& W4 l2 S( E6 v3 v8 k) E6 Q    // 设置 FIFO 级别
1 M4 b- P4 }' x5 j* [    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
6 `. m( O1 P/ i8 y4 Y0 ]+ a}  T. A( I+ C3 R7 l
& A' R" |/ c) s. p& b
/****************************************************************************/" q1 Z/ Q0 v, K
/*                                                                          */( T5 `" F$ M! g1 a, I6 D' `' ?
/*              UART 中断初始化                                             *// b; x5 {) s4 R- P$ [& |. `  G8 q
/*                                                                          */
/ U) C( K% S* x- r3 O/****************************************************************************// I! F3 a: i! z* ~
void UARTInterruptInit(void), \' O% [( e" U' c9 a9 o, M' ]
{
, f2 M4 b6 Q" E/ ]7 N0 O# M, `- ~        IntRegister(SYS_INT_UARTINT2, UARTIsr);3 c; K) G  y$ p
        IntChannelSet(SYS_INT_UARTINT2, 2);
$ X: E" {( u8 S6 P1 L        IntSystemEnable(SYS_INT_UARTINT2);( ?2 ^) e# l7 N# F' V% s) D. q

) u/ h4 o/ e& e4 p- B7 c        // 使能中断
0 {6 Y- A& J" h" Y: e0 _        unsigned int intFlags = 0;9 Z: m$ @8 t* A9 x) \
    intFlags |= (UART_INT_LINE_STAT  |  \
5 {* K3 d; F- V* G! x, ~' P                 UART_INT_TX_EMPTY |    \
* e; h# q2 ~; l; C2 c: y4 D                 UART_INT_RXDATA_CTI);: A7 B  _. o( p. B1 p6 O
    UARTIntEnable(SOC_UART_2_REGS, intFlags);+ c1 b/ i" I- w" \' s9 c+ V
}
* j/ e+ f9 E: f9 o
' o/ ?0 N  A- h; Y5 J$ F8 n/****************************************************************************/) }6 `5 @! H' F1 @; t
/*                                                                          */6 e7 {: K; ~. v- b! q
/*              UART 中断服务函数                                           */% H" X2 {% r! b" [9 z) Q% n
/*                                                                          */# d" i  f: w; v0 E/ c/ n: l
/****************************************************************************/- l0 g& c' i, \  x4 q, O. s
void UARTIsr()
1 R% r5 s6 f' W  ^{2 b/ X3 u( }# x, S# o; S6 Y2 |
    static unsigned int length = sizeof(txArray);* L- |# t* A& }& O" c
    static unsigned int count = 0;
9 c4 d3 W! F2 ^    unsigned char rxData = 0;
% }, w! T' l3 ?% N+ N3 a4 g    unsigned int int_id = 0;
+ i) F7 p! S, |1 H5 G* j- O  \9 i3 m8 \
    // 确定中断源) M8 i; k1 ?* z% M
    int_id = UARTIntStatus(SOC_UART_2_REGS);
% @( v; K4 X' m# V2 W. }* M, K, k
( E; ]2 J: s. ~3 L8 i. U    // 清除 UART2 系统中断
7 [! w  _/ [' O1 ~% @% ]0 a    IntSystemStatusClear(SYS_INT_UARTINT2);8 M2 N9 b- e2 J) H- W$ `2 X7 y
% h4 Z5 x2 j' _! \
    // 发送中断  I! D6 j% W6 i) r  {
    if(UART_INTID_TX_EMPTY == int_id)
5 A$ \6 x2 ]. L6 D; R: f    {
# G, B- Z2 ?7 _8 |$ Z3 o2 ^        if(0 < length)" f3 p  m4 J" I, Q* T
        {+ V7 `5 z' [; ?( C
            // 写一个字节到 THR
6 g( K' L. z5 \            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);: [' ~3 E! `) n4 Z6 L! I
            length--;
% i; J- j1 k: S# c, s            count++;1 \. i. F3 [+ n+ J5 ]9 \9 j& T" b
        }% Y+ U: p6 t) p, c3 X  Z
        if(0 == length)
4 i" C, ?7 K  y; i        {
; M% ]+ {6 j6 T            // 禁用发送中断
& `; g8 E, Z' Y) D" s            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);. o- R' f, K) \; T+ f
        }
! k9 L( r7 S, b! _9 w     }
5 b2 J( m) D- T. \# g+ n' B& r8 K! }/ k* p3 G
    // 接收中断5 A" G# B, ~4 _! B/ y1 v$ r- q
    if(UART_INTID_RX_DATA == int_id)& W7 x) g. o! ?$ R
    {8 q' t0 B( B# w) e; E
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
+ @: J; @: ^$ P) d: |. @
3 [, _4 V/ t+ ?8 ^6 J        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
! u( }) w7 ^* S0 |# C$ L. ^' T) c    }8 M' C0 r' n$ C$ j% p
4 l- O' a& {# G
    // 接收错误( j! }) L8 e0 ?8 c# m$ P" Y
    if(UART_INTID_RX_LINE_STAT == int_id)) N8 ^9 g3 S2 L. x1 `- l
    {
9 y; e3 k# U- e& e6 q9 T        while(UARTRxErrorGet(SOC_UART_2_REGS))
. c1 e0 p+ p  S' J" h9 @& N        {3 x- z" ]3 J0 [
            // 从 RBR 读一个字节
) q! t/ J! E& W            UARTCharGetNonBlocking(SOC_UART_2_REGS);9 W. ~) a2 {9 i
        }4 j6 b$ `! U6 S1 N
    }3 d. B! _5 f. J$ _: U
   
* K# d  v; h0 g& d7 \: ]    return;
+ Z! \) s. P2 I& W6 X}
( ?/ g% Q5 U" i  }9 C) V
回复 支持 反对

使用道具 举报

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  ]7 E- F" b: ?) l5 e- _, N% E
如果其它设备快速给你发送串口数据,你这边能正常通讯?
1 m: Y6 C: o+ d5 Z2 `3 O
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 13:29 , Processed in 0.043021 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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