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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7455|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。) t1 s  w7 G! _+ P/ Y

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。! b( q, E7 H2 n2 V' M4 ]* G
4 L- A' q8 {( f; ]8 L
#include "TL138.h"                 // 创龙 TL138 开发板相关声明. K. M  ?: s0 L: O2 {+ ^: r
; q2 {' O& {" ?/ W, i2 F
#include "hw_types.h"               // 宏命令
' {) `. n, F* e% u( W#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器' ^4 b4 x7 C- a$ p- m5 n: d
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器4 a" {- n' D. {, g- o

. X0 j: N! c! I* a+ t#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
4 ^; Z1 n" v5 c#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
% A, N) \% a& M  ?' `#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
  K  ~  N; M/ Y9 \#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
, q/ |* J9 X# ~9 w) b8 x2 ^
# a4 t1 }& M6 y& j; T/****************************************************************************/
. _( W) L2 @% L" t! k3 z, N/*                                                                          */; b4 y/ e. B& B, g
/*              宏定义                                                      */
) i9 ]: P8 _" ]! V! S+ |2 W, F& ]/*                                                                          */& x* ^' W: Y: N+ G" a1 s
/****************************************************************************/& R. a0 d8 K$ ^: f
// 时钟4 D5 j" c* e% U+ D; i& O
#define SYSCLK_1_FREQ     (456000000)
8 R! r  X% p4 i#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
5 s) T) z* }( {( c8 {* l, U#define UART_2_FREQ       (SYSCLK_2_FREQ)+ d8 n. z9 o8 L$ B
( Q$ D% J, K( }7 }
/****************************************************************************/% R( B0 |2 d  A! z, B6 J* V; `, l- U
/*                                                                          */
  N: T2 v5 }7 P  O7 h* V/*              全局变量                                                    */
& @$ X; A# H1 T& p" Z9 X/*                                                                          */! j  s2 e$ b2 c) u% ]7 j
/****************************************************************************/
: {" O- _" m5 g; wchar txArray[] = "Tronlong UART2 Application......\n\r";& m3 |- X; C6 K1 k) L5 z6 H% ?1 m" q
- {) y. [3 {7 w
/****************************************************************************/
$ a: X( [( ~' m5 C# A/*                                                                          */) f+ A! J# u6 h, ?
/*              函数声明                                                    */
* `4 `6 _4 f2 p6 v' d  i( q/*                                                                          */
  O/ @: \  s: p2 }* H/****************************************************************************/7 X; z- \) u% T; d
// 外设使能配置
; z- c: G+ N0 n: g' Qvoid PSCInit(void);
' M1 d5 }/ O/ S( m
6 r3 u/ @# E2 f  Z( ?9 ]: S// GPIO 管脚复用配置
( K4 m6 H. |; }- m3 pvoid GPIOBankPinMuxSet();3 i* c9 O$ a6 |

9 r1 c. B' r1 {5 i2 t* e4 s- g// UART 初始化
$ c- B! g4 @& M6 s; \& ivoid UARTInit(void);
; U* U% ^2 j: h1 i: H// ARM 中断初始化# m4 y4 \3 F/ k7 I: y7 C5 w. I
void InterruptInit(void);8 f; L. w  U( g5 n, M3 R" ?
// UART 中断初始化+ _% e$ t/ a9 K% D/ k: ]
void UARTInterruptInit();: K# T1 @/ ?/ Y( U! ~* _( H
// UART 中断服务函数' B9 o  [' e9 x" o3 j
void UARTIsr(void);
3 X# U, g; w, _9 s. d/ m1 c* \! v* K2 z
/****************************************************************************/7 i  }+ K* U+ [: b9 F3 F) a3 B( l, B9 W
/*                                                                          */
' n( b7 `) m6 K7 g9 d  X; z$ y" _/*              主函数                                                      */0 x; Y' _3 O3 t7 r
/*                                                                          */
; P  Z  N8 G1 f. C/****************************************************************************/* R: @4 t- B. _( R
int main(void)
3 `# `6 G/ l* |* X4 k{4 K$ S0 D: e2 V$ N# W9 v4 H
        // 外设使能配置
. f# z0 Y8 {4 ^$ r) X( ^6 n% t        PSCInit();
. h# B4 @# G% y' X5 Y        , s, [, G" F$ r# v9 B& W
        // GPIO 管脚复用配置
; h, o( H7 D  [% u2 z) f0 @        GPIOBankPinMuxSet();
8 ~" T& j& ^% v! \6 ^' V4 T. |5 R. r
        // ARM 中断初始化& q8 E3 N' D7 t0 @( a8 ^  F
        InterruptInit();
; e1 I( q% k1 q' u! G% V; I$ m7 M5 C. F5 _4 l4 \0 d
        // UART 初始化% J0 }1 `8 `+ N* x2 L
        UARTInit();
# i% e9 J6 J" I+ n" Q3 P6 A! `/ m9 w9 [& {! W
        // UART 中断初始化5 @6 Q( M& x6 [$ x' H
        UARTInterruptInit();
. ?& D3 @6 J# h9 y/ E  V7 {- g7 h$ \* N0 S; v
        // 主循环
9 Z/ C' V0 r# E6 X: B9 |6 p        for(;;)
  w, y4 {3 Y) ]% a        {
) s' j* K- ~! v) ]; d: n+ O7 ]; j* u+ m8 I$ o  @8 Q. X
        }( O' m  s  p; ]
}4 [  `4 y! B% s( S' s  U( T- @% z7 q
% o! b4 Z( t4 C$ F$ t
/****************************************************************************/
/ z% P& _  R0 G8 r/*                                                                          */
$ L0 M5 H' B8 M" L. @/*              PSC 初始化                                                  */6 x0 M; f2 l0 M! M" h1 B: ]
/*                                                                          */
# X! U. P, x5 j  _+ e/****************************************************************************/
; Q- E: x5 @8 g/ \- pvoid PSCInit(void)* P& E! s- M6 j  ^
{5 x$ v' g. l( o: P9 E' W
        // 对相应外设模块的使能也可以在 BootLoader 中完成, s6 d4 R. ]) r# ?
    // 使能 UART2 模块  P& u( Z& r$ u5 a) f! d! u
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
3 X- {4 p& U0 c3 s: h7 I}9 j# B6 {. K3 p& y/ s
1 O* k6 X0 q' r$ w& Z; C" G* h( l
/****************************************************************************/% w  ~3 c' g# `7 M( o& u
/*                                                                          */
0 C& r- z, y  J0 M( C/*              GPIO 管脚复用配置                                           */
% o2 G. r( P4 B% G5 L+ E/*                                                                          */
$ `4 h- Z- S( L% _/****************************************************************************/
" x+ C) _/ r# L+ Rvoid GPIOBankPinMuxSet(void)$ k2 R! |: ]$ Y  A
{
+ U: g7 a0 [# s0 C8 @        // UART2 禁用流控  D2 f) M9 }; Z  D
        UARTPinMuxSetup(2, FALSE);
' Q9 w1 {- A6 S9 n}) H( M* X) x! B+ f) f# i) v' K
# D! R' [) V$ ]6 L3 I
/****************************************************************************/
8 g3 i. Y2 Q- u7 H5 z/*                                                                          */  p# L5 I+ n  A; E- ~; a
/*              ARM 中断初始化                                              */
4 E$ Z* s- H# m" j/*                                                                          */
( ^: G# n! U2 D; P- T- k& u/****************************************************************************/
/ Q( l5 [; N' N/ s# Y+ u1 L2 dvoid InterruptInit(void)  f" l% h& E' I- k: V' f" B
{
7 z0 q$ Y6 G3 M/ o# b9 m: j    // 初始化 ARM 中断控制器( T  X$ {3 z4 D, R+ A0 \
    IntAINTCInit();3 R4 B9 j8 V0 j$ a1 p8 n5 l
, M- ~: ]+ s4 d* V+ r5 u% s
    // 使能 IRQ(CPSR)
+ r/ G1 k6 I' Q! q    IntMasterIRQEnable();( H( N* e8 t; E
' p( J! Q2 |# `% P2 w
    // 使能中断(AINTC GER)
3 J% `2 v0 [* a  K: @8 ?6 g6 v7 ^1 i    IntGlobalEnable();
% G+ y$ r3 G- N
2 v& E: D: M8 P7 m7 @    // 使能中断(AINTC HIER)
: y1 Q! I8 w, e" R5 w    IntIRQEnable();
1 H* F! m9 c4 y6 J2 O}& b+ R# R' M7 K0 v! m& ~- ?
$ H/ k$ }# _2 E  L! N6 Q9 u. D
/****************************************************************************/
: C: I2 J, u- C/ ], D/*                                                                          */! t4 W$ R8 `; r5 C6 A3 p
/*              UART 初始化                                                 */
% A( R" g$ c2 S8 j( r/*                                                                          */
2 b7 S$ t7 M1 v4 v1 Y* w/****************************************************************************/  J) w9 M! ]* H# B( D/ M% f, b
void UARTInit(void)' O2 G+ u8 B0 H
{/ t1 }0 l- z4 e& E
        // 配置 UART2 参数/ K& {' O# B( o
        // 波特率 115200 数据位 8 停止位 1 无校验位
$ O6 U+ v6 w8 h( |5 `. ]$ p    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
& K' b8 H9 h# A) r- O+ u" r4 Y  c                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);7 s# \  V3 k# f! a: E5 R- c( U& _
        // 使能 UART20 k" e: q, ~" I+ W
        UARTEnable(SOC_UART_2_REGS);, q1 B' d3 y8 u& [' _. G: Z

  c" u% ]& f: s* F/ {- R2 l0 b    // 使能接收 / 发送 FIFO
6 t$ P! q- Q' a+ C( j3 i    UARTFIFOEnable(SOC_UART_2_REGS);' G. c( \: @# |) X. }, H

/ g0 B# v; Q: h( J( h" m    // 设置 FIFO 级别
' X( z& @' V5 L    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);! D4 D* W9 l0 O0 u5 v6 p
}9 {% }7 P/ b8 G4 K) `

- B- U3 G: c1 Y% \1 w, [$ }/****************************************************************************/
. M( y! s$ e5 P) `! l" A/*                                                                          */% o/ k3 u6 A' `  X$ ~
/*              UART 中断初始化                                             */5 Z5 t! H" h6 p% F
/*                                                                          */
. h/ g; o$ y4 J" b) T& n/****************************************************************************/
- {2 ~! K% e$ wvoid UARTInterruptInit(void), g. C+ u% w* U& P9 e% Q
{4 q' b/ @% o( u) u3 x8 B" \3 K
        IntRegister(SYS_INT_UARTINT2, UARTIsr);! h" Z4 e& L; W& }. O
        IntChannelSet(SYS_INT_UARTINT2, 2);: r& m! _) M7 B# B0 y+ N. x- }
        IntSystemEnable(SYS_INT_UARTINT2);! X6 Z3 ?* J* p9 O. R0 Z  }
/ o# M  N% ]" B& ~2 p7 C
        // 使能中断4 O1 o) z3 n: J1 N0 [- u0 g6 l$ q
        unsigned int intFlags = 0;. N, m6 u! ?8 u8 ]
    intFlags |= (UART_INT_LINE_STAT  |  \" k/ S) |0 z. l6 e
                 UART_INT_TX_EMPTY |    \
  ^! g  e4 G$ Q8 f1 A                 UART_INT_RXDATA_CTI);! b- W" g* z) q  K
    UARTIntEnable(SOC_UART_2_REGS, intFlags);% R( m: @9 N# S
}2 I& B! Q1 I- S& t* N! C

' b) J. j: L8 @8 o( e/****************************************************************************/, U( [. _# C5 B( `, |1 _( r" x: J* N
/*                                                                          */. L  b4 C% Z9 C1 ~8 n7 U
/*              UART 中断服务函数                                           */
; e: Z, ~# a  \% |! ~1 w( ?/*                                                                          *// R. z. L) a3 A* l
/****************************************************************************/& m9 `+ h, C% V$ A0 X# H
void UARTIsr()
$ B3 J* W$ p" Z1 J{: l9 g8 a$ ~3 X. p8 V
    static unsigned int length = sizeof(txArray);
/ {( R6 x% H; a, `1 \    static unsigned int count = 0;
8 ^  |3 R2 T; S' r8 k4 Y    unsigned char rxData = 0;
. @3 o$ T% d* t2 _    unsigned int int_id = 0;! n6 e3 D% @4 @8 F5 Z  E8 j2 I
4 a- `( q; v0 p+ X2 L5 n& l
    // 确定中断源
+ l% P; ]- y2 a! n; o6 q    int_id = UARTIntStatus(SOC_UART_2_REGS);, u6 P. R7 P8 _6 Z* z( e3 [

$ c5 p, |6 v( E" B2 _: m3 N    // 清除 UART2 系统中断0 f! F( @3 L5 h5 d
    IntSystemStatusClear(SYS_INT_UARTINT2);
& y- q6 W: [2 d# S9 u6 [2 a- I4 a0 H3 F8 o
    // 发送中断9 a- U* ~! x2 ~  e/ u
    if(UART_INTID_TX_EMPTY == int_id)
3 w+ L( Q( {. H: `    {
* ?) x7 M0 `+ _& V! n/ f        if(0 < length)
5 C/ R( \; b2 x) w+ [        {. D: E0 {* n( r& E
            // 写一个字节到 THR
8 H" N8 L' {5 E4 e+ |! u4 n            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);: E* o. M9 |: S
            length--;
* I8 q1 T/ k' x8 l: q5 {            count++;" s* y2 y" G7 r- P; v+ U2 f3 n
        }. q; b% O. N9 A  F, A
        if(0 == length)( ]: O# G) e# q
        {7 t2 u) D# x9 ]( b2 c9 l
            // 禁用发送中断
8 N) k9 s% `0 h" _  a            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);$ T: w8 ?. `' U2 J( r
        }9 ~3 L2 K: N0 e( z9 S
     }$ C4 f5 W, G8 Z4 l% T4 Y2 P

" ^  P. e- B% ^: O    // 接收中断* X4 R9 c8 V6 c/ w4 R
    if(UART_INTID_RX_DATA == int_id). J: @: j/ ~; d" {: @) S  U3 m; t
    {3 Q) i) V, @4 X- P: B
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);/ X) \  N$ q. T2 V3 G! i1 H
( g# }5 f: |+ n2 n5 K1 |. V
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);! F) C& }4 X; B3 W! i: y8 M
    }$ ]0 u: k6 X4 O3 U$ G
. ^, D; e7 w: B/ Z1 q+ G
    // 接收错误
% m! W( g5 S& }1 P  ^. U    if(UART_INTID_RX_LINE_STAT == int_id)
/ I' n2 Z) K& d; L7 i$ Q    {/ u3 R9 ?, ]8 D' u) @
        while(UARTRxErrorGet(SOC_UART_2_REGS))% U6 P- k9 y" n/ N- Q. w/ O
        {
* f. n! |% B) Y: H! p3 M& U- D            // 从 RBR 读一个字节" s' c( B. q/ ]' ?: _( i
            UARTCharGetNonBlocking(SOC_UART_2_REGS);' s/ V/ l6 @/ z+ j" l/ X) k
        }. f( F1 p1 r4 \% ]; F! X( |, {! }
    }5 X) ]+ b3 H* x! r
    3 K) s+ R* v& ^) v6 Q( [
    return;
3 L. v4 f) o4 o}$ s0 b, i2 l" y4 V" v0 u
回复 支持 反对

使用道具 举报

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:253 T3 f# U+ X6 f/ H" h
如果其它设备快速给你发送串口数据,你这边能正常通讯?

% F4 u: L# ~& ]谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-13 16:41 , Processed in 0.044662 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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