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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7792|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
" l4 I9 K1 A' Y+ J$ a  l( L

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。7 J: Y) d% n$ W5 e( R
! C% l9 d/ f4 w( o
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
) I+ w: ^+ i. E, ~/ v! v; w
; D* W* [- ?' W! w- P/ p, z#include "hw_types.h"               // 宏命令/ \3 o  b8 W* A! E8 B+ Z
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器6 ]5 h8 P% ]/ V9 m; s5 f
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
3 W4 |6 s7 s5 X% x& P, v+ t% O0 s. R9 t
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
3 f; A3 Z2 W: U) n. S0 H4 p#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
3 f: c, k2 U5 e& Z+ a#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
* v! b  J  v6 j: F& A) A. H% E% x#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
; O5 f. P# c1 s# R& J' V! h: |# x' X2 ]8 m% s2 Z2 _* H8 G7 x
/****************************************************************************/+ V/ }" A& L1 S' X
/*                                                                          *// k4 v' ^; v0 B; i& s9 h
/*              宏定义                                                      */
1 j: d  F; k/ J4 b4 B/*                                                                          */
" y8 I/ f" w  o+ n  {( N) \/****************************************************************************/
7 W( g" a. b) j( w$ {/ n! H# S  k7 X// 时钟
8 b5 ]- H! K: _. Q* N#define SYSCLK_1_FREQ     (456000000)6 W' @8 H) w/ T2 Z% m
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)8 ]3 |# Y; R& M0 S
#define UART_2_FREQ       (SYSCLK_2_FREQ)
7 F9 B. d+ {; O/ s6 J/ W7 e. E$ N2 ?4 ^( i
/****************************************************************************/- W6 t- }7 Z% @4 e) u$ a
/*                                                                          */) V# X7 a0 J* Q
/*              全局变量                                                    */, d' n- |8 ]2 m6 v4 z; J
/*                                                                          */  T" l' Y: `& a3 z3 X
/****************************************************************************/( L- a2 M" p2 X
char txArray[] = "Tronlong UART2 Application......\n\r";; I! F) O4 A4 z, g$ U
; J' _( B) t; O2 m
/****************************************************************************/
' c# [, Z+ b, N% r" V/*                                                                          */
, z0 U( }/ A5 P7 h( {, M/*              函数声明                                                    */
5 Z. ~2 ~; E) w/*                                                                          */7 n% R; A; H3 }, Y& Z
/****************************************************************************/
3 J* \5 ~9 q- ^6 y! F  b; P. q4 f// 外设使能配置
+ E9 k8 l* U4 f5 xvoid PSCInit(void);' U' l1 G- g8 i, O
' a5 [. N7 `. p- ?
// GPIO 管脚复用配置
' t% R8 W1 T; A" zvoid GPIOBankPinMuxSet();
8 C/ H: P2 Z  z5 y8 L5 v0 R, W6 S# g9 G. N
// UART 初始化
3 T8 q, A# I0 S0 E8 i; @6 ~void UARTInit(void);. x+ g2 b, l+ J  j. R, o
// ARM 中断初始化/ M; X: s) L9 h% i8 |" ]0 S
void InterruptInit(void);: I  s) H9 d$ X5 `5 a! _7 v
// UART 中断初始化' Q2 v& M6 ~3 a3 h6 ]+ W
void UARTInterruptInit();
) Q; X8 |0 }" R; B, W; {% R+ Q' L) k// UART 中断服务函数1 V1 V& d! j  ]- X8 B5 [0 R4 S' v* k
void UARTIsr(void);
7 O/ n6 X! ?+ \: A6 G; K
0 \8 r& o% Q3 Y7 w) `/****************************************************************************/* O7 d* K9 _' }3 p5 C0 u
/*                                                                          */7 f8 w3 n7 \4 ?" Z
/*              主函数                                                      */9 S' G; w/ I* u0 Z3 \$ T
/*                                                                          */4 Q, Z8 H  ]7 y1 @7 N0 g: G6 G3 Q/ Y( [
/****************************************************************************/- u; W: e6 z, A+ @
int main(void)
' R" B/ B6 a( ?! n) \" V{
/ K! R0 B1 k0 g9 n        // 外设使能配置
; V$ R3 ^' W$ D! {* J        PSCInit();/ Y6 {- z; X1 W. ?. |: Z  |" Z, I
       
5 B" X" q# ]) `# D        // GPIO 管脚复用配置+ e3 ]) }9 N+ z8 E/ g8 V5 E. S! R" K
        GPIOBankPinMuxSet();
3 Y4 V( `* R& T4 D
; R1 F: d0 K# X4 u, d+ v7 N: Z        // ARM 中断初始化
* I  d7 y8 y, O4 M        InterruptInit();5 G% V  t5 a- Y& r# j
9 ?8 k. k7 A% l1 ]
        // UART 初始化) R- w, F" R- M- ]6 b
        UARTInit();$ S( f# }' L3 e- v" V7 N; U
: t2 Y; T( A% r' \; O# h
        // UART 中断初始化
: f, u4 }/ ^- i; }( h        UARTInterruptInit();, g& m& L; n) c. O
- J( }" ]0 J, w+ `8 o. }
        // 主循环9 ~! |" `- ]1 ~) D  t) J, v
        for(;;)
! z) J% ^5 q" X: G" I( M9 W        {
0 k8 L3 f3 Y9 e! C2 J- L: l' T2 `) m+ ?: U+ B/ p6 _( q0 \
        }. Q. ~% e5 d7 H" z1 ~9 D
}
1 K7 E" r7 G2 b' y) p( T: y8 R' b+ Q4 E) x6 b4 d
/****************************************************************************/* J8 S1 Z+ Q. N6 A# s+ X
/*                                                                          *// \8 N+ Q# t9 C3 w- d7 `4 k* p
/*              PSC 初始化                                                  */
0 a: z- p- l* _. W) p8 }2 s/*                                                                          */
6 M: n3 @0 e: M/****************************************************************************/
3 A& g+ K, n# Lvoid PSCInit(void)
8 {: y5 E: ^5 C) g% j. ^& s# G{. W+ L) B$ t8 }3 u+ N' Y
        // 对相应外设模块的使能也可以在 BootLoader 中完成
3 N( G$ B7 {$ A1 e. P+ k) X/ C0 K    // 使能 UART2 模块# t3 M$ D! ^- F
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);( l2 K, b# x& @% ^6 v
}
: F) V& P! |' k) L# G2 X8 V  a8 h
/****************************************************************************/
& R8 G1 @0 f( [' U  G/*                                                                          */! a! T" S9 |# v3 ]# ~" [! Y, P
/*              GPIO 管脚复用配置                                           */
7 f) F# z! W4 h1 m& R. c/*                                                                          */
& v- R$ ~: @  X. c7 R3 B$ Z/****************************************************************************/, b6 p+ f+ n8 n+ D& q6 {/ I
void GPIOBankPinMuxSet(void)
/ x* M' I7 @/ V9 N3 v( ~9 U{4 I/ A7 p7 b) L6 U
        // UART2 禁用流控
; ?/ j/ m2 ?0 s        UARTPinMuxSetup(2, FALSE);
, M2 P. U7 U# n}. t# ?  B% Z" p! g: b5 S9 ~  m# o

  ?' _/ J/ z' ^7 Y/****************************************************************************/
7 w0 a2 Q/ E! c( o% u8 o/*                                                                          */
# ^7 J: Y% P2 x9 e/*              ARM 中断初始化                                              */
% u5 V- z# j: b0 F/ Z# ^  y/*                                                                          */2 X# _/ Q' X( b2 n$ Y- N
/****************************************************************************/3 c! s9 ^# k' Q# L: J6 b5 c7 |& P
void InterruptInit(void)
/ a0 u' t' K+ ?2 z2 }: q{9 v( Z0 \& B# a1 ]* ?
    // 初始化 ARM 中断控制器
/ W3 I8 V  F9 F% P; J/ B% C    IntAINTCInit();* A- |5 n( R3 V5 u; P

  X% z0 P$ X% U9 C; m    // 使能 IRQ(CPSR)% A$ }! r9 }9 [. X6 p
    IntMasterIRQEnable();
/ w# z4 ~+ I1 S! S* W/ d8 w* j" _. d6 P+ F! Z! c$ D
    // 使能中断(AINTC GER)* B4 l3 G3 x' n+ m' d2 h
    IntGlobalEnable();% G( u9 x" O. P  V
+ _# ]2 X: T' p- C5 L
    // 使能中断(AINTC HIER)2 B$ n7 \" O5 A; d! n
    IntIRQEnable();
" |" {) [2 L' Y( S' @4 `. t}8 K( V0 w) r6 r' ~0 g
: ]$ P" F! d6 g1 J9 S6 [
/****************************************************************************// [2 c/ l3 Q! _9 P$ E0 x
/*                                                                          */
% \' h/ V5 [/ ?; W; T6 {% U/*              UART 初始化                                                 */
" {2 M6 U# e7 E  E; E6 h" V/*                                                                          */8 M2 V5 l0 V+ \5 {! a2 i
/****************************************************************************/
/ n0 b3 O3 p+ f. S4 F: Vvoid UARTInit(void)
; D0 {. q0 v! O4 O( M7 A{
* i; M7 j5 _7 I  V  k* G* g        // 配置 UART2 参数
4 u3 Z. g6 k" `/ b/ r        // 波特率 115200 数据位 8 停止位 1 无校验位
5 ~- {4 |2 n2 O% M- m    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,; |) x. D7 n( J" _. W% I/ y( |
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
' c. y2 H3 J/ Y2 ]- X, j        // 使能 UART2
- m! T. h1 y0 a+ E* U7 C1 H        UARTEnable(SOC_UART_2_REGS);9 M2 G9 a5 F8 d0 {
3 s& m$ d) Q/ u3 A' }% |/ F& B2 L( {
    // 使能接收 / 发送 FIFO
- a6 {5 m/ O- V1 @# V    UARTFIFOEnable(SOC_UART_2_REGS);& N* u7 h7 k" Y, h
, n" f6 h- }' T" x
    // 设置 FIFO 级别1 n3 U8 i; |, {# E1 s# |% r
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
4 o  Q: q  ]4 ?% |" _& E}0 k- g5 V( C8 Y4 s( q* S

( E5 A; l  ?; }/ e0 ]/****************************************************************************/
. q! I: d  K$ J$ |/*                                                                          */( D; k8 i' u8 D6 v6 D
/*              UART 中断初始化                                             */# f% \1 f( Y) B6 ~3 B
/*                                                                          */4 w2 j/ u! H$ C6 o! w& U  k7 t
/****************************************************************************/+ L0 s& {  ?* ~5 c
void UARTInterruptInit(void)1 i6 z) K8 v' M+ t4 L! c
{  t9 c1 k1 X9 x* b7 N9 o; V% G
        IntRegister(SYS_INT_UARTINT2, UARTIsr);6 x2 e% L$ F, R3 M* E
        IntChannelSet(SYS_INT_UARTINT2, 2);; ~0 p4 Z3 z/ t3 d, Z5 @
        IntSystemEnable(SYS_INT_UARTINT2);& _3 U) \+ z' G( t  F8 x
: B$ S5 c: L- y
        // 使能中断6 |; ^' ^9 R2 c$ [
        unsigned int intFlags = 0;
- A, q8 i+ E$ |' T' V    intFlags |= (UART_INT_LINE_STAT  |  \+ {2 @9 w$ S" l4 ^! K
                 UART_INT_TX_EMPTY |    \
3 O, f. [4 Y- k/ C' r( g( k+ o: l! a                 UART_INT_RXDATA_CTI);7 s7 o) S' G: f' a  K6 M2 B# ^
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
( \$ N# k' ]6 r: r}  g/ u/ r  H+ r6 p+ z
+ }7 @3 r" y/ Z/ I: C6 F6 B
/****************************************************************************/) ^4 H/ J* O/ g! f
/*                                                                          */
0 z/ b: p; M  Z: I% b; E/*              UART 中断服务函数                                           */
6 Q2 T* u4 a: d% c& j0 H3 }/*                                                                          */
6 f8 ~( C  [  H6 g/****************************************************************************/" C# a6 U9 ^! X
void UARTIsr()" k# q5 k  a1 n; O- y0 n# Z: S- ~
{
1 Y# g: O4 u0 z0 }    static unsigned int length = sizeof(txArray);
1 a3 f/ f' k* S' }- K$ [# v    static unsigned int count = 0;
5 I8 ^2 g# w) _$ {% I    unsigned char rxData = 0;
$ ]' B; B: [4 M& C/ P    unsigned int int_id = 0;
! l8 g/ a! w5 a/ K9 y1 X; h' q
    // 确定中断源
1 G% B7 m# ?8 j  J    int_id = UARTIntStatus(SOC_UART_2_REGS);8 J! b/ }" H( i3 n/ o9 G

3 A2 D4 a- i; Q    // 清除 UART2 系统中断* _& u+ R1 x9 c- v0 m. }9 J% G
    IntSystemStatusClear(SYS_INT_UARTINT2);0 v: W* Z) l4 G5 I: F6 Y

, Q3 }5 `3 `! M4 Y7 C( J1 f    // 发送中断
2 b( m3 D5 p5 d    if(UART_INTID_TX_EMPTY == int_id)/ m4 S4 j0 [7 u8 G
    {0 c, C+ M) y% p1 y" T$ K. u
        if(0 < length)& v4 g# v; o$ s2 F$ j0 }
        {
2 X4 g; ]; I, V1 J4 ]            // 写一个字节到 THR/ |" J% w. G1 W$ {0 w
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);8 }8 [( A/ V  W+ A' F, ?/ ?# I
            length--;
: ~% a8 E. x2 {) b/ k! ^            count++;* v6 W6 ~5 }- M
        }
2 Q: ?/ d1 g- q) w9 u; i& k3 F        if(0 == length)
1 J2 e, U5 H, f! h- O" \& M        {
: F3 p+ H0 h( H# N- N: c2 h            // 禁用发送中断4 f& J4 ^/ D2 y; m/ ?  F; c- P
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);, |# p' m) f, R; o. G* U2 q: p
        }
% p" R. e! `# S     }6 o, Y5 [, ], G2 m2 G1 L

# t  e: i! Y3 D2 y2 f    // 接收中断2 C& j; |( V& H# b
    if(UART_INTID_RX_DATA == int_id)
% @3 e% k& q1 |! G8 w5 c3 I( ^3 N    {
6 X. c; m/ N9 R+ u5 S$ R, o: z        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);5 G2 r, [" [4 o3 ^- S: L3 R
* V/ E! i4 z  @4 q
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);( L% E6 p: `6 K- \6 |; k& M9 Z
    }9 U( I" [4 I" j8 G3 \
% E7 D9 e7 p* `! _1 l
    // 接收错误1 s* F3 V; H; O' b- X; C4 T
    if(UART_INTID_RX_LINE_STAT == int_id)
* C7 Y0 @* }' l( _    {
' }' X) K; @+ B8 {5 x        while(UARTRxErrorGet(SOC_UART_2_REGS)), d. C, ^' K/ ~. D
        {
5 y5 |% I; r  Y4 i1 u            // 从 RBR 读一个字节
* u; s) H) q* q8 z            UARTCharGetNonBlocking(SOC_UART_2_REGS);
( ]  d& f' |9 J( F1 {9 l        }- o: v; w. q/ x
    }& M, f$ Q+ b6 `2 ^) N( ~
    + g' c0 M" @9 U
    return;
: f- N9 z6 e( n+ a- T}+ r  G/ [# x' K) U
回复 支持 反对

使用道具 举报

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
' V& T% K  t- h' m+ |如果其它设备快速给你发送串口数据,你这边能正常通讯?

. F' e- M3 x. Y6 z9 Q# k3 M7 s, m谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-16 00:41 , Processed in 0.049039 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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