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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5602|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。+ i6 t$ Z; x7 F+ o2 L

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
8 ^, b8 Z& D, t4 I9 |; E5 G) V6 r
( n6 D4 _9 i: g, d+ o1 |( p/ {#include "TL138.h"                 // 创龙 TL138 开发板相关声明1 P( H: d, p4 O3 L/ g0 H) K, N

0 L8 n* Z+ l2 W: y#include "hw_types.h"               // 宏命令( Q+ Q. c3 }& J. F* }! d
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器% J0 H: h+ g' W8 y3 I' ?- J
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
9 h. @' {: N' Q3 \. X& t6 L* N! g
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
4 L; G6 |4 W" v* U: ?! ?. a#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
$ f- p: k" A# G* p8 ^+ C1 g#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
' U) J! B7 ?7 x7 B3 O0 X" M6 G#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
4 d  w9 I  X6 ~0 m4 \' b: q( ?* ]1 N% T. {5 z
/****************************************************************************/' P+ N. Y- s- J+ ^
/*                                                                          */' |3 i! ^! S7 A2 k: i2 F
/*              宏定义                                                      */" }. x& B" n( ~5 ~  x
/*                                                                          */
' u; L. u# m  Z; W4 |! _) n/****************************************************************************/
) L% R- Q# g# T) y7 Q// 时钟6 {! m4 U/ S  C" n2 V: v2 M: R
#define SYSCLK_1_FREQ     (456000000)0 V, W% a5 R" Y4 j% g5 _5 @
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)8 u# C1 r4 B" t9 t$ X5 u
#define UART_2_FREQ       (SYSCLK_2_FREQ)
, k4 K; s* ~) X2 U  P* L  F! k; ~
' {/ ^6 N' I" P1 a6 x1 }1 g0 u$ |/****************************************************************************/# L8 a; Y6 ?$ H) E
/*                                                                          */9 p- |5 F! A; s3 J- |" h
/*              全局变量                                                    */
9 [# Q' ?! {. h( z/*                                                                          */
( Z$ F9 I$ H5 H0 K; Z8 @/****************************************************************************/9 h6 f. A7 C$ O3 q
char txArray[] = "Tronlong UART2 Application......\n\r";# X: a& y2 L/ w
% G, U) u, o7 [% U& ~. @/ l% I
/****************************************************************************/
0 h, b9 u' b' k' o" A* T/*                                                                          */
$ {6 y4 S$ p7 [) R/*              函数声明                                                    */5 h% x8 P' H* Q* R
/*                                                                          */
, V8 R9 i2 t: R1 k( Y4 N/****************************************************************************/
* R$ h: N5 p+ A# u) g2 p# w" i+ h// 外设使能配置8 m" P' q+ R, h8 U$ g
void PSCInit(void);' l# g4 V1 w  r1 G( Y
- o# O: v, V9 T! c
// GPIO 管脚复用配置. `4 {0 f8 Q) p6 a1 A
void GPIOBankPinMuxSet();3 u# x$ }4 g5 c( \' b5 b% P
) p! K/ y0 |0 s6 z% N/ P2 h
// UART 初始化
  d9 H9 [8 F  ~5 L8 r& lvoid UARTInit(void);' i9 d, B, G( i1 O
// ARM 中断初始化
  ~; D  J: V  M5 G! h* kvoid InterruptInit(void);
! |" R# `+ N$ f& E// UART 中断初始化
2 e, S: F( C+ T  evoid UARTInterruptInit();; g. W4 U# \2 ]( o: j" n# _
// UART 中断服务函数" ~2 V" U$ S0 V% n4 S
void UARTIsr(void);0 J% U; i* C. m

9 j5 @: S  Z" v8 K6 T/****************************************************************************/
5 S+ v; v8 c" M$ d! H/*                                                                          */
" o& P0 |0 c& O- J3 S" W/*              主函数                                                      */
# `) O6 @% X8 z, w/*                                                                          */
: {, i' u5 A3 T8 ?/****************************************************************************/; B2 M+ L8 E3 u1 d0 p
int main(void)
! }/ `. _7 T  `8 z{( f2 [$ u, n! G/ g# E
        // 外设使能配置
4 Q8 M, g3 I# l6 k, O3 \        PSCInit();
9 N: |' T9 {# B  I. J, \       
/ l5 S+ {2 C3 ]; x7 Q3 Z        // GPIO 管脚复用配置: ?0 `# y/ [. p
        GPIOBankPinMuxSet();; e- B2 Z! ^- ?5 I

# i3 C+ ^4 z- c9 K6 T        // ARM 中断初始化
5 F2 }+ _9 r$ k+ Y6 a        InterruptInit();  b7 q. w" l$ |% J6 L+ J
+ w% _& c/ q: m
        // UART 初始化
' l) r8 R6 U/ h0 @4 I: a$ b        UARTInit();
! O! U* r4 o$ S; t4 s8 K& d5 [- k3 R1 y4 Y2 s
        // UART 中断初始化" ^% y# T' v6 K0 D+ k
        UARTInterruptInit();
5 [% y5 m/ Q2 P6 B# f
+ ?) U- g+ q4 x) }2 c        // 主循环( Y  s$ m& ?- F+ \
        for(;;); y7 m! F+ e4 [9 f! N4 g
        {+ ^& O' ~" {: S0 D
0 S: n  f, N, J7 c4 f7 o4 U: b
        }+ I2 ~4 ~$ m! c* s! ]
}$ L9 P! ^% v* Z# ^% E  N2 u

. u5 ^1 d5 g9 ?# C/ w9 _! n( q/****************************************************************************/
$ f& L. v$ x1 I! Y( a/ Z4 G5 D/*                                                                          */
9 F( u! O  C3 w( N/ D/*              PSC 初始化                                                  */; K2 a( W: Y( O" I6 U& r0 n
/*                                                                          */$ _9 L* |  f5 }
/****************************************************************************/, o( M3 y) ]5 a  p# A# I7 O% t3 D; H
void PSCInit(void)
! O; R9 e# A% l7 V# U{& B- x# G. ?$ Z4 z% {
        // 对相应外设模块的使能也可以在 BootLoader 中完成; m6 X7 x. O/ R7 Q* |
    // 使能 UART2 模块
% K7 F) I, t. U4 M& ~, c    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);, D3 S/ C2 A/ Z" {
}
' Y7 N1 M! L$ @+ l: F2 D% Z; i) s# v5 m/ c5 v( |
/****************************************************************************/! H3 S  N. d2 x& @3 C
/*                                                                          */
9 \& P0 x1 F3 \/*              GPIO 管脚复用配置                                           */' y: r! Q& @! Y
/*                                                                          */; I: L$ M4 |$ Z4 |
/****************************************************************************/
' }/ E  f, r( Y2 ~void GPIOBankPinMuxSet(void)
  f5 o! u/ p$ }* \. {/ s{6 `, f  m& w1 p( f9 s! [2 m
        // UART2 禁用流控
3 [' E2 K8 |1 i+ i) L        UARTPinMuxSetup(2, FALSE);& \6 c+ V0 K) B3 _
}
. V+ g* G; w) W3 B7 g& ~
8 O6 r8 z; f6 b5 X/****************************************************************************/
# [4 w; B, H6 u/*                                                                          */
/ ]1 ~; L# @# g& B3 d! `0 R. [1 p/ P/*              ARM 中断初始化                                              */4 K* j6 c& r7 z7 z2 |& x
/*                                                                          */9 u5 ~" I5 T4 j+ {/ V" M
/****************************************************************************/
9 v* i) C& q6 n1 M# Fvoid InterruptInit(void)
) I3 a$ H. i" _5 H7 k/ m+ y{2 r# a" m" k7 c+ E2 _  Q
    // 初始化 ARM 中断控制器2 n! s6 K- [: s) ]: e" ?1 f, K% \
    IntAINTCInit();
7 y) Y: c, @, N6 `4 X0 z
) [; k( v! g7 A- y# }# ~1 O& L% @* P    // 使能 IRQ(CPSR)
# f/ U4 q9 K% T; S    IntMasterIRQEnable();
9 Y# A1 B0 i* d8 M
+ ?' d5 |: U4 |9 _, @1 y    // 使能中断(AINTC GER)
$ W$ P" T6 e' h+ f% C& i, j    IntGlobalEnable();
* t$ P5 M3 s# _* W% S
! A5 l/ y+ m- @1 @7 A: N    // 使能中断(AINTC HIER)$ G" ^6 c' @: z$ t0 u0 x
    IntIRQEnable();
0 ?+ [% w7 r) t; K}
+ k( R7 C# Q- ^" D
+ v8 {+ T6 d! x9 o$ w/****************************************************************************/
% Y9 C% K1 }% z7 s  e/*                                                                          */
' N% F; o9 U3 f" E2 T4 u( T  M/*              UART 初始化                                                 */
1 ^5 M, @0 \) D! y/ Y2 j* N1 V1 U) c/*                                                                          */
2 h# N$ r, p5 {! ?/ Y/****************************************************************************/
4 b; x) k; l2 N; Z+ l6 M; N0 F' l' Evoid UARTInit(void)( ?0 D5 H8 a6 A
{! t) b# s' }3 B
        // 配置 UART2 参数# P: O4 y- Y1 V: w& i% Y0 {) d
        // 波特率 115200 数据位 8 停止位 1 无校验位
' W* X, U5 D7 K8 Y/ {    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,! h7 t% y* s! L, y7 W" ?4 \
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);' R$ I2 Q5 E( q7 j5 b/ }: r
        // 使能 UART2  ?7 m4 a4 ^" c* G8 z, O3 @% T
        UARTEnable(SOC_UART_2_REGS);! h( b8 K1 w4 B/ F

$ N" O* e/ n4 Y6 y, c/ d    // 使能接收 / 发送 FIFO
. [  T$ R- q! G8 V4 N2 Y' J    UARTFIFOEnable(SOC_UART_2_REGS);
3 l0 x4 ?$ P# d* X( z: N; L/ G5 t' _" S" A% p) B0 Q
    // 设置 FIFO 级别
$ n/ O, h. D& K0 L2 q    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
5 L& U7 A/ g+ @. {" V* k1 L6 v" c8 x}
/ f# w$ U/ C2 F
; |! J3 h7 l9 {, j* o/****************************************************************************/
; E4 Z6 U/ U! L0 p1 I/*                                                                          */1 ]  y7 U9 F& c/ ~% n9 f9 T* o, j
/*              UART 中断初始化                                             */, s9 Z9 E" C/ m" ]' Y
/*                                                                          */
0 l- V7 K8 Q/ P$ j6 y7 ]/****************************************************************************/
( b+ k! V  g3 H: z0 m. O8 ?! lvoid UARTInterruptInit(void)! K: K& J* H# ^" F& V
{+ `) d9 o$ M, `4 e
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
* x; L. @" Q! }  z8 M, A        IntChannelSet(SYS_INT_UARTINT2, 2);# L. y0 p7 |. D
        IntSystemEnable(SYS_INT_UARTINT2);
( `: V' b* {. ?3 Q1 A, Y2 [
/ e1 N* y( D5 W9 X! x        // 使能中断! s: M: d% z  r$ M; F! y& Q" i
        unsigned int intFlags = 0;; ~9 A; a9 Q/ n8 a, y: q" U5 i' R
    intFlags |= (UART_INT_LINE_STAT  |  \
! C3 ^. ^- M* u3 h' {                 UART_INT_TX_EMPTY |    \6 F* A0 L" T! d% n% Z) v2 f4 h# x
                 UART_INT_RXDATA_CTI);
7 Z, B2 ?1 I5 ?    UARTIntEnable(SOC_UART_2_REGS, intFlags);
# q0 i# @, d1 _$ p# Z}0 m* o& ~) Y$ {2 U
9 \# V$ O0 o3 p/ J# z5 j  i
/****************************************************************************/: y2 u4 v- b; n; j6 f$ \7 ^8 U
/*                                                                          */
3 v0 [* F- l5 W2 z) @) c9 t/*              UART 中断服务函数                                           */* L+ \8 C+ ^( S% P& m
/*                                                                          */
& b3 Q. b- M3 d# {) t( M/****************************************************************************/1 {; F6 z1 d8 G/ F. E3 ?
void UARTIsr()
& K# e1 P: z% b, n: B{2 [5 F  j! B( S/ ?% S. i
    static unsigned int length = sizeof(txArray);# ^0 o3 d6 b/ `: s
    static unsigned int count = 0;4 q* r$ O6 ?) s- ^+ |6 x0 J/ ~
    unsigned char rxData = 0;( e' g) ~: `- [+ w
    unsigned int int_id = 0;( m) p( ]' y. n9 I: l

) z" m4 J$ \( v$ l- F  s    // 确定中断源
4 ?) }! W% l2 e* i2 y$ o    int_id = UARTIntStatus(SOC_UART_2_REGS);
0 h5 q" d9 s5 z; j9 R/ q9 x9 D! C, ~9 g1 b/ ]( |
    // 清除 UART2 系统中断& C- M. ]( v& m
    IntSystemStatusClear(SYS_INT_UARTINT2);
6 O' f0 S6 j& ^7 {% m, w
* T, C) M" N5 T0 ~    // 发送中断
. j, U6 W# {9 s3 E4 e    if(UART_INTID_TX_EMPTY == int_id)
8 z6 }  n1 _0 D; v1 W/ o4 s    {
8 Q: I! Z" n( o6 z4 [. ]/ ]8 A# N        if(0 < length)
+ A8 h& \1 c4 j. \( s) Q0 d& i6 B" @        {0 ^0 t/ H0 _6 w: N) a* O4 S
            // 写一个字节到 THR
* S6 H2 T+ m6 {5 s            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
% d7 o) j2 j7 c" X+ _, y: q            length--;
4 r$ K# D: F* g' u) d- a5 q/ H0 a            count++;
, s4 z& j3 ]2 e- j3 Q2 w" P        }
' R7 r) d5 R# \        if(0 == length)# p' _6 j  q) X
        {% R; E/ P. J" f4 S" l
            // 禁用发送中断& m/ ^: i6 s, |' H) Q% l  a
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
& j4 ^) n2 e% `- u) {        }
! [0 }+ I, p( {     }
( m* x, Y5 y% b) E, g/ ^
4 |; p" z' S2 B- |8 D: W    // 接收中断
8 K( ~4 k$ |: ]+ k* e' L1 F    if(UART_INTID_RX_DATA == int_id)
6 F" ^/ P( j3 W    {
9 w9 ?. y0 \0 R6 J5 ]. t        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);) D/ i8 ]4 _+ R4 ]2 ]) y, t

- I% k4 \5 s8 E/ j8 ^# n* r! N( H        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
2 c4 ^' ]2 w6 N( S/ f4 \; c6 f6 X    }! F# A% k9 z2 B! d1 Q
4 T( I' z( A  x6 R. U
    // 接收错误
* v, l. E* O1 l( G    if(UART_INTID_RX_LINE_STAT == int_id)
6 t9 p/ Q) m( v# F) x    {: I$ v9 @1 J+ Y8 |( B+ U% Q' U% Q
        while(UARTRxErrorGet(SOC_UART_2_REGS))7 f& ^) g; Z. D8 j
        {
$ q! m; M+ s! X9 @: Q! e1 `7 I0 n            // 从 RBR 读一个字节
0 g+ J/ \8 J* l- R            UARTCharGetNonBlocking(SOC_UART_2_REGS);
! v* g: T8 t' ~        }
1 G  \# M7 @' B6 p) ?* t& R: F    }
. e1 h, a3 z( C( a& M      J0 |6 J. u7 O* Z  x- Z
    return;
+ d  K2 \- X: `; B- i}
" X( r2 g+ v5 x' j
回复 支持 反对

使用道具 举报

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
6 Y" U# q1 y/ o如果其它设备快速给你发送串口数据,你这边能正常通讯?

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-7 00:46 , Processed in 0.044489 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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