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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8038|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。7 ]+ @3 L' s4 b

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

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

- s2 {* F: g! R. h. P#include "TL138.h"                 // 创龙 TL138 开发板相关声明
' P* ~/ X2 v) b4 N3 ]0 R" T+ L
/ j! J( X" D4 i8 u6 B7 v+ B- j+ Z( V#include "hw_types.h"               // 宏命令
4 |0 }# }/ Z0 G; k#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器/ G  F1 [! S/ r/ F& T3 L3 B
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器' L/ ]$ [% u' T$ R

  h* y9 W* J5 x- l/ k5 W#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
3 p) H3 p* r4 E3 c. K$ J, `0 v( r#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
- A+ x+ R" j9 k# l* R1 \#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明  p( [/ t' F- o" ~2 X* \
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义" H& b( s+ P+ q0 u% q" N
% r6 k. G2 ]: a; w* ^. U
/****************************************************************************/0 S1 t8 o2 c; V/ ?6 C
/*                                                                          */. j- j/ {' K& P6 D: @1 y3 e
/*              宏定义                                                      */- @  T' i- A  y
/*                                                                          */4 d% ?1 s% L' o3 u1 J: r+ v
/****************************************************************************/& o5 B! f: @; ]' b# A" O& R1 u8 @
// 时钟
, |' t1 N1 Q+ _  T#define SYSCLK_1_FREQ     (456000000)+ E8 O2 X" v$ _- y2 s
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
  p- h% q7 z  ]! m7 I8 |#define UART_2_FREQ       (SYSCLK_2_FREQ)
# i6 p* a- X2 D+ `9 f! s
. O  U  o" L% q) U9 y/****************************************************************************/
0 p5 A+ ~1 ]! u' r! T/*                                                                          */
8 \4 m9 ^$ c1 {/ O' c6 a( v# P4 f/*              全局变量                                                    */
% ]5 F6 r. e2 N+ L/*                                                                          */
# x7 K3 O: ?, a' E  {: e/****************************************************************************/2 X, N2 H2 v. x( n; h
char txArray[] = "Tronlong UART2 Application......\n\r";3 l1 |! ^, s, g

" p& l& V' M  x' Z* z7 ~/****************************************************************************/$ \$ d  ]; P" L2 F( ]( ]1 Q1 S3 X
/*                                                                          */
" G- M1 D% C7 _  F( |/*              函数声明                                                    */, ?5 l, e4 r6 v5 e4 Y
/*                                                                          */
8 r6 L$ @9 g- I% g/****************************************************************************/3 Y, Q5 q. I5 _: E/ C9 u
// 外设使能配置
: t) T/ T7 i3 x5 [void PSCInit(void);3 t( I7 Y) }7 v
4 ^5 D/ W1 Z8 G- j, E: B
// GPIO 管脚复用配置; B: Q9 V) L1 L7 l, p( T6 d, X
void GPIOBankPinMuxSet();+ _! z2 [9 W1 ~& I+ r2 C( L7 \6 w

7 h; Q2 Z" J- R3 c// UART 初始化
. p1 l, u; _5 Q) D3 kvoid UARTInit(void);3 D' S8 ~% F  M% [# }0 f3 Y! g! E
// ARM 中断初始化' v, i6 V2 O% Q) d6 _% E* X% J4 I& l
void InterruptInit(void);% j3 I$ m# O1 @6 _
// UART 中断初始化
$ ]* T9 `4 g: V. q/ h& m3 V8 uvoid UARTInterruptInit();
" R: t4 F& \0 N; r0 A4 }$ D1 u// UART 中断服务函数
' R0 z! n2 i3 P1 B& q2 H- M& Uvoid UARTIsr(void);, Y5 p( ^0 I! n8 A. t
! g2 O# k* a$ I8 k" U) i
/****************************************************************************/# g6 t1 _, S8 @* N, Q: x
/*                                                                          */! G& n' _8 F; @% J; q0 k6 H" G$ R- N5 ^
/*              主函数                                                      */
1 b$ d0 K2 c) I! D. s/*                                                                          */
1 \7 S0 j9 M, u- \/ z$ w/****************************************************************************/
8 F' c, i; j4 c6 H( Iint main(void)" W! d7 ]+ O, w& M; E0 s
{
7 R& Y& k( U( ?& E, b' |0 o        // 外设使能配置
, D0 x$ j' |9 k6 u* L        PSCInit();
* u% j4 ]' G0 W, E, I        ! W' f+ a7 Y  R1 ?
        // GPIO 管脚复用配置
6 _7 G: Z, b. U. ^; s        GPIOBankPinMuxSet();
+ u8 E3 k$ e# M3 W" I/ U( b& n
        // ARM 中断初始化
& h. f* [4 \$ M( @! g7 X$ l        InterruptInit();
, |7 V2 s, f( i: y
6 @$ b( N8 P# B% r7 T        // UART 初始化% F. l, L, k, J  L
        UARTInit();
7 K) l3 m( t. ~& j. ]6 e* P- H
- G. O3 ^9 @( ]; C- Q7 e! V        // UART 中断初始化8 M) W" s$ Y# n  a6 c% Q
        UARTInterruptInit();% l& E3 p' |" H9 U9 B( ?
) ^' ]/ R' W1 h/ c
        // 主循环* S  t; ^2 ^2 y. d
        for(;;)0 g' `2 r* }* \) q8 F$ P3 r) ?
        {! _) E, l! g1 A, p, k9 h  a) B- R

' Z4 h: u+ S4 {# L        }' n: p- P0 F  {/ d5 {
}
# ~/ e# G, Q8 M! w' x0 Z- r" ?3 P& ~+ B; U
/****************************************************************************/3 Z2 ~4 G/ F* K4 J  E" g8 y
/*                                                                          */. l6 e9 a: b0 F7 j
/*              PSC 初始化                                                  */9 x4 G' D6 f% V* m3 U6 Y
/*                                                                          */
% ^& k3 ^* F: O/****************************************************************************/3 W2 o- Y& N- j( a3 a9 o
void PSCInit(void)
3 M: d: W, Y$ p: u{
- ~! k3 G: l# _  m        // 对相应外设模块的使能也可以在 BootLoader 中完成
! m" z) l1 L; P! Q. ?3 e- @    // 使能 UART2 模块5 L- w7 [8 j1 N$ ?* f
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);( O3 E2 r3 e9 C" y
}
# Q* \: ?5 \& y7 K0 A
+ w+ n2 q5 c1 o5 q. f% n2 Z/****************************************************************************/% G) g3 G, Y1 I/ _
/*                                                                          */
. l/ n3 e9 Z0 _$ H, I) Z4 J: e5 ]& _/ q/*              GPIO 管脚复用配置                                           */0 G/ z6 j7 `! E: s: S& u
/*                                                                          */
* B5 v) e" q9 C4 ~' l/****************************************************************************/2 w! L) t3 _+ s" [0 ^
void GPIOBankPinMuxSet(void)
% e/ L9 y0 K$ j' Z{
8 ]' P3 E. H1 y! c* V% B$ E        // UART2 禁用流控
3 n7 h2 z; Y6 U, h0 i        UARTPinMuxSetup(2, FALSE);
, A2 v9 _0 `8 a. d! Q8 W0 T% @}
! A$ o; m8 x/ ?$ N5 e, E+ s- T# m" e& \! i( |
/****************************************************************************/- E+ D' x6 J2 N# C
/*                                                                          */
& M4 ?2 R5 R( t/*              ARM 中断初始化                                              */
' c6 H: {1 W) ^3 a# E# F# l! ]) C/*                                                                          */
- V* Z' f# x8 _/****************************************************************************/+ J" T4 Q" m# H2 s. G
void InterruptInit(void)
0 ^. y2 N) b, F+ V. c- J0 L{
! {) z2 A! g& [( H& Q    // 初始化 ARM 中断控制器
0 p8 V/ J( Z4 F  d    IntAINTCInit();
" `8 y7 |( d1 U8 C# F4 _+ a! K# Y) c* T
    // 使能 IRQ(CPSR)6 b' g/ T4 |$ z: O7 r% b9 r! t3 d  }4 G
    IntMasterIRQEnable();
  T7 w( i) N) `! E
/ s$ h: b( b! \* d    // 使能中断(AINTC GER)" X) `6 ?& S+ I
    IntGlobalEnable();( a# `/ a& p5 f6 m
( d8 k& N$ q' l" ]) l) z8 @7 K4 o4 q1 r
    // 使能中断(AINTC HIER)" |# ]4 H/ Q8 n/ F2 ?
    IntIRQEnable();6 A& ?! T4 n1 ~# V, M8 d
}9 W$ |% y% J" U! D
) m- N: N2 @/ d% ?! W  ?
/****************************************************************************/
5 l  G$ Q+ L8 s" t, p/*                                                                          */
0 Q6 b2 \- v5 o8 a) }# l0 L8 C1 W4 E/*              UART 初始化                                                 */- p7 z+ ^0 W3 k$ `
/*                                                                          */) o8 @- Q* N" u8 h* |- g5 L
/****************************************************************************/- v! l0 N4 n4 w8 n) @( ?
void UARTInit(void). M& \& c7 D# |  \9 |7 {# ~: j; y
{8 n" J5 k* c7 f/ p0 c
        // 配置 UART2 参数
5 m2 n/ ?+ l8 D        // 波特率 115200 数据位 8 停止位 1 无校验位
$ H8 S6 k- s6 D  D4 S/ t4 {    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
8 u% q6 b4 U: C, f                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
* w, d) U4 q: g  b        // 使能 UART2
6 D2 Q0 U; \( }9 L* F6 W        UARTEnable(SOC_UART_2_REGS);" x+ M; R+ f! ^5 v. O$ Q
6 G) i! x- p: G8 E: F* Q2 j
    // 使能接收 / 发送 FIFO
# u( f* w6 s2 k1 e3 Q& D5 [    UARTFIFOEnable(SOC_UART_2_REGS);/ p- L+ T5 B5 c9 s# U" k) R
- p$ N( k. K% [. o* g
    // 设置 FIFO 级别
# g" J( S7 y- H+ S# n4 J; ^    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
2 {5 x8 s; V. C& I* P1 P}
' b$ ?  ?4 W! I  Z# b
2 `1 R3 e( Q5 _# v9 c$ z/****************************************************************************/' I) Y2 g/ a+ D  _: S6 B
/*                                                                          */$ g) \) n- r* r, o
/*              UART 中断初始化                                             */
7 Q* f& \. G" b& a, d) W/*                                                                          */- N( W+ w; I6 \# S/ Y* g
/****************************************************************************/
, R7 b3 f, l2 L- Wvoid UARTInterruptInit(void)
% i- w% e5 w* i, X, d: n+ j{
" A# Q7 ?8 M3 ~  M- O' {- _        IntRegister(SYS_INT_UARTINT2, UARTIsr);1 a/ v) Z) `# d  n/ Z+ a
        IntChannelSet(SYS_INT_UARTINT2, 2);6 L" @3 G; m9 F
        IntSystemEnable(SYS_INT_UARTINT2);: g. q. c" i& f* w. `
8 _' ?9 g( s9 X5 v; |& ~8 I5 b
        // 使能中断' d% A- Y$ Z+ r6 I+ F' y' z! [$ z
        unsigned int intFlags = 0;
$ N" I  Z( x- U" k    intFlags |= (UART_INT_LINE_STAT  |  \
" \2 ^* K4 \6 p) w9 ^8 }1 m3 M                 UART_INT_TX_EMPTY |    \. {3 U; m6 i" u8 @* C7 C$ t
                 UART_INT_RXDATA_CTI);* i" O$ d7 T/ H1 V  n+ a3 A9 b  x
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
/ r5 E2 R! ^) N( W0 h/ y( y( w2 O}
8 I- H. ^/ ]4 u7 a+ w0 g" z5 [6 L5 A& Z+ C# u$ Q! D6 Z
/****************************************************************************/3 G1 K$ u7 n5 c8 `: C2 G
/*                                                                          */6 J8 C: }$ E: d" T3 R* H7 b5 N
/*              UART 中断服务函数                                           */  \9 e8 F0 }4 L2 z0 R
/*                                                                          */
/ H! F3 e5 w6 w/****************************************************************************/
" s1 ~; _4 O0 E1 l. x6 o* uvoid UARTIsr()
1 E. h; t3 h/ M& `7 t% `{1 s# t$ C5 K' @, d2 d
    static unsigned int length = sizeof(txArray);- f- d4 F9 B6 a' g3 M; s! ]
    static unsigned int count = 0;* e8 Q! K4 [* R$ b( q# x
    unsigned char rxData = 0;  s* `& d. `/ E6 E  d6 c1 m
    unsigned int int_id = 0;
& q; [3 P0 _6 r- y4 F
( u. g1 e$ J$ A4 [; n$ Y    // 确定中断源! J# M5 J) M6 ^& B/ V# u
    int_id = UARTIntStatus(SOC_UART_2_REGS);9 U" j. J4 L4 o! C! R  {
, J5 d# z, o# l5 d0 b. p% a
    // 清除 UART2 系统中断
0 U5 }9 n! e3 N9 h' U    IntSystemStatusClear(SYS_INT_UARTINT2);
% ?  E* v& t" d+ D* W/ e/ S6 J9 t$ ~& n+ n( P3 c5 O3 `
    // 发送中断
4 D" }5 u7 L5 w- J9 |: o3 K  B    if(UART_INTID_TX_EMPTY == int_id)
8 y% o+ N  V7 x/ W" Y    {
7 _; p' }3 P) B0 D$ ^' B        if(0 < length)
, t" k" P9 d) q/ P: Y: S        {
/ @, I" T- C( u) a5 J            // 写一个字节到 THR
9 e5 x$ J1 s/ d& n- T            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);' m5 t& z8 B5 m, ^2 l: D" m3 ^
            length--;
0 i" F$ x* m( }1 h  l+ m, x6 O" ^            count++;* Y. J  R# h/ W- d% U3 O  Q
        }6 |4 Q: F5 D1 _/ o8 J
        if(0 == length)
/ E" R5 p) j* g        {6 D1 C' S3 `- g! P5 f. R' c/ n* W) a. ^* \
            // 禁用发送中断3 {1 A+ T% V: Z; s) a! W( y
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);3 W+ {+ F& ]) V% V3 }- G  }
        }' a" N& a( q6 V2 W
     }9 x# K/ E& F- {5 n6 B, q3 ~; E

7 u% S  g6 M5 P, ^) g    // 接收中断
0 c! ^2 ]3 [  S# D0 ?- j    if(UART_INTID_RX_DATA == int_id)/ N" C' m! B. _( Y6 y2 p
    {
+ J. P" |( @% S! h$ q1 w, [' c        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);0 ^( J7 c) D6 q+ n

; \8 Y+ d) J, V9 h; {3 o9 m' y        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);5 C' n& v% N) |
    }* c: T( i$ C. P# ~, ~; M% h% @
! p  k8 X' X! E
    // 接收错误
, \  F, ^. I$ A1 p/ S1 n5 f    if(UART_INTID_RX_LINE_STAT == int_id)/ D$ E0 O$ c2 b9 Q/ G/ I$ P
    {4 y2 J- c; v' f( G0 x1 i, K5 @2 l
        while(UARTRxErrorGet(SOC_UART_2_REGS)); z8 \7 {1 r* b7 j/ |3 ]1 [# w
        {# h3 S# I+ e, \6 ^
            // 从 RBR 读一个字节
# H% e/ J* j9 i  E" M            UARTCharGetNonBlocking(SOC_UART_2_REGS);1 l# g. p9 C- v; f  q
        }
4 p2 o3 _3 C/ {% B    }5 h; |# `# ]9 W5 n" t" }
   
0 |( N. |+ C( U  H& T% _$ M3 ?    return;
: X. W. S2 z; b7 i4 u* f}
& Q/ @2 t0 ]4 G2 @/ S
回复 支持 反对

使用道具 举报

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/ k/ `* M- ?# d: N, i$ A
如果其它设备快速给你发送串口数据,你这边能正常通讯?
5 q% L! e' s1 d' n* \
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-2 01:20 , Processed in 0.043004 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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