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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7396|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
4 x% G: Y1 m2 `# _$ G8 b8 j$ S

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
* t  n* Z! R- l9 o# _6 G
( @. t7 X0 `& d+ l  S: _4 t#include "TL138.h"                 // 创龙 TL138 开发板相关声明
1 i, C' b5 j: Q9 w
7 R( u) }' Z) N7 x7 H, P& f#include "hw_types.h"               // 宏命令
4 V/ Z' M: F7 K+ N- r* j" \#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
; Z  V+ [+ B/ y5 F* r#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
7 W0 r9 p" ^3 Q. c3 V! W0 K- \  G# E% n  o* j0 g/ b9 a' c
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
, O* h. Q3 Z+ s4 G! o8 @& o#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
* d+ J$ q, ^* y2 H/ i#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
  R$ C& t) k+ ]7 \$ y% |#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义1 a5 S9 |; j. v0 k7 A% k

) d/ [& P+ C8 P& j# {5 S/****************************************************************************/  c6 \# h$ E% ^+ t0 t
/*                                                                          */
% B' y* `) _$ |( {" V/*              宏定义                                                      */
( I' I3 V' i2 `/ l: u" S/*                                                                          */1 Q  c, ~7 u5 {0 D4 T" W7 _6 E; n
/****************************************************************************/2 B, P, S5 C$ a: S( }# [3 ?1 `
// 时钟$ b7 p; ?% K0 n" o/ ]
#define SYSCLK_1_FREQ     (456000000)
( ]! ?2 K6 |3 `! e. y5 H#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
1 K' f$ u+ u5 h! d5 e#define UART_2_FREQ       (SYSCLK_2_FREQ)
' |  k9 a: L8 Q0 g& k- l
9 ?5 z0 A' r/ z% @5 [8 q/****************************************************************************/2 a% E- ]. I1 U( h, i4 G
/*                                                                          */; h+ V* F1 v& F5 r5 M6 \4 g  Q; \' k4 C
/*              全局变量                                                    */; U- x9 X0 x) n
/*                                                                          */; A3 f; @4 d( ~4 l/ x
/****************************************************************************/
. x: ]9 v& I3 echar txArray[] = "Tronlong UART2 Application......\n\r";
$ o1 C6 p2 i* P3 T. y5 ?& N7 H& S6 k& {& ~
/****************************************************************************/
- J  ]8 R; J, D6 H; v3 \" Q! M# a- L/*                                                                          */
! _- J  {5 Y% L4 W8 N* r/*              函数声明                                                    */
' g+ Z+ ]0 I' y/*                                                                          */
' J5 W* ]# }1 B! X6 e: S/****************************************************************************/
* j" d- Q/ Z9 d& o$ @0 t& K2 N// 外设使能配置
4 z( R7 g# A  T6 Wvoid PSCInit(void);8 r8 O# A! B2 H8 T
( X! A+ n6 X# ^6 G! ~& K
// GPIO 管脚复用配置
- i* I9 a) o: p9 C# rvoid GPIOBankPinMuxSet();
* e# D# m! X/ ]' Y
  ]- O6 q8 P( _6 g" s0 @// UART 初始化1 p7 t( y6 V9 U2 `
void UARTInit(void);; Q. ~  a( Z  O
// ARM 中断初始化5 s# O/ i3 r( Y
void InterruptInit(void);
  z: |$ H) c  ~// UART 中断初始化0 F% U4 _6 l. z1 y& B
void UARTInterruptInit();2 B$ q* C  a6 U- C  e4 w" g
// UART 中断服务函数! T. N& i# L+ Y7 ]4 e( V( ~9 g! G
void UARTIsr(void);2 O) g0 l( a) n
9 `& h/ u+ w% h2 T
/****************************************************************************/# p6 E% W* M. X0 R/ R9 P6 `
/*                                                                          */5 p# M7 R6 J' ]
/*              主函数                                                      */
! Y1 f' A5 R0 F( F. ?% c/*                                                                          */; R5 q- F5 m0 y7 x
/****************************************************************************/
7 t5 O; c9 q: ^" l) ~+ mint main(void)
5 O; c) d" g, W7 z, r4 c, b{
: i1 [" c* r4 E" g        // 外设使能配置& ?  q! }8 A  Y; B2 H
        PSCInit();
/ F. M$ k# Q" n' F/ \5 ]        $ F2 q9 K, k; u; f: v
        // GPIO 管脚复用配置) n/ I2 p9 m1 |6 ^. l* o
        GPIOBankPinMuxSet();% j- g1 m, ^/ B; N: D) H8 w3 a
' I( _% _/ l& S5 k8 H6 y
        // ARM 中断初始化
: n' `' u! |- [3 v; I: q& Y0 y) [        InterruptInit();
$ q7 `* M* |' |1 q; r0 n' N- Y, A
, L8 E7 q$ s' y- V* C1 B' r* t        // UART 初始化3 _7 z3 U' D" b
        UARTInit();( x" P, u; B# @4 a5 R
, V. C! w& I! r2 V, W  r2 P' y
        // UART 中断初始化
0 C* l) F4 K% q! b) w        UARTInterruptInit();, |7 a" h3 w" M; y9 I; s
! C- C8 \( x5 M( a9 g
        // 主循环; d  ?/ m  u9 U% s8 j$ `+ r
        for(;;)
, B  C4 |% t$ J( d1 g        {6 c% Y! Q: d% ]. g
0 r' Q7 e* J+ A
        }$ @! ~9 P9 r) Q
}
. A; A! q( Z5 l
! g; h3 Y, Z! [- e# g4 m4 F' M/****************************************************************************/
, f- V5 x% ]- f4 g& j1 {- c/*                                                                          */) Z$ H8 U" T8 k% H5 e+ D
/*              PSC 初始化                                                  */+ n3 C3 o( P  r8 z* p1 Y; D
/*                                                                          */. D9 L7 B' U& i4 @2 {# P
/****************************************************************************/  N8 g9 q9 z: Z+ C+ O8 ~
void PSCInit(void)# ~) g% \4 g0 D7 n
{7 [9 ^" |: h$ m1 n% C9 p
        // 对相应外设模块的使能也可以在 BootLoader 中完成# y0 q7 i. Z. z. l, ?5 p/ p
    // 使能 UART2 模块7 {4 j0 z2 {$ u
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);: c" u5 J1 O, O  e/ }( S) y
}
3 Y, w5 Y0 ?" f& r- \/ D8 Q: a1 a4 A' ^# w
/****************************************************************************/: [# o; @+ O8 v- c3 C7 \
/*                                                                          */" c* q3 ?% ~( z
/*              GPIO 管脚复用配置                                           */: F+ l  {" k. C- i
/*                                                                          */6 M% b; H( z& i3 ?* D
/****************************************************************************/
& T6 `& b. |" D, Vvoid GPIOBankPinMuxSet(void)
9 G8 I  l- e, l1 G{0 Z, C# [. k# ?8 b- j2 a! B& c9 b
        // UART2 禁用流控& k/ Q$ a  l; ?
        UARTPinMuxSetup(2, FALSE);  Q7 c2 U, f6 r" Z: D4 c/ j* e! d& S
}
, G" l1 i# q' F. K8 F/ F# ]( [* z/ `- @( i# a. L, K* q: Y- S1 I
/****************************************************************************/& _+ [( K5 ~3 f5 T4 V) s) M% g
/*                                                                          */
3 B4 A* O6 T" e# q/*              ARM 中断初始化                                              */
: P9 J. _( _! W! {/*                                                                          */
, u% N4 w0 W( d0 ?/****************************************************************************/
5 _4 x1 M' u2 {) Lvoid InterruptInit(void); y. a$ P: g0 f# c  w. q
{
$ D. V' z) E3 ]# W) H$ w( ^    // 初始化 ARM 中断控制器
! g8 U, \; t0 ]7 v    IntAINTCInit();, j0 d) ~$ e. v6 E+ ]
! B! ]) g0 p$ U  i8 @
    // 使能 IRQ(CPSR)4 v  p& \9 ~% ^+ x3 m% U' _' X) g
    IntMasterIRQEnable();
! ]  H+ `4 Z6 I& S% G
, r) e: E$ [& b3 Q: U' Z    // 使能中断(AINTC GER)7 G$ i: d# K2 M: @# q0 t
    IntGlobalEnable();
, p& v% p$ L& N7 C
& N5 S( V) t/ P9 C7 j4 [4 v4 z+ A    // 使能中断(AINTC HIER)) @# X9 u2 L+ i& t) u& q4 j* N1 J
    IntIRQEnable();
3 ]2 A( s5 I, |}% q' w8 N% |' W: L

3 P: K: @0 Y, ]% S. J2 k9 K" z/****************************************************************************/
4 i1 y$ Q3 _* s) u5 O2 O% {0 `' C/*                                                                          */& H+ {  V3 o0 z3 x
/*              UART 初始化                                                 */! E# `: \* W: C2 \
/*                                                                          */
& _; N+ _' {& s/****************************************************************************/
4 P- U9 O- Y2 L* Pvoid UARTInit(void), G0 z! o! b$ {& p/ {& \: p7 L
{
  X' A, G% k, P4 w        // 配置 UART2 参数
9 I: `$ b- E% _, z' V. @9 t        // 波特率 115200 数据位 8 停止位 1 无校验位
6 R2 u0 G1 s. L; f5 U5 B# F9 a    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
2 ^" W6 U3 d! r" t1 {                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
+ a. s7 [& X7 d) J% X        // 使能 UART2
& o0 U0 `' w& R8 @5 }        UARTEnable(SOC_UART_2_REGS);
  z- m7 G/ X- d6 |$ Y( @
) ~% {! ]4 m0 I0 \; F( z    // 使能接收 / 发送 FIFO
! W/ X. H" T4 f4 i* u0 \    UARTFIFOEnable(SOC_UART_2_REGS);
* T$ N" \5 k" u
' e9 k4 L3 _1 |8 G6 J0 R8 a7 d    // 设置 FIFO 级别5 |# P4 @: E8 n3 {" {& m
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);0 z: n1 D2 h( s! I
}( d% h3 Q: k. |' Z1 O

9 _0 k2 p1 q, L1 S/ c  b1 |0 n! ^" `/****************************************************************************/
; z( J' ~+ L/ O7 p8 ]1 @2 a; x5 _/*                                                                          */: C6 r  z5 ]' q+ P
/*              UART 中断初始化                                             */
$ c8 ?: {) M% X/*                                                                          */; Z1 R$ ~: ^$ ~# S
/****************************************************************************/
6 `2 f* z5 g* @' J. N! Vvoid UARTInterruptInit(void)
$ a3 A4 S8 b) {2 M7 i{
  H) `( S8 K+ W% T        IntRegister(SYS_INT_UARTINT2, UARTIsr);
, u: B! {) B4 h/ i" Y        IntChannelSet(SYS_INT_UARTINT2, 2);. `/ G1 b9 z1 @5 d" G7 u: p
        IntSystemEnable(SYS_INT_UARTINT2);* B- V6 Y" Y" J" a; s

% R! l3 C) X' n; Y- x) m" p! O        // 使能中断
7 u: v( s+ q& G! P! i6 D        unsigned int intFlags = 0;7 L  F6 l: Z* a. j  m
    intFlags |= (UART_INT_LINE_STAT  |  \
1 c; Q- _) C1 `8 j                 UART_INT_TX_EMPTY |    \2 y9 M! q+ d' v; F9 n  N* {
                 UART_INT_RXDATA_CTI);
: z5 y4 {9 A9 S9 f    UARTIntEnable(SOC_UART_2_REGS, intFlags);' D+ R3 G4 h; R) P: \" W) C& B
}
: n* K% ]& S- Y( F, d6 A. u& |8 s2 s% w5 u) `9 L2 A; a
/****************************************************************************/
0 {  d! h/ ^$ r9 h) w5 V; U# c" T% Z/*                                                                          */
8 a; l- O+ X" k5 x' ~/*              UART 中断服务函数                                           */
  d" T6 i: q2 Y# B9 B/*                                                                          */
. j3 {0 d6 M9 j  F* |2 r( N6 y/****************************************************************************/" D: @' R0 Y* `3 D* M' q! O
void UARTIsr(); u7 Q- F1 q- T& B, Y, \6 j
{
' v: s6 G# I9 [/ s    static unsigned int length = sizeof(txArray);
/ j- T2 i: e" u1 |    static unsigned int count = 0;( U) h5 w- V0 ]9 B
    unsigned char rxData = 0;
$ w; B6 U. s. e) ]9 C2 U- l    unsigned int int_id = 0;
7 ^7 M! t6 A! L; |7 U
. s9 c2 y* p4 H    // 确定中断源
* }  s( B1 p3 F# J    int_id = UARTIntStatus(SOC_UART_2_REGS);
5 Z$ |( l; a5 F5 y, k7 A3 o( w/ g6 e, p1 v0 L6 S
    // 清除 UART2 系统中断0 D/ D' c. @: ~8 x+ A! n
    IntSystemStatusClear(SYS_INT_UARTINT2);
' Z, l! Q( ~5 [! Z0 g
1 T1 Q! Q' O0 N0 x    // 发送中断6 r/ |$ W2 k  F8 s8 m1 A& U1 s
    if(UART_INTID_TX_EMPTY == int_id)0 Y, X# j( W2 ]3 Y5 C) t
    {# k! @, c- q8 o, [5 S% J+ i4 x
        if(0 < length)
( h5 ^( A. s2 V        {5 }2 n0 U6 l. N' f& Y$ ?) J$ |  R
            // 写一个字节到 THR7 F) W4 k) E3 X3 C5 R6 y
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);* ~$ y% U# r* A6 b- a
            length--;+ {. f3 ~5 w( _+ \4 T
            count++;! e: @  }' v$ i( H, b, J/ A
        }# k1 X7 q- Y7 I  i8 u
        if(0 == length)6 ^/ ^$ s- K/ h. W, [! n
        {
- i! L5 A! f) j, h            // 禁用发送中断( M6 k7 J1 U% v' x
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);# p) I, @, l# l8 b
        }
1 m( g5 v  X  L7 M) ~     }) O' _, S" A! y- G, o, e
! v' d0 d9 b/ n* B
    // 接收中断/ g5 u! K! ?! l9 I5 D0 S
    if(UART_INTID_RX_DATA == int_id)
' g/ \" Q7 x% [$ s, y& v* `    {4 H3 R2 Y6 ~& g3 x5 i2 l
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
" k# P9 s/ Z- n' [& S* p8 U! S3 l5 O  w1 u, A0 Z
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
! d1 ?6 R* I8 x- b0 J    }
2 y1 J% [7 B" \/ C  D* F2 u7 n4 \! J8 L- c% Z" m& q
    // 接收错误
9 k+ n/ r6 r% p6 d! w, U0 Y    if(UART_INTID_RX_LINE_STAT == int_id)
$ p8 Z1 ]9 q( n8 B    {
, @: r! u9 A4 K( D5 c7 K  }        while(UARTRxErrorGet(SOC_UART_2_REGS)): R: {; y. t6 q+ q& j4 `6 `4 }
        {4 {, }- N1 ^% z2 O& k2 |- c: G0 a
            // 从 RBR 读一个字节
: i# P- h9 u. B' O            UARTCharGetNonBlocking(SOC_UART_2_REGS);
- }0 @& z- v1 @- I        }
7 J4 E' [. p) S4 q, t    }
% l. s' d4 g! i8 I" _1 x   
# }/ `$ d* ?/ P# [6 |9 O9 ]' e9 J# p    return;3 g8 w6 T+ D& k/ G6 j+ R& _
}- _% @& P0 j, y: F4 {6 Y8 I9 h" 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' d/ ^* A( x3 }3 J' m! M
如果其它设备快速给你发送串口数据,你这边能正常通讯?

+ x7 i* M2 h) ?+ o) a谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-7 05:36 , Processed in 0.044043 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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