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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5656|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
+ J4 ~' E- J0 x

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。8 t. C) b! C& T, x

5 v) D" l4 U& g/ L#include "TL138.h"                 // 创龙 TL138 开发板相关声明
5 ~3 D- M1 `9 n/ W: K" o: w- v8 q1 L9 W8 J5 X
#include "hw_types.h"               // 宏命令* I3 y1 d1 D& M& J( q; ]  o' o  u
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器3 Y0 w; Y% h  ^. o( Y. x# {
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
& L. k9 K" D8 @; l/ v- r6 C7 B6 A! y  D! N$ K6 d- `
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
0 t& z, Q5 H3 X% t8 ^( }* p#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
! Y1 o; _1 s6 o#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明% O* Z: T( B9 M0 t9 ?1 N
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
# H( _( K+ l, u: [% B2 ~  C- A/ L+ ?( L
/****************************************************************************/; i3 H% Y6 c* R( ]7 O& s5 Z6 x$ g) h
/*                                                                          *// V8 J' a: P8 }9 t; ~
/*              宏定义                                                      */0 _8 {! p  T7 n
/*                                                                          */8 n/ G8 `8 m1 Y
/****************************************************************************/9 U8 o- C4 r8 T2 y! P+ e! R
// 时钟
1 ]/ ?, J' |5 m#define SYSCLK_1_FREQ     (456000000): |7 ~1 u: e5 L1 F! D
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
- f/ i5 c/ B, R$ ^#define UART_2_FREQ       (SYSCLK_2_FREQ)
0 I. o) k; u1 {1 O* D* V* H( T0 G+ ^* R$ M6 w
/****************************************************************************/
& y- {. Z- r  m- z$ i+ e8 |/*                                                                          */: {/ L/ e% L: o6 S, ?
/*              全局变量                                                    */
3 U" w/ z! q* u. ~9 m. T/*                                                                          */# h% `; V& a6 q
/****************************************************************************/* @# g  }% ~% ?
char txArray[] = "Tronlong UART2 Application......\n\r";
3 h6 {5 D7 A% n' F0 v" X" G, j! m7 X
/****************************************************************************/
# U- }4 J, y/ K, y! e/*                                                                          */
  J( z( _; w* i8 }$ `/*              函数声明                                                    */7 H# W8 K& N$ h
/*                                                                          */  }, N9 g' ~9 C$ h; v
/****************************************************************************/0 O, v: x' f# }. L: U
// 外设使能配置
3 M& t7 u% X. A  \2 f1 E- Zvoid PSCInit(void);
( J8 ?+ B* p9 I- N5 J  g) w4 E, D/ [* ]1 C) H, ]( ~+ |. f
// GPIO 管脚复用配置
# x- m. m8 e6 s: D# gvoid GPIOBankPinMuxSet();* n0 }" o& a& T3 O' [

$ `# w5 z  m9 U9 R// UART 初始化
. E) ]8 Z2 G7 D6 uvoid UARTInit(void);" U& ?: h% Q7 i2 n2 }
// ARM 中断初始化$ W9 Y: l4 D( d: r! F
void InterruptInit(void);
+ S6 O8 J4 f3 e+ y// UART 中断初始化
4 K  x& ]; X, a! b1 `& o" l1 m/ Xvoid UARTInterruptInit();% o5 _" A+ w& W$ X' _8 R+ l% c
// UART 中断服务函数
( h% k0 v0 O5 Yvoid UARTIsr(void);7 U* F! }* Z4 u3 t
, o9 I" F1 b" M" y+ m
/****************************************************************************/
9 s8 l; A6 ]- }2 B  N* [+ y/*                                                                          */6 o# y- T/ S" u  k
/*              主函数                                                      */4 |" d6 t1 d( G& P( I" K! o
/*                                                                          */
: G2 r! @# M2 |9 D  i6 X/****************************************************************************/( C4 Y  G7 l/ |! P5 D
int main(void)
- X, S: z  b( W5 u( i1 v{$ e' g* Q! E2 i  h. U* l$ j& B
        // 外设使能配置& C; O$ n  o- o, A- B3 v8 ]! l( ?7 M" q
        PSCInit();
, V6 `( l8 {9 L; n1 Y4 K' U       
3 t( g# s0 V* z! k* L; }  X        // GPIO 管脚复用配置
3 H% F0 B- c/ r* }' n  z        GPIOBankPinMuxSet();
* z$ }; p' e- n# y& a
  ?' n8 J  q  x2 v0 p        // ARM 中断初始化
# {; W; U2 i/ V$ n% M6 W) p1 y4 }        InterruptInit();$ Y/ |  a) ?# w. G) @1 k/ T7 h
3 M9 U% z  i6 P
        // UART 初始化
  m3 d; x$ [4 S9 A, j5 N2 u        UARTInit();7 {5 [. o3 \0 X7 c  T5 y

) w7 v% ~) s2 B# `$ U9 C        // UART 中断初始化
$ C- K3 a2 Q+ f3 D, Q        UARTInterruptInit();
3 N' B* i0 p( }. F5 m2 b$ Q* k! |) W! r( X9 \/ v3 Q0 G
        // 主循环9 N$ {8 x- U( b' y0 Y. K# o
        for(;;)5 q- D% x6 K9 N) p2 c
        {
2 B) K. F* ^; N- i: G
2 T: l4 m0 ?/ v9 F( ]: H, B1 P# S        }
. B; j. u. r; @; |% P! c}# W! m# G- a( n, d' ^9 ]$ o6 T
9 J) b, q0 k- o, ~4 K9 y/ G; ]! v
/****************************************************************************/
/ k7 {( Y8 v; K. H( {# Y8 n- o/*                                                                          */% N$ q$ M6 l) G9 x1 p
/*              PSC 初始化                                                  */
$ X) A$ E4 O# \: w/ i  p) m, m/*                                                                          */
: ~) o" M2 g; A# p/****************************************************************************/3 o. [2 `( b& @
void PSCInit(void)! D" A/ Q1 z; z; c# p
{5 A7 ~* x, S  |, T& G
        // 对相应外设模块的使能也可以在 BootLoader 中完成
( h( i( z  ~9 N# @- Q    // 使能 UART2 模块- }: m, i  a5 R  d$ p
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
2 m5 b" s$ b) f}' R2 `) k; k+ c* V$ Z4 j5 Z; p. D2 D/ y$ S
3 f* ^" B, q: s# d3 o: y- v
/****************************************************************************/7 S( Y1 l& ^: J' u: Z
/*                                                                          */+ B% s1 X9 m$ z, a
/*              GPIO 管脚复用配置                                           */
$ Z$ F$ F/ ~% {) U* ]0 ]% D0 `/*                                                                          */7 u% s% \, ~% H3 A5 l3 |. }5 G: _
/****************************************************************************/
- Z+ U& p( r3 z/ F6 Pvoid GPIOBankPinMuxSet(void)
' Q; q) J, q) T/ j. N{
3 }0 E& m( h  H0 {6 o1 O: k        // UART2 禁用流控
. u* j+ y" G3 A& _1 O        UARTPinMuxSetup(2, FALSE);8 q8 K; ?6 j) w- W  K" R- m
}" N& x, D! \2 [+ s
+ s1 w0 r# V) A, x: b3 U3 k
/****************************************************************************/  V4 a: X" p; h! y. O
/*                                                                          */
4 J, _1 Q* R1 K6 P+ @3 L/*              ARM 中断初始化                                              */+ T# @7 m* t2 C' `  L" f
/*                                                                          */1 b7 @/ }5 V9 g6 b4 M/ u
/****************************************************************************/$ D7 T1 [2 F& t# @
void InterruptInit(void)
  a3 _2 d. `- l0 s% N{
/ Y/ d+ F; ~- n; w9 M    // 初始化 ARM 中断控制器
3 k  F1 ~4 J; Y1 _& k0 L; c    IntAINTCInit();& F+ E: ?+ j7 o* x% e: A

' Z5 B8 ~  r" [1 l; a    // 使能 IRQ(CPSR)2 Q! _+ h: S4 x! P8 `* s, o5 @
    IntMasterIRQEnable();8 X" z: [) g% h" K) ^8 a9 Q
, L1 C4 B# }6 b/ N3 ?" K2 ?/ p5 e7 y
    // 使能中断(AINTC GER)
  }. c! N. ~  {2 M& s, Z, t: W/ O    IntGlobalEnable();6 p2 K8 X: z. w& A3 A

' f3 [2 o: B7 J    // 使能中断(AINTC HIER): f5 P3 Z- \2 c# X
    IntIRQEnable();8 `7 r8 }; ]7 j7 d
}/ F3 C4 Y* V: S+ D1 k3 b
% R; V6 \! u# I' w0 g. }, ~
/****************************************************************************/! w1 h& c7 m2 {6 R
/*                                                                          */) J% m8 S# i9 }- B; C1 `  Q2 [
/*              UART 初始化                                                 */
. r% ^, s4 N! }3 T2 K5 f4 H/*                                                                          */* d/ d( |4 y$ `; x' t0 U
/****************************************************************************/
9 Y) L& i4 n' q  G, P) L' Bvoid UARTInit(void)/ B4 k  x8 D6 D( W, a
{0 [5 h' c# a$ r3 T0 |# p9 Q
        // 配置 UART2 参数! x! E5 _5 y$ W1 H
        // 波特率 115200 数据位 8 停止位 1 无校验位4 d& [( ]) ^2 N; r7 H; |. B5 z' I/ A
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,4 z" u6 W6 G2 @4 b$ k& o" ]# w
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);' z: I0 \9 N. y; s. E- z: z
        // 使能 UART2
  s8 E) n$ u& M" {        UARTEnable(SOC_UART_2_REGS);4 W( j- r( g  ^$ e% {
1 ?' K9 [& }& x6 z% g
    // 使能接收 / 发送 FIFO, @- T6 j$ z! j( l
    UARTFIFOEnable(SOC_UART_2_REGS);1 W8 d9 x$ m$ \7 |+ m# a! g" a
, E. v# p1 e; G. n
    // 设置 FIFO 级别7 e4 s- j9 y6 f) M$ K# T. L
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);. x/ s$ o5 R: T1 d
}
) l8 |& _2 F; _- C8 D* _4 Q& N. T0 l; p0 L5 m
/****************************************************************************/
9 ]9 o1 h5 C; D& I. g+ _# `/*                                                                          */* J9 \) @+ O/ o9 |, y
/*              UART 中断初始化                                             */
5 [9 f/ W8 g; Y1 Q2 e5 U$ R/*                                                                          */" \8 U+ ^- D$ X% t! ~/ G+ p
/****************************************************************************/, k4 F" c6 j/ {) b' n" z
void UARTInterruptInit(void)3 {; W* O0 a0 W9 t: J
{
4 }9 N+ K0 U3 k- X7 Z4 j. ]. k        IntRegister(SYS_INT_UARTINT2, UARTIsr);
+ Y/ c3 f: ~2 g- J        IntChannelSet(SYS_INT_UARTINT2, 2);
5 \7 P$ ~, U5 O( c; d  _, l        IntSystemEnable(SYS_INT_UARTINT2);) h  N# }1 q' J! W3 T/ k" X

7 d4 v, k+ ]. A: d# D* N5 T        // 使能中断% K7 W+ W8 @  a
        unsigned int intFlags = 0;
) y0 K5 k4 U7 B5 g    intFlags |= (UART_INT_LINE_STAT  |  \% }$ \0 ~" H1 y. I; I# r  p; O" M9 M
                 UART_INT_TX_EMPTY |    \% ?1 a+ T* ?- n7 N# r2 B
                 UART_INT_RXDATA_CTI);: Q0 j! m, L5 S1 }' p% B
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
/ Y1 n# X7 i6 Q. t& c9 X}
, A, a0 D( k" o6 L4 C* ]5 y; J- C2 R- C6 [
/****************************************************************************/
/ f/ o  N) C. J* q, g; |6 w/*                                                                          */
% \9 ~5 N- _# ^& n" O. ~/*              UART 中断服务函数                                           */) s9 N* r: m4 T4 H9 {) k5 u9 d
/*                                                                          */
3 i4 a0 B  D$ O7 C: ~  k/****************************************************************************/
; v5 R; F/ F! h8 H1 H3 o9 l0 \void UARTIsr()
! p4 c: Q3 }( \, W* n8 B$ ^{
9 p8 B0 M' o- Z+ v    static unsigned int length = sizeof(txArray);
- ~. u: c( z/ W: I( O    static unsigned int count = 0;1 e: C+ x- S$ R' q* b5 O+ e. _
    unsigned char rxData = 0;$ p/ K0 p% n7 O( y
    unsigned int int_id = 0;
* M, s6 g& g# \* a/ Q: f- N- r9 w
% D3 U# J* ?5 t6 n/ K6 `! K/ p    // 确定中断源' O. ?8 k5 v8 S! Q0 u
    int_id = UARTIntStatus(SOC_UART_2_REGS);
: _0 R: ^, U, _: v7 H
/ p+ ~& V: v9 }& j7 y2 ^' f. c    // 清除 UART2 系统中断7 Z! ~5 p6 t* v+ Q! @( S/ U5 e
    IntSystemStatusClear(SYS_INT_UARTINT2);( U# H+ b% j5 N+ u6 A" o8 l  T

% v. n& w- [* Y" G2 U8 S    // 发送中断
; T+ |0 m" }, [9 |: H    if(UART_INTID_TX_EMPTY == int_id)
# j- k* \) z: K& o8 X- z    {( j* G9 e. R5 B; d3 @0 K
        if(0 < length)
4 H3 R) z% j- O  q        {
2 U' l% Q3 F0 h! ]            // 写一个字节到 THR
! _2 N9 u) Q( [2 P4 P& `            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
) u- m7 K8 ]! U( O* l8 f) I            length--;1 T# P/ o+ h7 Z  r- Z; b
            count++;
" F7 U1 m" T2 r6 L# J' w        }2 t: |$ w2 u9 h- Q. y6 @
        if(0 == length)
# z9 ?% [0 H; k  Q' Z        {
7 o; ?* B' ?) ^; l  e/ W            // 禁用发送中断
+ d' @& P6 H' [0 x            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);$ t/ j: x: d1 |! s( N4 W
        }
6 |2 `& ^8 n7 w0 k- e% w7 K     }; b4 P# G: a8 i% @# h2 p: `- G
  U% \$ |8 Z, P
    // 接收中断# Z/ v% Q1 a  T+ H
    if(UART_INTID_RX_DATA == int_id)9 {7 j( _2 R! f3 l- W
    {
3 L2 g* [- b$ a& E        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);6 Y* }* Z. S" G7 H; |* Z7 U) D
: k8 o0 b3 B: l4 L
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
3 ?* n/ v% }+ N7 f$ w4 `    }
% d+ M* K( C$ u4 ]' u4 d; S0 C( F7 b
    // 接收错误/ [1 I: V/ n8 e% m# y, _- ~& d, z9 _9 G
    if(UART_INTID_RX_LINE_STAT == int_id)
, s6 u4 ?3 c8 F' l    {
& j/ e$ X; G. ?! L, Y1 ^: z$ u        while(UARTRxErrorGet(SOC_UART_2_REGS))5 u0 y$ w1 w6 y2 y  _0 m2 `. V
        {
: J: C( \0 Z3 u$ u            // 从 RBR 读一个字节
9 f5 h/ G$ X, g( j7 j/ G            UARTCharGetNonBlocking(SOC_UART_2_REGS);4 v% [3 g, ^) J8 `  f% i0 U
        }
+ e2 w" |0 l+ S    }
( Y6 c& X8 z; W  a    & I9 F; }7 G+ N5 w, O
    return;
: X* {2 J. j& D0 @' Z' F8 Z8 {4 p7 f- N}; G( ?1 p. Q; Q" R1 c
回复 支持 反对

使用道具 举报

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:254 Z! j" j$ I3 \
如果其它设备快速给你发送串口数据,你这边能正常通讯?
$ N& S2 @( Q3 f- v" g1 T
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-21 00:04 , Processed in 0.039798 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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