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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8351|回复: 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 b1 o4 }) B' L' ]1 }2 o: j

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。$ J. A" N9 P: A1 {1 W& s( {

9 p, t5 ^% b3 u7 K8 |# `#include "TL138.h"                 // 创龙 TL138 开发板相关声明- p" P7 P; ?: p5 E

/ ?. g5 z3 y! o0 R/ L, z: C/ M- Z#include "hw_types.h"               // 宏命令
7 k6 d: M, x# C& u& W. T: t#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
, O5 o7 }8 P1 `#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
/ S5 \2 h+ |* M* y/ s% G$ a* F+ y. q* f) K, K
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
3 V$ }& y  f7 B1 p/ Y7 F#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
! F5 ?7 b1 I/ j3 I1 t#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明3 t1 u# v9 T3 `& K
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义4 W1 X4 f$ F0 r/ Q, `% l

  M3 H2 m$ x2 }# @- A) Z" g/****************************************************************************/
6 n2 C' e' Q) U3 N" z  _& C& _7 Z/*                                                                          */
$ G+ F6 G' V( f. M+ f  i/*              宏定义                                                      */
( _! K. @0 p3 e* @9 C/*                                                                          */
6 T$ \& @" h& [3 V/****************************************************************************/+ I7 U  E% Y+ ?0 V, l  G, a  f* O% z
// 时钟
- W, k4 `! |, i& I#define SYSCLK_1_FREQ     (456000000)
8 f5 D1 v& f- m, _#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
8 |  I% o: d* i5 Y0 x: s6 |#define UART_2_FREQ       (SYSCLK_2_FREQ)& i" P' V+ d5 s- E$ v) M1 f0 B$ [
5 q  p8 e: V" c  t! V
/****************************************************************************/
, ?0 q3 y4 }& B" ?/*                                                                          */7 M8 I2 V. c& \* E6 e4 W0 \
/*              全局变量                                                    */7 T- \# X; X' ?2 P9 k7 A" F
/*                                                                          */
* i/ Z; [  I/ m, Z! h/****************************************************************************/
6 }! A6 d; s* K6 ]2 |5 t" a' Tchar txArray[] = "Tronlong UART2 Application......\n\r";) ^$ p% ^  ]- ~" P5 O
, D4 R6 J2 c6 c' C
/****************************************************************************/
$ _: C, z, N" _! ?: H( ?/*                                                                          */
4 `3 s# f+ t$ P$ y. c/*              函数声明                                                    */
/ \& M; D3 g) U/*                                                                          */8 _4 I$ [# q6 t3 L. s' |5 r
/****************************************************************************/
* b- X0 P) l+ x// 外设使能配置
  l1 A6 {# p: Wvoid PSCInit(void);% ~+ d8 h* }9 t& M' n) L% M

* E5 \3 S5 d$ d' a0 P// GPIO 管脚复用配置
" ^) k- L. F# M" p" u6 x( bvoid GPIOBankPinMuxSet();7 O9 V: Q" O, N' b( }

3 X* P3 U, ~/ o8 ~$ i/ P% g( y& v: S// UART 初始化
+ F$ C1 T. W" M1 Rvoid UARTInit(void);
; u  ^) Y- ~0 R// ARM 中断初始化$ b& \) d8 U' T* Q
void InterruptInit(void);" \7 c) g! V5 h/ e0 P6 x
// UART 中断初始化3 e7 W3 f+ u( n# h- p1 W3 g" e1 L
void UARTInterruptInit();
- H! o( w2 P3 C* i/ k// UART 中断服务函数
* C& \& H, M/ n! @: bvoid UARTIsr(void);
. v8 y+ w# j! @- Z* `7 A8 [) N
: l# m; B& W, w. S( T, S4 T/****************************************************************************/* A( S. C) a+ _1 d' D3 ?
/*                                                                          */
$ L! a+ n: p( [0 b7 R8 a% k/*              主函数                                                      */
, {- g4 E& L- ?/*                                                                          */2 S% h* d9 `$ y
/****************************************************************************/
/ o2 I6 N& _0 h' v  {8 p' c6 _8 }3 `int main(void)
/ o) u2 \4 i3 i9 l! p2 @9 w{
  ^& k1 ^. s6 U# ^+ R  R2 c        // 外设使能配置1 a/ T6 O. p* [8 |1 i+ K
        PSCInit();" y/ h" X/ w  g" K, E+ |
       
+ P3 Z/ v2 X9 g        // GPIO 管脚复用配置6 T, D+ r8 z, A5 K1 ~: t4 x  l, H
        GPIOBankPinMuxSet();9 z0 e; U& z9 V+ L; @1 V
, t9 f% p! h6 u8 S* V
        // ARM 中断初始化
$ W, C. M" u9 e  m( @$ [        InterruptInit();
9 f6 n% @8 D$ ]% U. z: L4 ?$ a, J) `  ?! @
        // UART 初始化9 _9 u% R0 [3 b. \6 M
        UARTInit();
( H# L$ ^0 K: A9 {* |8 R$ r8 @- v0 L' r" Y
        // UART 中断初始化- J- A/ G' k9 |
        UARTInterruptInit();# w1 l, H1 f1 a7 F) T  N# }

! z7 g; w/ ~' n; U( F; e  M        // 主循环4 E$ _3 s4 C5 v1 T
        for(;;)
1 W0 {4 E1 h1 I. ~        {
: E; W' b  |3 q- A) w. g. S. N
/ I! E( Q* I# W- p& y- P( g2 m        }
  ~7 q$ U- e7 G. I1 {}
, i9 z- k5 I' D& a, e* z/ A& J
/****************************************************************************/
$ k9 W) c; S& Q$ f6 |9 S; i3 {) F% ?/*                                                                          */
7 ^' W  [, q& q/ y' h2 J  |' ]/*              PSC 初始化                                                  */+ ?* r! C" ~4 b/ F
/*                                                                          */
) q8 w- i2 M8 [% \/****************************************************************************/
+ J- w! t7 u8 z! {& L: }) uvoid PSCInit(void)9 P' X* Z7 b! Y; C
{1 p" F9 o9 Z0 b2 \- z; ]
        // 对相应外设模块的使能也可以在 BootLoader 中完成2 {' o6 K2 `5 w; h" D
    // 使能 UART2 模块
( X, a9 y: h! J2 }" E    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
+ R# x6 Q, @# }/ f& T2 ]! l8 r}8 `4 T  y/ p0 `/ ~3 R- s2 X8 |
8 |7 R, X1 Z8 S
/****************************************************************************/
- X* C9 g. @. T# d# F$ J& y/*                                                                          */
+ g7 S' |, g3 c+ H8 A/*              GPIO 管脚复用配置                                           */" @7 L- x! i- ]
/*                                                                          */2 J/ k* [5 O# b) t& ^. A" {' E
/****************************************************************************/
" \( @* g8 Z% g9 ~void GPIOBankPinMuxSet(void)! U. ^; I- \: ^* ~* o
{
) B$ R- q% |5 X; p6 y3 M5 F" \        // UART2 禁用流控: e0 E% M3 A! j1 V# X& \2 E
        UARTPinMuxSetup(2, FALSE);
7 C* B, ]: R" \& ]# d7 W& _}  |- [7 {3 m. w1 C( ]8 y
3 x, |& d4 u, X
/****************************************************************************/
# K0 c6 G' f1 ~0 E/ N/*                                                                          */; ]9 _0 D9 t: L$ I
/*              ARM 中断初始化                                              */
- T5 f; y, V6 y; [1 |8 G- W/*                                                                          */# \* g: B, @  z5 J/ u1 j
/****************************************************************************/
) {0 F& }) A( [6 h  _: T) Avoid InterruptInit(void)
% B  K1 O0 w" a& M9 N, G! n{
/ x9 M0 [, @  g* [  I    // 初始化 ARM 中断控制器. e8 U2 S  j: L! a" C4 u( R0 h& \
    IntAINTCInit();
! s% z3 ^+ N9 W" l& H+ \
- Z1 b; X0 z0 O$ e) F    // 使能 IRQ(CPSR)
; o3 M; }( P: P' D; H  {* w    IntMasterIRQEnable();3 S0 ?$ R8 K- D* T5 S( B" @) h& h
; @& L9 x5 r) a& ^, B0 `6 O
    // 使能中断(AINTC GER)0 R9 L' E3 p0 @
    IntGlobalEnable();
& ~( [% B* L8 F0 t" |5 o  O
8 I! V  C6 p( ~    // 使能中断(AINTC HIER)% ]! Y0 \& q4 U1 p, w" H- X
    IntIRQEnable();
! A2 F/ W4 \  Q: u4 h}' V5 r, g/ f/ W' b& l
# T' c' X( I/ x% T* _* s
/****************************************************************************/
/ O( R& H* ~" i3 G1 T/*                                                                          */, j8 J6 D1 k. I: a; x) ^
/*              UART 初始化                                                 */
# \$ G) X* ]* R; H$ a1 U8 [/*                                                                          */8 p6 b6 C  Q; t* X5 X2 s& A, ~
/****************************************************************************/
* s- [6 P+ u  U9 s' d% vvoid UARTInit(void)
# l, D4 a0 b: m{
3 |- @( i. e* d1 h. x6 l" |        // 配置 UART2 参数
5 I" n: U" n" O! \) E        // 波特率 115200 数据位 8 停止位 1 无校验位
. ?! g4 N* q7 C    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
2 @, u$ m: ^( z9 k! W& v4 ~: ?                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
# s9 A5 C7 B6 w$ G0 ~7 n5 v        // 使能 UART2
* V* u" ]+ ~, ]4 W0 @; M) _4 U4 C$ b        UARTEnable(SOC_UART_2_REGS);
; ]# L2 K8 K: p$ w
$ M: N; A: X( k) |    // 使能接收 / 发送 FIFO$ z6 G% W, S. f) u/ h
    UARTFIFOEnable(SOC_UART_2_REGS);* M+ H5 x6 Y7 |( [- _

4 ^. v# _5 B. f7 J. F) `8 w& J    // 设置 FIFO 级别
- f  F" M: h! M+ I/ L$ |* V+ G' t' W    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);; |0 I2 R) M7 R/ C4 q% u
}
. {/ |4 _. J+ f' L4 T* s6 z% I: v( N
/****************************************************************************/% D7 U9 ]* k' |/ @: c7 E, ^
/*                                                                          */
$ a- l8 G6 M3 K/*              UART 中断初始化                                             */! C0 U, S4 g! d3 K7 R
/*                                                                          */
% C  K7 w7 {/ C- C0 V3 M& T" O/****************************************************************************/
! g/ [' M7 |) R( w! Svoid UARTInterruptInit(void)
) Z; N& }7 c+ I- `$ u9 Q/ g{
- H- @- m' H) H" }% J# |        IntRegister(SYS_INT_UARTINT2, UARTIsr);# _# @5 P! ?$ l7 ?; F9 _
        IntChannelSet(SYS_INT_UARTINT2, 2);
  S  X: c/ q; b& b        IntSystemEnable(SYS_INT_UARTINT2);! l& E/ R7 g1 q

% |0 i4 Y9 k  A' l! q8 B        // 使能中断, b( R; J& L4 u
        unsigned int intFlags = 0;
* @" f$ I- V  J* F: O; A    intFlags |= (UART_INT_LINE_STAT  |  \
' p2 V* V1 B' g" L! `; x                 UART_INT_TX_EMPTY |    \
$ a$ d# U% _" E0 @9 _) P  H" C                 UART_INT_RXDATA_CTI);$ S8 _6 X; m4 b5 Q. |) C  J: C
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
  q2 O3 @0 j1 d4 I9 }# L# b1 F}: S# {! u0 [0 @0 F/ f4 v

2 b8 v; e" R, ~; {* t/****************************************************************************/: [. P1 q! N$ I' T' d4 n
/*                                                                          */- ]# m& Q$ v4 E/ E7 M4 Z
/*              UART 中断服务函数                                           */0 C2 t, e2 ?( ]0 |3 S8 ?% G
/*                                                                          */* ?  x# U, O: O5 O+ T1 z8 _
/****************************************************************************/
4 ^  {4 e4 g' ~1 n2 rvoid UARTIsr()
" Z' E6 o' s/ c- X$ U' j{$ b; P0 Q/ f8 M
    static unsigned int length = sizeof(txArray);
1 v- `7 w: S% l6 N    static unsigned int count = 0;. B+ C" h) x! n3 Q# E9 s1 J* _5 ]
    unsigned char rxData = 0;; U* ~. ?% W. Q, v9 }
    unsigned int int_id = 0;
' S* [  m& D6 ]/ R+ k& R2 t$ U2 i1 \- M$ x1 o* Z" C5 }
    // 确定中断源* d3 \5 N, z* C
    int_id = UARTIntStatus(SOC_UART_2_REGS);8 ]4 U- k4 V+ `2 m% g$ I

6 d0 E9 p2 R. k. o9 D5 X5 U  r; _    // 清除 UART2 系统中断! \& R5 L( U7 _" Z+ M/ ~
    IntSystemStatusClear(SYS_INT_UARTINT2);
1 \# N9 \; |3 H
" c/ Y, y0 l  |9 u0 u, ^0 D    // 发送中断
3 T; x( {$ O) d* L3 E    if(UART_INTID_TX_EMPTY == int_id)
* A0 A9 |- V& M" w    {3 S* O7 S) e9 g9 m- Z; h2 \
        if(0 < length)0 g. y1 J0 f5 S4 \7 K) g
        {- V% N' k9 S! X2 P: u9 j3 R
            // 写一个字节到 THR
  M3 h- U1 x. n/ b            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
( Z* d) r1 D: _2 j, T+ I6 R            length--;
, C- H& C7 I' |6 @! j            count++;
  g- X8 W% F1 ?; D; S2 ]        }
- f" t) ^7 J0 E4 R        if(0 == length)
. a% ?; u+ F) _4 V        {/ f1 b: e8 p* ?$ H4 Q9 _
            // 禁用发送中断' V  ~1 D% y3 o0 x' X
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);2 t0 a2 S2 U- h1 H% l
        }9 f' [. D+ t5 y4 z' C$ s5 L
     }
7 }3 c9 X3 r+ r0 z
! d  N4 E0 a5 p4 p3 J! z, Y    // 接收中断
2 J$ C1 w/ y- q0 P( G    if(UART_INTID_RX_DATA == int_id)3 W3 Q! u% }( e! Q4 O( H) |
    {
: }$ b( b! ~& |0 |) I8 h! U) A        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
* I- Z7 k5 @1 {) d9 @& ^
0 M1 s  z4 x( H5 H9 ?! }  H0 Q        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
$ e) d/ j9 A& X- ?* S    }' @( \4 U3 r0 P+ W: g
' b# O* y9 a6 a: N# f
    // 接收错误
- a' I. T4 H) Z/ A4 f    if(UART_INTID_RX_LINE_STAT == int_id)" ?  P; m" z" }
    {8 q3 K  t. `  X4 Y8 T- O$ H
        while(UARTRxErrorGet(SOC_UART_2_REGS))
0 Z9 d2 L3 a  F" R/ o        {
) R! O/ v/ f) M8 J9 m            // 从 RBR 读一个字节
' D& p; ]! |8 E  g            UARTCharGetNonBlocking(SOC_UART_2_REGS);
! m; p4 j# T3 M- r( s4 }        }
2 u0 c; V* h+ R( L( g  Y+ Y, H    }+ U$ m3 D3 z7 \; ^
    ' @1 {$ t# Y: H) u5 l: N8 i
    return;: \7 R7 P# K3 K2 V4 ?
}
4 l( O. p& X* B$ z* [0 S; o
回复 支持 反对

使用道具 举报

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:255 H( l; E/ j0 i: C
如果其它设备快速给你发送串口数据,你这边能正常通讯?

& b; [7 a$ I. [谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-9 03:39 , Processed in 0.044624 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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