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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7407|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。# V5 K& t7 d9 V& G0 M2 G6 K" T

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。: W! z1 N1 Y" s( I, Q! `

4 J/ ~/ ]7 G. C" z  ^% Y! D' p: p#include "TL138.h"                 // 创龙 TL138 开发板相关声明- V- K* B( y9 p: F4 x" n8 L
) @1 W1 O3 }, w' ~- l3 s
#include "hw_types.h"               // 宏命令) V- h' }* M) f
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器/ ?6 c) X0 @, h; B3 p, w
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
4 U! H; }7 {9 D: ~8 f* W* m7 N7 Q% K/ {/ e8 x6 _" E
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
# t4 k. h( Y$ S2 A" a( j3 B#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明7 l! F/ G( ?+ A' C  N
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
! u" W/ m1 S1 b& U( S#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
$ ^8 u. y( z. s7 m, C( J& V) k8 N3 h" ]
2 L- O) {2 x4 z) \, c/****************************************************************************/
7 ]+ S: A0 x/ f$ [- R/*                                                                          */
9 C7 w8 n+ a1 q: t* d5 P/*              宏定义                                                      */6 z7 ?$ s# C! S5 j% p: ~
/*                                                                          */" ^' r* \# r1 o
/****************************************************************************/
  u$ a: W# R$ ^2 r6 ?" Q0 H// 时钟* \; }+ h! |+ D7 S
#define SYSCLK_1_FREQ     (456000000)6 m5 J+ n4 h2 S' J" w5 g' `
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
! o7 Y) F& _! u1 l8 B#define UART_2_FREQ       (SYSCLK_2_FREQ)9 @* z5 `; P5 B3 n

) b+ r) H0 ]" F  ]$ D# G/****************************************************************************/
0 k! |) ]( O( F2 o/*                                                                          */5 j2 M* A  u/ U* e; X+ A
/*              全局变量                                                    */5 K' _/ A) |2 ~; N4 U
/*                                                                          */- b- [' q) O- H& F4 D1 B1 R
/****************************************************************************/
5 `1 E( {# m$ C2 q) P8 g( Ichar txArray[] = "Tronlong UART2 Application......\n\r";+ ^; r1 O! j5 K, V3 ?8 e7 V

8 _3 R- r$ `2 C& k: p: b' Z/****************************************************************************/
1 v% D5 ^& x' J- X4 F/*                                                                          */
& W- w- C( s6 T9 i0 Q) L/*              函数声明                                                    */) U# R& `. M; H& Z* l& b
/*                                                                          */1 ]9 W& }1 N& `
/****************************************************************************/
% d2 o7 \1 V! U$ @// 外设使能配置
# C  y& I* w8 bvoid PSCInit(void);# g6 L, f0 p: A3 o* z
1 F, x9 d2 `$ F# g$ K
// GPIO 管脚复用配置% L6 t0 {5 n  s0 ]4 O
void GPIOBankPinMuxSet();0 U* e3 S$ y% R; N* ~/ H
  `# H% ?9 b7 v0 N- x* W
// UART 初始化, V7 ~4 w2 s& m" @# d
void UARTInit(void);
: n& E6 W& u4 y$ O$ F, t+ o) i0 z// ARM 中断初始化
5 L; _4 d" Y) U( rvoid InterruptInit(void);' H; @- l+ k& J* X+ D$ @
// UART 中断初始化
& j& z0 j: E' _9 E) ^, U2 ?" Evoid UARTInterruptInit();1 ]/ l' K9 x1 |: B
// UART 中断服务函数( G9 t$ C- q1 D1 L5 D! D
void UARTIsr(void);
! ?* \2 \1 z+ _$ K7 A) |% o! m0 @6 h- {# T- m* r  l0 w3 O
/****************************************************************************/
* J4 M8 h2 |$ ~2 g+ m/*                                                                          */
- l: x$ U4 H7 Z' ?/*              主函数                                                      */, @- l( n" R# ~  L4 o8 x
/*                                                                          */
% R" ]0 ?: [6 b$ _% Y/****************************************************************************/
% b/ c0 A' E1 Z& n( u$ x3 g1 zint main(void); C( `  C/ [" M8 L# a
{
9 J1 \( F. `) t0 A( S1 N        // 外设使能配置
) G. e' t! e& Y3 {& F  _        PSCInit();4 @! q$ h( Y" i& E3 d* c  d
       
( G$ g& t, U8 N& y3 X        // GPIO 管脚复用配置
1 r* o' k" c% M: x; r4 H' q        GPIOBankPinMuxSet();' n/ o( O2 _' o+ v' V/ Q& x4 H! L" n

; m- _8 ?8 K6 J: b/ Z) R' j, b3 e( n        // ARM 中断初始化- R6 R# q5 g/ e
        InterruptInit();
3 ~& k# p$ J7 \0 u& W( p2 U4 N+ F) {3 I2 V1 f, N% C: g* b
        // UART 初始化
, ?, Y+ F* W6 q% F  g: t; U2 N        UARTInit();
# N/ f3 d- T) S# p+ F7 `/ x0 K5 A1 ?- H
        // UART 中断初始化
' a6 z8 A. T8 j0 w        UARTInterruptInit();
: s) x) N- V$ k4 T2 U5 v. y% `% k7 o
        // 主循环
  ?! d! j1 H$ D# [9 i        for(;;)  m% U7 N  e! O: [. Y
        {
4 G: f0 g5 W3 x+ ^- t% I- e1 n! T
" a2 L+ S* `) j9 @( m# Q        }, x6 b+ B# A3 {& U
}
4 r( P" E3 ~  ?, ?  B( A1 }7 x4 s: W  A
/****************************************************************************/6 P$ }, g- a! X' C8 Y8 s6 G+ R
/*                                                                          */$ A) W6 S0 x/ A# D. J; y
/*              PSC 初始化                                                  */+ C8 v/ p3 s9 Z. m8 z  S' F5 Z
/*                                                                          */. s/ O7 ^% N# V" W% l$ |' @) r
/****************************************************************************/
* a$ k5 W1 q8 n& Z6 Y6 i3 xvoid PSCInit(void)
- I4 H% y) `9 R6 ^3 v, F9 j{
& X% U3 p7 L) ~2 I        // 对相应外设模块的使能也可以在 BootLoader 中完成
+ E& K* [% \2 i  u$ v0 _- ~    // 使能 UART2 模块  X4 l0 C- M1 l1 B2 N6 s
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);2 C+ V0 w2 s0 J- M  ^, O* h9 l
}1 q! G$ \4 ?$ \8 s# E2 N
0 }9 W* e) y. P, F) p! [$ n
/****************************************************************************/  S) [! H! Q0 I7 D, {
/*                                                                          */! J9 ~9 i; y. S! F/ S! `1 w8 w
/*              GPIO 管脚复用配置                                           */' A1 n, D3 r6 o6 O) A% G
/*                                                                          */& {7 N& x; X* R* g/ M
/****************************************************************************/
( x3 Q: d, n# J) k+ \3 ?  jvoid GPIOBankPinMuxSet(void)6 }) C' h& @5 b3 {& I
{
* w  [* a4 C% w  z( Q        // UART2 禁用流控3 _& Q7 @: c: Z2 a6 w
        UARTPinMuxSetup(2, FALSE);9 I& t; E+ p. r' E( R# u
}
' m) ~' M* n8 U) C( B9 ^/ ^' p- E+ R/ u# f1 L
/****************************************************************************/
0 O3 A/ h3 b5 N! I  P! T/ J. o* p5 W/*                                                                          */* Z& R7 U* \* ]" G# X' `
/*              ARM 中断初始化                                              */  a$ Q) }. x$ M) t2 G; U3 v: e
/*                                                                          */$ A8 @( D) Z; q3 T6 i5 ]
/****************************************************************************/
: o0 A. y# q0 N1 S/ K0 gvoid InterruptInit(void)
1 l* S( b3 w# c3 G& w5 j( `{
! z5 o- e/ [; x8 s, S( A/ Q  m' t    // 初始化 ARM 中断控制器! H8 U2 ]' Q; M) i
    IntAINTCInit();
8 x' s) d1 B  F+ r) H5 ~4 ]' T1 c* w" H
    // 使能 IRQ(CPSR)
5 Z# }; m( X3 p- Z- U( C, a/ l    IntMasterIRQEnable();. m; A5 Y. O3 V9 a2 s6 t
( l3 G7 D- V& v5 H# W7 q- V
    // 使能中断(AINTC GER)/ H# s, j2 y: G+ p  l+ J3 i- b
    IntGlobalEnable();
1 {- L6 `1 t4 S$ r# c0 L/ e& a1 G% @# }1 ?& @# O$ f4 Q, N2 @8 W
    // 使能中断(AINTC HIER)
; s% V/ B! O3 U% M% V' F+ S; H    IntIRQEnable();
7 l( Z$ `8 i- Y) U3 c5 I}, m- v. R# x( ?5 N
. `1 \% p* b+ g" T# K* s
/****************************************************************************/! G: N' h$ ^  M* _) A# E, Z& r
/*                                                                          */, I% z0 f: _% D" k0 y
/*              UART 初始化                                                 */
2 F! `7 o6 {6 d+ T9 O  A/*                                                                          */: f5 c' g( B5 A: _0 }1 V) e' u
/****************************************************************************/
7 k% C. H- U6 i; L6 Hvoid UARTInit(void)
" i5 K4 h  q+ v$ c3 k{
! j$ q3 T! J- K# n        // 配置 UART2 参数1 P1 ?) B0 E' H( m% q- v
        // 波特率 115200 数据位 8 停止位 1 无校验位# h: s+ u2 h( P" n
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
1 O/ a) Q' M: s- t) S! O                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);' K1 g/ t& V9 \; |. \1 l
        // 使能 UART2! E' F* V! R! G$ S% Q, S/ H2 O. }
        UARTEnable(SOC_UART_2_REGS);# z8 H: j3 o& W9 |5 h

7 _6 ?) i3 _3 b4 }    // 使能接收 / 发送 FIFO
: q+ z, j* H1 V+ i& u    UARTFIFOEnable(SOC_UART_2_REGS);
' E0 |6 `  V( `$ k4 m
# K7 V3 n9 l1 z2 P    // 设置 FIFO 级别
, B% \+ C: V% r9 C    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
0 P/ |/ F5 p. u- G}
0 b' _& v( `: x! a% Q
/ A, w) q' P8 O9 G& |+ Z/****************************************************************************/
' \7 ]; H# `% |/*                                                                          */2 s7 X9 F, d$ g5 y. N
/*              UART 中断初始化                                             */0 J& r  r1 c0 H8 _) L5 d# a
/*                                                                          */
3 \9 |$ ^- [* N4 @6 ?% ~/****************************************************************************/
, s- H2 A4 b4 a+ D; z) M0 p9 N6 g) Mvoid UARTInterruptInit(void)
9 Z% @. y+ X2 d. u0 B, `{
. ]: e: v0 M) S( U* ~8 Y7 s        IntRegister(SYS_INT_UARTINT2, UARTIsr);
  K1 ?6 J! X* z! K4 u2 @+ J; E        IntChannelSet(SYS_INT_UARTINT2, 2);
* }: _' t0 e5 E3 z4 e- K# F4 m        IntSystemEnable(SYS_INT_UARTINT2);, d! t# ]& j" Z3 P0 I* i1 [& E8 t

- v) g2 Q& D: R% x; K        // 使能中断2 f; K7 Q( V' A9 u( X$ z: B
        unsigned int intFlags = 0;
! t: G% I7 ^; C0 B    intFlags |= (UART_INT_LINE_STAT  |  \
  l0 U! g0 p( V* S                 UART_INT_TX_EMPTY |    \
% o1 Y7 w+ `0 t3 Y! R                 UART_INT_RXDATA_CTI);
2 ?2 W. K: S: i, n1 E' {, m    UARTIntEnable(SOC_UART_2_REGS, intFlags);
6 b8 a1 p- U6 N+ `6 Z% O. c}9 t, q6 T) r( E4 \
& D  I  Z# m, `, H  `3 [5 C
/****************************************************************************/" s" S: C9 z8 O% u
/*                                                                          */& y$ S; k% N, _% q- v
/*              UART 中断服务函数                                           */
* A2 a# k- ~  K) {# S/*                                                                          */
  L  n$ ?- P" S2 j4 H+ h! T/****************************************************************************/6 e0 a! D" M* p; |, u- y( @
void UARTIsr()
' ^. ]+ m. i7 v6 \{% E# e  B; \  z9 v) p( \  f
    static unsigned int length = sizeof(txArray);9 l' X1 X+ e+ b+ r+ z3 D
    static unsigned int count = 0;9 i# r$ @, C9 H% S+ y" @- E
    unsigned char rxData = 0;0 K' D, l- ~8 a
    unsigned int int_id = 0;
. @0 X  [" B; d' ~  Y6 {8 U: J+ o: s
. l5 b5 R5 f) Y- Z$ D3 a3 t) y* @    // 确定中断源
+ Z& P3 n% U3 \8 S) x9 r. i    int_id = UARTIntStatus(SOC_UART_2_REGS);
3 X* w6 K; Q7 X; l% ^; ?
% [3 L  [$ n# p: I% x    // 清除 UART2 系统中断/ y$ b8 w& u0 g' p' A' M, l
    IntSystemStatusClear(SYS_INT_UARTINT2);
) l5 z$ z1 R# u* X' @: Y
& j: o, k" i5 w+ [) h6 w    // 发送中断, t' I6 r- M2 d
    if(UART_INTID_TX_EMPTY == int_id)
+ D4 y+ o+ W" A! [- _    {
9 a  q0 q* b' h# Q5 ^' D3 B  {        if(0 < length)- X8 A$ K4 N  }& I( C( h; P. e
        {
; o+ E8 Q/ G7 Y9 |            // 写一个字节到 THR9 g% ?: q8 n: h, V) X  Y
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
. r9 K: M. r" }) b            length--;9 n- N* `: E1 |2 w# Z
            count++;% d, d3 \$ G/ D0 I, d
        }& h8 @4 C- r  K0 v" G5 q
        if(0 == length)! I6 ]9 i4 X! ]- @0 F- g3 Q
        {
3 c) c6 i* L3 q( G            // 禁用发送中断+ f' N$ N+ h; O$ }% H
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);* n+ D7 j, y( |- y9 [
        }
' O- O- `" f* O# p( g     }
4 R, B9 H0 O4 ^% t" H& o* y6 X( m
& h; A1 t( o* E% A$ \- }0 d4 u  g# w    // 接收中断0 E9 g* c! n2 N& z0 K, U+ B
    if(UART_INTID_RX_DATA == int_id)3 N4 F( R& v" _- I
    {
6 h" i  D0 N3 b5 G) M5 z8 N) u5 _/ l        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
: d) f" s0 Y/ w# P( G, w) R! o: `1 B. Z4 k
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);) U  P: Q  Q4 g1 B& g, l. ]
    }
" }& G5 [. ~# J" w
* m9 I! v% L% O% @2 b* B( [    // 接收错误
- D2 i1 V8 w/ m+ _    if(UART_INTID_RX_LINE_STAT == int_id)
, y6 d2 p5 e; p  p    {  \9 q4 i$ O2 ?" \3 r
        while(UARTRxErrorGet(SOC_UART_2_REGS))
; e7 [! M! w. |0 U5 V0 K& b* ~( E. J4 E        {1 L. i' O7 g+ J2 f
            // 从 RBR 读一个字节& T- X5 R6 ?  Z  c; G: u' U
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
5 p' U' N, `- Y- d- H! R        }
& C2 I) ^+ ^% T( m" h    }; k1 c& X. ^* R3 H" D! E
    # F! j8 {, p7 t1 V' Y; J0 Y! `# x  r1 w
    return;
% a# ?6 y/ [  J- u! Q}, Z- `8 I, N4 U8 F+ E
回复 支持 反对

使用道具 举报

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
8 D9 G, V- P0 i7 ^如果其它设备快速给你发送串口数据,你这边能正常通讯?

1 E/ L0 ^' A5 {3 p: x" Q* B; c2 Y谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-8 14:51 , Processed in 0.043655 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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