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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5555|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。  x! I2 B) l! D# t2 h

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。. p3 b3 o' Q* D/ j
+ @" j6 p+ H3 s8 z& T8 y4 T
#include "TL138.h"                 // 创龙 TL138 开发板相关声明# K) l3 |" c, M
' B) y0 v% S# |/ C; n  h& S* ?; p( |" }$ f
#include "hw_types.h"               // 宏命令
' x) }- B: y8 W8 v" W# a& }3 C#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
: I3 ]. o7 M1 V: D3 R2 `4 J# I0 ~#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
- Y$ q  }: ]0 E& y% y% y
% m+ R6 j# A; P7 Q( ]9 y0 u#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明0 s$ L1 R6 D9 H4 U
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明  b6 S9 U3 F# x1 ?) w3 e" O
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明' i5 H5 y5 G2 w5 b3 V1 g& r
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义, B+ n& |. p3 z
6 l# U2 j# e( U0 a9 q
/****************************************************************************/5 O" E$ ?! g6 B9 ^# ]" U
/*                                                                          */# q8 j+ `* [! w: g0 Q
/*              宏定义                                                      */
4 a  v8 X) h# V8 q/*                                                                          */% ]+ |9 u, [) a  V' q8 m6 R
/****************************************************************************/
7 t5 F: O* h; S! t9 t% m5 j// 时钟2 K% L, ~" s, V" y- d0 ]) G% N7 m6 m
#define SYSCLK_1_FREQ     (456000000)
  U7 \" N' C7 d8 c, r#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)* o' b' V7 ]" K0 ^+ D, a5 g
#define UART_2_FREQ       (SYSCLK_2_FREQ)
$ n! g+ }6 D8 m3 F5 `" [: A
& j4 y) E* _7 z8 e! U/****************************************************************************/
  m. O. p" Q# d. R2 j/*                                                                          */3 i  P' r( ]' E* u/ ^
/*              全局变量                                                    */( z9 J6 G1 Y5 M: S2 t4 O; E  e4 V" e
/*                                                                          */
) P) l5 a9 |( ?+ v/****************************************************************************/
$ W5 ^( n! q/ @) z, x! N% s! achar txArray[] = "Tronlong UART2 Application......\n\r";
1 d! u8 M/ _6 G  T
8 l/ S# D+ Y' g: K* x/****************************************************************************/
8 |) X% H% h- t4 Z$ a/*                                                                          */
) U% u0 M: f% u1 a) ^7 _- L/*              函数声明                                                    */. l/ H( P# `' u5 i
/*                                                                          */) G, j) P- W& T
/****************************************************************************/, @+ R- s* Z, l. |
// 外设使能配置/ f# i. d. ]/ g6 p4 e% G% Q) L9 f& _
void PSCInit(void);
% ~8 ~8 O- N; o% W2 T$ X8 O
4 q1 p3 [/ C* F- P8 Q, @// GPIO 管脚复用配置
& n6 d7 T0 H: Lvoid GPIOBankPinMuxSet();. o4 W& ?/ m7 F5 E9 K' v& f5 z
* ]9 j+ |* K$ ]* v6 q& A' n3 e" S
// UART 初始化
( s0 ~( u+ r9 {3 ^' d- zvoid UARTInit(void);
+ m- ~) x2 e& [  k$ Y: _' Q/ E6 A// ARM 中断初始化
4 s" g- X7 v5 a0 bvoid InterruptInit(void);% }, \3 A& x; u- F  M( O
// UART 中断初始化
: c% z7 Q% ~! U0 i# I5 g6 Ovoid UARTInterruptInit();+ m5 W# f& C9 B) H( Q0 B0 Q7 D- M
// UART 中断服务函数6 f, a9 Z) w% y
void UARTIsr(void);9 X1 r4 S, C; a8 e/ L& G" r0 H: m

5 F& ^4 z: d0 u! |+ l/****************************************************************************/1 V+ e8 F% P  g; ]4 t1 x* A
/*                                                                          */' o+ [: r% P6 G
/*              主函数                                                      */0 }3 q; w- w& u' @. s
/*                                                                          */. p8 U+ G. T7 m6 i+ b0 n: J5 U0 o
/****************************************************************************/
4 {( a: P' n; Zint main(void)
/ D* F; k9 t7 l) X- H{
* s0 v6 A5 m; F% A        // 外设使能配置; Z# C7 f* t& D7 f# X6 S9 c
        PSCInit();
+ c" j& K. I  H! _# p- g) l4 w: Z; ]        / E. z# M1 w, D* p! h
        // GPIO 管脚复用配置
% t3 G2 X; D, @5 a0 Q) K        GPIOBankPinMuxSet();1 s6 ^- I, B; ?2 t1 S

% L0 {/ L- F7 n' R        // ARM 中断初始化
) T" h$ D% {: l; N! M  r3 [        InterruptInit();% E, z6 a: N- h* x" [% G2 {
. z5 v5 L3 L/ X$ {( A8 O6 x2 H  g
        // UART 初始化
; k% f+ P. \9 T; S* A        UARTInit();' r- Y6 ~- ]" A' T9 D( F4 U5 F5 N) u
! M1 f$ L# E, {! a) R8 e
        // UART 中断初始化
. X, a+ _; O$ ~* V3 b) ]% J        UARTInterruptInit();3 K( c. |& |/ r: Q

9 g: b" w3 D  t  B& P        // 主循环
5 I7 c" K1 r/ o9 e/ V/ ^        for(;;)
! i- s' i+ r2 s$ S( u- t        {
( ]5 k8 `2 `3 `- C9 V
% X3 h) ~+ j. }. k" ^        }
* r7 z7 g# u4 X; t. [5 U8 g}
9 q$ U$ f8 `& \4 r" n$ N9 {
4 Z" D& ~  i% M3 r/****************************************************************************/
4 x( H# C7 D/ L+ g, O5 W1 A/*                                                                          */
* L+ P% J& u$ s2 h# f9 b" ?7 D$ ^/*              PSC 初始化                                                  */- c1 t% z( F. y! A
/*                                                                          */4 P" W5 D' _4 ?# v
/****************************************************************************/, ~, a' _/ Y% N6 p3 U* ?; r9 R
void PSCInit(void)
. z/ P, ?  n/ Q# N2 u- \{
6 B- o+ D+ K% ]8 N! y8 j& P        // 对相应外设模块的使能也可以在 BootLoader 中完成
0 S  ^3 i2 Z( v: K    // 使能 UART2 模块9 k" Y# ?: S& B5 h
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
( W" E1 T: d. L5 b& O4 K3 }# f}
( E6 A6 p8 G5 Z% G' i" m9 P3 m' b3 u$ i% {) g$ _+ A9 q. J3 e5 \
/****************************************************************************/0 m0 c! w" R! W* g# p9 v
/*                                                                          */
; v, I' F* \/ Z/*              GPIO 管脚复用配置                                           */4 p, e3 U6 `& R" H
/*                                                                          */7 T+ B" u6 ~4 D6 R
/****************************************************************************/
& n3 ~2 z. V: Bvoid GPIOBankPinMuxSet(void). [6 W8 }1 c! z7 a+ y' `
{
0 G/ o1 E9 v+ E5 w        // UART2 禁用流控' ~: r6 @" H7 {  q8 Q% }
        UARTPinMuxSetup(2, FALSE);- ]" h8 A, }1 X% u  p
}
" y2 g* w& c3 Y  N- j
5 w3 c. Q  r0 |2 h* {( G; F. B/****************************************************************************/
# b, K, Z  c* T( D, X/ Q$ n5 g! y/*                                                                          */
8 i' S+ P1 y! j( t% V+ W2 G/*              ARM 中断初始化                                              */
  }; i2 x6 f! S+ J6 t; G/*                                                                          */# C. L! B* z* f: t! x* y4 D
/****************************************************************************/! U$ P- A5 Q3 _6 T+ H" r
void InterruptInit(void)8 j4 M4 d  ~7 @; T+ f2 W
{4 B' s1 ?1 M2 w2 q$ f$ b: X' R
    // 初始化 ARM 中断控制器
& ]6 |+ p' b7 ?    IntAINTCInit();
( _$ x" G6 \" m2 P% w% q
+ q0 S+ `# e# B5 |    // 使能 IRQ(CPSR)( D* Y& f9 O# n$ e; m. C
    IntMasterIRQEnable();
4 ^' W2 c" v+ D6 a
+ o& V4 h7 w. P; e, m; @" S    // 使能中断(AINTC GER)
; I/ D; g% G% x# s+ S5 g5 \    IntGlobalEnable();
; n7 X1 b4 S6 \& T! M5 w4 {  K! G( W- [1 W' ?* k" B# b2 r
    // 使能中断(AINTC HIER)
( S' s, i4 u, l9 N( ?9 q7 h* d2 A/ D3 u- H    IntIRQEnable();
4 v" q& g, d0 s! x+ y7 ^7 o# a$ h}
; ^+ i! Z) ~. E) c$ m- l# k, Y4 S& @- d
/****************************************************************************/
4 o: z/ U4 }( I' W  u/*                                                                          */
% o2 L& Z# z% T: c/*              UART 初始化                                                 */( F+ b+ `* b1 ]  H6 r4 L2 G
/*                                                                          */
3 W! z: h* K0 ^+ d# Q4 L+ B9 ]5 ^" j/****************************************************************************/7 @0 H# j+ E: A2 v3 ^7 V7 z1 q3 O! U6 O
void UARTInit(void)7 \% o( \! M& `
{0 X" K2 ]% x. |6 I! q
        // 配置 UART2 参数
8 `% Y0 H5 W7 V% t2 B4 `1 u        // 波特率 115200 数据位 8 停止位 1 无校验位
8 w& H$ b7 Q2 g8 c) |/ K6 Q    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,9 D& y2 U( Y8 s2 q$ D+ ]) e) b- S  G
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);1 _, S9 Z2 Y7 S, S' a; \( [
        // 使能 UART29 }  B9 j9 ~: p7 E. B
        UARTEnable(SOC_UART_2_REGS);
' j( P+ u5 U! B& u6 \$ Y# F, l, A/ C8 W: K  k0 W0 |1 i- @
    // 使能接收 / 发送 FIFO
) ~3 h5 n9 Y' V2 `) ?' O: f    UARTFIFOEnable(SOC_UART_2_REGS);
. T0 R% t5 {4 U& T
& O' x; ]) ]; J* t  X6 h* ?( X    // 设置 FIFO 级别
: ^" |' q2 Q* d- K9 ?/ [. W" j( j    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);# ]- N: J9 V' j8 P
}8 R  l: l/ U' d0 e

6 o. K! P7 O& p% ^& D/****************************************************************************/; f$ M% q$ J+ M; f4 R, w4 Y
/*                                                                          */
8 E- b# u- g$ b/*              UART 中断初始化                                             */$ ]: \. W. O: ]& R
/*                                                                          */
0 C3 P" j2 w9 x3 x" m! Z/****************************************************************************/5 P/ T" V" b& \$ n1 I7 V
void UARTInterruptInit(void)1 A, A0 a  r: k* @, A- K
{$ D- k# s, g1 W6 B7 e5 D* Z% a
        IntRegister(SYS_INT_UARTINT2, UARTIsr);2 m4 X2 _- K2 _5 w. d
        IntChannelSet(SYS_INT_UARTINT2, 2);
2 v4 a: X, m' L        IntSystemEnable(SYS_INT_UARTINT2);" L' N- E, u" x  O
0 _9 L4 y0 U) y/ C1 ?6 p3 {
        // 使能中断
* E) S. z7 s+ v7 P# v6 A        unsigned int intFlags = 0;; B/ g- r3 S2 G
    intFlags |= (UART_INT_LINE_STAT  |  \  y+ D: K8 X( N% R# v
                 UART_INT_TX_EMPTY |    \
( C' ]9 v4 U1 I; N+ V9 N$ f                 UART_INT_RXDATA_CTI);7 c6 M8 n1 \9 ^9 H; w4 v' D
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
9 U7 k; ^. K* |- m- s/ D}
  g+ R2 J; q& B3 `
- U$ L$ Q% N  w. Z  |, _/****************************************************************************/
  U  M! D: t, a$ ]. s3 V/*                                                                          */' _. s+ Z! z6 q/ a! d
/*              UART 中断服务函数                                           */' b1 E2 m$ \) F6 G3 D1 N1 T2 a
/*                                                                          */1 [4 g( a5 o8 a8 a* v7 V
/****************************************************************************/
* J$ T( k- F$ ]$ v! J) R3 d: r( n5 W8 }void UARTIsr()
  J2 f  k  r/ q# H0 M{
' Y* n2 U: f, ~% Z    static unsigned int length = sizeof(txArray);
+ i- r# ^  d# ?0 M6 u2 t: ?7 k    static unsigned int count = 0;
5 W  H& o* h( J$ D3 I& G* i    unsigned char rxData = 0;
; y. I" ]0 I* ?" q6 l    unsigned int int_id = 0;+ C# p# G% j- {# n' A1 l
9 Z: R" B4 G- m, u0 v6 }; n
    // 确定中断源4 X0 d3 r* y; |8 @1 B' I2 \
    int_id = UARTIntStatus(SOC_UART_2_REGS);6 r8 [+ p0 V: A3 M( m: f" p1 V

+ F! y. e' ^6 T+ o1 b    // 清除 UART2 系统中断
8 E: @1 U  v6 k" ~1 K0 g    IntSystemStatusClear(SYS_INT_UARTINT2);- n2 t! K  a1 f4 ^! W4 A/ {# L* ?
: z. m; a* o6 o6 T
    // 发送中断
7 N1 h; Y1 p& x4 K/ d2 U- b# ~    if(UART_INTID_TX_EMPTY == int_id)* w7 b8 _  P7 H+ _% D1 R/ g4 _0 d
    {0 e" k3 Q, Y0 y" i+ Q' i6 \
        if(0 < length)& v( T: u# v; O  x/ z
        {
! `3 X6 P, m1 v- A/ ]            // 写一个字节到 THR
$ e4 k" [) z7 x; z4 Z            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
% p" I" ~3 P: N, A% U4 g            length--;
4 k) g2 N0 F2 j/ E$ W            count++;
& m9 L% V9 M+ o2 Q$ ?        }
- V2 y8 {0 p( z/ g- d$ `        if(0 == length)" m# v8 c, o$ C! I
        {
! x' q/ W! k8 H( q  X. W0 R4 K5 L            // 禁用发送中断
$ p; N0 }4 Y3 a1 ]3 t; V            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
: @5 c! {, v$ `0 f* B; F& ^        }
7 [2 \8 h. p$ e* l0 E     }7 ]2 |, u: Z3 x, R* R7 c. _  e) _' w
; j% @4 s( `7 _" Q" ?& n
    // 接收中断* ^# e/ u1 \  F/ @% i1 ]4 k
    if(UART_INTID_RX_DATA == int_id)
  ^/ W! z' H6 Q& P) [    {
: C) ]/ J5 N% \5 d" o# t        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);, t( i6 z# b+ r- k

6 Q- A" h/ `! X! l        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);/ V) D" o; J6 _2 @* B9 a
    }' T. F: G+ v; ]$ ]! a; S

5 N3 |/ D7 c1 l6 P  s    // 接收错误
/ K- j$ M, |4 ^- Y) ^    if(UART_INTID_RX_LINE_STAT == int_id), a. X, d7 A$ {1 p& ^- X# f
    {) ^& S& @' ^) I$ U9 m
        while(UARTRxErrorGet(SOC_UART_2_REGS))
# _8 ], \. d* L2 }: c, K+ W        {3 i/ y! ~. Y$ ~! P
            // 从 RBR 读一个字节
) Z0 Y5 z  M( H; w7 I            UARTCharGetNonBlocking(SOC_UART_2_REGS);- r6 K, i  w# V6 H1 R3 F
        }: M& u+ N9 M% A7 b1 d/ G0 b! V
    }8 v; `  i3 ~! w+ o
    ( V+ Y) X& y+ o8 A) v
    return;. q/ C! l/ B+ g% L! Y4 v
}
# F/ l/ l5 x* `7 @  r
回复 支持 反对

使用道具 举报

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:252 @8 z5 b+ @4 t8 {% C8 b
如果其它设备快速给你发送串口数据,你这边能正常通讯?
: F, E1 u8 C9 L0 M+ a
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 20:40 , Processed in 0.067242 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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