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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8300|回复: 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% A& q9 F3 X1 |

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
  n/ |. a% B0 j0 y; e* z* ^) H3 E' K/ d4 v8 G. m0 y
#include "TL138.h"                 // 创龙 TL138 开发板相关声明0 `8 U: d5 X2 P- q1 q. C, v; L1 O1 E
; M( \9 o5 t. O  {/ [/ W
#include "hw_types.h"               // 宏命令
4 Q0 ?! x2 E/ M8 L; r#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器, y6 R& }% Y% |+ O
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器+ K5 \$ x' ?7 k
! y) s* e; }1 X
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
2 }2 q  |& r  ~8 l#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明# n. v/ R; w) i1 T1 z
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
! P9 K- d7 M3 P) M2 z% F3 s2 A#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义( t' y& M3 w3 G2 F
! E& K2 x0 i2 T
/****************************************************************************/: y6 S, _; |+ s! C' n
/*                                                                          */0 _" ~3 B; _! A: J5 t7 C
/*              宏定义                                                      */
6 Y9 w2 b8 T* D( _+ @& p/*                                                                          */
1 E3 {2 q# e! E/ y: _* A7 r/****************************************************************************/3 ?6 R# R, e9 q  Z! A0 j5 [! E5 d
// 时钟6 p" x0 q# w) y- X+ Z$ s- R
#define SYSCLK_1_FREQ     (456000000)
9 T/ \# y( \# N# t% F  ~#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
! h( y# W0 m+ X1 c#define UART_2_FREQ       (SYSCLK_2_FREQ)
4 n: c& Z3 [8 e% W: j9 U8 z( U
6 `+ ~/ o2 v6 q1 L% \$ G( T/****************************************************************************/
& J  Q) d9 w1 j/*                                                                          */
& f3 l) ]0 D( e* r- D/*              全局变量                                                    */
; i+ z0 {, @4 b3 X8 f  X/*                                                                          */' Y. b# E6 I3 H& P: x& N" ~
/****************************************************************************/
4 @9 R6 G2 k5 o: z7 I) q, lchar txArray[] = "Tronlong UART2 Application......\n\r";( v# R% w( h5 _; z4 n! y3 B
+ |$ ^% v3 [: Y1 }5 f# r
/****************************************************************************/1 }: |  j! I! O
/*                                                                          */7 d; O3 ]) E8 }
/*              函数声明                                                    */0 [7 H; ~: s3 |+ H. {3 x9 u
/*                                                                          */
7 [* y& X) d; J4 N+ G& Y/****************************************************************************/
0 T: B/ A' O& t+ T5 {// 外设使能配置
7 r, g- f7 `% E; x, F4 g4 J2 |; `' ]void PSCInit(void);
2 j% V/ y, H0 r1 f/ ?( k/ m+ x1 m) {
/ ]' Y& Z0 F* B4 p. r' M// GPIO 管脚复用配置
6 ]& P% v" q' R* k6 X, P$ [void GPIOBankPinMuxSet();
* W, s7 a5 ?5 e8 S$ b1 _! G
( F+ m1 u2 _7 i! A// UART 初始化
, x* A' [* @- ^/ K5 x' svoid UARTInit(void);
5 I" ~' s" K% F7 w// ARM 中断初始化
8 M) ?1 u9 E! X) M) t2 N* r# v6 Ovoid InterruptInit(void);' L3 S7 C" o$ S  ^6 R0 W6 e
// UART 中断初始化2 Q) k9 W5 z( c: t4 Y1 y8 m% U* e
void UARTInterruptInit();1 a: I6 u* f' T. x- e
// UART 中断服务函数
/ A- D2 j" t2 G. U( d0 s3 Uvoid UARTIsr(void);
1 }: R# n. L6 H! h$ d: u
) V( i# B# U# B8 I% G9 I# p/****************************************************************************/
0 k" K3 _) W. E" \& Y/*                                                                          */& Q" Q( _3 W0 a+ p2 Z! k% Y
/*              主函数                                                      */; S# U7 x& ~  |( ~
/*                                                                          */
3 r& c' ^. x# f( P* C& l- j% B/****************************************************************************/+ r# t/ F5 q  c
int main(void)# o) Z0 @0 N. s4 r5 k
{
( K3 W* z8 s' @        // 外设使能配置
5 R" V( u. Q% F$ F        PSCInit();
1 l: o6 g$ b& Z: J       
% J& D3 T( ?! j3 m. h. Z. f        // GPIO 管脚复用配置/ c. j! ^) W1 Y+ ^! q9 W2 y
        GPIOBankPinMuxSet();
) F8 p9 d1 d" |3 n- W& j4 m% }9 t
        // ARM 中断初始化
; P/ [$ W) ?, i: h7 ~        InterruptInit();
: f/ Z. Y0 ]* f5 ]
6 N  @) _! @* S5 z. Y$ j! m$ K  V        // UART 初始化, L" W7 W/ ?* u
        UARTInit();
3 Q% l" z' W, a) ?! t3 A. t! E8 \6 R9 f4 L. r" o
        // UART 中断初始化' U8 r6 a) m1 g& I
        UARTInterruptInit();
/ D( x% V. m/ S+ b2 q3 j( X2 G9 {8 m
        // 主循环" f8 `& q" g  b# E, X" U
        for(;;)5 n( J4 t: R) D  W) m! H. Q
        {8 {( U" [# m) ~4 j9 d

6 a% V3 y1 o* ^2 n$ u        }
5 V& T9 c2 c0 E( v8 o$ Z3 ^}! B& J) B. \6 o2 `. r4 O9 ^: k
* r; S  _% i* S1 Y
/****************************************************************************/
$ o% J9 w+ C- F4 f9 ~' J6 a4 O; x/*                                                                          */, s- e9 ?" M- X
/*              PSC 初始化                                                  */
: \' w5 E9 Y! _3 m; g6 R/*                                                                          */
0 Y4 }( y' Y5 M, a/ h  z9 x. E( D3 z/****************************************************************************/
9 j) M6 C" F7 gvoid PSCInit(void), k7 Z  q- y, u
{
% G1 E) A- }1 F        // 对相应外设模块的使能也可以在 BootLoader 中完成* `7 g' D1 C' U/ _: m  G% P/ b
    // 使能 UART2 模块
- k! a! x8 E* s" v, e/ f" [  M    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);6 {4 O9 I& y2 a1 Y' Y
}
- \* x' k. H! X2 c) ~
# g% F" F) _0 C! S3 q  I) r# Z6 i0 l/****************************************************************************/
4 ?* f- I3 |! g6 C1 k& H. b/*                                                                          */( H7 Q8 w8 Q! v9 D) [( l
/*              GPIO 管脚复用配置                                           */
+ N( w5 Y0 j0 {# u% M& K+ m/*                                                                          */
% ^3 w: v  U4 U6 t: h9 s4 g/ K/****************************************************************************/
1 H' B3 k$ @& `9 F1 {; Q. u) V5 Lvoid GPIOBankPinMuxSet(void)# \8 m- z% n5 I; b- D/ F1 i3 Q
{
) W" {; Z1 k2 V! i        // UART2 禁用流控
2 l9 A7 s8 w" T+ `- Y8 c8 d        UARTPinMuxSetup(2, FALSE);
; h, Z/ `- I+ Y, R6 [}
+ g' W, l' S' C7 K/ v$ X3 `0 j2 Z/ J7 O) E6 P1 {
/****************************************************************************/5 k# o0 \3 F8 X3 d
/*                                                                          */
3 ]) Y( @6 e! U. C/*              ARM 中断初始化                                              */6 F% R6 o* Z% V9 ^  Z  P3 ~/ i
/*                                                                          */
- B" t# n6 }1 l/****************************************************************************/
9 X/ u  r- C$ F: c% Hvoid InterruptInit(void)
) ?# h7 l* n0 I. I! u" X  E7 ~{' O0 ^! K/ g/ q2 K$ n# ?  P$ F
    // 初始化 ARM 中断控制器
" m: P7 |2 g6 I3 s3 v: n    IntAINTCInit();# s) i8 Q  {$ ]" A8 @8 {
' v7 I% {: c9 q9 u; k# O$ W
    // 使能 IRQ(CPSR), q% a" a! m, S& y+ J  C8 p
    IntMasterIRQEnable();0 O2 e8 d' L$ z6 f
3 Z, U' c- u/ G9 c8 m- z
    // 使能中断(AINTC GER)
; w! @9 L/ C0 R4 z1 q) e& `    IntGlobalEnable();
  D; _8 |  i8 j
, ^7 v) C( E, z1 p' D: ^: N    // 使能中断(AINTC HIER)2 c, Z" p% V8 B+ ~. ~
    IntIRQEnable();! v/ v% ^) e, {9 X
}( N' y  [; |2 l' A- D
# ~& }- d& U; d% g- A5 N7 T' n
/****************************************************************************/
) R* ^* K; N. Z% i+ p/ {! W/*                                                                          */
6 O; u6 Y5 D7 O3 \* M! @; I/*              UART 初始化                                                 */
& S0 N/ s  k+ L$ P/*                                                                          */6 Y! Z% U+ t6 c) e3 o) Q4 B
/****************************************************************************/( ^& n  T1 ?" W$ U8 n2 P4 a
void UARTInit(void)( L6 P" ?; y+ u5 m# }2 ~2 `5 L
{5 F# l; x* Z" Y1 \' [" l
        // 配置 UART2 参数# z" d8 F/ c( G% O! a! q
        // 波特率 115200 数据位 8 停止位 1 无校验位
& ~# w  A. d# {/ e8 L    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
; H; u( k1 k0 w7 d) k9 w4 @                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
9 I2 J7 W' e8 a( {1 \        // 使能 UART23 {$ W- S' y  I( w+ h- X
        UARTEnable(SOC_UART_2_REGS);' q  k/ t* C% Z
* H; ]3 {& k2 T  E# f
    // 使能接收 / 发送 FIFO
6 ?2 ]- i1 g0 ?, d8 [    UARTFIFOEnable(SOC_UART_2_REGS);
. L) q2 O, a7 e' P$ @
, s' X. @$ [) H4 j) W    // 设置 FIFO 级别
; P( Q/ G6 H9 |' h9 ^    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
1 N) ]3 @. ^% ^& Q}, l' y; f$ O8 C% m* g. I2 Y

; e4 j' k- P0 R0 m, b/****************************************************************************/
* x8 v/ J" ?; c3 l1 G% q/*                                                                          */
' R; x& X5 }- _7 B, D" [& R" j/*              UART 中断初始化                                             */
' a! R5 b# H' W/*                                                                          */% _+ a3 o) x* `+ j
/****************************************************************************/3 F& i: A3 n: i2 l1 \
void UARTInterruptInit(void)# N; p5 @" g4 W. j' [; p( e1 f5 t- e
{
4 F6 n/ l* d" E, ~6 I        IntRegister(SYS_INT_UARTINT2, UARTIsr);& U1 c2 ?/ U9 P0 p
        IntChannelSet(SYS_INT_UARTINT2, 2);7 d* H& b+ t5 z/ m; G
        IntSystemEnable(SYS_INT_UARTINT2);
# U1 t; J! Q* A5 `4 W) _+ {6 s0 @+ f) L# P) e$ N$ x# E
        // 使能中断
% S4 X' Z  P! Z  N. Q        unsigned int intFlags = 0;
: V; l, Q- e* T9 t    intFlags |= (UART_INT_LINE_STAT  |  \
4 X' f! p8 z/ P                 UART_INT_TX_EMPTY |    \
5 v+ E1 Z3 [% @+ h$ B                 UART_INT_RXDATA_CTI);
0 ?+ E4 |0 U& y3 p  c3 ^    UARTIntEnable(SOC_UART_2_REGS, intFlags);
0 W' i2 H% h+ v5 x  }% u}
. }& c& _/ j" j8 K
" g( w& q+ u5 V: ]: v: `* e/****************************************************************************/
0 b. g9 z% S. T8 q# s9 \. o! A/*                                                                          */$ M( y$ Z) E/ Z/ s! @- z5 ?
/*              UART 中断服务函数                                           */
( G2 T0 J5 @* K& V$ |/*                                                                          */
8 Y1 u/ @1 ^9 F5 L- C/****************************************************************************/
" E& y/ S) x: E5 x3 w! @. O  c- {& tvoid UARTIsr()3 c9 H- H0 w, y) N6 X# h
{
* @0 i2 [$ v. ^* u    static unsigned int length = sizeof(txArray);
3 A! R3 X2 Q! A( G" C* B    static unsigned int count = 0;4 J4 G! N: f$ {: W
    unsigned char rxData = 0;
  a! u( g1 h$ n2 e2 Z    unsigned int int_id = 0;, {6 [, ]# `9 {0 _+ S) l" d
# s1 K; S) p* v8 {& s
    // 确定中断源8 k9 r+ Q& Q& A4 W0 I( j
    int_id = UARTIntStatus(SOC_UART_2_REGS);
* B( n# ^$ R' E2 a- H; J# ?/ H6 s( I3 c
    // 清除 UART2 系统中断$ B! c8 |1 ^) k4 U5 H9 r' H, {% r
    IntSystemStatusClear(SYS_INT_UARTINT2);
# t( @: P" ]* _2 [: J- `" j5 N# U  Z  s4 ^/ p
    // 发送中断
; W( F$ u! d5 B* e+ P    if(UART_INTID_TX_EMPTY == int_id)
/ T  E; @. G" E. E  X5 T, c    {( F" T$ O, H" D
        if(0 < length)' Z7 b3 T# [& S
        {
$ B' H" y% V( ?$ ?            // 写一个字节到 THR
# _* J' m! t) q! _8 e            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
, }. b% i. i' ~! c4 E  x            length--;$ ?, g- y  G  Z9 m$ I7 G5 J. d2 \
            count++;
3 L: g- [% q4 t$ O! M+ I        }+ p! @5 ]4 q, F( ~  `
        if(0 == length): a4 |+ J( D: F% p; d9 d! [5 v
        {3 Q4 U% t/ F8 w" Y8 t5 a
            // 禁用发送中断
" B6 z2 x0 c% C" M' S- `            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);. [5 P( O9 V' a  j% S" k
        }
( f  H* a2 M6 k5 z     }
8 j" B' j- H( o5 z+ k" ^5 I" c4 f5 y" Y
    // 接收中断
2 P) G% u. G" I& T    if(UART_INTID_RX_DATA == int_id)6 s1 s1 Y: [6 v9 H' R
    {
; q, o2 i& l, C$ S* l8 n        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
! R2 V# W7 i/ a/ e9 B% |) W6 h+ S
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);; y; k- m# z7 m5 \
    }
; F$ {; `0 l3 j$ E- B
+ u( H) K. O5 x, |* s4 u    // 接收错误
9 V! N. F) X5 _3 `8 e    if(UART_INTID_RX_LINE_STAT == int_id)
' j% r- Z5 W' N( @% L  H. h- {    {! @( K* V5 ^/ E- a- Y/ S# C
        while(UARTRxErrorGet(SOC_UART_2_REGS))- Y6 g3 F, k4 m* G: Z  q/ f
        {
1 J; m  q- k! ~" o) d, Z9 S            // 从 RBR 读一个字节, }* q1 M( j# T
            UARTCharGetNonBlocking(SOC_UART_2_REGS);* [+ U7 W; C/ i+ ^
        }( k& D2 o2 c( ?; v7 s9 x
    }- Z5 Y* J" F' @( ?  b' k
   
9 W- b. J3 w( R5 J5 P' |# I    return;* H, c% k7 v4 @: X+ u2 S& p
}
1 {8 B  R7 ^! 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:25
# Q, L" b. j$ [1 V3 |如果其它设备快速给你发送串口数据,你这边能正常通讯?
1 V: }# `6 W+ R9 D+ K7 P
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-22 23:19 , Processed in 0.049193 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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