串口发送中断触发条件 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8516|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
9 }- v) l' e1 ^  |' f  M3 k

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
- {9 z( c. c. I% w1 T# g# G# Z
3 x/ P: P% Y& k! {( w#include "TL138.h"                 // 创龙 TL138 开发板相关声明! E& Y; y- O" q! y; ~

: Y( l4 N) k" l+ }4 V) a  o#include "hw_types.h"               // 宏命令
4 z, ^8 c3 h9 o% E3 A: b: D#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
& `. u( O3 J2 l' A) d#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器- N- y$ e$ U4 g4 a  ]2 c9 Y; u
7 i6 v* ~! @6 n0 d. q6 e
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
* `* R0 L1 e/ E5 D2 C#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明8 ~  E; C: t! i5 u% K+ Z& a9 ^% T' P
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
/ N9 J. }0 x) x: i# k% W9 `- E" X#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
* z8 W7 n1 }1 h" u" N2 c. h3 x  L4 P8 T4 u+ ^  w
/****************************************************************************/
8 ]0 F$ a, f' Q. F) U, V/*                                                                          */
6 ?, P/ q$ g: a, R2 [9 ~6 ~/*              宏定义                                                      */; ^+ n/ x( `4 i0 Q" y# s
/*                                                                          */+ N$ K+ M) g  G: P: m7 D. n& H
/****************************************************************************/& t  d3 E1 a! m
// 时钟. S- d6 v* a0 n
#define SYSCLK_1_FREQ     (456000000)8 U$ m( ~; a' ?8 f, Q; T# C
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
: j% Z) P" I( C7 H#define UART_2_FREQ       (SYSCLK_2_FREQ)
0 C) R8 x* R% Z* f) ^0 Z3 y9 p/ B' _2 K! A) t
/****************************************************************************/6 S4 ^7 k" h( J& B# [- ^. |) U( J
/*                                                                          */
/ t3 H3 }  J+ W/*              全局变量                                                    */: s! I$ X3 U8 Q- X
/*                                                                          */' d3 a* ]$ {3 a2 [( w8 E3 F
/****************************************************************************/
/ e9 u* m+ I* N+ Ychar txArray[] = "Tronlong UART2 Application......\n\r";
/ M" L' G# @/ G" n- R: ^9 A9 {6 U6 {
1 b8 i' }: c2 W* k& \4 Q' H/****************************************************************************/5 I! ]. O. z: D
/*                                                                          */
# L: x- u6 k3 H% N+ n: ~; u/*              函数声明                                                    */9 C* k5 `' b6 X
/*                                                                          */
7 k% T. K! e) E8 l6 ]2 ~/****************************************************************************/; P' W# S! W* o
// 外设使能配置
2 K' o* a) L. V1 fvoid PSCInit(void);5 Q0 \% P( n/ e. V  `0 V

. h9 R. z) g( @6 g5 V+ m0 z6 m6 A( ]/ G// GPIO 管脚复用配置0 Q) Y0 f" H2 {% t- {
void GPIOBankPinMuxSet();) \6 U" f7 }1 g. e

9 v# K: V+ V  ^// UART 初始化
9 j2 g# E$ V" _* L# P; ?: bvoid UARTInit(void);" _8 x8 @; g5 k/ a# ~
// ARM 中断初始化8 D6 s3 m3 n3 v7 R; k
void InterruptInit(void);
  C8 z, s9 R. l6 I' J& k// UART 中断初始化
0 i' N: {9 I  P  cvoid UARTInterruptInit();
1 R5 A/ R- S' t5 ^// UART 中断服务函数1 ]2 \. A' t: |) z1 t9 a
void UARTIsr(void);
' K. z$ _( L/ ?6 f3 i. S6 H8 M- V7 b- A9 a: D
/****************************************************************************/# ^- r0 p) C0 w4 e
/*                                                                          */
% l+ N' C. s7 m" R/*              主函数                                                      */
/ W8 T! N, y5 o4 ?2 n0 h! B6 l7 d, D/*                                                                          */
3 R8 E, V: k1 u/ m# U& \# s$ l" e/****************************************************************************/; M! r2 p. K" E# A$ j7 n( c
int main(void)
1 u, t+ I+ |: ?# X6 O{: H% w( [' o0 r- V& h8 h- R+ k
        // 外设使能配置0 _5 ~) `1 g% |! j2 j+ C
        PSCInit();3 \2 h+ |7 k* Q' P8 N9 w; @
        $ `, y  v- z: S( j  K9 a. \
        // GPIO 管脚复用配置% A$ q/ Q" l$ l
        GPIOBankPinMuxSet();. l( `& q( _" m) X- @, ^* V2 I
! {' k& Q5 F7 z$ J
        // ARM 中断初始化
* j9 s) V0 F$ C# Z: ^! Q2 l        InterruptInit();+ k/ D3 }9 \3 w1 a* |1 l# R/ i5 n

& t8 V8 N  y) @% d        // UART 初始化# B+ F7 F/ C6 G- |$ g$ U( M
        UARTInit();
3 @# ~) e7 U3 w& V2 {$ S9 L8 O" c1 Y( q
        // UART 中断初始化
( G) ]- W% ]0 W2 l8 @( C        UARTInterruptInit();
2 t" [6 y- O: T4 X) V
2 l) w: P, N3 }/ i        // 主循环
/ [7 D9 o" a: q  y        for(;;)1 z! f! ^  [9 J0 s$ ~9 z
        {" @, b4 ]. ^% F8 i
, _; [/ M" Y2 Z7 D
        }9 X( n1 T6 Q2 J
}
( ~( L% |6 T. P$ z0 h: Z7 g1 A' O/ i9 x; d) v" f& B
/****************************************************************************/
2 n+ `+ Z  n5 f# G; E* m" W) ?3 L/*                                                                          */: n: v$ _2 f; q% Q
/*              PSC 初始化                                                  */
. W/ K/ l  f  O1 r/*                                                                          */
0 q4 N4 L; Z/ [6 q/****************************************************************************/
! Z  y3 l+ X# dvoid PSCInit(void)  h- Y. O( L, z; @: r. Z
{
% O9 S( T1 p% Y% U        // 对相应外设模块的使能也可以在 BootLoader 中完成
* Y# n% y2 c2 v4 \    // 使能 UART2 模块
! ^5 T6 P8 Z% w    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);( w3 J) w  ^) L5 w
}
# o$ w6 [* L( z: m1 ^' V* v) G; {. V$ x4 M% u
/****************************************************************************/6 F5 I/ H" _; ~; N
/*                                                                          */
9 ]! K7 H+ f4 j- e$ ^5 a9 Q/*              GPIO 管脚复用配置                                           */8 I7 q7 O5 q$ M
/*                                                                          */
: a5 d% {! n/ ~7 n! I7 p6 }/****************************************************************************/4 ^3 S! [$ M+ _* U
void GPIOBankPinMuxSet(void)) o9 S' ^2 F& t: K
{
5 b( y$ k) q# J/ r        // UART2 禁用流控) e7 F7 ]7 P$ N! v2 M2 e
        UARTPinMuxSetup(2, FALSE);5 M8 Q9 `, O( G1 m
}% U/ e; j. d( U- {  d$ @
/ i0 d3 O6 s0 ?% ]+ c
/****************************************************************************/
' s# Q& {/ b3 E4 ^; p/*                                                                          */$ m9 i! H0 w7 A! s8 @- G1 e( N
/*              ARM 中断初始化                                              */
4 w" b; {0 s7 U4 j: ]/*                                                                          */; y- R0 Y4 u% @1 }
/****************************************************************************/& _( g/ S6 Z0 x
void InterruptInit(void)/ c7 |+ B' A, w& m% h
{8 L: e" s: |- R8 T+ b: F
    // 初始化 ARM 中断控制器
! p4 r# x' R5 r5 C" H' g  [    IntAINTCInit();( x3 N8 P# M" k: M

; Z8 U7 ^+ j+ p6 e1 p/ F    // 使能 IRQ(CPSR)6 Z5 ]  d) `2 P9 g
    IntMasterIRQEnable();
! h$ r) ?3 B. Z8 \1 @( @
" B: S- O8 T& q$ u9 |5 `    // 使能中断(AINTC GER)1 r" @& V2 V; F( H& G$ Z! ^
    IntGlobalEnable();/ W/ q8 }! A9 K. `" v' g" L
. j% l/ O) D# V: k$ t' T7 F
    // 使能中断(AINTC HIER)
) g/ h2 D  Q" w    IntIRQEnable();, E0 P2 ]' \/ c" ]
}5 c1 w, G4 p+ S3 e8 Y7 V" R) a
% S' l+ Y* a1 d9 O+ c
/****************************************************************************/
: ?" `$ Z0 H2 w2 U$ ^) K7 |; }- K/*                                                                          */+ ^& {9 N1 k8 d
/*              UART 初始化                                                 */9 s; z" W1 n) k3 Z# ^
/*                                                                          */
* v" i1 c1 y  {8 @* p% G; e/****************************************************************************/3 T. E; a) v% B
void UARTInit(void)( H& `6 m8 Z" I
{  r7 z- j7 r$ n7 Z5 v4 y
        // 配置 UART2 参数
5 u0 c4 B) [& @! F        // 波特率 115200 数据位 8 停止位 1 无校验位4 [1 d" C. P* r4 b! Z
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
/ k% q$ V3 x* e; W$ }# x/ k8 N                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);( k, C+ A3 [4 z$ N) Q
        // 使能 UART2* v0 v" }6 T* `6 A9 L; @9 W
        UARTEnable(SOC_UART_2_REGS);; v7 ^7 W! ^+ U* m# u+ s

# B6 N! b. S5 ]& v" T    // 使能接收 / 发送 FIFO
3 {( e' j8 {" t" _7 o2 `( P8 i; q    UARTFIFOEnable(SOC_UART_2_REGS);5 n- G0 N( |' i2 D5 S( u6 g
0 |  g  c* g6 g8 P6 x
    // 设置 FIFO 级别% C1 i1 b* b5 ]$ s' v. Q
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);; G  R1 x) ]% e- i) m0 t7 e
}8 o. J2 l+ d2 r7 {( A. O$ _5 z
# C& v5 \) Q7 V$ W
/****************************************************************************/
+ G$ p8 P: V  k  P7 j1 V& d2 R/*                                                                          */
, r: Y0 Q6 y. c. s  L8 i/*              UART 中断初始化                                             */
4 _3 T. J5 s/ u: M/ W1 @1 W/*                                                                          */
- F" u% [( d3 r, M2 b$ O/****************************************************************************/  e: z4 [0 C4 V" v% k+ u" d- U% {; l
void UARTInterruptInit(void)! w2 r- T0 W* B/ [; K) d
{
# J9 h# {6 y- J) w. O' U% ^: N  t, T        IntRegister(SYS_INT_UARTINT2, UARTIsr);
6 f6 S8 U* ~2 ~6 m+ T% P+ t8 ?& g        IntChannelSet(SYS_INT_UARTINT2, 2);
9 @" p( m2 {" A; l        IntSystemEnable(SYS_INT_UARTINT2);
( ^& L5 ~2 j0 G7 x8 m) q2 o9 f$ Z7 ~6 o/ R3 s0 z' o: }
        // 使能中断' d$ N/ a6 \2 S. z) Z
        unsigned int intFlags = 0;
' I$ m/ v# Y% }    intFlags |= (UART_INT_LINE_STAT  |  \
4 b  _" ~' @3 w2 L6 X% |' j                 UART_INT_TX_EMPTY |    \
& j- w2 Z/ S; S( _* L) f                 UART_INT_RXDATA_CTI);' r6 ^, i( R# Z+ F5 P
    UARTIntEnable(SOC_UART_2_REGS, intFlags);; P1 g9 b$ Z0 ?' b* T
}1 g/ z: `( l. `  d% Y* J" c$ q! t
/ q( B/ }* d0 A- j4 _
/****************************************************************************/
( z1 E, S. Z: e$ v$ w1 t/*                                                                          */
) [4 W6 l0 r" a; v5 _/*              UART 中断服务函数                                           */9 R1 N) Q( O& {
/*                                                                          */
& u& p* l' c* O/****************************************************************************/
7 c/ S/ k7 _9 H6 M8 I$ |% I+ ?void UARTIsr(); m; D. f% U( q" l; Y8 _, A
{4 g/ U9 B! r; ]' V
    static unsigned int length = sizeof(txArray);$ M& U/ ?1 t+ I3 d, g0 w0 N
    static unsigned int count = 0;' k3 m9 Z2 O8 R. S- f: E. {
    unsigned char rxData = 0;( E0 L9 Q1 G; w9 C/ e
    unsigned int int_id = 0;8 a3 \0 ]; q# d

, h* x  z) q! F, d5 S    // 确定中断源
7 g2 Z0 l/ M; d& s7 {# g    int_id = UARTIntStatus(SOC_UART_2_REGS);
) {4 X& O- L4 k% F: G
% X7 [" H3 U( c6 a) t9 M9 R    // 清除 UART2 系统中断
5 @4 V0 L0 e7 D    IntSystemStatusClear(SYS_INT_UARTINT2);
/ y4 z, J  f$ p' @
/ d6 S1 y! y  A+ e" u" I    // 发送中断- X! e0 y. p$ L9 A6 c8 E6 G
    if(UART_INTID_TX_EMPTY == int_id)
1 ?" l& m$ W; z    {
$ t7 o' ?$ x4 y1 d8 b# E        if(0 < length)
# ]+ c$ U# W* K- l2 I+ Z; @        {8 `, a: {/ q/ D. T
            // 写一个字节到 THR# x2 C+ v, y3 U: H; Z1 ?1 N9 `
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
7 [5 b% g1 L& D            length--;: n0 \- m9 Y0 e6 K  c0 ~0 B9 O
            count++;
+ s' m! K- j/ j) V  ?) y6 _        }1 U4 y3 @# j' H% r+ r
        if(0 == length)
) W5 j- _# l1 R+ b1 J- ?2 l9 q        {
* ]* C9 h+ Q  D2 X6 d6 ]            // 禁用发送中断
- \4 T  j& N, [3 O$ \4 Q            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);7 y% r5 m9 |. ^% I1 Z
        }% t# }) C; f1 X% N7 ^4 C
     }3 K* ]' I  w" F: j# y! X

: _" n9 |# o& e; ^6 l* y, v5 f    // 接收中断
1 o7 g( b9 g; J    if(UART_INTID_RX_DATA == int_id)* \& }4 m8 M0 w8 `
    {, |( i" D) K1 d; ?
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);' r! ~5 ?* c4 H! T+ n1 e7 v

/ U0 D% @* ]- D. c7 {' K+ u& a. Q! _( @        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
2 A9 F& ^' T. x0 I7 `- F    }! X- p4 i2 e; Q/ [
: _7 N) W5 \; B' v) }& _5 V
    // 接收错误
9 u0 h( V- a' R* A: j/ ]    if(UART_INTID_RX_LINE_STAT == int_id)) D9 t; c0 B/ U( ]/ y
    {
. r, Q, @9 A3 i: }0 c: {        while(UARTRxErrorGet(SOC_UART_2_REGS))* X# K# b6 n9 b: i/ m! ?! u" d$ C
        {6 h2 }: ~9 B: }! W
            // 从 RBR 读一个字节9 O. J8 l  L/ ?7 X3 @3 r
            UARTCharGetNonBlocking(SOC_UART_2_REGS);/ ]. l' ]  h2 a) D
        }
+ n$ Z+ E% W4 s$ _. |* D    }, E- F9 Y8 G/ H! X. O
    ! F; `2 T7 ~* `
    return;4 T# ~2 D# [5 C0 G
}
5 _1 n$ Q4 c, F
回复 支持 反对

使用道具 举报

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:251 S5 E, U5 U) T" x
如果其它设备快速给你发送串口数据,你这边能正常通讯?
* K0 z# a7 N3 B% O. Z2 F: Y5 }9 J  j
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-2-22 05:06 , Processed in 0.045892 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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