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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7384|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
7 D* T* H  `1 W, |& F0 L

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。% D# M1 l$ |2 b# e4 r
+ V- M/ M* M8 o% s% v+ W; w
#include "TL138.h"                 // 创龙 TL138 开发板相关声明5 j, r4 v3 E* c) R9 z6 t% \
6 |4 p/ j7 H, b' L
#include "hw_types.h"               // 宏命令
$ R/ H3 ]+ C) D  E#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器% e! ~! ~3 \- K; @* A( O5 f
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器0 r0 |% J1 `' f0 i" \, f* ~, [* Z
7 x* D+ I' i, _* j9 Z9 h& ]
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明( w( X: ^( f/ t* ~; U! y# A
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
3 E" H: B6 Z6 v#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
2 ?0 p/ A  t  `$ p#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义/ S7 X* O" p( |) J3 O- x: `6 i
1 m, h0 C2 F+ R% t. V
/****************************************************************************/, q6 J; f5 o  u2 @* j' f
/*                                                                          */6 H+ S' [( k6 ]
/*              宏定义                                                      */
% g0 b* v* q' b+ S" X/*                                                                          */
& ~6 n- H( M6 g6 j$ ~) P" i  A" f5 ~/****************************************************************************/
& X" n+ f' |3 p1 l3 r! Y// 时钟
% W9 z; L; v' Z" D+ h7 g#define SYSCLK_1_FREQ     (456000000)
& u3 z- }" N4 \; `8 l9 }#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)! `% H0 h9 K/ W  A, c( p! G
#define UART_2_FREQ       (SYSCLK_2_FREQ)0 n- t4 e7 C3 h- L  J

' y  e  ~+ E% e8 [+ Z; x# J/****************************************************************************/( {/ \7 I( [- Z" l! V
/*                                                                          */( u  w+ @6 J- y( |
/*              全局变量                                                    */- w2 Y/ ^# f! K7 F& x. q; I
/*                                                                          */8 j; e5 x  K7 P- J
/****************************************************************************/
' P( z! r5 d5 R1 }char txArray[] = "Tronlong UART2 Application......\n\r";# y- N5 k# a* N( O, i' q
9 k* V6 [$ O0 x* m& j: T
/****************************************************************************/
+ ~9 i) E- b7 L' S7 m7 H; N/*                                                                          */5 Q  S$ q0 }/ H; Y2 ?. x& e
/*              函数声明                                                    */
! e# r+ W9 z- `  j/*                                                                          */% ~, `- l' n0 u' P8 Q. R
/****************************************************************************/: ~* S) l$ I8 y4 ?3 {7 X) I3 Z
// 外设使能配置
+ B5 h+ v$ T' z; o8 n' Qvoid PSCInit(void);' w0 w# `6 z' ^, F

3 n8 L4 V2 v) K0 t9 G& T// GPIO 管脚复用配置
, m. s8 `9 H) uvoid GPIOBankPinMuxSet();7 ]( B  c' r3 ]- ~5 y
. L1 t: e7 o9 J6 Q6 X% D- I, T
// UART 初始化
4 g6 N! b. F0 Y+ q4 ]7 }void UARTInit(void);
; [, O4 v8 j+ S( I8 Q// ARM 中断初始化) L$ u  H9 j) t0 S
void InterruptInit(void);% O5 t3 C! t0 G5 w9 w" R$ G; N
// UART 中断初始化
/ J2 h* \4 _5 l. kvoid UARTInterruptInit();1 a5 _: O/ a7 W# S3 O) L1 H
// UART 中断服务函数" L7 r+ t* J) w! k4 D
void UARTIsr(void);% S2 w1 k- k# ~
% l3 j5 e1 h5 ]! y7 [
/****************************************************************************/
+ M+ G; x" F$ L7 e2 O6 y8 q6 w3 f9 C5 ]/*                                                                          */
, D* v; B$ {) }) A) t+ p% y/*              主函数                                                      */% H* ~3 D9 [# i  D; H9 @
/*                                                                          */
; z0 Q7 L* h- C0 [- e/****************************************************************************/
, G7 n, g- {+ n! c/ A  G- P0 dint main(void)' h7 \+ L/ Z( Q4 i# S! \" w: z
{
: ?- f; p/ Q; B* d' y  t/ I        // 外设使能配置; P" ^$ c3 L) K1 M5 K5 J2 ]
        PSCInit();
- \% C* g8 B4 c! z: o        ! P) r- ~+ M) W" J* I7 P9 D) Y
        // GPIO 管脚复用配置
2 R: S  t" A% S' }" A& V        GPIOBankPinMuxSet();% Q9 S5 w. |& F. k2 D3 U
3 h& V3 F, g( k$ P1 X5 @  x& _
        // ARM 中断初始化
2 Z  w  B# ?9 G0 \. V        InterruptInit();4 x. Z* I% Q; O
4 u! g, z! ~8 V& i3 I0 B- @
        // UART 初始化2 b$ v" A6 E2 R4 T2 k
        UARTInit();
$ a8 u7 W% y2 m5 A6 w& k8 T5 d+ L+ i' m  M' a
        // UART 中断初始化8 A; u5 q0 e9 v4 }
        UARTInterruptInit();) M- }- l) y. i$ C

- l& q1 ]# i5 H3 m% ]5 f4 d* n1 v, X; w        // 主循环7 R+ S) _$ a3 l7 t1 l. u
        for(;;)
0 H4 G. e% _1 t  X- n' x: O/ t5 d        {
8 h1 K" p% U( Y6 _+ X1 f5 o: n& t
0 k8 L1 a/ d6 E# z1 _8 v: q        }
8 B; d3 O! `* w5 ?: j}* x  M0 Y) h: y! M+ h

+ C# G) N8 Y7 y1 Z" u) K1 G. G& p/****************************************************************************/1 F" {& m/ ]8 l* P3 Y' C* f
/*                                                                          */
' H' c, [/ \0 X9 e3 I/*              PSC 初始化                                                  */. ?! o2 B& W1 k" u
/*                                                                          */3 X8 K; A2 Q- D
/****************************************************************************/. p4 @: t' ]- i2 S, T8 k. p
void PSCInit(void)3 R  V7 }, a+ F0 X" Z7 x
{
+ E% D  r: k, ^+ Z* c& F        // 对相应外设模块的使能也可以在 BootLoader 中完成
% K  |/ q( j& p    // 使能 UART2 模块
8 K0 l% t' i" {) I8 b    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);; u, e% i- O2 M2 x9 }
}  G6 N+ N  e3 V9 r2 [9 d5 d! c

2 p$ u1 p# m* f/****************************************************************************/
0 R4 l+ U$ f( ^0 s/*                                                                          */
; J( `! `. y/ @5 T! P/*              GPIO 管脚复用配置                                           */
/ c1 r  Q# s1 q5 G% I/*                                                                          */
+ q' @1 S. ?# I. n, n, P8 ^/****************************************************************************/) D7 q, V. n1 }7 b, ~; E5 C- A. h
void GPIOBankPinMuxSet(void)# u) H* [9 \. `8 B( ~
{
, I% m, o: O5 a        // UART2 禁用流控
5 a, q2 A! ~  n1 x5 B, y( a        UARTPinMuxSetup(2, FALSE);( U8 G+ @, T7 S" c$ `  r
}
1 X8 p$ D8 v! c
. j7 z/ Q' H* O1 H9 a" S/****************************************************************************/
0 X- q/ N  {/ O& h$ L4 e  e/*                                                                          */
( C% I2 u; G8 [7 C/*              ARM 中断初始化                                              */
+ K+ U7 s3 B9 o1 ?3 L$ ]/*                                                                          */
, d& D% w7 g' O' p# r# R/****************************************************************************/
- E6 a* M/ h5 p( ivoid InterruptInit(void)
# q3 y9 [6 g. W5 }9 x{3 _1 Y* z2 h5 j! T+ G0 a7 y& }8 u
    // 初始化 ARM 中断控制器
$ I. @! D; w& }3 _6 R    IntAINTCInit();
1 `/ j7 t7 w! z. X- n: Q( E
  h' _8 s! f5 y$ [8 {: [    // 使能 IRQ(CPSR)" T+ y% Q  y5 t1 Z4 T0 F- z  x
    IntMasterIRQEnable();
# W! g/ }  b) K6 N
5 {: v4 r5 o" L( \( Y- E7 N2 j1 s    // 使能中断(AINTC GER)
# j+ I3 n7 J2 I2 N" ]2 [% R    IntGlobalEnable();& ~5 t9 i7 A  G* A$ N4 b$ M
8 _& u1 l+ @2 p: g! ^4 {
    // 使能中断(AINTC HIER)
5 Z: K3 [! Q+ M. E- L    IntIRQEnable();- |& X7 e9 n- M3 C
}- y6 ]$ [* o* Q
1 k4 T- X: J0 _( l. W0 a
/****************************************************************************/
2 ?$ U" H. W3 t) g/*                                                                          */
+ l6 o+ L8 {$ w# r& y1 ]$ ~9 ?/*              UART 初始化                                                 */# r/ d0 p8 B/ x' _" ~
/*                                                                          */
  Z$ n- a# Z9 y/****************************************************************************/& y# k5 s, W7 d# }
void UARTInit(void)! n* P$ u+ ?6 F& b  Z
{' N- j+ I- s. G9 e2 s- U
        // 配置 UART2 参数
8 k- T1 r- n. U7 [" w        // 波特率 115200 数据位 8 停止位 1 无校验位6 X, a4 U! \: k0 F
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,# j" I! x9 t' _6 b4 Q' N+ `+ q. e6 U) t
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);+ o. \- H9 ?1 M) ?# O0 Q& G
        // 使能 UART2
; D2 e7 r$ h4 O4 L0 J3 e3 b; `        UARTEnable(SOC_UART_2_REGS);/ M% ^- t+ h% h% ]" m

! x5 t1 K9 ~9 Z" j; H/ u    // 使能接收 / 发送 FIFO
9 ]& f7 C" U2 h    UARTFIFOEnable(SOC_UART_2_REGS);8 U: c3 ]3 j% F$ w

; i- O; D: @# t% G: N- t$ t% }    // 设置 FIFO 级别1 E7 G! o4 e1 ?% Z+ K
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
% ~( {* Z" ]' T) q7 L}, O/ r( c7 i6 Q0 {, h
9 t$ i! |6 h) x
/****************************************************************************/) N/ ^( Y9 v3 C" W+ o+ c. `
/*                                                                          */
" k% u" [, V7 e) L4 Y. y  {* I/*              UART 中断初始化                                             */3 v; Q# O! L- x8 z
/*                                                                          */0 ?: G9 W5 ~7 g6 o
/****************************************************************************/
! c" J+ ]& r5 ?void UARTInterruptInit(void)
- r& U& a2 Y5 |1 ~/ I0 ~7 l{* h$ q! f6 I/ y. |9 U( O
        IntRegister(SYS_INT_UARTINT2, UARTIsr);& b  O+ M$ z$ k1 D! N. [$ G
        IntChannelSet(SYS_INT_UARTINT2, 2);* t  a! N' T% E3 Q5 a9 }4 W
        IntSystemEnable(SYS_INT_UARTINT2);* N; D, X7 O+ ?
' h8 c0 C4 Y6 d1 |  M" I1 X
        // 使能中断! p& k0 Q7 |. X3 F/ H, F& _
        unsigned int intFlags = 0;9 G* B0 R1 T6 \  U$ x4 a
    intFlags |= (UART_INT_LINE_STAT  |  \" y) l4 o6 R2 \- y
                 UART_INT_TX_EMPTY |    \
. e* y8 ^  c0 ~; d                 UART_INT_RXDATA_CTI);0 b( @: [: d, F% I/ D
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
1 o7 G2 N. Y7 {0 A  {$ S}" F9 n( l, }( J* i- A; ]* H
3 ~: B4 E& N% Z6 P. i" `' m
/****************************************************************************/
0 i+ z# V: K5 C7 I7 V. H" z  L( s/*                                                                          */
. ]# f. _. \0 O' l6 {% q7 N( Y3 H0 Q6 u/*              UART 中断服务函数                                           */
, E9 v6 m+ Y- X! c/ }+ t9 U/*                                                                          */
5 F  W' B# z" `6 w7 U1 K. F/****************************************************************************/
# U4 b0 _3 L, w& E5 }- n5 Zvoid UARTIsr()! b8 T8 D4 b" I& L3 @3 S
{
- t' f( Q7 `2 g2 ]    static unsigned int length = sizeof(txArray);
8 A) M- [- K: u( ~6 u    static unsigned int count = 0;
: i4 b5 s# f" \1 F; U' x    unsigned char rxData = 0;
, M- x  Q4 h* M- D2 T& y" m) N    unsigned int int_id = 0;9 D. w/ e( L# v- a3 z8 p

1 `5 Q9 l1 j8 ~- {8 }6 p    // 确定中断源
2 n$ a; N& o5 F    int_id = UARTIntStatus(SOC_UART_2_REGS);
" u2 C' p1 z1 I; [" ~/ s  S( C: ~# Z: b* t9 a
    // 清除 UART2 系统中断2 |9 g, u% N. {$ }2 ~% x5 M& `
    IntSystemStatusClear(SYS_INT_UARTINT2);" e8 `1 a2 u8 k2 {

/ O/ b* B) h; R( u- s6 b    // 发送中断; ^% E2 h; h# e: t7 `9 E
    if(UART_INTID_TX_EMPTY == int_id)9 ]% a' _& v; L3 m2 [7 u% V
    {
; g! P. M3 Z/ G& R9 h  T3 d        if(0 < length)
0 o6 |6 \5 H6 X6 Z% t1 _        {
( f' T6 [! f) ?) k            // 写一个字节到 THR2 E4 u8 p4 i& h
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
  @* i4 k. V0 L0 o; D            length--;
- E+ {% r0 h2 h5 B# M7 N% J            count++;) }) I( l4 o7 L8 Y! }
        }- P3 u& f$ z9 s/ g" k; s# x
        if(0 == length)
( F/ i' O! X  K$ t2 V        {
2 A' L) i( Z+ P! F" Z  y            // 禁用发送中断
7 p# A0 F8 O2 i% d            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
6 Y) {2 n( [% g8 q0 [        }
" L/ w& v, i$ q+ E! R& @8 C$ F     }0 L! L& ?6 b, q
1 N# g2 B' t4 q- }7 {
    // 接收中断1 `8 c/ u' U$ Z. s
    if(UART_INTID_RX_DATA == int_id)
5 ~: C  Z& d! |! N    {
  P: n5 U' h$ b% Q3 x  b. }% {        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);& i2 U2 r1 Y# a
. v  `: V5 T3 y$ }# i
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
* _4 N9 j' Z( X8 ^+ C  J8 l    }
3 C' ?$ |0 e% V) s  y! q
' v' [/ f3 e! h3 H* r; I    // 接收错误! H, y, ]( J3 u
    if(UART_INTID_RX_LINE_STAT == int_id)7 ?3 P  b5 x& d9 {6 L! g& V7 G0 @1 e
    {/ M& _9 w) k* `7 Y
        while(UARTRxErrorGet(SOC_UART_2_REGS))8 x) }0 Y7 \" @; i+ a3 g" a
        {% S4 j  L$ _, }& }0 @( ^# d
            // 从 RBR 读一个字节" Q9 d% Y. `  q; Z' ]
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
; Q3 p, ?/ N3 u        }" R* y9 I2 t) s8 r2 S% x/ p
    }9 V. M$ B! C: w' F! y$ l$ i7 G8 s3 o
   
% Z5 h) V  V4 C; {6 _    return;
) \) _+ U+ Z9 |3 Q0 U  }* L}) _. y0 r, j3 Z6 O6 w5 o0 Z9 F
回复 支持 反对

使用道具 举报

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
) w* K+ w2 F9 W6 X如果其它设备快速给你发送串口数据,你这边能正常通讯?

9 b9 a/ n$ h/ y4 F谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 00:38 , Processed in 0.042141 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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