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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5592|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
& K# E5 @1 c9 A( e$ U

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

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

0 l) e6 c% R6 C#include "TL138.h"                 // 创龙 TL138 开发板相关声明4 l" u' E1 v8 m' ^/ Q8 V

1 K" k' M/ s2 K* ?8 v' b#include "hw_types.h"               // 宏命令, x  Z3 _4 `4 j! D$ R$ e: _
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
. r; P" U/ T3 m( ]# V# K( F#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器! H4 S( e6 _- p6 B4 l3 \
4 u! T; c# b: `+ D
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明5 i: B0 ^8 P4 {' a; w4 m
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明/ b; h3 E& v$ Z
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
/ Q' a7 F7 x* Y: L#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义  A7 ~4 f) g( k2 ?* ^( ^# F! ~

: w9 D- E, i% C, h: A0 n" V! N/****************************************************************************/: C9 \. I7 N* i, |
/*                                                                          */0 s/ W3 [" A! S* o" @
/*              宏定义                                                      */6 f# A. B3 ^1 x( v* o
/*                                                                          */4 m1 p2 f* ~  A6 P
/****************************************************************************/
0 \3 _/ x) S- E, m/ h8 S// 时钟0 I" H  g& y" H: v8 P( ^( c9 ?0 [
#define SYSCLK_1_FREQ     (456000000)
! u* F: W8 ]( b3 g8 @#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
6 }1 b! Y% {/ z% m7 M1 d3 {#define UART_2_FREQ       (SYSCLK_2_FREQ)
- `* q! D) N' C% f. _/ \
9 z4 y# L: I" I) I" b- p" S/****************************************************************************/
% x0 f% K% V7 g0 |, ^. q  |/*                                                                          */+ c9 j- a6 M- r* a9 E9 m& C, S
/*              全局变量                                                    *// u* I- f: m7 A: |. m! j2 p
/*                                                                          */
% a2 z/ s4 g# j9 r* u, K# O/****************************************************************************/5 d3 I( N( ?# v
char txArray[] = "Tronlong UART2 Application......\n\r";7 w6 d9 Y8 S! r+ `' F- l

) p4 _- C6 V' y/****************************************************************************/
5 R2 s1 l3 L( ?, u/*                                                                          *// o1 O! B7 u" Q3 U, z* s
/*              函数声明                                                    */
/ n9 u! H; x- P+ D, ~8 _1 u. ~/*                                                                          */2 q2 w$ K1 g) L
/****************************************************************************/
- T. y! z  ]9 v) g7 E, f// 外设使能配置" h  L% m) r: Z& M. W" Y
void PSCInit(void);' t( e' ]! G% t# ]# b% X& U

& x  z. I9 x) n( ~" D/ [% l/ _// GPIO 管脚复用配置0 r) S' s) h" |0 \4 ~5 |
void GPIOBankPinMuxSet();: I' l  G0 p# ?
( T9 \( g5 z& G2 _+ v; B% v
// UART 初始化2 o2 F, z( S, k3 g+ f
void UARTInit(void);
1 u2 C3 l. i5 e- w1 u# L8 {// ARM 中断初始化% X8 D, ~& K* c/ @( e
void InterruptInit(void);8 m4 R4 V$ F5 M5 G1 ]9 m; H9 H. [
// UART 中断初始化' n9 F7 `- w4 K# _4 ^
void UARTInterruptInit();7 P# K* n2 R. R, ]
// UART 中断服务函数4 _) J  J% a. t( y2 g0 Q$ L6 A
void UARTIsr(void);
$ x6 q  V% l4 o! U- H. ^6 a! i8 Y& g8 e8 l- Q7 ~+ }/ h
/****************************************************************************/
. s; j& X$ {) v3 O/*                                                                          */
, ^. N& P- A  D6 J' P" E/*              主函数                                                      */6 ~! i; _; a: Z) i
/*                                                                          */
2 s6 i+ f  V: w# ]- L/****************************************************************************/5 E2 A" G0 `% R$ \% W; k
int main(void)
, ?* g- y: j; @: Z& v2 R{$ P7 m" G6 |, N, H7 A" y
        // 外设使能配置
) c( }% L  ?( m+ G8 Y) f& N" E" Z+ |        PSCInit();' y! a* q1 b# `) G" W3 w- M
        6 e; b3 t- A, y" t6 L
        // GPIO 管脚复用配置4 a: E0 n# G8 r" J$ `  V+ s' N2 I
        GPIOBankPinMuxSet();) V8 W+ C& e& }( i& M- _! P+ L/ ?+ M

6 j$ _1 h0 Q7 g        // ARM 中断初始化. E) v* p1 F# w1 J- d
        InterruptInit();1 j- J; ?3 [; _: w* b/ v2 G0 u+ r1 X! w
: L- `3 r4 P9 I6 x0 {) }
        // UART 初始化# x0 Y9 k) h/ M/ V0 V2 G$ @
        UARTInit();
& N* m8 i/ A3 K; H4 s3 O: D8 \6 R
        // UART 中断初始化
, S1 P8 v: q, [% a" K! u        UARTInterruptInit();% }' Y- q) N9 ~! f- D  f

) b4 o  Z% ?$ |8 n9 y$ I% P0 Y        // 主循环3 i. f5 W9 [& i# S. u
        for(;;)
  i) m2 T! z6 o8 q8 c        {. x1 M2 ^/ `0 L2 M, p
: {$ Y: i6 P% N% [; w1 C
        }8 L( u7 ^2 K0 a0 S0 m
}3 n% U: r9 l4 k& [% ^- y4 V, o8 l

5 d  e; d; Q: P- k6 @' P/****************************************************************************/
2 `: S% f( {- i4 v6 `/*                                                                          */
9 P8 R. `8 q: r2 @, @3 D/*              PSC 初始化                                                  */& d' P5 F- G' _% R" s: `# s+ F
/*                                                                          */* Y+ G( K2 G6 Z; D  i1 B+ |. a
/****************************************************************************/" R" Y8 X6 \/ d
void PSCInit(void)
9 m+ D. C$ S1 p% q{. V0 c( G2 i7 ]- ]3 z$ [
        // 对相应外设模块的使能也可以在 BootLoader 中完成8 U9 ^$ Z- ?1 ^& R- z
    // 使能 UART2 模块+ [/ J5 n# k2 P' X  r) g7 t
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);; ~- J9 f* U( N8 x5 Z1 R
}) S: J6 G7 ]$ @; h/ w" {4 Y

  O* X7 h; B$ z$ |1 h$ @- F' Z# }/****************************************************************************/
" o, _0 z* g0 {% F* `+ m7 C/*                                                                          */
. V' f* v: V  r* H; s9 q4 c/*              GPIO 管脚复用配置                                           */0 X0 w* l1 f3 m# T, |5 g. y
/*                                                                          */3 p$ ]0 C3 `. p" U
/****************************************************************************/1 Q' V# K$ O* @1 k
void GPIOBankPinMuxSet(void)
6 `, J6 [5 N# {$ J( i{" @* m* R9 r2 v6 v; ~
        // UART2 禁用流控
5 Q; w, \' n* d& E* ^7 m        UARTPinMuxSetup(2, FALSE);
4 d, ?0 l- o, L7 |4 k7 T. g& C  {+ `}
/ {9 }; G/ e5 l3 z
' E( L0 l- M* N- f% `/****************************************************************************/
% g0 G: `8 ?8 ?$ j/*                                                                          */# U+ Z/ ^( |$ x& I5 t( e! j" o) H
/*              ARM 中断初始化                                              */
' g) a: R6 r" Z5 u  ^" ?) Q  y4 o/*                                                                          */& V$ n9 d* T5 I8 A
/****************************************************************************/( G1 M  |/ F% B' T! d
void InterruptInit(void)' T4 x* ?1 }" P: g1 e. t- N
{3 Z" ~5 B# b! C. B2 {) i
    // 初始化 ARM 中断控制器
  P% U0 S8 l7 t+ A6 a8 {    IntAINTCInit();
# p) G  ^9 |$ m0 I* O) g8 E* x4 O6 i2 h4 |$ ]0 N- y
    // 使能 IRQ(CPSR)
  V8 `+ z' w8 e- v, g    IntMasterIRQEnable();( X6 T. X2 q) A2 t3 J- n# [  g1 p

  J, }2 y. [: [  b& N3 E$ _    // 使能中断(AINTC GER)
" a2 x- O' u) `8 Z5 y    IntGlobalEnable();2 O9 X8 @! b/ {  G& U9 c. W  X

2 j# X' y% l, l9 d+ I8 D    // 使能中断(AINTC HIER)
8 r% ]" {; }* F" j    IntIRQEnable();0 L9 U/ N. C: |) H
}/ G8 C: h5 \' R# Y8 [( h/ a

  f4 A* J3 ?* A5 I3 X/****************************************************************************/
* |$ T7 o4 g) T+ r/ x$ T: ?$ O/*                                                                          */$ L" {0 U. p0 v9 q
/*              UART 初始化                                                 */: }# l. \7 c+ a
/*                                                                          */; ^) Y" N! _0 _* \) s. J6 V5 ?
/****************************************************************************/
  c' {, A6 ?1 @: u0 ^3 t# zvoid UARTInit(void)
7 q* u& X: z" v5 E3 m) E4 U{
7 C% H1 t0 J$ r* S7 ]) b" q        // 配置 UART2 参数
3 C+ m/ b* F) G% I        // 波特率 115200 数据位 8 停止位 1 无校验位
3 B9 C9 ^$ q8 N6 V. P* Y    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,# j9 A8 [* h' r/ Z- Z: \; u
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
2 i, L! H9 m: \% |) j- ]: ^        // 使能 UART23 Z" ?" u" q% d, c
        UARTEnable(SOC_UART_2_REGS);9 E: z; X0 e1 Q  ~0 a
9 [: ~, N" e1 H, z2 h! D2 j
    // 使能接收 / 发送 FIFO
& n4 z+ W$ C. D- t- C7 Z    UARTFIFOEnable(SOC_UART_2_REGS);! w! M4 y/ A6 Q
* Z2 E8 ?! ~! U. y) {
    // 设置 FIFO 级别
7 E- c6 F* u7 l7 H    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
4 B% }- \5 V1 H& P) d% k}+ v* i5 Y. ]+ V! m# j2 E; m

6 p( e% N; R4 o2 W( U/****************************************************************************/) m( w5 g9 Q. t- B1 ^5 u5 K3 y
/*                                                                          */
$ Y) t& z- d5 H; W7 t2 i/*              UART 中断初始化                                             */3 H+ f0 A$ B/ |! Z; j/ o
/*                                                                          */
% R) z9 Y: i% \& s' d( K/****************************************************************************/
( _6 w$ }: ~* K7 _& G7 Evoid UARTInterruptInit(void)4 p! D8 X2 V( |) R2 x9 t" _
{  K) Z* m& B. N# i' @2 l, G, O
        IntRegister(SYS_INT_UARTINT2, UARTIsr);* I4 O6 }8 u0 D: p& V
        IntChannelSet(SYS_INT_UARTINT2, 2);- f5 n' f+ o" }- ~/ @
        IntSystemEnable(SYS_INT_UARTINT2);2 r& L; k- S1 O1 a) {7 c
3 ~) D8 o2 y+ m' y! ]: k& I: d3 @
        // 使能中断
& q  D! r) l& E! f0 [( Z        unsigned int intFlags = 0;
: y& t3 ~2 p& T- b" j3 ?8 }    intFlags |= (UART_INT_LINE_STAT  |  \, f2 G' E: o  ^$ ?- u7 e; z! P
                 UART_INT_TX_EMPTY |    \8 [7 r5 m" \' N
                 UART_INT_RXDATA_CTI);+ I; Q& u1 l; L5 }( O# s
    UARTIntEnable(SOC_UART_2_REGS, intFlags);: y: S' x1 Q  ~6 z& l: i0 m
}
: `) L' _6 f& q( l$ s) b# q) r+ {' O3 a+ _% `" D7 Z
/****************************************************************************/
- Z# V* v0 ]- d$ b  _- |/ E/*                                                                          */
7 i' i9 F# Y& r+ [* [  h: F% T/*              UART 中断服务函数                                           */) Z* N3 _* T6 F% C% k
/*                                                                          */
# L+ a0 L, J+ O% C. w( I0 |/****************************************************************************/
. t9 E: v7 Z9 A: M/ m6 bvoid UARTIsr()
2 ]+ Q$ `3 H  P' ~2 k" T' W% T- e{
0 x4 U: B7 m0 c4 @    static unsigned int length = sizeof(txArray);
/ E+ D$ V6 q2 Q. E0 V8 q" N    static unsigned int count = 0;
8 w4 ~4 m) [) t& N0 q- R    unsigned char rxData = 0;& l" D5 F* w0 ?- {3 h
    unsigned int int_id = 0;$ H  u6 V9 D5 F" r6 p, L

! m. w! z7 h, \! c* x$ K    // 确定中断源
4 k2 ~0 P# h' C2 w( g/ \: ?    int_id = UARTIntStatus(SOC_UART_2_REGS);+ Y* x" b; E2 e+ J# s
; j% t) e) D- z
    // 清除 UART2 系统中断
/ k3 C" |4 I# x+ N0 p$ @    IntSystemStatusClear(SYS_INT_UARTINT2);
* V/ I, w9 _$ Q# S3 U) e$ v% |0 E5 m7 Z+ v6 J6 h* l  ]
    // 发送中断1 l+ z% V. p9 r' I0 b4 a
    if(UART_INTID_TX_EMPTY == int_id)/ A4 _4 z# J2 }/ T" _& T& `
    {
0 d  t% W: B8 F        if(0 < length): g! y. i7 l9 Z$ D( S: i
        {
2 x  a- x( x4 {, K            // 写一个字节到 THR
  }. P- B# x+ x9 E8 |: y. `( [, X. F% b            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);: ~& E% B5 q& n, r
            length--;
" f5 M. D; e# i( j            count++;
, @# G; q7 r! G; F# @        }
$ d  e' ~& x5 K" `/ \5 h% E        if(0 == length)" a" b" u. u+ W8 Q
        {: `9 R1 w4 y) V& Q5 w. h( _
            // 禁用发送中断
5 c: m' H+ g1 T$ a. o( d            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);+ Q3 \! O* C& Y2 x  h. L
        }. c% t( k  K, A8 f
     }; ^) p$ H9 S5 M6 A
* l/ S- Z( {: |6 _5 v
    // 接收中断
" r8 J2 s, \2 x/ A9 S, i2 B    if(UART_INTID_RX_DATA == int_id)- N; W- v- _% O) f/ e# G7 Y
    {
' _2 z0 q1 w( {" z1 e; n4 H: |3 C        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
6 J% _9 e2 x6 w' i7 Q) x0 l* d: l  z4 Z
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
9 W/ U" {$ P* F9 o. k' e    }
  k; ~; M: g9 Z) T. {6 ^. J
% s0 ~+ W. |$ b5 j* P( O* k; v/ t    // 接收错误! J; W% h: O  v9 r$ C. K5 O2 x
    if(UART_INTID_RX_LINE_STAT == int_id). A, U1 u3 i6 n. U, x4 r! a
    {
; {3 Y! ?6 s# a) s' ?, d        while(UARTRxErrorGet(SOC_UART_2_REGS))
3 C3 C( w8 d2 z% f        {
6 ?% X4 U' t/ i9 [6 _            // 从 RBR 读一个字节6 ~: O' [6 U# H: R) Y
            UARTCharGetNonBlocking(SOC_UART_2_REGS);8 E5 \- o$ `- F7 Y% b
        }# q4 {6 {. ^% U- H! x& v. d
    }+ u( M) K  P- W, G' x! y  I
   
  L: N. X+ K3 K2 }; x5 e    return;0 K0 _1 W9 I9 c' B( T
}1 K0 Q$ v8 f; D% l. I* _6 k
回复 支持 反对

使用道具 举报

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) b/ z6 v+ U2 `* E
如果其它设备快速给你发送串口数据,你这边能正常通讯?

9 b! @& u6 D& L! ]4 X) h, [4 T谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 12:35 , Processed in 0.041422 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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