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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8025|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
/ Q  u3 O' x: M4 g8 a+ U& N

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。$ ]( h2 [3 m2 P3 H: {
9 I& j) S3 y: ~, O
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
) _7 ~/ O% w7 n! Q6 `% a) l+ x) `2 @  J2 P) U! J
#include "hw_types.h"               // 宏命令2 c4 w+ {4 }2 z$ u) ^8 @+ i
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
2 Z  {5 U1 m( z4 g, A  C* w. p7 [2 @#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
6 [* J1 E+ N; O- p4 F; b* a! p
6 x8 y  w1 X; D  j# B#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
' M% e3 a# o: G1 `. r#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
: d4 y" p" O% I* P#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明  q3 O3 A5 f$ W' {3 o) G9 \+ ]
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义- o3 O5 l& c  f5 [( w6 B

6 v* p4 h! A& `4 g/****************************************************************************/
8 O! f: [* H4 V/*                                                                          */
2 {, B7 A% v% y5 J, \" f: [- [/*              宏定义                                                      */  a8 T+ h. I- g- P* n5 O
/*                                                                          */
% Y0 P* W* b% B/****************************************************************************/; ]3 k" x: S  M2 g9 k
// 时钟- H: r8 O% e0 B! B  t
#define SYSCLK_1_FREQ     (456000000)' D- q4 B' K2 j$ N
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)7 F% Q$ X' X7 v* N( s2 U8 o
#define UART_2_FREQ       (SYSCLK_2_FREQ)
2 @) K& A( g5 L! B. B1 w4 C, i+ O" v8 W; T" c+ x  Q
/****************************************************************************/
7 E8 L; @, J8 Q. o2 i6 W7 f, {/*                                                                          */
0 V" S" z9 {+ k. I# `1 e7 r# Z/*              全局变量                                                    */
3 Y5 @* X2 k: M/*                                                                          */
8 u# N. \$ w3 X2 g: f/****************************************************************************/" E' s1 b; N- u" M* Z& N7 v
char txArray[] = "Tronlong UART2 Application......\n\r";
# s# P- J+ `2 i7 @3 |
5 ]4 C: T9 |& B2 q! H/****************************************************************************/' Y! Q  J% @# W2 W! r& f' S8 B
/*                                                                          */4 k* w3 v- o& G  U, e9 F; d4 ^4 S
/*              函数声明                                                    */* [5 a1 N9 R) k) |9 F1 i
/*                                                                          */% U3 ~8 q8 a" @8 _
/****************************************************************************/
0 v8 M# d7 w" g8 Y// 外设使能配置
. |  H2 i5 p& W) n! U+ P3 Tvoid PSCInit(void);) B- g' i6 H" f: _  N9 |! _

$ x1 p2 w/ c1 H$ p4 ^// GPIO 管脚复用配置% Q& p) M8 e/ O, V
void GPIOBankPinMuxSet();3 \- h9 ]+ @! `& x' q7 j: R" E  X

6 h2 E& j7 x7 W+ ~; f% ^5 m% h// UART 初始化/ D2 s, J0 @  z) g3 L% g$ P
void UARTInit(void);
4 s; M- ]3 v* i% Y$ }// ARM 中断初始化4 }, w' m0 a! Z/ Q5 m/ Z) ?
void InterruptInit(void);
& ]/ [: q  }5 h) F) Z; W% f// UART 中断初始化: H9 n2 {- `4 C
void UARTInterruptInit();
! l. b6 M3 V* [/ f/ J7 H' |/ A// UART 中断服务函数
$ N7 m: c5 ^1 G; |/ w( `5 l9 Qvoid UARTIsr(void);
2 M5 h; y+ p1 c$ D. q) S1 p4 K  p0 \. u& ?
/****************************************************************************/  a3 a+ g% Z) E" Y+ K$ k. A
/*                                                                          */% {( T; U  l! r3 f% A( M0 g
/*              主函数                                                      */
3 n8 T5 k; l5 J" _/*                                                                          */- u% Q/ G" n0 \  w; |; u5 s
/****************************************************************************/
0 a0 K6 A! L7 z  I" q  O6 ~int main(void)9 v- K5 P8 d  ~) B  Y7 w! I$ S
{8 I3 H- u5 ~/ [# W; V5 o
        // 外设使能配置4 j4 m# d4 I2 e8 Y: e7 q- ]3 A
        PSCInit();) K4 r  e: i* R8 n1 ]' K# V
       
# {/ `6 f  L6 n6 L* U8 k        // GPIO 管脚复用配置
( u/ z1 T$ o+ E9 q        GPIOBankPinMuxSet();
( P. {& R6 {* I3 h
4 d) O5 R6 ]0 u( ^        // ARM 中断初始化
( N, [, b1 o0 h5 m8 z        InterruptInit();: e" T1 C+ C2 p9 D. Q

8 M' _0 Z" A1 k, L+ f; F        // UART 初始化
# T0 w/ y& [8 M: J0 @! U3 ^        UARTInit();
6 C! m5 }  K+ W; h3 F, U3 I
, e- h2 {% A9 b) ]6 r2 Q3 S' g5 K        // UART 中断初始化( o" ?/ f" h; y- d
        UARTInterruptInit();
- y. r& A2 u8 f7 K6 C$ F
7 Y" b" d* X& e- c        // 主循环
7 c! k) S. f5 v4 {+ n        for(;;)
0 h1 \8 r8 W. |1 t+ O; v/ H8 M! ~) p        {
$ I# m! e* n) U' f1 A5 [& e( w5 ?% ]# M) i7 z; a
        }3 f$ Q* ?& L/ i) c5 w, ?, L
}
: [2 N% ~8 ], u/ T/ f! t6 u
  d, H; C2 L' ]# Z( g" B/****************************************************************************/
+ n0 f8 Y" Q) p( W2 T/*                                                                          */
$ b$ x2 X- u. V! `. ~/*              PSC 初始化                                                  */; ^! Q( v2 Z7 r
/*                                                                          */0 l9 N( N4 }( ^) @
/****************************************************************************/
% L" U; V6 J6 @  Nvoid PSCInit(void)2 w! E& [% \* C. C8 j. h
{; N0 _, ]2 _1 ~. o- z7 C2 e2 I5 l
        // 对相应外设模块的使能也可以在 BootLoader 中完成
: i8 @! ]2 r- L    // 使能 UART2 模块
# C0 e' e1 |9 @1 p+ Q8 n    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);# N4 y: G; S. Z9 c# _" I  X  |
}8 P: x7 r9 G2 T2 D6 U5 Q! G3 w

7 a8 ]% O# M1 c# h9 `9 m5 g/****************************************************************************/% ~* K2 U/ X: R  _9 m" `6 b: y: \6 l
/*                                                                          */
2 ?" d; p& O3 i$ ~5 l/*              GPIO 管脚复用配置                                           */6 ^) \4 ^) l% O! o
/*                                                                          */
6 ?& Z, ~1 P6 E6 C' H2 c/****************************************************************************/
- W9 v3 [( N6 V8 f: V# T- jvoid GPIOBankPinMuxSet(void)
( \/ ^! [2 \8 h5 m8 T" R{
$ M( E. ^, t8 |! r4 X        // UART2 禁用流控8 [) }. ^0 y" Y% ?! b8 U  v
        UARTPinMuxSetup(2, FALSE);
: ^. A  b# i4 r}
8 J7 [& ~0 d  s# F# w3 E* J  H0 c3 m7 q/ V; Q
/****************************************************************************/
6 E& \  h* l* ]+ I0 ^6 }, ^! S2 Y/*                                                                          */6 |$ d1 E% ~/ A
/*              ARM 中断初始化                                              */2 Y1 b. w4 b* [+ q
/*                                                                          */
. p& [1 Y# _, [1 c& ^/****************************************************************************/
# a5 o( P+ A4 J* s) j6 jvoid InterruptInit(void)
: h5 I% ]: R( M, z' ?8 _, W{$ x  C' F  H3 f, w2 K
    // 初始化 ARM 中断控制器
  M2 R* \! t4 O; x    IntAINTCInit();. P* G" O+ k1 K# e) Z; J

1 I, T/ q( _/ b' h& g: J    // 使能 IRQ(CPSR)
& d) A$ m; [) I, n    IntMasterIRQEnable();
3 d+ t0 T$ w# P6 y  q. o+ m2 ?; B7 x$ S- @. E9 G
    // 使能中断(AINTC GER)
1 i' t5 C8 S) U0 q7 j7 X    IntGlobalEnable();
. a+ `# n% ?0 d$ Q  z
+ }: C/ V7 R* ?1 M    // 使能中断(AINTC HIER)
+ B/ l' \' d$ V, L$ l    IntIRQEnable();0 \7 }4 C0 a; {4 z8 K* X+ S$ Y1 c
}
( S2 X: u! [. [% J/ F( q
; y7 J, d6 i* d% A/ l! @/****************************************************************************/% J6 f0 f$ o* \. q  d& r$ m2 a! a
/*                                                                          */: A3 `: Z8 `- R
/*              UART 初始化                                                 */; }  {9 I/ k* a5 X
/*                                                                          */, i7 s$ G2 G2 h* x
/****************************************************************************/
1 v2 n. w  o8 d% A! ^0 {$ [5 {void UARTInit(void); {% d0 y5 k! O3 p
{
$ a/ C8 t7 e* y/ {        // 配置 UART2 参数
1 b% K! n) L) z0 s- }5 q        // 波特率 115200 数据位 8 停止位 1 无校验位4 B, p1 R$ _" X* y/ n( ?( c
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
( i0 M: E7 K" ~6 o: E                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);# r/ z7 ^- a, R0 a) e! ~0 F! b
        // 使能 UART2
; ]4 g, D& c& A  ~& _        UARTEnable(SOC_UART_2_REGS);
# B0 o. w$ K3 A$ y6 S$ R$ H( {. R5 W* `) H$ ^- i- N' ]
    // 使能接收 / 发送 FIFO7 ]: o  _5 c8 k4 K/ P* a5 p5 j  h
    UARTFIFOEnable(SOC_UART_2_REGS);
& |9 L4 f" b4 g8 ]/ U" o
9 j' e$ Y6 t- ]1 f  _4 t    // 设置 FIFO 级别
, q5 K: d- W! ?# }/ u    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
( a5 U2 G& u$ `0 F& A! w}0 d- w$ h! C' r: U  c0 i: ~+ b
8 v- g( m" j# T" N- ^0 D: C- v1 {
/****************************************************************************/
7 \8 C$ }! M  \7 X7 Y4 Q, P  K/*                                                                          */2 Q0 D" I4 s+ M
/*              UART 中断初始化                                             */$ E# ~- L6 O, k& K3 x" @# H
/*                                                                          */
# M  \% c* w$ o3 T. w( }, x) h. P/****************************************************************************/
7 r6 z4 `  k7 Z4 [1 o! ~void UARTInterruptInit(void)
! P+ C2 \) `4 R1 B6 J& {, ^' M{
1 ~- D6 C/ [: C( u        IntRegister(SYS_INT_UARTINT2, UARTIsr);
- J) b( S1 x0 z9 U' ?1 j- ?        IntChannelSet(SYS_INT_UARTINT2, 2);
6 T* o, N, w7 x; {( a6 L        IntSystemEnable(SYS_INT_UARTINT2);. T9 y; ~1 H+ j2 X9 x" Q. [3 V

9 ?9 c/ N, _+ ]% M, s        // 使能中断7 q/ {- `2 @  U* S" `, a1 [
        unsigned int intFlags = 0;# j3 _! {& y0 E6 k* C
    intFlags |= (UART_INT_LINE_STAT  |  \5 t2 Y5 c- M8 Q# p1 b- b
                 UART_INT_TX_EMPTY |    \
$ a. q1 }, g; q& V: U7 L* _9 t  {                 UART_INT_RXDATA_CTI);; k' h5 ~! u! n4 |
    UARTIntEnable(SOC_UART_2_REGS, intFlags);  e3 c1 ^$ G0 A9 t: V$ `3 V  Q
}% j) U, b6 j- p, W
) i! ]# J  v3 W/ e/ Y
/****************************************************************************/
* m( u$ h, u- }7 k  y- a, x3 E/*                                                                          */  z1 b4 a  c; N. \- A2 b: R1 H
/*              UART 中断服务函数                                           */- F: Z: n9 `! R7 |" H* P# ~9 @/ o$ I
/*                                                                          */
3 I8 C( X5 G. X; f) o: |8 t8 t/****************************************************************************/
, g" n1 y2 Q, B0 Nvoid UARTIsr()6 w, V6 N9 f, v7 s) i* V" A
{
) Z. A! x& x0 ]" d    static unsigned int length = sizeof(txArray);  W6 K1 }; U  V& n) s/ ?
    static unsigned int count = 0;- R" \2 z9 P1 {7 O' v) X
    unsigned char rxData = 0;  n- B' x  {. t$ o6 R1 H
    unsigned int int_id = 0;$ o3 r* v! |" W) g1 b6 G

; `3 ]9 w* Q  [. A2 Z    // 确定中断源
4 d( G2 o9 n0 J0 A- V6 x4 l; M1 n    int_id = UARTIntStatus(SOC_UART_2_REGS);$ F3 W9 Z+ f8 z: h7 @& b( {  ^/ k& j
, L/ ]0 E3 m* Q
    // 清除 UART2 系统中断$ A) U7 U5 Z- {/ Q- ^9 f
    IntSystemStatusClear(SYS_INT_UARTINT2);$ s; }7 v  e3 u
, H+ E( X0 q: R
    // 发送中断7 {4 y4 m1 r5 B& y! T" u/ A
    if(UART_INTID_TX_EMPTY == int_id)
' A% u  [3 V! E( @% _1 T: Y( u    {
  v+ ?) L* p6 D# L! c3 R        if(0 < length)
# v' C$ g% V4 e5 N        {
- G, R# J% W2 t            // 写一个字节到 THR0 O* _& D0 y" u: q0 b6 K4 a
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
6 F& J9 Y/ {. e; y            length--;
7 `4 n6 G" `1 h- F            count++;9 L# t* l1 z9 @7 }" P. v6 k' R) X/ [
        }
! d9 E9 i9 z- d. ^/ K        if(0 == length)
+ m/ N& Z/ g# \" g, S3 r2 v* Y! j        {
. n! P# S" J1 e0 B/ K2 M$ o  ?: m            // 禁用发送中断+ e9 n0 N5 F+ @; C3 B7 b
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);+ Z9 ?! I3 ^( e2 R- Z6 t1 F
        }
/ F4 r/ [3 X* X8 a     }
+ F- \% \( A# j9 g8 j5 i% N+ p  g; V5 n% m4 D! o
    // 接收中断% m$ S2 u# w' _9 P5 w# T
    if(UART_INTID_RX_DATA == int_id)
2 T) d$ V' C$ }7 \. \* v; h/ v: X, ~    {8 j' v9 L. c0 X$ l1 P. w# Y/ t
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);* ?9 N5 c  B: F7 }" r

4 F5 Q, J# U. w$ l        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
5 I9 A) _1 F5 N3 D, D0 \  @; \  X    }. b, t2 n) j3 f
# a, s- F9 I# s( p* Y7 @
    // 接收错误
( x. e5 E1 K" J% e    if(UART_INTID_RX_LINE_STAT == int_id)
0 h( j, o6 y6 z& o; _7 Y    {
( G" S4 E9 r2 i4 M" }        while(UARTRxErrorGet(SOC_UART_2_REGS))
" Q7 M" B. `% _; _        {" ?4 z9 u# z7 ~* v3 ^* H
            // 从 RBR 读一个字节, i; v8 Y0 ?, Z9 V2 _. g. ^
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
& y/ A% A) F) P) l        }
& O; B" R. o. j, s2 Z- }! h    }: k: o# }' o4 y4 `" P# n3 p9 J& M
   
6 I1 M8 U/ q/ @# ?& n& @    return;
1 g# V& A7 q5 A) I$ ?5 s3 l; l5 h}% D1 k1 m0 p, P$ r$ s
回复 支持 反对

使用道具 举报

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
% k: _$ M, A2 C$ J& q7 i$ J如果其它设备快速给你发送串口数据,你这边能正常通讯?
$ p. a# n; q( Z' I; z: `7 V
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-30 22:20 , Processed in 0.048183 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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