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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7343|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
- q. }  c* ~& G" C1 j4 F3 L

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。4 l+ o7 u( }2 y4 S( X
$ {! W1 T" a1 C4 Z6 I
#include "TL138.h"                 // 创龙 TL138 开发板相关声明, k2 F* S8 y. ^+ L
9 x) _$ K$ x4 W" e  k
#include "hw_types.h"               // 宏命令* y4 f* `4 E: Q1 O/ \0 c1 P
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
3 T' W5 `' F+ ^#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器; R  Q5 |. W- E
3 J+ `  f* ^: Y  n6 j' z
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
/ l6 P8 P+ j5 R1 \5 H2 Q7 m#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
3 g4 O6 E5 Y( W; B# P#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
8 O- U- ~! o' ]4 g' }6 w3 r1 Z7 p#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
8 x- P9 b8 e1 C1 o) N: j9 i# q  E7 V$ {! f, m! `9 d6 M
/****************************************************************************/! a2 p/ N: c1 O; w: u. a
/*                                                                          */' \9 y1 u9 Y9 ?/ [0 D$ w
/*              宏定义                                                      */" J1 C9 S7 F4 w4 O9 P
/*                                                                          */; i) I# H3 b  o5 l7 F6 K3 H' i
/****************************************************************************/, m: J$ f  E& i; h. o9 [
// 时钟5 W! S* F- l4 C  s/ f  B' R
#define SYSCLK_1_FREQ     (456000000)2 B4 O& B( Q* L/ s  S9 A
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
2 Y6 z/ h5 K  \" v+ `) b; B#define UART_2_FREQ       (SYSCLK_2_FREQ)
6 y% y/ Z& r  q8 F4 s! }% o4 B  M+ q1 v7 y
/****************************************************************************/
4 b7 M6 l5 Y( R7 p, ~% K8 ^/*                                                                          */
% T8 ~! C' O* o) V0 \+ j8 F& E/*              全局变量                                                    */' {- s1 S9 s! e3 L
/*                                                                          */
. O# d9 X- h; G# G7 N/****************************************************************************/
$ T6 L: U. [: h- f# P  r. l1 A4 ^char txArray[] = "Tronlong UART2 Application......\n\r";( h' n" @$ `6 t) ~. _- }" C4 i+ T

/ C  H5 u8 I% {( O/****************************************************************************/
: m  I; o4 o7 W5 |% o4 u: N  a! [! O/*                                                                          */+ }1 t* p+ {" R  o  l, B! M; x
/*              函数声明                                                    */
0 h6 R$ |" y  `" }/*                                                                          */3 H3 Z7 q' w- }" |- g! Y, T0 ?
/****************************************************************************/
4 p; ~+ s! {4 U- d" _5 R! P% E// 外设使能配置
9 P+ P7 \- G  e, E7 \void PSCInit(void);$ S$ Q' ]% z; |$ C  T( k' [
6 Y+ G- Y! o3 z; \
// GPIO 管脚复用配置+ Q& {, F8 ?/ O8 _) C
void GPIOBankPinMuxSet();
$ M  U! e, ?/ g. e+ D7 Y
& r$ s5 d( q9 ?3 z$ g) A// UART 初始化; F% n: [+ b# u, [/ z2 s
void UARTInit(void);
3 y0 u; M/ }" Z// ARM 中断初始化
$ Q' A) F+ o$ H) N1 dvoid InterruptInit(void);1 |. ^: t1 i$ w- ~
// UART 中断初始化. X: e- S7 O  O! g, ^. F4 k; q
void UARTInterruptInit();
4 `( r0 z( _) j  d// UART 中断服务函数% D4 z* ^, V* c+ o
void UARTIsr(void);+ P1 I- i9 B2 J
3 o/ P* w4 D( z/ C! {5 V
/****************************************************************************/
- k7 x' U  k4 m1 h( @/*                                                                          */) ^5 [6 I9 t8 [/ t7 m
/*              主函数                                                      */" `) r5 x, C6 |7 d8 C+ W
/*                                                                          */  W8 x; ~9 d4 a+ m' G
/****************************************************************************/
' n0 ~* M4 S: B% @( Uint main(void)8 [  w/ }9 d" ]0 ~4 E2 M
{" e# e. T0 D1 n- V( n/ ]
        // 外设使能配置
; I* U8 W6 m- e% C- |; }0 [) C        PSCInit();3 k' i* c& w: |
        5 U8 C# \; }8 ]5 X9 q/ R
        // GPIO 管脚复用配置
$ r" P/ H  I/ t+ Y* B+ \        GPIOBankPinMuxSet();/ r/ R, [/ O9 Z% }5 |/ q# F* p: I
- s5 P4 l& q2 x1 L: m& G& Y& U& V( A
        // ARM 中断初始化5 [- A$ P. l& U3 \( Y
        InterruptInit();. [5 r$ ^! ?- r* c! b( r4 O

) o6 Z3 [$ o$ I: X7 d        // UART 初始化
6 c" q' ]. h( L7 j3 M        UARTInit();
' |2 T! w  a3 E! E9 e+ o( C0 o7 S5 @
/ `* I$ V0 |) g        // UART 中断初始化
8 |6 l% I( O# u8 s7 `' |  n  N- b        UARTInterruptInit();  R% d. M" r6 q* z  I) d
$ ]' y. o: M( G3 ^+ g3 u% R- S; m* O9 N
        // 主循环
# B0 B; M! z3 h5 z: r( m        for(;;)% w: O/ q3 \) q# ]8 M
        {" o& I) a( }4 \1 T; D8 n' j: I
  i7 q. K4 Z' D3 s/ O" n8 O
        }  u, B4 l, O' P0 i& J4 d# ]
}6 l! ^3 ?+ `8 Z6 w
3 u- }1 I  [2 w
/****************************************************************************/
# Y% D5 v7 C+ k+ m/*                                                                          */
6 J' q) V; _: _- x0 l: G/*              PSC 初始化                                                  */
5 i, E" _6 p0 q) \# z* R3 a/*                                                                          */
& Y; w# `/ t: p: i; S  B# W/****************************************************************************/, g5 p5 n' I* i2 F) N4 k4 X
void PSCInit(void)' A  r1 |0 O, ^$ |
{
, o' {& p  X' y+ Y        // 对相应外设模块的使能也可以在 BootLoader 中完成, ]9 }8 p2 Y4 R1 `1 T
    // 使能 UART2 模块
$ d, ~1 X8 X" [" p- }' [    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);3 C2 e5 B1 v7 K
}* d& f1 M) V: k8 e
: G9 H* p5 g; `* l/ x# a! j1 ?9 {
/****************************************************************************/
) x6 i$ K3 \7 D/*                                                                          */  U" I! @" i/ m& {' q
/*              GPIO 管脚复用配置                                           */  F/ Y2 |; ~2 U. Z( f. n1 ~
/*                                                                          */2 Y# o0 d+ n  ^" L5 T
/****************************************************************************/; S& D9 M3 D2 `
void GPIOBankPinMuxSet(void)
. M' f0 x+ A7 O{2 y- d$ a- s4 V! t8 [6 F2 i- v8 Z
        // UART2 禁用流控
( \; r- s& y! _$ b6 }; e4 {7 ~9 r        UARTPinMuxSetup(2, FALSE);# `9 }1 N! h( c' @; T% R6 ]
}
/ p1 z7 G4 m- c0 B6 Q; {% V$ _8 k/ G; y) M$ P$ P% z
/****************************************************************************/
5 d8 \3 Z/ J3 F5 `/*                                                                          *// |" M6 x; ~% t9 c7 U2 }
/*              ARM 中断初始化                                              */9 p1 g% R# S' g2 ^+ w9 y( m
/*                                                                          */7 a" h3 p# q- O
/****************************************************************************/
4 ~* V4 N: U6 c/ ]6 jvoid InterruptInit(void)
1 [1 V; y; i3 o6 N{! O3 Z1 x; J7 z" K1 M- t' l! I
    // 初始化 ARM 中断控制器2 s) D/ q6 b1 g" G
    IntAINTCInit();
6 }/ Q- p' _" s" ]* H* ?
, t' l7 y. t8 I# }9 G7 D    // 使能 IRQ(CPSR)+ X" c! p; K0 ~3 A
    IntMasterIRQEnable();: ]% s& S; [/ }2 s1 A. N

1 V4 l- F* l) f7 i8 q0 ]    // 使能中断(AINTC GER)
4 U8 g' k$ f( s3 i; F, F+ D& b- r    IntGlobalEnable();4 h$ O# u1 k, s2 R4 e

3 O: W6 z3 z4 T    // 使能中断(AINTC HIER)
% `  A( z& i( P5 M, m% b    IntIRQEnable();
% |  E) {! x- y}- ?9 o3 P/ U) _  m9 Y1 k% z
5 v; a0 ?. Y; s$ x1 R* M+ z- w3 c
/****************************************************************************/
8 _) r# v5 L2 R3 f/*                                                                          */
8 _8 s- T4 p' V; F' W. O/*              UART 初始化                                                 */4 t* b. n# i0 I3 t5 F
/*                                                                          */
6 D2 \9 x# G. q1 v! U$ h6 c, ?: B/****************************************************************************/+ a" Z1 h( I' N$ |1 C) B
void UARTInit(void)
& C3 U: W/ O1 _8 k/ `) T& U{
3 U( p5 y1 F% F3 V        // 配置 UART2 参数) R& x+ z: @; P5 D! T
        // 波特率 115200 数据位 8 停止位 1 无校验位8 S1 ~5 o+ H* S' i; |, _1 h9 @
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
5 w7 }7 S' r4 N8 Q5 D0 j                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
% M1 V4 m, I8 X: n( }% k        // 使能 UART2
- {" h, u$ W$ u* O9 h- ?        UARTEnable(SOC_UART_2_REGS);
0 @: f6 w' I0 Z; _/ ~" g) ]9 f) B# Z6 ~- N/ b6 w
    // 使能接收 / 发送 FIFO
, ]* B* g; ~" \    UARTFIFOEnable(SOC_UART_2_REGS);
3 C8 x; _, {# }$ n1 n* W- D+ h( r0 k9 i' {
    // 设置 FIFO 级别  c' r" ~; j6 }9 R: `! [
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
4 L) W8 n( l$ c. J* k0 d5 v, |* Y$ x}
! J* o. v" N1 h/ _. [$ h2 ~7 y0 O. }" v
/****************************************************************************/  x: ]5 ~! O4 M8 F" M
/*                                                                          */
8 }' ~1 K3 ]1 ?- I$ G0 ]6 D9 {; d/*              UART 中断初始化                                             *// I2 S, d5 j. }- @, k$ q0 I; V' Y+ f
/*                                                                          */
9 E! f( ?6 k) j4 v* ?5 \/****************************************************************************/+ }# x. {3 p, |; @2 I7 Z
void UARTInterruptInit(void)
4 x5 w# u) ]+ Q& k2 I' X{
6 y# A' h* D; C/ e) O# {) K        IntRegister(SYS_INT_UARTINT2, UARTIsr);4 X3 o1 v# z! `, l* t  T' X8 N
        IntChannelSet(SYS_INT_UARTINT2, 2);1 g1 m& R0 j' K0 m, l- i! c0 p! D
        IntSystemEnable(SYS_INT_UARTINT2);5 l5 g3 H2 \8 N! N
! Y8 i1 }* f6 {6 `
        // 使能中断
9 f$ V$ X$ b: k7 d        unsigned int intFlags = 0;
. c, j4 d3 [9 U    intFlags |= (UART_INT_LINE_STAT  |  \4 z3 }: C  U! C. Y% M% w5 I
                 UART_INT_TX_EMPTY |    \5 B! \' y' t, P/ f. S, k/ R; z
                 UART_INT_RXDATA_CTI);. P% i1 w' N5 y4 a# M( j, i
    UARTIntEnable(SOC_UART_2_REGS, intFlags);- {8 f' E7 s8 `: A+ ]4 a
}: ]( l) \# S) a8 o

3 f9 a- ^/ K# D% g/ j/ a" M2 X/****************************************************************************/
4 R) b: _# ]) E2 i/*                                                                          */" J8 v: ~  L6 x" [! C. ]9 C& P
/*              UART 中断服务函数                                           */
; i8 y+ t& Q1 G: |& o3 K8 N) |/*                                                                          */8 w' i/ r6 s3 r5 a
/****************************************************************************/
0 b' z  \, n) p  r) Vvoid UARTIsr()
. b+ u' N$ v- V# H{
* `$ ~6 y8 ]1 E. B6 S    static unsigned int length = sizeof(txArray);8 d' Q& x8 O4 m
    static unsigned int count = 0;
2 ]6 X1 x9 p+ N, \* A    unsigned char rxData = 0;3 r# w, p! k% u& R
    unsigned int int_id = 0;) |2 R& S* k8 _4 a
* j' @  A4 ~* Y7 \; y# C- q
    // 确定中断源' ]- z. `2 [4 M4 m6 x
    int_id = UARTIntStatus(SOC_UART_2_REGS);4 s/ G  o" b' m$ E' J3 a# `$ P# e

8 G7 c2 y+ x0 A" d( s! [2 {    // 清除 UART2 系统中断
. r, z; F% D+ ^5 c0 W* |$ }    IntSystemStatusClear(SYS_INT_UARTINT2);# ~; B0 M3 j9 m

6 t! L& f' x: I: g* v! l) }" n    // 发送中断
5 L% N* R/ ?/ J: K/ U" h7 A    if(UART_INTID_TX_EMPTY == int_id)- Y. o8 F9 p& A) [# d
    {
7 s6 K: e6 \. P4 U" f        if(0 < length)& f" l% }6 s' o8 O* L
        {7 V7 ]2 Y1 {( t8 J6 N& A, b  c; c
            // 写一个字节到 THR
. B1 u3 ?% {* d            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);, B  {* z( X, M) ]
            length--;
: j- F. D5 H& N4 k$ C( A            count++;
9 s) f4 o7 R0 |/ s$ E        }, M5 Y% Z2 ]9 |( J/ R6 P
        if(0 == length)+ I' d5 W. l$ ?8 B
        {" g1 X& g, ?4 y' j; _1 s
            // 禁用发送中断
6 ~# P9 v; A& F/ _( I$ D            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
- E6 Q: |4 B0 [0 [! @. \        }( `: n/ H* Y- O: u
     }
! d4 [+ F0 G% v1 s5 }
, a' V* ]3 G7 O6 L7 p' W2 J    // 接收中断
. L* H* h) G! l    if(UART_INTID_RX_DATA == int_id)
; H0 G; X% Y0 B. ?    {) @4 M/ }5 O' J/ F' Q6 u+ a: T7 T2 m& ?
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);  O/ k4 z4 [& L4 J' e; `: D

& q2 Q# g6 R3 V# q: o        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);! m( S! [# @5 i! M; @, v- \7 V2 Y
    }7 c9 t$ O+ W  b$ L) x2 \

6 s4 O3 e7 K( A0 J  b( W* l    // 接收错误7 H" Z: Q  c- @) S% q
    if(UART_INTID_RX_LINE_STAT == int_id)4 _5 p8 X! I, c0 A! |7 o- u. E
    {
& H# P4 F1 D2 z" w# L' d9 t4 C        while(UARTRxErrorGet(SOC_UART_2_REGS))
: P1 \5 H1 {/ c. L2 p  f5 P  V        {
) _/ M  L% G3 n' B            // 从 RBR 读一个字节
! x% m5 C3 s  f  r# P            UARTCharGetNonBlocking(SOC_UART_2_REGS);
& l7 w+ a- e' \7 P# n        }
  |, t" ?7 P+ u4 C' r7 e( L2 w    }4 L, X+ {* E$ G, w" Y2 a2 A
   
) S0 U. F. Q8 ]1 f: L% V    return;! J( ~2 r' m! b
}
: K& P' Y6 `5 A3 w! n
回复 支持 反对

使用道具 举报

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- R# T! D" S; {4 h' n
如果其它设备快速给你发送串口数据,你这边能正常通讯?

. G  {8 t8 ~, x; H* R- {谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-2 09:22 , Processed in 0.042317 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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