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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6990|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。5 ]. J) S, ]& n+ O' e& C

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
* f% }; h7 L9 `4 D! f; Q6 b3 X4 G- }* `5 v* [; n" [
#include "TL138.h"                 // 创龙 TL138 开发板相关声明* c3 k2 \, Z7 p6 f! I7 g" C- m

% e) T* O+ ?2 p0 Q- U#include "hw_types.h"               // 宏命令9 t  h3 M: [. F( D
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
1 A: ]% P7 s0 ?  L9 W#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器) j! i% U7 L$ v/ e4 W! U

5 ^! I6 O2 A* g: h( T, J#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明2 R2 y- ^- t* v: {+ D8 O
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明2 @9 l, e6 V9 [5 \" Q* R. f1 I2 U
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明$ S% _) ]+ f% v2 V, }4 T
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义$ g9 i" k' L& Y  J3 D

% @+ E3 Y( ]! S# E) j/****************************************************************************/
' c/ q' T' B  W4 h& W& K/*                                                                          */
' ~) O' s0 d; E/ w$ z/*              宏定义                                                      */% L6 O7 c, Z2 _* W! \0 g7 P
/*                                                                          */. R$ B, \, B" h, b
/****************************************************************************/
1 ^7 K" U! @1 X0 Z0 I' t// 时钟
- s. L" y5 S2 z& [( r% c6 F#define SYSCLK_1_FREQ     (456000000)1 S2 v" [3 Y' `
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
1 A! a! I4 ]" d/ h4 i#define UART_2_FREQ       (SYSCLK_2_FREQ)
& C( C* u: z' o; \
& Y* k+ o" _$ H! ]5 M( b" d) S/****************************************************************************/' `( s& o4 w, ?( I: C
/*                                                                          */5 ~! G: G6 @4 r# {" W) p1 E
/*              全局变量                                                    */
( {, x. a+ d0 g+ u0 }/*                                                                          */5 H, F4 s* f, j& s! h& x
/****************************************************************************/2 K* G" y3 n' q6 M4 y6 \# G
char txArray[] = "Tronlong UART2 Application......\n\r";
, {- t, d+ a" Z! c8 R; G
( b; x5 c( N- V6 M, L' x/****************************************************************************/
+ L: Y  i" ]1 |4 ^# l/*                                                                          */1 W7 c& V. R6 b- M! O: d0 E4 a& a
/*              函数声明                                                    */% ]- O  S0 C" E8 `
/*                                                                          */
2 }, ]( t% \) X. @! Y" n/****************************************************************************/5 {6 z5 D" P5 D( _0 ~# X
// 外设使能配置$ m& U- _/ S! g, L
void PSCInit(void);
' E& X' }' H; C
6 e2 ?. _+ @, ]# K// GPIO 管脚复用配置% L# d) D/ f. L
void GPIOBankPinMuxSet();
' h+ h; j. V% s
2 w0 Z( y% T3 H! [8 V3 S// UART 初始化/ T) `$ g% T; z1 S! F: s
void UARTInit(void);: n4 z! U( s' Q' z/ i9 d- M
// ARM 中断初始化
0 {0 @' Y3 K, z4 J* Cvoid InterruptInit(void);& h/ p" U: v- T( j% v* }! R1 K
// UART 中断初始化: p$ K! q/ I' Z* D2 |4 q
void UARTInterruptInit();. w. y& h/ q# j2 ]8 _
// UART 中断服务函数* m+ U' s1 N, Y" a" U. h. w5 c
void UARTIsr(void);" h: s/ @& W. r( d/ i  D0 K
' z6 C- _) e; [1 {
/****************************************************************************/; U$ ~5 K7 a* y  d8 ]  S. H
/*                                                                          */
4 v5 d8 V* j7 V3 b& L+ G/*              主函数                                                      */- B6 u% }7 u" ~8 D1 m
/*                                                                          */6 `- K( ^( Y* Y' `
/****************************************************************************/
& c9 X, i6 _3 s' tint main(void)# }/ G2 X) F' M0 g& \, d
{' R2 o4 v1 L/ p9 k$ G. d( U
        // 外设使能配置1 J" x9 p1 H1 i: W, [! ?
        PSCInit();3 W5 H4 e! R6 D0 u! L
        7 F) \5 w6 L7 T& R
        // GPIO 管脚复用配置& [+ Y4 i( U$ W" l0 Y, L
        GPIOBankPinMuxSet();& L9 p* q& {- {

4 {9 z2 O( k1 e/ N- D        // ARM 中断初始化% r" @: ?6 e7 @/ U5 q# n  X, E/ _5 o
        InterruptInit();4 j7 T5 \- K8 B# Q4 A

8 z& Q8 G9 V' \9 l4 E        // UART 初始化. a: G: F, e9 y/ l* ~! T
        UARTInit();
  E1 N1 X& [" t% f) Y& \+ ?& p2 Q# ~; i
        // UART 中断初始化: S- G! I5 ~. s- A
        UARTInterruptInit();5 a- }. b( L/ u" ^' l1 Y
+ s5 p9 a( w& J- s
        // 主循环3 H' q& p: i! d
        for(;;)
; P; ^9 z% k3 V) a        {8 q. O- q: B( m. j$ u
  ~6 w+ ], k6 _3 p7 ^
        }4 C" n# n! \% G
}
) {) d- z; d( i4 l6 |6 }
$ G( l. W3 Y7 P6 B3 R9 L2 B/****************************************************************************/
. G( f# i# T; m& P/*                                                                          */& [" e) e  q( m. s5 D
/*              PSC 初始化                                                  */0 U  ?# e5 R/ k
/*                                                                          */; J+ k" B( |5 Y) A& x* T; G" `
/****************************************************************************/7 G+ I8 g4 z% w; W5 W: v8 s
void PSCInit(void)) p# ]. w! }. }- K: f; D
{* q. |9 y4 {7 B& ~5 J
        // 对相应外设模块的使能也可以在 BootLoader 中完成
9 W/ {8 N: d& `7 t( }4 ^6 m% @) U+ P8 Y    // 使能 UART2 模块; @& `/ z+ x: n( X# b  M
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
6 o3 j% Z6 Q, \  R. {- |% P2 h}" A6 a) j  K' L9 w/ m9 b7 Z
3 A  c2 |. ]4 D
/****************************************************************************/4 H9 D: P  \( T! }! h4 w
/*                                                                          */1 x. j# ~3 A7 w: o% s
/*              GPIO 管脚复用配置                                           */
& @$ w! n2 Q% ?/ K5 \, P/*                                                                          */9 d; x* R4 T/ Y* p; c
/****************************************************************************/0 k- P2 h" M; ~5 O
void GPIOBankPinMuxSet(void)
  J7 x7 G4 J9 _, ~7 w+ I; a# U4 y{/ X6 E' R! v$ X* A, S( O+ B
        // UART2 禁用流控
* f. C& g8 {* m6 W        UARTPinMuxSetup(2, FALSE);7 b' Q2 a; H' @/ ~9 G9 i4 S
}
- n+ x5 v1 z' w2 R7 ~
& ^4 p5 ~4 @2 i, E/****************************************************************************/
. h# |6 c4 o! b' y- b6 v, Q* U4 E- ?/*                                                                          */
+ B. R7 G) @4 ]3 V/*              ARM 中断初始化                                              */  u- C% I! B  J* E/ ^5 f8 \  C
/*                                                                          */$ l" q) D' ~. @' \* H& f
/****************************************************************************/6 p! M1 n: ?6 d9 d: e
void InterruptInit(void)/ X$ U5 Q  x# n9 q& m4 p4 j
{
4 J* ]2 ?9 M7 c0 S    // 初始化 ARM 中断控制器
! _" l3 d: G7 d3 |7 p  Y( m8 N) n    IntAINTCInit();
4 v) u4 n4 D* x# Q
1 a6 B  P. ^5 P+ k, A* I$ v    // 使能 IRQ(CPSR)
7 w9 X# G" p( \7 I& D    IntMasterIRQEnable();
3 u9 O9 J3 |+ C! g2 h$ K
1 p! G& C) O! F/ P' @1 N6 U    // 使能中断(AINTC GER)2 a/ u: ]9 d$ ^+ Y
    IntGlobalEnable();0 l! U$ b& p: u4 _$ |
0 L' p6 q/ W6 k3 w* |) N6 v: }4 w
    // 使能中断(AINTC HIER)
: l; n4 p7 h. x9 T: W1 P# D1 V    IntIRQEnable();. ?: r- }0 {9 d+ v/ P1 v2 Z8 V
}& k1 p  L9 Z, N

# Z6 G  u6 c) L! c& Q8 G3 I/****************************************************************************/
( m5 L9 q/ T( T3 R8 u. x/*                                                                          */
: J8 r* S' _7 Z/*              UART 初始化                                                 */
$ q  X4 y( k# X. a+ ?8 }/*                                                                          */# O& ^% v* r) B9 n
/****************************************************************************/5 w5 T. O# \5 H6 I1 L
void UARTInit(void)2 _* _5 ]& [) W; w- [: [
{2 x$ ?9 b0 {: E" g& Z$ E5 R
        // 配置 UART2 参数0 H" k# V$ G, B5 T+ |# t
        // 波特率 115200 数据位 8 停止位 1 无校验位
# {+ q7 A/ E$ J! B( W" M) {- A! n    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
7 h% I3 V; e2 \9 {; E! a& y4 B& _# J                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);4 k0 w: H' q1 V- ]  a
        // 使能 UART26 x1 [5 I3 l8 J/ a- J- A6 p
        UARTEnable(SOC_UART_2_REGS);6 D- K$ O+ j4 ]9 n3 l; ^5 ~% I

' y, N! i1 N6 t, n( f5 V1 @  V    // 使能接收 / 发送 FIFO, c( ]$ C6 P8 i2 H- k2 K  J
    UARTFIFOEnable(SOC_UART_2_REGS);
$ R4 w0 V  X: X. g0 L1 J' s( a9 s5 S; e$ ?8 e% {( O1 ?
    // 设置 FIFO 级别- P9 E4 _* @$ y9 `3 y3 y
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);/ G: }! x0 D; M0 X& Y
}* L# U% l& `$ H9 P2 x  t& Y
& q8 h. J6 e9 J3 ]7 Z
/****************************************************************************/$ C7 c8 L, f' R4 I' _! L
/*                                                                          */) C3 ^8 K/ n$ y6 ~( _$ Q7 m
/*              UART 中断初始化                                             */: M1 n; r  q% i& F. D
/*                                                                          */
7 d4 E$ A; {: K/****************************************************************************/
4 s* `) y6 b! N. T* Rvoid UARTInterruptInit(void)
5 j; K9 m! X. P7 r- \9 s! }' E$ U{' k8 h8 F& n9 p' m& b7 C# l0 `3 r
        IntRegister(SYS_INT_UARTINT2, UARTIsr);$ y8 n1 ^* Y0 p+ n( o9 K) `5 o; }! w
        IntChannelSet(SYS_INT_UARTINT2, 2);$ g# m4 L- M- N
        IntSystemEnable(SYS_INT_UARTINT2);
% K( a# q" l' h2 z, c. b+ h( {; D, {. V1 n
        // 使能中断3 H, t7 H4 e0 W" S. w" M
        unsigned int intFlags = 0;- i* ?) \8 L6 w5 l6 }* Q  |; `
    intFlags |= (UART_INT_LINE_STAT  |  \+ P7 @! i9 P& }. {  E: E1 s
                 UART_INT_TX_EMPTY |    \  {1 ]3 m" r8 \/ A, Z0 X1 K! E( a" Q" f
                 UART_INT_RXDATA_CTI);) X" b* Q7 c- u7 B5 U6 [4 a
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
& q3 B. p: J0 T! o- ?" n/ `}
& d6 z: h% `0 H; L5 V" u: B2 P) Q8 Q
/****************************************************************************/2 M9 h% l9 n6 F8 y6 K% X
/*                                                                          */
) A3 {. ?& ?) i- M$ ~' r/*              UART 中断服务函数                                           */
; z1 Y4 d- \# m2 n/*                                                                          */8 r: P* y9 p) }' x' ^# y. s9 N
/****************************************************************************/
  X. n( P  ]* ?3 evoid UARTIsr()
; ]8 q* {# Y' V+ Z{0 D' j, h$ o; R( A" |  ]* H+ l
    static unsigned int length = sizeof(txArray);
  t7 {* v( j- s3 h) C( m) r    static unsigned int count = 0;
$ Q) f' u  o: K; ]9 V+ N) G5 |    unsigned char rxData = 0;- `  \: s+ U+ w! K; l5 D' A
    unsigned int int_id = 0;! W( O9 }! I3 ~  o" G
5 V  E. R5 L3 y- ?
    // 确定中断源6 G+ q1 [1 n8 o% ~" P% z
    int_id = UARTIntStatus(SOC_UART_2_REGS);& f) n/ Z  D$ L  l
. D! I$ q5 T8 a# z& f, R
    // 清除 UART2 系统中断
+ _$ j: K: M  ]4 B+ ]# S    IntSystemStatusClear(SYS_INT_UARTINT2);
' f* O0 N4 }/ K1 \- Z
% [0 y2 [  J! G6 r3 n    // 发送中断3 H. X3 {7 A7 N0 A% q
    if(UART_INTID_TX_EMPTY == int_id)% l7 D/ _) ]( }, O7 r3 a3 k
    {8 o! @" a' m" b3 T4 t1 Q
        if(0 < length)5 `3 `, ~2 \" n4 N$ v2 _. v
        {0 K1 R& t" b' W  w
            // 写一个字节到 THR
0 `9 D* k) N9 A$ ^- @% R            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
+ u3 ]1 P) ?3 B8 ]+ A$ \8 _            length--;7 u- }6 Y1 F4 N! O: K  R
            count++;
- M/ X; H' z. \        }, f$ R" V" N, Z* b" e# d, y, g
        if(0 == length)
% ^9 K. {; _% H- h. _  Q9 g7 t        {
5 j5 b2 @- ?, A/ i/ r( a, `+ i/ o3 s* h            // 禁用发送中断* f+ T) R% J4 \8 g$ ~/ g+ S1 q
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
8 M4 l  _* f. `1 X: n        }
/ e: {! p/ K5 P     }+ E& u7 n4 o) X9 y0 i# k! z
% B9 E9 p9 w1 v- z: d1 o' [
    // 接收中断+ \8 J+ F* j6 X$ m5 B7 N6 w' e
    if(UART_INTID_RX_DATA == int_id)
( g7 y6 l! k* b    {6 j2 |5 h$ U+ T4 ]! U. z! D
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
2 I$ ^3 m8 k4 I2 ?- B7 B- _5 L8 t: l9 D/ `
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
* @  F/ N+ z7 c7 W    }
* e# |+ p- g0 O$ Q; i$ J$ j+ j5 w
$ G7 l& p( k- K4 X0 {    // 接收错误
- I; A' ]' E: f, J' v. \    if(UART_INTID_RX_LINE_STAT == int_id); y5 f- q- q" j8 Z* N+ g" }
    {
' V. d7 V: \+ m9 K7 F  D        while(UARTRxErrorGet(SOC_UART_2_REGS))2 k1 d" x& {2 O  l' v1 m& ?
        {
8 g  Z9 P- s. _" y% d            // 从 RBR 读一个字节
6 H9 J& G% G5 i4 h            UARTCharGetNonBlocking(SOC_UART_2_REGS);, h5 t# \6 @. E; x: K( x; N4 Y8 u
        }( P- V$ R/ z" f/ ]8 g2 n: m% }
    }8 J/ }$ }4 Q( ]( |0 c
   
8 R! O$ m  C  h5 M( f+ L$ h8 J    return;
% Z, c  M5 `& z}3 {2 q5 ^0 ^) I8 ^  c. i, D# 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
8 k! c4 S) x. D* m% }; ~如果其它设备快速给你发送串口数据,你这边能正常通讯?
* V  ?1 T4 t" a! h4 e) l
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 04:44 , Processed in 0.046504 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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