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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7389|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。  k5 d" k, K' q6 \$ H  |

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。" V: j- H! T- z7 `

  G/ v8 ]( q5 R7 O+ h; S#include "TL138.h"                 // 创龙 TL138 开发板相关声明7 {* c" J% r3 n( z$ `
/ _( u* g& Z( |, K0 J8 K. E
#include "hw_types.h"               // 宏命令
+ ?/ v7 W  H0 e: v* Z: h, U1 i1 C3 W#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
; ?0 _8 ^  m+ \* _4 W" e#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
. t5 }( `' s, A/ l0 f# y% A8 W2 D
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明, M" s1 S) P+ S+ v3 z! h1 A! `
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
# V- a0 R" b2 f. i! ~% c#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
; s5 q" J; K" o& K#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义& l) x, b" |6 g
: x9 l' _! u$ c# S7 M6 h
/****************************************************************************/
  u" N$ n/ f# \/ B/*                                                                          */* \3 V5 S6 p" ^
/*              宏定义                                                      */
) x: U4 I/ X: ?9 V/*                                                                          */  b$ c1 [; V3 }9 U! r* x
/****************************************************************************/
8 R) R* e5 p7 L. R6 s6 R// 时钟
2 w  u# x, h8 Y! u6 w4 b#define SYSCLK_1_FREQ     (456000000)
$ I: O/ T' D* Q; N#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)! B$ ?% w9 y; z& J) Y: U
#define UART_2_FREQ       (SYSCLK_2_FREQ); H  Q; |; f( U3 g; T% x

: M; D& K8 _) J+ P. A% J2 N/****************************************************************************/5 ^/ N3 h% A" w7 W, {& z
/*                                                                          */
1 `& ?2 F4 c  u' e: |" _- L7 O/*              全局变量                                                    */8 A4 Y" i/ D+ L8 u
/*                                                                          */
+ y# N. J# ~! M/****************************************************************************/$ g5 p  E. a0 h- ^' Y2 e4 ~5 j
char txArray[] = "Tronlong UART2 Application......\n\r";
( i3 u3 G: \' ^1 |. U. j& v6 F6 F: ~  ~
/****************************************************************************/& k- m+ g' \- |
/*                                                                          */1 w2 Y" P" y6 S* J7 a- f$ T
/*              函数声明                                                    */
! x7 I' E5 S6 o6 ?: c$ ~/*                                                                          *// N5 a  D, U- k8 M7 j" _+ W# i
/****************************************************************************/
$ s# [3 Y- G( I3 O' i' ~7 W// 外设使能配置- |' _" @* F+ x9 i+ Z9 o
void PSCInit(void);2 J0 \) d: g7 w
) I; \8 R/ B$ T  P
// GPIO 管脚复用配置+ Z, S9 T2 C% `5 W! T4 i
void GPIOBankPinMuxSet();' a1 {7 T% A  @) v- L! b* o4 O# x( j

5 W4 V) o0 b! \, h+ u( v// UART 初始化
9 }: V+ ?8 K8 ?5 i; e+ Cvoid UARTInit(void);9 y3 b% R$ V( i: e% p
// ARM 中断初始化
3 N( X" q! H5 evoid InterruptInit(void);3 c. R+ f3 t( c5 V& w
// UART 中断初始化
' |2 n4 ]/ I* U7 _8 U2 xvoid UARTInterruptInit();( k+ n! E! Y0 k7 N- D, L, E
// UART 中断服务函数
. r" I0 A; E0 Y# \0 xvoid UARTIsr(void);
" i( q4 I/ m# r6 S  a, U2 t! k8 U
/****************************************************************************/& {" h6 G, f* F! l; Q/ D- D- i( h
/*                                                                          */
. K4 @/ e& e/ d8 g4 W; H4 I: q/*              主函数                                                      */
2 N* V$ h5 Y7 N8 }4 l# h/*                                                                          */+ y  Z/ B2 g# z! j1 k/ p
/****************************************************************************/
" z+ v4 `! a* q* W7 D& n) {; oint main(void)
. X0 y4 q0 C" I: M* a+ w{
& n1 i( e- [& h: P& l2 J& ]# P        // 外设使能配置
" n- R0 E$ L" C        PSCInit();
: ]7 @; h/ V4 U! ?. g        . M2 I2 U0 z$ z/ K! Z
        // GPIO 管脚复用配置# J9 w5 s6 J, E- a5 H9 v
        GPIOBankPinMuxSet();
0 b% Q& I. y2 z' m% O/ G9 V9 B% u5 Q3 T% G5 @( v3 e' Q! y0 l7 D
        // ARM 中断初始化
3 s" {) T/ o- C        InterruptInit();
6 w: B. |8 ]9 P9 i( ~6 X
. I$ q  l. h: f4 f+ W3 T# x        // UART 初始化5 k7 `3 f5 i" H; @- ^" q6 b  ?+ D
        UARTInit();
  q! q7 J5 Q3 y- y& {* W
* D0 q+ _: l- b4 P        // UART 中断初始化
% q; a; ^0 B# R, q8 [2 b0 s; l        UARTInterruptInit();
. m) M6 G4 j3 S1 G; I. n
! _0 ?: T! Y8 p8 o0 j& L. A        // 主循环& G/ K% Q$ z" w* o" [5 G
        for(;;)! S8 ]$ k. i, J( X
        {6 B6 d& L, O$ {  r
9 l" U) ~3 H  |' @  l
        }
5 r8 E$ D2 R4 b% T}5 [. `5 n5 K1 G6 e
3 J+ X- \0 w9 `
/****************************************************************************/
2 G! z& P, v3 j/*                                                                          */' V( _& l0 @& ]+ T! H; x! B
/*              PSC 初始化                                                  */  X; f* i$ @" M4 ^. U
/*                                                                          */; C+ E$ J( k+ U) N" `# w) v
/****************************************************************************/: t( `( U) G8 c; q% ]9 j. v/ p
void PSCInit(void)$ G* Z( X9 \% |) ^5 P* l; h7 q5 m
{
+ P0 n8 `9 m& ?( A; a        // 对相应外设模块的使能也可以在 BootLoader 中完成9 n9 h+ C: _4 Y7 z* X6 ]- v1 J0 t
    // 使能 UART2 模块
0 e' ^. s* S7 W, _6 d( R    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
+ m/ Z. o  u5 l}. O$ I+ I9 [6 O0 J' V1 g9 e- m0 W, p

3 n* l+ m, l/ a" Q- y1 C/****************************************************************************/
: _- f0 L3 A1 E" \/*                                                                          */+ K9 i3 `! u7 O- @4 d8 S
/*              GPIO 管脚复用配置                                           */) T3 L9 u- Z) [1 O, ?) G
/*                                                                          */6 L7 c4 ]" _" [3 p
/****************************************************************************/
) U4 w+ X# ]+ R) t: hvoid GPIOBankPinMuxSet(void)
. D4 _" V, b) e- {) G4 `0 G{
, x! g8 o4 I0 ^4 G6 e. z5 @        // UART2 禁用流控  n# `! r5 P1 h. {5 d+ |
        UARTPinMuxSetup(2, FALSE);( s( [) Q! f$ k  h
}
* Z6 m0 j) f- Y. T
* X+ w7 o) r8 w1 I0 c/****************************************************************************/
- M8 s% F' F3 g  e; @/*                                                                          */
! E+ j2 x  B4 e1 G8 a/*              ARM 中断初始化                                              */
9 d. \2 `. a' I/ b8 W* b. D# Q: W/*                                                                          */
- ~8 S& `, X  q' M/****************************************************************************/* s% c! B, b8 H/ r; q
void InterruptInit(void)
# D) m% f* E5 [- S{9 ?5 X( U: b8 \; t: k2 o4 c0 q& I
    // 初始化 ARM 中断控制器+ ^; u& c. G* H' r
    IntAINTCInit();7 S2 f' h9 A( b- O) I- J
5 k# S$ }- ^! ?5 C
    // 使能 IRQ(CPSR)  Q4 I6 a7 n8 ~! E7 S* c
    IntMasterIRQEnable();
2 h6 o- |) Z2 M  B! F6 U2 ]6 {+ |5 T# `; [* x7 y
    // 使能中断(AINTC GER)  c( z; ^, I7 R/ r+ e
    IntGlobalEnable();
& ~  d0 {8 K7 B) }8 P+ Q. H0 w- g6 I& c9 t0 d9 }
    // 使能中断(AINTC HIER)
) ^& P5 e% T+ O5 e& ^    IntIRQEnable();! P: O- `. H( C* C
}% `) I" n+ `' [- e( {' h' k
& h- @1 D0 U- C$ O! m! x9 {9 D/ R' @6 g& w
/****************************************************************************/" \6 o5 t/ H- a# g! ]
/*                                                                          */
* G4 [  B2 M' Q: Y/*              UART 初始化                                                 */
" R( F3 ]! X8 g6 u/*                                                                          */
* A* ~4 j- j$ S, L/****************************************************************************/
$ _6 N  {$ q8 gvoid UARTInit(void)
6 I/ H6 O. W; r/ Q/ _& D. R# R{
2 V% S4 k8 P" G2 W+ x! @" k) q        // 配置 UART2 参数2 I$ o( B1 w* s6 k
        // 波特率 115200 数据位 8 停止位 1 无校验位
; K- _; r$ p& k    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,1 T" l& H; G, n5 g# o+ v
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
: t  u. d5 K7 z; Q9 r# I5 o        // 使能 UART2
2 S1 M- {- `0 ^$ U# b        UARTEnable(SOC_UART_2_REGS);' O% i5 z: p  l& W9 J5 h
6 t4 i; I3 l2 r) y4 u5 L4 v
    // 使能接收 / 发送 FIFO
0 P$ ~6 u; S9 v& ?    UARTFIFOEnable(SOC_UART_2_REGS);
, C! Z( c- K: ~4 U3 `; e# @* t- w  l' l
    // 设置 FIFO 级别
5 j: m. y9 G7 A$ t: F% A    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);* U6 ]5 }( V* j: i
}
  T, v1 K6 ]' J# h: c: D. u
8 P. w: g! A! t" t/****************************************************************************/3 N( R- o: `- R3 d1 u
/*                                                                          */
4 b! [7 j8 |6 A, p+ {- B. s/*              UART 中断初始化                                             */; X( J: H) |& e: x: Y
/*                                                                          */' B5 f! y% S' r7 k
/****************************************************************************/
  r. D7 R( |% P, |0 U' e( Q- xvoid UARTInterruptInit(void)
2 y# Z! P( Z2 p{% r: Z/ N! \0 Z  F  O4 t
        IntRegister(SYS_INT_UARTINT2, UARTIsr);: u8 L8 W  i' S# @9 C7 P# _$ y
        IntChannelSet(SYS_INT_UARTINT2, 2);
! z0 U  _, U. }5 Y* _& k7 W        IntSystemEnable(SYS_INT_UARTINT2);% s- J9 i; P9 ?! P: {) s  B
6 D: k4 S% v, G
        // 使能中断2 a7 B# g! P' l
        unsigned int intFlags = 0;5 p: T; J' p+ b6 J
    intFlags |= (UART_INT_LINE_STAT  |  \
1 m, C$ g% F" Q) r                 UART_INT_TX_EMPTY |    \+ F& G* W# W1 \# U6 u
                 UART_INT_RXDATA_CTI);0 r0 G, b& E1 x6 ]6 d0 O
    UARTIntEnable(SOC_UART_2_REGS, intFlags);# Q. d7 `+ M+ O  J; j5 d( N: L
}1 k" U2 A  t1 {1 |, Z" }

% U* ]( G$ x% h0 I, b5 w/****************************************************************************/: r7 z# E; ~" H* f! O
/*                                                                          */6 w4 e! w7 s; e; f2 E
/*              UART 中断服务函数                                           */
! f) q; X# L9 m8 n/*                                                                          */, a9 B/ t1 f) @9 r* V6 t" f  t2 B0 V
/****************************************************************************/
- X/ p2 d) Z1 I! |9 x* f2 h; `) x; Rvoid UARTIsr()
: C$ f8 O% G& b: U$ H8 B{8 m; `# ^  s; p8 m+ G, E
    static unsigned int length = sizeof(txArray);
( q2 B# W) u" J: M' g8 R: R4 a    static unsigned int count = 0;% q6 h! n7 }9 F3 a0 e5 s# _
    unsigned char rxData = 0;1 N, a) n( X4 R% \. L
    unsigned int int_id = 0;
# z0 I6 ^! ~$ H9 B5 o0 x, ]) T# T6 D/ {# @3 G
    // 确定中断源3 k6 ^0 Y8 F9 p* P6 _1 y
    int_id = UARTIntStatus(SOC_UART_2_REGS);8 ~" {1 U4 \( l, s( e8 D$ G
7 s5 J" y" u3 S4 T$ S# r
    // 清除 UART2 系统中断, c. w( Y$ j: S9 V: H, Z
    IntSystemStatusClear(SYS_INT_UARTINT2);/ Y, x7 i! N3 X% n5 L% ?

. X5 F/ x6 N4 p  b1 r$ V    // 发送中断
% Y8 y( G  L8 y$ r2 f    if(UART_INTID_TX_EMPTY == int_id)7 x$ K0 p) |7 m/ j5 v4 X6 Q, E
    {# Y5 X3 f! r( x& |
        if(0 < length)% S! @4 ~4 t# p" e- |8 w
        {
  B8 e! \( K! b/ x' t6 d' [; S            // 写一个字节到 THR8 B8 B* i8 s" T9 Q- m( R1 T
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);2 J. M- V  o& ?* _. a
            length--;
4 t: m! ~! [) @0 G            count++;
  p0 F" g9 t9 d0 ?        }8 W8 |# T/ i# ^1 w& T
        if(0 == length)0 B: O4 x' H9 G; `- x( K* D
        {
4 a& S$ p3 W- V2 [) I; ]            // 禁用发送中断
, b7 h2 n) y" u/ W            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
7 b# k" R6 r; q# E. {$ p& O        }
. W4 \. B% F# y: I. O     }
6 j3 ~0 [" @2 D6 f5 a7 b8 t  v  \* f) M5 c& {, B
    // 接收中断7 I6 f$ Y# B! B+ N* n( X$ ]
    if(UART_INTID_RX_DATA == int_id)2 V. ]( I. B+ x3 ~
    {3 P9 g! C/ u. a6 _# C/ G+ m
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);% y% H0 k& k; K

1 w% Q4 G/ r( V2 Y8 G1 Y$ H        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);/ Q* D7 o& R1 O( D4 r  Q
    }# m  K2 h- q0 d( M- h- m2 Z

$ A$ c" h% N* L  d7 ?    // 接收错误
& B. X: L6 y7 c  O5 i8 u7 m" x    if(UART_INTID_RX_LINE_STAT == int_id)4 g$ `; L6 L7 w- O. r6 Z: D! {  ?
    {
, W: l( ^$ ^8 C- m5 ]! c6 S3 ?9 R        while(UARTRxErrorGet(SOC_UART_2_REGS))
6 O7 C8 b- e7 f: y        {
' z; u2 B1 m$ C9 z, r            // 从 RBR 读一个字节# q- @7 U% d' d7 a
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
' h' Q2 x7 P  \        }
) N; k+ [# x4 P, Z# i/ G- ]4 x" g    }
2 ?: L, Z* M7 Y. j      x# _# K7 E3 R4 P1 E! C4 ^7 k7 }. V
    return;1 v5 N* x2 Q2 }; N8 ^
}3 }! e9 ]" ?$ H
回复 支持 反对

使用道具 举报

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
9 I' d" U& ?$ F7 {0 ?如果其它设备快速给你发送串口数据,你这边能正常通讯?
9 m+ s  A9 M# u7 c$ u
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 09:39 , Processed in 0.042651 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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