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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7805|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。* t' }* [" {3 _+ p( h, @3 T+ ^1 j

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

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

1 ~/ @; q- Z* U: `0 {#include "TL138.h"                 // 创龙 TL138 开发板相关声明, ]& D2 Y0 s$ v" l; N0 a# ?  O$ D

& m1 B2 w" Y1 @+ C. H  R( l#include "hw_types.h"               // 宏命令
! ]. O7 J: p3 |0 P, N" r) ^3 r#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器1 U3 A  I+ I# c' w8 a
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器9 X4 e* A9 e  V1 e

4 K. r0 E, v& M7 v( O. x% ^#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
, x- v3 Z( _# ^( E#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
  x4 q& `/ o' q5 Y+ ]#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
- J' U2 d& u" Y- ~. s% c( e#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
5 O5 N4 W0 y* C. e& s
8 L* M+ k% N4 S/****************************************************************************/
8 L- i3 U/ c3 S: r& W/*                                                                          */, P1 c) ?  n0 b5 T9 V" a; V- r) a/ c
/*              宏定义                                                      */& h4 |, g4 }- s$ Q  a$ r
/*                                                                          */
  Y! d. q& j3 f7 y/****************************************************************************/7 ^: J! `4 H4 s3 a
// 时钟5 ?1 V! \/ R8 Z" F' r7 s9 y5 _
#define SYSCLK_1_FREQ     (456000000)
# t' L% ^2 Z: T7 a#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)% `2 I, w( G, f' X3 }
#define UART_2_FREQ       (SYSCLK_2_FREQ)2 _3 _2 o" n2 O1 Q
! s: G7 ?8 ]0 }1 |) r/ x; X
/****************************************************************************/# k4 ~. O( A6 b
/*                                                                          */, H4 B5 s6 R7 k6 {! W
/*              全局变量                                                    */
: q( r2 ^! Z3 S2 V! Y/*                                                                          */9 J- Q( `, q9 h, M( @
/****************************************************************************/
& a: ^9 w3 S, Achar txArray[] = "Tronlong UART2 Application......\n\r";5 p2 C' N$ d) O6 [, R" b
' Q: q3 E2 R% F3 ]/ s! w6 Z$ X+ b
/****************************************************************************/9 o6 v2 {5 L3 f( F8 }6 v
/*                                                                          */
6 ~6 ^2 ^8 q9 ?4 A0 }) _6 |/*              函数声明                                                    */4 J% D3 }* L( @% f' R$ q6 q) c
/*                                                                          */
8 S; C& M/ I! ]% d7 `/****************************************************************************/2 g& n, O& `- n, x' N$ i  U* K; l
// 外设使能配置
9 }. E: P" r' t, a2 ~3 @void PSCInit(void);
8 M8 v5 m7 u* [  {" W! V" t( k2 @! }8 V+ J0 l7 X
// GPIO 管脚复用配置2 L0 \7 [/ P/ o& _! z2 m/ J$ w& Q5 u/ X
void GPIOBankPinMuxSet();
7 J1 u& t4 T6 B% s5 A3 h5 ?
, x! q$ x- Y3 C, e" h  L( E// UART 初始化
' f# V! Y5 `  Y# q5 Ovoid UARTInit(void);
0 I9 X4 F# q8 c, [: ^: v// ARM 中断初始化
8 e+ s- O6 u2 fvoid InterruptInit(void);' l* p0 i+ y( E  ]% [
// UART 中断初始化
3 N1 [  C* q9 ]6 }# Rvoid UARTInterruptInit();1 e0 k' P* W$ u$ n
// UART 中断服务函数
% z" ^0 }+ E" P/ N" O, Nvoid UARTIsr(void);% H9 c$ _& s& D; [8 P# |# k9 i6 K
% G# \8 s/ \+ M  z6 X
/****************************************************************************/& z& |/ s, \, R# K7 o
/*                                                                          */2 L4 L5 M8 J3 v) [
/*              主函数                                                      */
  Z) {+ K& G* w; S; S! u# z' R1 S: x/*                                                                          */; l3 H; H% Q. c( B3 Q
/****************************************************************************/8 {: s& G9 o- g
int main(void)
4 Z+ P8 b0 h% M5 H) T{
# }7 }* v3 n' E. ?- C& B) r        // 外设使能配置) Q0 E2 M2 s3 M! I7 Q7 f6 w6 V
        PSCInit();
+ T: x& U3 ^, v* |* I5 P% N. h' O9 I       
' z( S+ z" s: P0 x5 ~        // GPIO 管脚复用配置5 c' ?- x/ N2 t/ Y1 `9 ]0 {7 j# B* _4 o
        GPIOBankPinMuxSet();
" S2 H. G: t; `* O/ h
6 n# E( e+ J/ ^  P& E        // ARM 中断初始化7 t1 W/ |& x* j+ s3 U# D2 t
        InterruptInit();1 o6 c) K% U9 i  M
  T6 ]. c7 B* }- K* L" ~7 K
        // UART 初始化
1 y, c7 e  d  R1 r; J        UARTInit();
- W% J, Z6 w0 t0 I/ w& l  t
, b( P+ y& V9 X$ F        // UART 中断初始化5 T. C1 y: N1 V& E5 f6 H
        UARTInterruptInit();
, n0 E. i  e- F: y4 E
2 B( ]5 a9 L+ b! ?& F        // 主循环/ z2 w% [/ p) t0 S7 q
        for(;;)/ z0 N1 `/ w/ G+ z: V  P
        {
9 ~! Q  H( ~" M4 j* Z  ]
7 B5 }- G+ Y2 s/ o8 [5 R        }' a1 U! O' e. L8 A5 w3 S' l. l
}* {# r5 K5 n6 W/ T; Z- u+ \9 O

4 P& y4 i% }' G/ }- N/****************************************************************************/3 E+ \' ~" l7 j  n
/*                                                                          */
0 m$ y4 `1 m) l! G2 a/*              PSC 初始化                                                  */( F" d: r: R( g7 c$ I
/*                                                                          */9 O, J% ]/ ?' }4 X( D3 D4 h
/****************************************************************************/# w( Z1 K3 V- B$ j" O8 G
void PSCInit(void)4 s7 f% S" x* j. ?0 x6 m5 F
{
) T0 X1 K" T) s4 x        // 对相应外设模块的使能也可以在 BootLoader 中完成
! [- }# D" ]. v! s6 _    // 使能 UART2 模块
, _8 k2 w* I3 d$ `    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);+ J3 d3 R& h! c2 {/ I
}
, S5 q3 v7 M3 q/ j1 d
5 c# b( v* B( z, y. N/****************************************************************************/
7 w9 B. I8 ~! \3 d/*                                                                          */" {" \4 @! N; d3 S: M4 ?
/*              GPIO 管脚复用配置                                           */8 x$ x7 }' y8 G/ X
/*                                                                          */1 I: N3 I, F- P& Z6 V4 n* ]
/****************************************************************************/$ [8 ]. x$ Y+ T  {
void GPIOBankPinMuxSet(void)
6 |8 [/ q4 w: x; ]9 v" O{/ o6 {( ]( @: r. G% m7 s$ c+ Z
        // UART2 禁用流控
) K8 B# c* ^8 \6 ^' J* e3 j0 J        UARTPinMuxSetup(2, FALSE);
8 i1 @5 Z6 N" S  Y1 m! _8 a}
" {/ v% n: G7 ?* ^) D7 N( E  S+ S# \, v; R+ d" ?8 l- Z/ @
/****************************************************************************/  g5 b* J4 A7 J+ j+ ]" l
/*                                                                          */4 @5 |" K1 n7 g
/*              ARM 中断初始化                                              */2 R6 Q3 \* @0 n6 ]9 \
/*                                                                          */
3 b  t$ @3 ~$ b  U* T" V: e/****************************************************************************/
' Z9 u+ `2 l  E- N# {void InterruptInit(void)
, r: B/ E" |% c. T2 o1 O2 r$ c{  D0 t2 g2 R5 d' [8 e1 q# n; X; p- g
    // 初始化 ARM 中断控制器8 @6 ~* v5 i/ o) j/ ]* ?. R
    IntAINTCInit();5 D* A# O/ O9 ^0 E: O6 }- z3 f

+ z8 b  E* f3 o/ t    // 使能 IRQ(CPSR)1 J3 L+ ^& X1 c! ^4 n5 U  a/ Q
    IntMasterIRQEnable();
9 ~/ L& M8 \0 A. t9 e6 ]! {  Y( U/ o; X
    // 使能中断(AINTC GER)& e+ j1 o" `# x5 E
    IntGlobalEnable();2 F3 W  u( b$ j2 _1 q3 ]
4 c0 g* k* z  R
    // 使能中断(AINTC HIER)% r3 ^) J7 h  A% v
    IntIRQEnable();
) }" ^6 }# N1 ~9 Q}
: m( }  j) a# V9 K3 `5 w: n, f  F- m3 g
/****************************************************************************/
# U7 k5 y7 F1 i, S/*                                                                          */
6 a$ B- h" v7 Q' M$ B: [( ?' ]/*              UART 初始化                                                 */
2 W" g1 Y3 K* u2 ~) N+ c7 g2 T: E/*                                                                          */+ X$ `6 l& u1 L! x  J3 ]
/****************************************************************************/% N. q, n5 b: k6 d6 N; B
void UARTInit(void)
, V3 r( }" I# }( f+ p- W( v/ b* P{
. ?% G3 r. K6 r  M$ E  O% `        // 配置 UART2 参数
/ w& f  b% D6 d- F$ }7 m1 Y        // 波特率 115200 数据位 8 停止位 1 无校验位
7 S6 @2 C, v  o: j1 C+ p3 ~# w    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,# n6 x% o& N+ O( Y6 V& W5 G% j
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
: h& F/ a# ~/ V. H        // 使能 UART24 u/ r$ [; U# n
        UARTEnable(SOC_UART_2_REGS);
+ P' q) Y! }, T" t
. E& A; u2 M7 r- ]8 O# E* b    // 使能接收 / 发送 FIFO% h7 m! [' |* y# L* E
    UARTFIFOEnable(SOC_UART_2_REGS);4 U4 s# f7 F5 z& g6 X5 d

+ Y$ H8 ~  n* E( K/ z# s6 O    // 设置 FIFO 级别
& B! v; X( I6 ?8 |+ X; H    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);% X. K' u4 t, e1 a( E) E
}
- Z: u8 H! z/ l( P( e3 }
$ k7 v3 @' P# J$ Z2 B; Q, n4 Y/****************************************************************************/
# ~7 ?" }% `0 b) @, V8 Y/*                                                                          */
2 [' O2 U( B) k7 W- T/*              UART 中断初始化                                             */
5 E, q) r3 A5 P, u  D/*                                                                          */5 E4 z1 j7 ^, `. o4 }6 y# g
/****************************************************************************/; j  N6 v: M! ~2 h8 s0 I
void UARTInterruptInit(void)
$ |( m2 A5 w9 z7 A, u{2 J8 `0 [* |7 h. Q( Z% [
        IntRegister(SYS_INT_UARTINT2, UARTIsr);9 C  G; p/ F9 x$ j: ~% I3 ^: U, C
        IntChannelSet(SYS_INT_UARTINT2, 2);
' i* j3 f  T& A3 B  X  H. x3 X6 I        IntSystemEnable(SYS_INT_UARTINT2);% O7 A( T7 ^5 S2 w  R
4 G: j4 b% J! B
        // 使能中断
, j* z4 G* r6 Y7 a        unsigned int intFlags = 0;
% S0 P8 q. O9 @& x6 K* U4 u    intFlags |= (UART_INT_LINE_STAT  |  \
2 _1 n/ d+ ^9 p                 UART_INT_TX_EMPTY |    \
6 d. z5 m) z  b8 Q/ M0 S                 UART_INT_RXDATA_CTI);3 O/ W5 M# n1 A. l
    UARTIntEnable(SOC_UART_2_REGS, intFlags);  E/ t" M& C/ X# ^2 U
}
$ H8 w4 V9 Q# J4 ?& |( m1 c+ D/ S. W6 K! F5 ]: e
/****************************************************************************/* O% j2 M$ h% [- d2 g# h
/*                                                                          */
7 E* Q5 E, E2 D4 Z& b" k# K/*              UART 中断服务函数                                           */4 P1 H0 E8 [3 l9 \2 G! O& T5 _% S
/*                                                                          */
' ~$ h, U) [  a0 ~% A1 u, a) |/****************************************************************************/
# q! m7 C! ~" y" f+ D% z6 Hvoid UARTIsr(), I+ ]* f7 D$ q
{
, V. B+ |5 b9 u    static unsigned int length = sizeof(txArray);
( ?, L* S* }, h2 P, {* U7 S0 y    static unsigned int count = 0;
) [4 X" Q: L3 P- }. N    unsigned char rxData = 0;
+ d* W+ R  W" p0 k8 }' H    unsigned int int_id = 0;
% a1 E$ a8 G2 ?; p7 K# S% t& {0 v+ |& r& b
    // 确定中断源: ?  A3 F) r/ `" ]* A6 d  j
    int_id = UARTIntStatus(SOC_UART_2_REGS);5 b$ j# z' _$ w. Q# S# q  F+ ~/ ?
$ [& L/ {: B6 C9 C- D$ m4 A5 m1 I
    // 清除 UART2 系统中断7 _5 s9 W' ^2 |+ Y
    IntSystemStatusClear(SYS_INT_UARTINT2);
+ ^. S7 |. j- a4 d$ z; `
2 Q! s5 _  G7 N4 W& c; ~& O5 t    // 发送中断) R+ f4 @* v: l2 G
    if(UART_INTID_TX_EMPTY == int_id)
  O9 V, p2 @" l1 q    {
0 M2 z( n5 o% e- h9 v        if(0 < length)  S/ l5 L3 [% s. n2 G
        {
% r1 J0 e5 W0 b( k0 A            // 写一个字节到 THR* \% T" V2 \1 x; b
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
1 ~. r0 K! p; b  O1 y& x- J8 F) w            length--;* f. }- R' a, y6 ~2 D* U/ B
            count++;
. h. @$ t, h% ]: S        }
2 r+ v1 K+ S, O0 X6 |; C. Q        if(0 == length)
4 I% f1 R+ C+ n. F+ a        {2 o+ K& ~  J7 S6 z
            // 禁用发送中断
/ Z/ L5 p" s. s: t; ?/ D            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
6 Z8 ]6 G8 K9 u; ~& d0 [2 p" z9 T2 m        }
5 U, J8 v, e  `( I1 T' B     }) n5 @& [( R" L$ K
$ I- z9 @1 D+ `3 O! {
    // 接收中断5 Y$ Z8 `& Q0 o7 I& D+ X5 D9 F- ~
    if(UART_INTID_RX_DATA == int_id)* B( X# S, O, M
    {
1 a' \9 C# J: M( S        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
( d1 d" X7 U9 ?8 w# r- W4 n) M5 c* r
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);/ w6 q) l9 {4 m: L( M
    }
/ M- n# K- N$ n1 K3 y, t2 L& e' G9 v1 U" Z0 R! Q
    // 接收错误4 n4 d& X8 A- S9 ]) N/ ^. |, O
    if(UART_INTID_RX_LINE_STAT == int_id)
0 _: j: U- r# c* O5 w1 H. w    {
* C! p8 u. v2 K        while(UARTRxErrorGet(SOC_UART_2_REGS)). H; o& E$ o2 Y# C
        {
5 Q' Q% G! m: c# I+ i            // 从 RBR 读一个字节
2 ~5 R3 ]0 q& I0 Y            UARTCharGetNonBlocking(SOC_UART_2_REGS);
# C0 C0 V- B7 d9 W+ N' M        }5 y% [9 M7 o# P+ X% C
    }! a2 Z  t! e/ H9 ?4 h
   
1 Y/ Y! f0 i4 ^+ G7 d    return;7 f; p3 C0 k! }- ~% }
}* z, H; w. Y+ @, e
回复 支持 反对

使用道具 举报

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
4 ?  C& e$ h' I" S. H如果其它设备快速给你发送串口数据,你这边能正常通讯?
* G5 N8 V2 c+ o. @6 @( Z
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-18 02:07 , Processed in 0.110672 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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