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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8462|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
8 g: c4 S3 T* n0 j( l

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。3 [& ?$ n% ~/ Q
: {1 R1 f" h* W, D3 m
#include "TL138.h"                 // 创龙 TL138 开发板相关声明! S& g' p$ p% L( U$ z* K

5 A9 t0 @+ B0 x) R; ^9 I/ B  O1 K#include "hw_types.h"               // 宏命令7 C/ I/ u  x7 {( D$ j. i" \
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器, g, ?4 n/ F) U& [( W# |
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器3 n/ A) J' f4 `9 n( x/ r' @. t

# ^1 L+ {! k4 s7 o+ H+ n#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
2 L( u1 j- m' E: p! a% a#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
7 n6 P. Z: I) s+ F#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明2 L3 s0 b; U3 ?
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
) Z2 Z% m: F- ?/ Q1 O  l5 g
$ ?2 _7 g# ~9 a; Z/****************************************************************************/
( F0 ?! B$ l2 r" J' m( k" M/*                                                                          */
+ K$ U0 P% ?3 z/*              宏定义                                                      */: z3 D7 ^3 B' M* i
/*                                                                          */+ c! Y1 K( ?% @9 e
/****************************************************************************/
  P! E2 B' n0 q: ]' _1 d5 T// 时钟
3 E3 M, s2 Y' U7 c( j! T#define SYSCLK_1_FREQ     (456000000)
7 o, c* Q1 w) i" r#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
% p( E; \( j1 l- j6 ^: X% |#define UART_2_FREQ       (SYSCLK_2_FREQ): Y* I6 a$ d+ G5 o

3 I1 G8 J0 j/ m* m/****************************************************************************/6 u/ [3 ]) x% B4 _% g0 u
/*                                                                          */
0 l6 ^; k! S; J5 N4 z# ^7 V' G1 h/*              全局变量                                                    */3 Y7 {+ {1 w5 S' w  u( d: l: W6 G
/*                                                                          */
1 u5 ?# H8 ]0 H. v2 q# m& X: k/****************************************************************************/4 A. j, z/ C0 m% n/ Y
char txArray[] = "Tronlong UART2 Application......\n\r";. O0 a+ x- p5 }! e
/ H8 v4 w, j' O; ~
/****************************************************************************/
6 A9 L) T6 ~# t1 r, t( N1 f& ^/ B6 q/*                                                                          */# M9 r& d0 o. r( b: {
/*              函数声明                                                    */9 V8 O# R  X# S& {0 B& j/ \
/*                                                                          */8 Z' l* T1 i/ {: z5 I6 x& _; @9 U* \) V
/****************************************************************************/! B1 @+ s1 |. ]. u1 k
// 外设使能配置
2 p3 B0 f' K$ |% l& ?void PSCInit(void);
5 a) f2 M. H6 s0 \3 T2 e& h$ l# O& q) P; `) v% w+ g
// GPIO 管脚复用配置
' j( E( B: [' i+ l4 V" S' xvoid GPIOBankPinMuxSet();6 O! B) y5 r2 D# w

0 K/ G% ^0 e4 @  W- H// UART 初始化6 Q! a* H( M4 y% y
void UARTInit(void);4 ~7 l4 |- j$ [! l0 e
// ARM 中断初始化0 D5 n, l4 g& B/ `" M) |$ G; d
void InterruptInit(void);4 W& ?* f; a' Q- J2 P+ N( W. ]2 A& H2 o  o
// UART 中断初始化# o; j" O0 y" ]+ O3 l
void UARTInterruptInit();
' M' u1 N5 G) `+ ~* x( s& Q; u// UART 中断服务函数
6 p# e3 O# d( c: ~" J$ vvoid UARTIsr(void);9 H: R( b0 {& Y; f, c$ _3 s/ Q

- m7 {! n6 [: T" s: T/****************************************************************************/; V6 k! ~8 N4 e) `" z
/*                                                                          */3 M( F$ |! w2 g8 L
/*              主函数                                                      */
5 V. Q: q* l/ D& P2 Z7 I$ ]/*                                                                          */' z( Q9 f2 P' R/ K/ \( b1 c* j
/****************************************************************************/' l5 c9 [: ?2 \2 y& I
int main(void)& M0 Z- O8 P% }- I! Y& u- x
{- f, i4 c$ m" m4 @, U% c2 X
        // 外设使能配置' p$ ^" ^9 Q- n" o0 q& T! g
        PSCInit();
: c+ r7 L8 M  m$ @        ! G3 m7 W5 d8 ?& {9 z6 B( B
        // GPIO 管脚复用配置$ x9 ^$ U% J7 u' g1 e/ j7 v
        GPIOBankPinMuxSet();) {3 v/ e$ |9 r- _" k6 O9 F
6 A, ^9 E6 z) H, l; C8 V* l
        // ARM 中断初始化
: ]% o) p# g& ~3 U( n( I0 E' @# R        InterruptInit();
/ o. K8 i, H7 b0 O+ ?  ?- o- S: X" h2 l- K% i1 s$ a5 c5 L3 D
        // UART 初始化4 }3 \+ G6 P8 B+ w
        UARTInit();
! U  r" {. g4 j% u; I) E/ e# W1 k( ^: u  h2 q
        // UART 中断初始化8 ^6 t1 B3 P# D
        UARTInterruptInit();7 d) h7 l+ @, c: L
5 p* a0 l5 U% I8 W3 u. k/ o' r. G
        // 主循环
6 \5 {! U" z+ J# {        for(;;)
2 x3 `" l  _2 L: a        {% \- k$ M& z( P4 N2 U) A* G+ j( ^

; D+ M( e6 l; c8 a1 L        }
! ]) Y- {5 Y+ e# R# [% X5 b}
% Y% ]9 P2 t- H/ P1 c0 Z+ z/ D# J' W% Z% ~7 e# W- i# S! P
/****************************************************************************/' a0 [2 f) x% W
/*                                                                          */, V, o  E3 D# i; R0 k8 p# v9 f
/*              PSC 初始化                                                  */
8 ~1 O# V+ O3 j- @* p- A/*                                                                          */
- ^9 |+ r7 w1 M5 O/****************************************************************************/7 m, q4 ], A* l0 k" q
void PSCInit(void)8 z  K1 a4 Y! S4 {+ _4 ]
{
8 K/ ]) Z+ j" L% M        // 对相应外设模块的使能也可以在 BootLoader 中完成0 Y# v& I3 z' Q7 r% k
    // 使能 UART2 模块  K8 v7 j$ a6 f, O3 I
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);! y2 z9 v7 W+ A$ y( K* E6 U
}2 ?' g  X9 d$ R: e

  X' T- u6 m/ Y  b. o% F' S/****************************************************************************/  T  t7 _- ]2 f6 h
/*                                                                          */$ w! ]# v. I" A1 n) C( g
/*              GPIO 管脚复用配置                                           */
# X: }) V( G5 p+ o0 D$ V/*                                                                          */) l+ ^' n) D9 G6 m, S& ^
/****************************************************************************/
9 r, A. q0 W+ {9 F/ Tvoid GPIOBankPinMuxSet(void)
& N+ t3 u/ |0 ^{
& o; E: c) T) l1 X) Z        // UART2 禁用流控
$ Y! ?% O/ Z5 |4 W% c3 X        UARTPinMuxSetup(2, FALSE);9 h1 u( [, Q2 Z) f
}
7 }4 C' U: D3 y$ }1 ?# t5 g4 k( B
/****************************************************************************/  e  D' _* Q/ p  W
/*                                                                          */) Q1 G7 S: x( X; v* l7 Y0 Z
/*              ARM 中断初始化                                              */2 |/ ~  \% |* f& L5 `! d8 ^+ d; N
/*                                                                          */
2 k  m9 r& u/ f' Z/****************************************************************************/
: R: c0 {0 Q+ F; V# r; q; K6 hvoid InterruptInit(void). F4 {. A  X& ?# W+ |8 v' Z* Y4 J7 _
{
- ^- A; N2 @  I# k) B    // 初始化 ARM 中断控制器
$ X! W2 I, R' c$ D! \; n    IntAINTCInit();
8 D5 Q7 o! m1 |7 n$ @, j% J0 n
1 E1 f, h9 g" L% v) \' N    // 使能 IRQ(CPSR)
6 Y3 ?' X% ]6 ^; M$ Z+ w- `0 \    IntMasterIRQEnable();, H! v2 f' G( h" N" Q' ~6 `6 T
3 [5 b- R" |( R0 R8 [/ X
    // 使能中断(AINTC GER)
1 }9 q$ P8 G. Z! \/ `$ r" S    IntGlobalEnable();" j. H; k8 \8 B" R# `

5 ^8 r4 L& @" m! V6 s6 l1 g( f    // 使能中断(AINTC HIER)
: t7 k2 L; ~4 M    IntIRQEnable();( }! b- R& S6 e. N3 k6 Z
}
3 h' ?( V" X- }  v3 c3 x! m' e$ U7 ^4 T: p9 C
/****************************************************************************/
; X+ H  O0 H; o* Q; @( S& \/*                                                                          */
2 j: D$ \0 ?' Z6 @4 c& o) i/*              UART 初始化                                                 */
9 Q; g$ e$ u% R3 ]1 @! j9 |/*                                                                          */7 ^$ [1 |8 H* Y7 X
/****************************************************************************/
6 C! ^/ S" B1 A  N$ g9 nvoid UARTInit(void)1 j* P( S& b) X  h
{; f: N: B; i% {4 o5 C% K
        // 配置 UART2 参数
7 J7 B* X1 u2 g  i; R( R) u; u" ?4 d        // 波特率 115200 数据位 8 停止位 1 无校验位
( X, \+ A* ^( D' F    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
) l; N9 W; ^5 ]# r: Y( D5 [                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
, j' X* ~# \3 P9 |+ J        // 使能 UART28 D5 h/ I1 U/ K% j
        UARTEnable(SOC_UART_2_REGS);
  H& `' f5 ^9 X$ L5 L7 W6 l" N' B$ }" |8 \) t7 ~0 s
    // 使能接收 / 发送 FIFO
& F5 d, }1 ?8 X" g. L# x3 o/ Q    UARTFIFOEnable(SOC_UART_2_REGS);4 r7 f5 @" }5 Q- ~0 K+ `  B/ K

7 n2 Z+ o8 a9 a    // 设置 FIFO 级别
) w8 J6 m; P6 m( X& S    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
+ S: p* h2 n( w& e8 F0 O- {}
& F* g% i5 n3 X2 U+ h
& E) `: r7 g& C# W- w/****************************************************************************/
5 Z  A: V! Y5 S/*                                                                          */: ^3 b; M4 m+ k5 J& B) t  e7 P! b
/*              UART 中断初始化                                             */
$ y% u. ^$ v& u! t4 _$ j' z: E6 P% p3 s/*                                                                          */
' \! o  C4 x; b& Y) A( C5 P/****************************************************************************/
% u, u  ?: R! a7 g( I0 m3 Jvoid UARTInterruptInit(void)
) N/ k0 |2 l7 U% C. C; j' Q4 D{
% i. e% M- i1 j* g% O7 T' H/ j) d1 P        IntRegister(SYS_INT_UARTINT2, UARTIsr);3 H( v6 c; E8 x$ l
        IntChannelSet(SYS_INT_UARTINT2, 2);+ B) o7 O7 U; Y+ P) l' j" v9 @4 J
        IntSystemEnable(SYS_INT_UARTINT2);. w* D1 N! ]# b8 e- c
3 I1 p% v2 a* z
        // 使能中断8 R6 K. F; @4 w
        unsigned int intFlags = 0;
+ E" X' e$ |; b    intFlags |= (UART_INT_LINE_STAT  |  \
& m0 f+ M: n- f- D  C                 UART_INT_TX_EMPTY |    \& m4 O6 E( F& {  O( \# f+ f
                 UART_INT_RXDATA_CTI);7 _" r* p& X8 l! E* V. u* g
    UARTIntEnable(SOC_UART_2_REGS, intFlags);4 z# i( ^, t, H* G% P. s
}2 W, G2 {& O; O, n

* |( u0 ?4 D( V) B  q; f. s( _% t% k/****************************************************************************/
/ ^4 u$ Q' v1 k) D, K* m4 u2 D: P/*                                                                          */6 x2 H- ~- d! T: F4 h: b
/*              UART 中断服务函数                                           */
2 @% C& B" ?, @. q0 G1 _/*                                                                          */" I+ V" {: ]$ s/ {2 P7 N6 L
/****************************************************************************/, U4 K+ k. c" y- b! Z1 C7 N# l
void UARTIsr()
3 i3 R# T5 D1 J6 N1 Y8 t) J{" o* Q0 v. ?  r( I: u1 {' q2 C
    static unsigned int length = sizeof(txArray);
$ [1 Y. B: n5 O. {; e    static unsigned int count = 0;4 h" K. y- [0 S5 A5 |0 p7 K
    unsigned char rxData = 0;
8 H$ R. F6 {" T) B: ~    unsigned int int_id = 0;; h# l8 i" V8 z; @; p& t* {' p
& q$ r1 \" M9 A! H6 j8 |
    // 确定中断源" s3 x. x0 v4 k* Y' Z9 J
    int_id = UARTIntStatus(SOC_UART_2_REGS);" ?  D8 D3 |1 O! @

# E) @" g, b, {- |( z' B4 W    // 清除 UART2 系统中断
' D9 K, N0 R  b0 J3 }( y8 I    IntSystemStatusClear(SYS_INT_UARTINT2);  e; w0 C2 O% t' C3 R
% ~9 b& d& F/ x* y
    // 发送中断2 s3 f8 n; u& x
    if(UART_INTID_TX_EMPTY == int_id)
$ h+ l! j  p$ Z0 A/ u+ n# b    {1 k9 k6 N# ^6 u5 `7 x! L
        if(0 < length)4 `+ n0 v, o; d; x2 A4 ]
        {$ `8 t5 L. |; M$ s
            // 写一个字节到 THR
% Y* u7 f3 q: R) I1 m9 z            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);/ T) Z) V( b. e! w
            length--;$ J7 {. j/ O- p8 E
            count++;2 e. S  }5 q% J( ~, H7 m: i) P
        }# u6 [( M- `2 n9 d  A4 K; L5 {
        if(0 == length)
6 l9 f, P# Y) i, O        {% `0 d* _1 g$ h
            // 禁用发送中断
! s5 o1 `1 i* ]. X( h, ?6 C            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
* N- t: ~! Y' Q9 B0 n        }; c. U: \4 Q8 G9 K, w/ S* p
     }
4 X7 ^, e  ^( t/ h3 _! u) U
! m, g9 |% d( h4 i2 i& B, X5 G    // 接收中断# k; @) [, q/ ^* N7 z  O7 W
    if(UART_INTID_RX_DATA == int_id)8 Q! A% }: G% K* Y' a. ~
    {
3 t, K! \, ?2 C- n        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
( T' F1 P* X# m( \
: f1 T2 @# n1 D8 o        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);4 V+ f( o+ K% a- y: g1 j3 T; L
    }" s# H$ \/ U$ k# K* M7 L

( W2 t$ x5 H3 R    // 接收错误* S5 ?5 J% j6 b
    if(UART_INTID_RX_LINE_STAT == int_id)0 l" v, Q: M# H1 S( B1 y( b
    {
/ I& Z) c  K/ _% {# _" E/ W8 w        while(UARTRxErrorGet(SOC_UART_2_REGS))2 D" y) N+ A# j' d
        {8 `4 E5 V% S% [
            // 从 RBR 读一个字节
( R6 q! b5 w8 |) d% R9 W7 U! Z% }: M            UARTCharGetNonBlocking(SOC_UART_2_REGS);9 v% P; ]! h9 e! W
        }8 `/ U4 o! q; Z
    }# h& r- s- J5 X7 }4 a; s" s9 s) _
   
* C. v6 H' H. C4 I) r    return;
: A+ q" x8 j0 K7 f0 L4 b" x}
1 ?$ M5 _. V1 R! O3 R
回复 支持 反对

使用道具 举报

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; L5 O, M7 b6 z! v- O
如果其它设备快速给你发送串口数据,你这边能正常通讯?
$ Y* D% E2 e' X3 M5 Z
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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