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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5588|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。+ P) r$ P" n# N: k% Y2 Z

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
0 Q+ u& E1 ~/ p
: q$ n  W- \* J$ x#include "TL138.h"                 // 创龙 TL138 开发板相关声明
4 l. b/ `5 S3 I1 u8 H* K7 S$ g
1 ^- l, k" A! g; K0 Z) s#include "hw_types.h"               // 宏命令
- y5 X) }4 T' D& c! F3 e! ~#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器1 m# P# f6 A/ e
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器0 g; ^' m# q0 C( e* H% o

. _- G  N4 W' m7 n! V4 N#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
, A! D  S5 E' U: @9 b8 |#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明4 e6 ]) s7 M8 u. Y8 @
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
2 P, \8 r' }- ?& y#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
0 \( ]# j1 t2 x5 |  H; O8 z( h- V8 ~# r& n/ c, D0 i  U
/****************************************************************************/8 |' ^! D% ~. q$ c
/*                                                                          */
. T/ u  U! ]" C; K/*              宏定义                                                      */6 m- i: [( r! V' p9 E
/*                                                                          */
2 S- m( R: P' c* p3 }; b/****************************************************************************/
4 I& R& u  `& {  d; N// 时钟. P* i8 ~. O! t8 L- M
#define SYSCLK_1_FREQ     (456000000)
9 \7 F! b& d9 q. }#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
6 q1 W& }3 ]3 ~7 ^. c: ^" Y8 D#define UART_2_FREQ       (SYSCLK_2_FREQ)
2 k& S) v2 y; q% y( ?# q( E7 a# ^: d) A3 Q8 b- J4 l
/****************************************************************************/0 g6 x5 p1 e, `& B
/*                                                                          */+ ?6 z0 `6 R# s# C
/*              全局变量                                                    */5 z  x6 p. \- I0 Z
/*                                                                          */
7 Y" p, u& D& y3 s; v/****************************************************************************// [( r; U& L* h, }: L* k! k5 T
char txArray[] = "Tronlong UART2 Application......\n\r";% `6 Y7 V! L; l5 M& ~5 J

4 A, I7 c- t1 w8 _/ ?; Z, b6 Q+ ]/****************************************************************************/
' a) l$ m4 r5 h. `8 H% w/*                                                                          */* n% U6 ], B% f
/*              函数声明                                                    */7 x6 s5 D& u2 h( p4 g
/*                                                                          */9 V! A& e( R3 B) `6 t# K" [# i
/****************************************************************************/6 S/ V7 D. B: w4 e! C' L( d; [$ j
// 外设使能配置: z* ~; _; \" ^3 W
void PSCInit(void);
0 z% o8 C. f, h- ]" _; T% C8 C6 [
// GPIO 管脚复用配置% n) K7 w1 V; u8 Y' y
void GPIOBankPinMuxSet();
/ w& J- T% ?3 \1 c
4 c9 ~4 |' Y+ ^5 L; t3 T% |2 A// UART 初始化
5 n' c6 C) {' o7 w: C0 x5 vvoid UARTInit(void);
' q( |+ m, f8 [3 D" W// ARM 中断初始化6 S0 y1 B9 h5 m& v
void InterruptInit(void);3 j0 _' p4 J% D, T
// UART 中断初始化& \5 w  k! B$ _& L: ~( b
void UARTInterruptInit();
/ m- l# [8 Q9 A! N// UART 中断服务函数
) n; T4 B; v. A; N* Bvoid UARTIsr(void);
/ K, L; H' o1 ]  q2 _
2 Q+ K  J( v. f4 H% v; W* q- m/****************************************************************************/3 E- m/ F# K4 R8 j: U6 q, U# b9 S# l
/*                                                                          */, f: V! M7 L0 i0 E9 z+ ]
/*              主函数                                                      */
" [- T1 h% V7 \' p3 f: l3 T/*                                                                          */# Q+ }' [8 j' g9 i
/****************************************************************************/
; ], i5 j" ^: {6 z! Jint main(void)4 A1 d3 W2 C- x9 V& v+ u
{
' v! \- b3 l* H6 |        // 外设使能配置' J( m1 }8 f% \: `! v, R3 O% T
        PSCInit();( r& a2 @" i' _" g$ D
       
' Y7 V- {* c$ V! s1 h* h        // GPIO 管脚复用配置" P( f5 {$ m8 u+ m+ h
        GPIOBankPinMuxSet();- P+ ?, z1 n/ u: l% H* ~' B/ F$ k- P7 O
4 u+ |1 F" H+ e' [6 w3 ?  Q) t
        // ARM 中断初始化- G. Q' Y2 P8 W' c2 L
        InterruptInit();8 {8 f5 }) ~* f) S& Z. g% \) y3 f+ `

4 Q' o1 F& m* s; f        // UART 初始化4 L2 a1 P9 Q9 ]" K
        UARTInit();5 e3 b' w# \- i5 ]) T7 ?

$ R$ K* U0 X) S2 [3 y7 o% m) d; i$ N        // UART 中断初始化! H  O1 J; e+ H% z7 h
        UARTInterruptInit();6 H$ p% t+ q; T6 |: f0 z  U" @
5 m' x8 e# p5 a( e3 S1 ]: M' u0 b
        // 主循环6 Z* s0 K' X6 z! q/ o
        for(;;)/ Z; C0 f# t- K: J
        {1 j1 O5 k7 d2 {3 k# T( Y

1 F+ w" |6 l% v( r2 a4 _2 P        }
. N9 j6 Q9 n4 _# A2 ~+ U# A# `}
* C/ }- y9 W* p# O, j  x$ I) w1 O2 ~6 C) a
/****************************************************************************/
6 B+ z7 Z8 j7 R) ~/*                                                                          *// j/ U$ A, f. t0 |) p
/*              PSC 初始化                                                  */, m5 z! P# `9 l1 r
/*                                                                          */7 p, s9 E8 T4 t
/****************************************************************************/  w$ u# i, L/ w9 B# d* W! W
void PSCInit(void)
/ O$ @5 P$ Q+ I$ Z" i{
' y) _% b* F$ a& e! A6 g* c        // 对相应外设模块的使能也可以在 BootLoader 中完成
% A6 h( H2 h8 ~( O# [' Z0 a    // 使能 UART2 模块4 B0 F* y, F# H2 L. t: W5 Z
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);6 E2 n+ D; h. v% I( E, j9 m& v
}
3 {% R! K! I2 `) J( i2 z- _7 c1 f0 B9 G' U8 n% H1 K4 R/ T" @
/****************************************************************************/
& U2 V: Y( R" E1 G. ]/*                                                                          */
! X6 I, I0 Y) F1 u3 ?6 I1 H( |7 U/*              GPIO 管脚复用配置                                           */* E4 a2 n& ?' d+ O
/*                                                                          */; w* h; g& @& o4 @, J1 h, e
/****************************************************************************/
' ]! C9 g( l; n2 X0 L+ m+ X2 L6 }6 Evoid GPIOBankPinMuxSet(void)/ r: }! J3 Q/ O3 G0 f
{
9 z1 C% X/ ^8 I: S        // UART2 禁用流控
" _& a$ I- E4 O5 ~  ^3 K9 y$ s        UARTPinMuxSetup(2, FALSE);
  b6 z& O' F  v, ], m+ M}
, r( H3 Z+ d/ e( Z) n& i4 t4 t3 l& @/ l/ Z, c# y6 `6 F( i0 o
/****************************************************************************/1 V4 k4 Y' D8 Y, c2 a% K
/*                                                                          */1 L+ k" t0 Y2 c' H5 W
/*              ARM 中断初始化                                              */
6 g. h8 p  X  R$ G, ^% O5 i/*                                                                          */6 r  i5 J) h1 U4 V0 D" Z' v; Q2 F
/****************************************************************************/
' X& [* }5 n5 E' D. s' \! v3 j* Cvoid InterruptInit(void)
; M. |0 R: ]/ M8 p+ r; o) a& n2 V{4 x8 k, P, ?& D  D1 P' u/ G: P
    // 初始化 ARM 中断控制器
; m: v+ r7 x5 k* f# ]    IntAINTCInit();. ~% T" Z! O" D3 [  M: D- a
* G( n6 N: R1 A2 V! P% Y
    // 使能 IRQ(CPSR)
6 Q$ ^% m2 K. e3 G- S    IntMasterIRQEnable();! R; ^1 {9 m1 V& O. ?

& S! s8 q+ M! V" S- [    // 使能中断(AINTC GER)6 j+ z' n! S" Z/ V- s
    IntGlobalEnable();
( {( V2 {& @4 o1 U+ O- J0 Z4 J/ a  U
    // 使能中断(AINTC HIER)8 o. d3 c( ?9 h/ f( W
    IntIRQEnable();
' ~8 W+ [. R9 F: _}- S4 |/ ?+ L' f; P; Y# u/ R4 m
9 m4 _5 l5 j2 P- d1 G4 {
/****************************************************************************/! }+ z$ X, X* k2 O: P
/*                                                                          */
5 ^" V' B+ R1 b0 j/*              UART 初始化                                                 */
0 m/ V9 e5 a- b2 o8 V/*                                                                          */. r' Z4 s) W$ U" g9 J
/****************************************************************************/" G: \3 W2 \1 M9 Z9 t+ i3 _3 p
void UARTInit(void)
1 P, K' A8 Q' q% B$ }' [{
" W% [  \4 j* t% Z$ p        // 配置 UART2 参数% t$ k8 ]9 E6 _* \- p+ ^
        // 波特率 115200 数据位 8 停止位 1 无校验位1 t/ D& T/ S6 E3 t1 Q! q
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,/ d4 t/ i/ `2 ^' K
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);6 |+ V+ i! Z% D3 r: w9 M- N
        // 使能 UART22 ~8 l/ l1 O$ E( c7 w: l+ L
        UARTEnable(SOC_UART_2_REGS);! y6 e/ r% l& Y- n  u: K
4 k6 j& ?/ c+ V- ?
    // 使能接收 / 发送 FIFO
! R5 o7 _0 ~  n% u7 G    UARTFIFOEnable(SOC_UART_2_REGS);6 @7 G0 b( I  N% m

$ ^) J: M3 U6 J3 |, {    // 设置 FIFO 级别$ Y( Y$ j1 k/ Y
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
( X7 O3 Q2 f) P}/ N/ [' E) E; W. |" `( X
- Y1 r! ?( d9 W: {2 X4 B& V
/****************************************************************************/' U; s9 Q6 n2 k+ _; Q/ m
/*                                                                          */
5 Q8 }- i) U) ~( U8 c/*              UART 中断初始化                                             */- x9 R- @+ X- m) m2 P: }
/*                                                                          *// |2 w% H, g* x# V& ^. ~
/****************************************************************************/( ]. J6 Q7 M* m6 c( ]: c8 k
void UARTInterruptInit(void)% v) T; b$ u8 U0 `% A
{5 s, ], }8 @8 [5 Z) A) p) s
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
7 u  s' w7 V& O- w, w' L# a% M        IntChannelSet(SYS_INT_UARTINT2, 2);
$ d" h: H: ]* r        IntSystemEnable(SYS_INT_UARTINT2);
, F* r# y4 V% Z7 |- v
0 f8 U- ]1 o" O# Z( `  z3 T! S1 y        // 使能中断
4 ?' P$ T# U$ d* H6 F/ j        unsigned int intFlags = 0;& ~' r3 g; o6 }- r/ ?
    intFlags |= (UART_INT_LINE_STAT  |  \# ?5 L$ M* ^3 s4 A
                 UART_INT_TX_EMPTY |    \
! F1 H( O$ n. C% m3 @+ p: d6 x                 UART_INT_RXDATA_CTI);* i( R$ @& E% ]  ]2 E
    UARTIntEnable(SOC_UART_2_REGS, intFlags);. Y' a. M) v# N7 R0 v) W& m
}
4 G, r$ i+ V; P5 n6 v7 R+ }8 v4 P  }3 U
/****************************************************************************/! O( Q' z& o$ X% }! I! u
/*                                                                          */) d  j6 C0 P( s6 J* o) Y% h
/*              UART 中断服务函数                                           */8 D2 N! i2 v0 x6 n8 M, o9 c3 G
/*                                                                          */9 p; k1 {+ f  U
/****************************************************************************/8 \, D, O. @+ z
void UARTIsr()
8 a, t$ ~0 A% o6 g; P{& Q; O2 p4 w' j7 v" U6 B. v2 |
    static unsigned int length = sizeof(txArray);% W, l' [; o0 g* Z- n+ @3 f; Z
    static unsigned int count = 0;* q/ o6 i( |/ E" |
    unsigned char rxData = 0;
$ s; V, E( N' A. r* a    unsigned int int_id = 0;- K( j3 o% l: Q1 J! u

) T- v0 s+ P; \    // 确定中断源# b0 ^2 v, ?* H; p' r3 f! W
    int_id = UARTIntStatus(SOC_UART_2_REGS);
! p& e* u" @+ U, `; X, ^0 R
! Q2 C. Y$ ]1 K% ~1 Z# h% ?! X    // 清除 UART2 系统中断
+ m! k, U4 p7 F- \) k/ B( I    IntSystemStatusClear(SYS_INT_UARTINT2);
9 G' {& A3 K/ v- e% G0 Q5 y+ u7 ?- U
    // 发送中断
/ l; Q# `8 ?  \$ D    if(UART_INTID_TX_EMPTY == int_id)9 U& J+ s8 s. r' @( }5 ]+ z$ G
    {9 }$ c* X& o1 s
        if(0 < length)6 ?; O% V( K# r7 c: P# n& V
        {; @- }2 L* a2 C. ^, C& a9 W
            // 写一个字节到 THR2 P4 B& C2 x3 t
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
. {2 t, M- @( c            length--;# Y1 u, x  `: V* ~# ]" ]! c
            count++;
4 B. ^: P& W* A3 y        }6 T5 {) q7 K5 w9 E' F  g6 x; H
        if(0 == length)
, ]6 u' N& r3 H' Q6 ?        {
6 S7 X0 _. X5 R! {            // 禁用发送中断
) C; k. m5 |9 r' ]/ @6 V6 Z" z) u8 [) e            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
% g. H/ Y/ v1 G# q# _# F        }$ T& a0 _; N( F, G9 s
     }
! O" e) F; h. z5 ^% A- ]8 h5 Q) y  v/ t
    // 接收中断3 d! ^* }2 g5 e: f- }; t) u$ C
    if(UART_INTID_RX_DATA == int_id)  y" i1 {+ j, r! x. H
    {
5 `/ u- J( B8 |" m        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
! `0 |5 a; t+ S1 V2 F/ j* U! d/ F6 C0 D( M# o, U, Y  L1 G' z5 p
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
7 r3 S6 p: K0 o/ M% n) L" u    }( h1 W/ N4 j; }
6 m( g8 Q, x- X4 m9 X# N& m
    // 接收错误, `7 J* h3 n& ], \
    if(UART_INTID_RX_LINE_STAT == int_id)
. i& q' B, l* ?- K) a    {
& ^) N( N! ~! ^) b        while(UARTRxErrorGet(SOC_UART_2_REGS))
$ d7 j4 \" V2 j' t8 X9 |        {
! G9 B5 t7 }- h            // 从 RBR 读一个字节
3 G; ?! s0 S- b' k            UARTCharGetNonBlocking(SOC_UART_2_REGS);
7 y6 q8 V3 ^$ X3 Q4 ?* f        }
4 T2 {8 G0 A! j9 e* w8 z    }- ~( X, H2 U; u% A  X& W3 @: L+ N
   
8 x1 |9 v1 e; D6 M& k7 W    return;. F* O. x5 I4 A2 i/ p& V- |2 t# N
}# ?. O7 Y) X3 y; q4 ^
回复 支持 反对

使用道具 举报

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& l  N( J- [* G5 H
如果其它设备快速给你发送串口数据,你这边能正常通讯?

$ b) v) m" o% @! y/ j7 ^谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 04:03 , Processed in 0.042065 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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