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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7350|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。. i  }( d, z5 c, `" S2 F+ j

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
+ R  T& w# r; l0 m/ Y7 k# [( g  Z& E  `! K! [- C0 P- t
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
) p. n, d6 s/ W. N
, J+ p  Q' a1 m- w6 u#include "hw_types.h"               // 宏命令
/ n& R1 g6 ~9 h#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
, B& W: @# O# r0 |$ ]- j! e/ ^#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器! m: V6 M+ C# H& R

+ c% r% W, A8 W1 X, {#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
2 b! f: [6 M5 d  {. Z#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明0 j! v& y$ k: D$ r/ z3 @5 R0 o; W4 f
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
, v" m5 m' U. n4 C! I#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
( I2 A# F9 Z( L. l- {% C' p8 g. _# X6 \! e, I" ~! F  E
/****************************************************************************/
" I: Y' K3 e7 P6 R2 O# C/*                                                                          */! _( r+ l  g0 Q1 m7 h8 U" P
/*              宏定义                                                      */
$ v0 C5 R$ E: ^( J# {: g# Z/*                                                                          */7 E" t& _, y! t+ ^. T5 ?* _
/****************************************************************************/8 s! y: n6 A) x
// 时钟- L4 e, _! @. Y$ H* M. L
#define SYSCLK_1_FREQ     (456000000)
0 d  O/ i' N* |9 O+ L/ r0 C8 ?#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
2 k8 O0 T; }) D3 j$ S#define UART_2_FREQ       (SYSCLK_2_FREQ)8 t2 Q$ R5 \$ @6 l! b) m
* f1 J, p2 f% G; s
/****************************************************************************/2 g7 w9 g0 c6 u) O
/*                                                                          */+ K7 w9 \0 Q) W# c. k4 \
/*              全局变量                                                    */
0 U# {7 ?# q1 Y0 ~/*                                                                          */1 w' s7 ~) V2 K2 T2 G$ E& b, a4 X: u
/****************************************************************************/4 V4 o3 ^0 |' j- Z
char txArray[] = "Tronlong UART2 Application......\n\r";
; {* |. ^- P6 T" f, X$ e/ o
: K# z# ]7 o2 C. f) k/****************************************************************************/
8 s$ j# f  `( X4 _' a/*                                                                          */
2 B* a! U2 L) e! P/*              函数声明                                                    */# v' j8 e3 O9 s2 {
/*                                                                          */
- e$ j- C1 w. i1 @" |! T9 Z/****************************************************************************/
0 X0 d/ K4 o* c5 b9 z  ~% @6 F, U// 外设使能配置
! }/ ?) _3 Z4 e. Xvoid PSCInit(void);
4 s; V' B# J, r* }$ ^9 b% g0 {/ m& ^" X% D0 {9 Q
// GPIO 管脚复用配置
( i  N/ m  I! R% ~void GPIOBankPinMuxSet();
- z2 i- @& b  K0 _7 I9 T) G/ H' z
2 @% ?) `6 \, `$ k, f. ^# ^# t// UART 初始化
$ f. w6 P; L9 W; W5 K5 uvoid UARTInit(void);
0 M. L7 `9 R4 F4 v// ARM 中断初始化
' v1 j5 D& T: [1 zvoid InterruptInit(void);
- o& N) D1 Z  G! K* ]" E// UART 中断初始化* J& c* N5 I: B
void UARTInterruptInit();( ^8 v7 ~2 \2 r1 v
// UART 中断服务函数7 F+ D4 y$ h% Z. b
void UARTIsr(void);* X# l# r3 @6 i# S* V

( {# K0 J. d( s% T4 v6 @3 N/****************************************************************************/! e: ]5 j5 t5 a" Q9 q2 I9 b
/*                                                                          */0 A8 q+ S0 f. Q7 F& c
/*              主函数                                                      */
! X1 j, {3 P5 r8 ~- B8 \/*                                                                          */
) m+ I( ?0 `' N3 Z# d/****************************************************************************/+ D, y6 d& V4 _+ b
int main(void)
, V. \6 a6 b% V$ [{
1 g. f' Z1 w$ q3 O! S7 w0 |        // 外设使能配置) V2 @2 r5 J- U$ A
        PSCInit();
# Q# ?5 b) z; U( _, K* b# O       
" B0 G! b4 h4 @& P1 {        // GPIO 管脚复用配置
; ], ^) b6 h9 V( b        GPIOBankPinMuxSet();
* b0 J9 L# f$ S
! R% E2 F4 v' R# H& k        // ARM 中断初始化
; D9 O# L# v5 K: x, P! n        InterruptInit();( A0 x. f- ^. U1 {

6 {( z7 G5 I  B% E# F7 K        // UART 初始化
% I# I: l. O% f- e' Y6 ]        UARTInit();3 p( ^% f& n8 e0 u. v1 d

/ G) Z% I- {% `8 B) M4 l        // UART 中断初始化
  F! X- F) ~) N9 T        UARTInterruptInit();
1 l. l6 i& {/ f+ n" m% z# F, c# r
3 V3 I9 i: B# ?' p3 I/ s2 M! y0 U6 O2 H        // 主循环  K' T  D* k% G9 \2 @
        for(;;)
5 G, N4 `) p3 k3 k' u( g        {
% J' S7 X% q* q4 |# N5 D6 E' ^5 z9 Q
        }
0 r% k+ e0 c; Y, b* ?: h' `}' W& G# d, C! r8 t- F

6 Y% C0 s: m) O) D/****************************************************************************/
+ ]5 c9 N4 \" g- ]' R/ L# d5 A/*                                                                          */, G# a! x$ `. ~2 |% ~6 h
/*              PSC 初始化                                                  */
" S9 E0 t9 K+ x/*                                                                          */
/ d0 R) E) D2 }3 t; N  \* D6 W/****************************************************************************/
9 x6 d0 a: ?" n( y' h% V) Tvoid PSCInit(void)6 |8 [& a4 w% C( x/ {1 \! G
{, G% i5 R. U! @* G6 [; V; a
        // 对相应外设模块的使能也可以在 BootLoader 中完成/ G+ N3 y9 ~+ M" H! y
    // 使能 UART2 模块$ D, y% E2 H) y
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);3 F) e# U5 X) f
}
  u; k6 K# }0 H+ _6 q2 e2 V/ f# T0 y) C6 e
/****************************************************************************/
" t5 ?; V! K7 h% y5 I/*                                                                          */3 P/ r4 @: m! J- G
/*              GPIO 管脚复用配置                                           */: e: J; D- Z  x& A! B. v
/*                                                                          */2 I  N7 Y+ k& F6 Y6 _
/****************************************************************************/7 G  q8 o6 c$ U4 u$ R; |
void GPIOBankPinMuxSet(void)3 ~" r3 J4 m- F4 V7 {0 \1 o
{
  Z3 l5 r8 [8 B3 h2 W$ C# X        // UART2 禁用流控
4 o. C8 r$ `. Q+ G# w+ K/ H        UARTPinMuxSetup(2, FALSE);
6 W" g5 G) F4 G: m) O0 T! A}
7 S" F, }) O' a0 d/ A& |
9 Y1 o( H" }3 D2 R0 b6 b/****************************************************************************/
5 Z, `) u: a; W) m6 d$ F/*                                                                          */; v; G/ t- h9 d0 E9 u
/*              ARM 中断初始化                                              */8 u& F4 ~# f& L0 X+ s$ b
/*                                                                          */
' ?2 A' q5 X( B/ l4 `9 H/ p" K) I/****************************************************************************/' `. s0 y3 Q. y3 X" Y! m' y
void InterruptInit(void)6 U. ~( K7 m8 w/ l1 d+ y( V
{
7 y5 ?" h7 @' p4 j, [4 {. p+ q9 ]3 x% t    // 初始化 ARM 中断控制器; V  V* c* s9 t
    IntAINTCInit();
. [6 A6 a5 O1 {* k4 U1 w2 f" j+ c& {  C( a; A* f" V
    // 使能 IRQ(CPSR)0 R7 u/ k+ N- t/ a4 N+ }* l
    IntMasterIRQEnable();* m3 W+ @2 [0 l
) P. i0 n) b: B9 c4 `7 |. V
    // 使能中断(AINTC GER)7 @  V! h, ]6 ~8 S8 Z2 v/ j4 r
    IntGlobalEnable();
; B+ l& R* n2 R3 V, T; r. ~" _) J1 h
    // 使能中断(AINTC HIER)  i: L# m) v  m, {* W# @
    IntIRQEnable();& x& f/ h) U- ^, g# z" L. l
}' U) O- P# E  J9 c1 Q- P

: b! Q; x; c* d" ^/****************************************************************************/
2 @" F% I( k2 @/*                                                                          */. ?* X. X( _) l" n8 y8 z' [/ m
/*              UART 初始化                                                 */% X6 ]& |1 P6 \
/*                                                                          */
: ]) J; c( l  ~4 p# Q3 @: Z9 G/****************************************************************************/
4 m, x+ {; p& r9 Z/ P4 xvoid UARTInit(void)
2 }4 @$ W! b! K/ V* K% A9 g5 O{
; }% @) l. p! p        // 配置 UART2 参数
2 d5 b: z. y. g        // 波特率 115200 数据位 8 停止位 1 无校验位
" n+ Z/ Z8 r, V; J' V' a    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
( h7 J% N- v' n# O/ N                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
* Q) }% O# G/ K% t7 c3 ?' c% d        // 使能 UART2
  F5 k  M. L0 o' c$ C        UARTEnable(SOC_UART_2_REGS);
* x1 F5 a0 Y% K! ?1 B( f
3 O2 i- N1 V4 d' w- r    // 使能接收 / 发送 FIFO  h6 y$ q( n5 e% ^' a. b
    UARTFIFOEnable(SOC_UART_2_REGS);4 O& @: L3 n0 @! O3 x2 a
9 P$ I  r. R! S2 }! b* n+ N
    // 设置 FIFO 级别
* h/ n9 f6 C8 Y& i% S9 y4 x( O' _    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
6 w/ s- e0 o# t}) n6 P8 Z' ^" Y

: J# C. z4 r, l! |- `7 l3 Z/****************************************************************************/
' _' p: @  u- l/*                                                                          */" y. A, f) {4 W* y, y9 W$ C
/*              UART 中断初始化                                             */
, k! s, D/ V5 k9 e7 A; Z& N/*                                                                          */
% E- ^9 U. q5 n8 ~& G6 D: a/****************************************************************************/1 V3 z: r* U6 u0 W  C! F2 q
void UARTInterruptInit(void)' J" b6 w1 H- G5 G& B2 C& |. \2 R9 e
{) M! {$ V! G" ]1 ^' r5 `% N
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
# n6 Q0 }: O/ X) ~        IntChannelSet(SYS_INT_UARTINT2, 2);# p- S9 ~$ n" y( m, i8 [- W
        IntSystemEnable(SYS_INT_UARTINT2);
8 ~' q! i1 r% _( ]( c2 n  w1 U$ W2 F3 r$ C
        // 使能中断% o* T. q; J% s# M
        unsigned int intFlags = 0;
+ p4 O5 N8 m0 r( o    intFlags |= (UART_INT_LINE_STAT  |  \7 y) `: n$ c+ D  E
                 UART_INT_TX_EMPTY |    \
0 a+ b# x6 ~: W- B- h- z3 W                 UART_INT_RXDATA_CTI);
2 U. q+ ~& e9 n& S    UARTIntEnable(SOC_UART_2_REGS, intFlags);
- Q* E+ ~% o# U4 |}/ Q6 m- R  C* D8 r
" O7 g! Y) T  o% ^0 U2 i8 b
/****************************************************************************/6 ]) G% t" W# w/ E! g
/*                                                                          */5 j& i: [  {" O
/*              UART 中断服务函数                                           */
- \% I" s  ^9 Y/*                                                                          */
; q  Q1 S1 I. a' j4 X4 Z/****************************************************************************/4 |) Y; v3 x8 V" c! Y0 i
void UARTIsr()
  z( b' F& }/ s/ G, c$ a2 s{
# \$ B# P' {/ d6 W" E4 r    static unsigned int length = sizeof(txArray);
9 h* n  Q! u1 M+ l) w6 f    static unsigned int count = 0;9 ^. `" }4 J' M9 }
    unsigned char rxData = 0;; m1 ?* A3 O3 D& R  v' z8 y/ ?' o8 l
    unsigned int int_id = 0;( n3 q4 I0 C1 p( Z  O& ~( H; N8 Q! v/ n

6 S1 A9 r; m" \. S% H3 H' T0 T% [4 S    // 确定中断源9 ]+ r$ S" K" F  S* N
    int_id = UARTIntStatus(SOC_UART_2_REGS);
( t, a3 A1 n. R1 T
/ V" t1 R  |$ [    // 清除 UART2 系统中断
' E) u$ h" B0 M4 f$ p3 ]1 z# Y    IntSystemStatusClear(SYS_INT_UARTINT2);: H& T( r3 |) P- t
) [$ f7 z3 f/ T: |
    // 发送中断3 f1 n0 ~" o3 `: d! ?$ V. f8 m# Z" @/ M
    if(UART_INTID_TX_EMPTY == int_id)) }  q9 o$ g' r% x0 z
    {6 ?; @3 r, }) N0 G
        if(0 < length)* `6 i* `" ~; `1 M7 W$ Y' K
        {
9 R( c& C  F+ u* l! b            // 写一个字节到 THR
+ C0 J3 c4 r, F; t            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
$ @# J* u1 z' `, i! x            length--;
6 v) y: S0 |4 d            count++;
6 A3 g) P0 Q+ h        }
' i4 n' s7 I0 z! Y' `# z2 q7 U        if(0 == length)
) r8 k# }1 |& V        {7 g, P+ H. |8 z
            // 禁用发送中断
8 n) {7 d( f9 |$ K# o3 x            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
: S( V- }6 k+ v5 m8 O7 @$ `        }
( K1 ]# r% C6 C     }
% E5 H, ~& u) y% V6 d6 d. Q! t' x" Z( Y. y# ]# U
    // 接收中断
* b: I* |& x, P% _    if(UART_INTID_RX_DATA == int_id)1 c0 g& X$ w2 A6 m3 k
    {
9 e% z* n  k  U1 b, Z% V        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);' ~. m1 R. s. o* q( h  E7 e
  g/ V/ U! h1 ~  v: B
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);& t* a) q" X- E2 B6 Z
    }  F  Q. F$ X9 V& [1 \3 S
. I  M  J. ]4 _& ^5 t* p
    // 接收错误
3 p6 U' R' K/ E, T7 M6 c7 O1 y( h  H    if(UART_INTID_RX_LINE_STAT == int_id)
9 }, l0 ^7 r& M) Q9 x; p$ h    {$ n4 h& ?3 R/ ^1 T8 [' h
        while(UARTRxErrorGet(SOC_UART_2_REGS))
: O0 r( m. H# X# G3 b) ^        {
, I6 ^( d- l0 o9 l4 s. M( |            // 从 RBR 读一个字节
$ ~6 ]6 n+ L; D  L6 M- V* a            UARTCharGetNonBlocking(SOC_UART_2_REGS);
! ^7 U" L7 m4 S$ t8 p        }
* j6 x& Q& N$ m$ `' `" K* D    }
. Y9 k! E& ]( R5 U* X, T" I# L8 Q    # c) X# y5 r0 u, ]# g' a7 o
    return;
8 P/ P8 B2 Z  z  J* r" U}$ U7 a2 [9 M: z) 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% K, Y! p3 H% o  t. V9 j2 f- d
如果其它设备快速给你发送串口数据,你这边能正常通讯?

1 D$ P% `' f' p3 M0 p  p6 K谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 09:27 , Processed in 0.043633 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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