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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7799|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
" @3 h" p1 f' [4 m; S8 a7 r

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
% Y$ _, L& K) g% I. V3 _! ?8 E8 @- R: I
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
/ r  Y$ q4 _" w% x. y2 o- m/ m7 [7 Y/ k& Y2 \
#include "hw_types.h"               // 宏命令
9 F2 _/ w) x% [( U7 C3 Y& s$ C#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器1 |& z! u3 A5 v# c
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
2 U0 r7 M! P8 x$ y/ p& O) y: Q' q4 s8 z1 \$ t
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
& g2 x8 o" t9 |% g! }, p' D#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
1 {+ K" H) L& k  A8 ^, [3 q- W#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
0 [$ q4 Q" L% o+ U' G#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
; ?1 k% H5 u& v7 ]: m& P5 B0 U+ x5 s
/****************************************************************************/
" n- O  H" ~& s2 l% M" F( g/*                                                                          */$ I3 @; ~" y+ [- A
/*              宏定义                                                      */
* }8 T- {) G4 L; E; |/*                                                                          */) `" n5 w+ v' O: k# X* t
/****************************************************************************/
" x; d8 A" V% K. h$ S- g) }// 时钟' X+ e7 O( [- h3 y  V- N
#define SYSCLK_1_FREQ     (456000000)* b: Q- D8 p" M9 \3 L/ u
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
. x: t% G' \- x! x# P7 m  W#define UART_2_FREQ       (SYSCLK_2_FREQ)
& _( i2 R9 g( z/ h' F  i$ E& c+ Q0 ?7 W: c
/****************************************************************************/
3 G5 @- s8 m, B3 q/*                                                                          */; J* Y" r! Z: ~# h1 X6 P
/*              全局变量                                                    */
  N) f. a! X3 H  F/*                                                                          */3 J$ ?; B) z; x2 A  z$ i: u% t/ Y
/****************************************************************************/* S2 z! Z7 a% t1 V
char txArray[] = "Tronlong UART2 Application......\n\r";
9 y6 A' X- ]; a0 z7 `" l- N# _$ @# v- T% z  c
/****************************************************************************/
' j8 c5 J( s; {& C. F. s! {% p8 e# J/*                                                                          */
; u( g$ C7 ~9 t) h6 o. x# _1 a/*              函数声明                                                    */
4 |7 b  G$ x4 |/*                                                                          */
5 y+ s4 p+ U! B/****************************************************************************/
/ n7 Q1 T# r. H& j* J. D) I// 外设使能配置
% p) U* g/ A3 F+ z- [- Xvoid PSCInit(void);
) V' ?0 ?, K/ `# Y- q+ ~  s% R: M5 c/ B5 I
// GPIO 管脚复用配置+ g+ _- [0 I2 b: A$ ]' h# a
void GPIOBankPinMuxSet();- F" n9 |3 {' q2 X. e

, J2 o+ }! v6 k2 M* D0 ^; z// UART 初始化2 I1 F2 @) q0 _. W! M
void UARTInit(void);; I0 g2 Q8 l& s
// ARM 中断初始化
  R$ ]( Y; M  xvoid InterruptInit(void);1 P5 @4 a# ]# [+ Q# v: D
// UART 中断初始化
- n+ G! B3 t2 i7 ~void UARTInterruptInit();
) w) R% C! P" ~% F: D7 g// UART 中断服务函数: {3 [2 R& s/ h
void UARTIsr(void);
/ @: F% v) S8 z6 q0 T. T! z2 s, m3 r* n8 {6 V
/****************************************************************************/
. t; y3 l" [9 V& T& I) A- q) M/*                                                                          */  j5 t2 Q" i( f  d5 [9 [2 r
/*              主函数                                                      */
% i  x! }1 [& p2 m5 n& T! U/*                                                                          */' n$ w0 G4 N( l+ G
/****************************************************************************/0 N$ ?- S6 g% e- j, _- j+ @# R
int main(void)  h) f, R2 O9 ?" w
{
/ |- [+ i+ h+ P# L: h- s, Y        // 外设使能配置
. m6 m: `, P7 Q        PSCInit();
. F8 {' v! Z  i2 l5 U        ( n/ F$ V7 d, F4 X
        // GPIO 管脚复用配置. j8 Y' f/ E0 X  g
        GPIOBankPinMuxSet();
7 {9 t' f5 t7 a* ]$ A% ~3 u& e# H4 x2 W/ T4 z+ }
        // ARM 中断初始化
, X" J+ U+ ~7 W9 ?/ \        InterruptInit();
7 h' q# ]7 Z$ m0 H( I7 V
6 i$ [. i1 D# R% v. q+ S8 q* l        // UART 初始化* P8 r' j+ C7 t. c$ |+ Z6 c* E
        UARTInit();
/ T! n* X- I* y
2 x+ N* T% p8 A& t$ I4 `9 O3 L        // UART 中断初始化
: N  q" a, g& c' \) B        UARTInterruptInit();
$ F7 M7 w$ b$ f& r$ P8 I+ P+ D  ?4 d) `1 x2 i
        // 主循环
# C2 g8 n' K8 w; h$ |& a- [        for(;;)( U6 T) X$ @. [1 I6 s; u0 k
        {+ U. y, U; w" D) @1 T5 w
0 O5 d: v# \  Z. W) y
        }- V& W! t0 x6 E" D7 G- ^; A
}
2 w. W8 T1 t" ~  f
7 Z' ~. J2 N% Y: d* e/****************************************************************************/+ X) i# {# f5 b: ^
/*                                                                          */
' I+ C8 j3 F( K% Q! \( i0 j/*              PSC 初始化                                                  */
3 X: F" @2 `+ d9 \/*                                                                          */
& U8 e$ c9 e. a9 `$ a0 i' S8 o6 i/****************************************************************************/, q) H& K# w5 J- \2 T. a
void PSCInit(void)
; d! D; @5 N' @7 S! H{
( d+ D( K! J$ \1 u. {1 J        // 对相应外设模块的使能也可以在 BootLoader 中完成1 L% u1 L7 W$ L& @5 l  H* l
    // 使能 UART2 模块
0 r$ P+ L; }+ Y$ I    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);  ?7 ?6 [4 u& E! o& _
}8 z, R* L8 r% G( Y: T2 ^
6 M% ?% o+ r- s* t5 P5 f( E7 {& [
/****************************************************************************/
3 p( S+ @/ |) y. s/*                                                                          */
, }/ i! X7 {) X( s( ]8 x/*              GPIO 管脚复用配置                                           */
* L2 x% W- P# [7 V/*                                                                          */' [  Q( `7 x0 h7 B4 K) [+ i+ R$ f
/****************************************************************************/! x- C1 h0 m: a$ s4 e$ w
void GPIOBankPinMuxSet(void)% M. }, O+ k6 O; E
{& @5 I3 G& ^3 W3 g9 q
        // UART2 禁用流控
& l( Q# T6 M5 C- x! L# A        UARTPinMuxSetup(2, FALSE);
2 t- s/ i, e( \4 S}
$ @9 Y- N' q8 D* S5 j0 P* K
  N  p- o4 E4 O, ^2 h/****************************************************************************/
4 `9 S+ M. D/ Z6 [1 E& D/*                                                                          */
& Z. N' _' K# ^' R/*              ARM 中断初始化                                              */
- j3 ~$ W2 M  f" L/*                                                                          */( S; @- t* f  I0 a
/****************************************************************************/5 q3 r  c9 ?% r3 R% a- T7 @7 V
void InterruptInit(void); X. G( u6 ~% D: U
{
# m( K# p' Q% H! j: ^2 y    // 初始化 ARM 中断控制器
+ y, H$ O8 H8 h2 {: P4 B$ R  s    IntAINTCInit();; k. F5 j9 D0 n6 L4 @: X/ q1 V
" N) C  I* a+ G) T
    // 使能 IRQ(CPSR)
+ i' V7 N* n7 Q; D4 N1 V; w    IntMasterIRQEnable();
0 B/ V7 L7 z( V/ d+ r1 \* U* c1 g% {0 y* G1 B& v8 k' U
    // 使能中断(AINTC GER)
9 F$ T8 o/ A# H5 }& T4 K    IntGlobalEnable();3 T: W. o7 J# W# x* V

# _0 E. U) _- z2 O- c/ T    // 使能中断(AINTC HIER)
+ m% d; w2 a5 h9 W' y5 R. }    IntIRQEnable();% b& A9 w- x, Y) ^  h7 ^/ R
}
4 ?6 |- ]6 t2 c8 M9 y1 R
2 X1 R0 o; s2 U; x/****************************************************************************/# `+ M7 q! i% e6 k. c$ f
/*                                                                          */9 n: f& q7 @8 Z/ x, t
/*              UART 初始化                                                 */. Y( k4 ~0 L! X' R7 K
/*                                                                          */
( v+ l8 i+ E+ |  |! }2 \1 a/****************************************************************************/
! o9 ^' d* I1 d7 Rvoid UARTInit(void)
( X, n/ C: b$ a; |; x' o3 G" u! ]{& {# }! q1 E% t& y/ t) s( q$ D. i
        // 配置 UART2 参数
$ y' R! a1 h( b7 Z' V$ W! ^  i2 q6 E        // 波特率 115200 数据位 8 停止位 1 无校验位: Q2 e( D! k% Y) Q2 p, u: Q
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
- |* B' M  p+ A# H                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);/ Z. s* w" \- |
        // 使能 UART2
) W/ X; K0 g( \' l3 y& Y        UARTEnable(SOC_UART_2_REGS);! m( l% C* E4 z9 n) Q% @

, f5 q" F8 q' t+ F; v. \    // 使能接收 / 发送 FIFO  a6 u: d" k( }
    UARTFIFOEnable(SOC_UART_2_REGS);- h" l/ W; i% c% q$ ?- c: T0 p

' H  ?% V3 j; s" h( L  J    // 设置 FIFO 级别
4 u+ J% t7 l" o+ a* Q) S0 G7 Y2 V9 K    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
4 V% q1 y( S( ?! W! Q}
! W+ E. Y& b* t& d0 g' ?4 o6 m+ @1 J; s7 h, x
/****************************************************************************/, p: v' q* R- H5 U6 c/ u9 F
/*                                                                          */
4 P8 V* \0 `2 M4 X  n: }) q; J. M/*              UART 中断初始化                                             */
! H% y+ C) Z3 }1 Z7 f  K/*                                                                          */
0 O) c  d" _/ o6 o/ ?. i/****************************************************************************/$ x8 V& i: s( {
void UARTInterruptInit(void)/ o2 {0 n% {" }1 D% m5 D% R
{  j$ @) g, R: E9 ?1 s( \' D- f
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
2 j: y5 `, D( M; X; x        IntChannelSet(SYS_INT_UARTINT2, 2);3 Y, W+ L, V0 Z. B+ }
        IntSystemEnable(SYS_INT_UARTINT2);# F; W5 [# |/ L* d& v; |1 o
4 k. f& C+ E. Q, u$ S/ A5 d0 x& i
        // 使能中断
/ h8 ^4 q' k: @8 R5 o        unsigned int intFlags = 0;
  K7 G% M; R  ~" [' v    intFlags |= (UART_INT_LINE_STAT  |  \" f8 O7 A. {3 ?/ ?% {
                 UART_INT_TX_EMPTY |    \
9 U  K) a4 m4 P" U6 c* `4 Y                 UART_INT_RXDATA_CTI);
4 J' T1 y1 g% E" n8 [4 o3 W; p    UARTIntEnable(SOC_UART_2_REGS, intFlags);
  c3 `! ?! ~3 R- b}
4 V" L& j# {4 B" t2 h; B. i0 A$ H8 K5 {9 F5 I( W
/****************************************************************************/
9 ~" }1 a0 ~4 a3 Z  h% w/*                                                                          */7 k9 z. J6 E) |! m0 [3 [
/*              UART 中断服务函数                                           */
9 l  ~/ a3 w" Z1 `$ D/*                                                                          */! s2 ?) `, b1 Y8 z
/****************************************************************************/0 T4 {$ W8 h$ @8 r
void UARTIsr()1 Q8 a0 k! \  E) N" v7 Q- t4 `
{
% H( M# Z5 {0 e8 M* {  j. A! E    static unsigned int length = sizeof(txArray);
) P% M0 R+ n; `! T    static unsigned int count = 0;
+ L1 B& O9 c4 s    unsigned char rxData = 0;9 ]: ?1 Z/ [- a5 x2 A
    unsigned int int_id = 0;
) l  u  j3 P- A6 J% ~
) ]6 J% H1 m+ ^    // 确定中断源6 b+ O9 D: d$ d" T$ l4 M" y" [
    int_id = UARTIntStatus(SOC_UART_2_REGS);
' h. B! ?0 B0 Y6 O( F) w. c- Y
. p2 U; p  R2 `    // 清除 UART2 系统中断- b6 r+ p; m3 v6 @, \
    IntSystemStatusClear(SYS_INT_UARTINT2);
) N& M4 Y' ^' E. I- D: ^3 N- `& @6 f. e: Z9 s
    // 发送中断
. f- H: \# k3 q& r. ]& ~    if(UART_INTID_TX_EMPTY == int_id)8 b, G/ s& C6 q! m: r# G5 Y& V
    {
& u* q* z! i0 p$ E; x        if(0 < length)
) P7 L4 g* @4 ~1 [/ R" ~        {
/ D# m  x, {3 L+ q' k/ o            // 写一个字节到 THR: n) |* w8 L; Z* K/ i$ a, N$ x
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);- r" h5 c( {& {- S6 I4 L
            length--;2 n5 v  f: ^' ?& K" p4 Z
            count++;
2 V" w/ E: P  ]8 ]2 B" G, x        }3 g: ^$ B, c7 \$ N. r
        if(0 == length)* I! {7 V, L% D2 K8 V" W0 o
        {
8 J0 D5 N6 G. G0 ^# I            // 禁用发送中断
8 M$ g9 L' W1 o/ q            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);4 _+ A5 e) q! U
        }
- I0 Q+ u% ^5 h  s4 ?8 Q7 C! x3 |4 v     }
! w2 b/ s( q; ?4 r( S1 J+ o' s( v( F; H/ p
    // 接收中断
* e" e4 X; ^# _  x4 ?" _9 h    if(UART_INTID_RX_DATA == int_id)
5 z" U  }4 X- W4 o% a* y0 O    {2 q+ j, {4 X0 r
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
# m% D5 r  P. E8 I; }$ {0 c, i% T5 c4 [! I' m/ `, O1 i# p
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
) v$ O% j7 S  @6 ?, y    }& ~. W0 j6 w0 ?# a0 X' E+ M, M

1 X2 e9 V) q4 m( f" Q. [2 u    // 接收错误: g) b" S6 I/ m; f0 {1 k( g
    if(UART_INTID_RX_LINE_STAT == int_id)7 Q1 K. }. z+ R, u$ v# l; F% @" G
    {' x1 \2 a  r/ \& d
        while(UARTRxErrorGet(SOC_UART_2_REGS))# v+ d1 k4 W2 K/ x
        {, e7 `1 |" v( k; I% Z
            // 从 RBR 读一个字节2 ~" t1 L/ ], ]2 o) q2 Y5 W
            UARTCharGetNonBlocking(SOC_UART_2_REGS);; |6 `! S3 [3 i- y) M4 x6 u/ \4 C
        }
- m0 K5 S" y: r# F) o    }
& t1 q% j% Q/ [5 E" C6 N8 w; U   
1 p/ \2 C1 W: m3 x7 q: m9 G& p    return;
6 d$ k: e) e& l/ Y) ?' d}7 N; y$ y6 N! o2 l5 d% Y+ O3 }3 Y% 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:253 t' t; T, C2 W1 \
如果其它设备快速给你发送串口数据,你这边能正常通讯?
1 w0 ?4 s( _6 w; P4 s
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-17 18:53 , Processed in 0.042478 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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