串口发送中断触发条件 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8457|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
4 r* Y5 H1 y4 R2 _/ ?% m& h

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

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

- U+ P9 |) u. V( |6 d. z! ?" Y& {#include "TL138.h"                 // 创龙 TL138 开发板相关声明
4 ^  E8 H0 x/ q8 Z
1 }* |7 r0 a% _4 K' c- c- K3 l#include "hw_types.h"               // 宏命令
( X8 J* U3 j' T& Z/ A#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
5 f& M9 A" F% C#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器" T. H! z& I' T4 h* P
( N% g* d7 x( F. G+ [+ X
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明! f% X4 I$ r& s4 a
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明# ^8 L' ]+ G2 O. s3 M
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
' c$ Z8 A( ~  L/ ], c#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
. ~; `$ T5 x" o! g% `
4 Z8 s; |" e5 y7 l/****************************************************************************/
. r0 I4 k1 s0 J6 \/*                                                                          *// w8 W* q% C+ c4 [) X+ N3 i: V
/*              宏定义                                                      */
. q0 }5 a. R# n, f  t% ?; _" s; T. _/*                                                                          */' v5 |# }& e; R' Y5 k
/****************************************************************************/8 d. |1 Q# D' T8 P/ @$ M  t
// 时钟8 j% E" y( ^  Y7 [5 e, p" ~
#define SYSCLK_1_FREQ     (456000000)
4 }1 q  x1 X" I  ~, z" g2 L- U6 V#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2), j9 S$ i9 z8 F) K  M
#define UART_2_FREQ       (SYSCLK_2_FREQ)+ q3 {0 {5 x9 Z  }5 d9 W
. a, S5 C6 M" D9 w
/****************************************************************************/
( K: V4 z, m4 \2 c; I2 U/*                                                                          */
6 _: ?# Y( u$ p/ q/*              全局变量                                                    */
) A" H" S% f0 g) |, G) A1 G. }/*                                                                          */0 k; s) w7 B/ q( g/ T5 B. _
/****************************************************************************/. `6 |8 l; n/ G+ p" |& Y) @
char txArray[] = "Tronlong UART2 Application......\n\r";
1 y% N/ i0 L* \$ E" l9 }0 y
3 z) y* a. }' [  o4 `( E& g, x/****************************************************************************/
( R5 \( v% M! j( {, ?; E; [/*                                                                          */3 k* n: t+ v3 f1 g1 @- t. [( w
/*              函数声明                                                    */
) k4 B# b( h/ F) d5 Z+ D/*                                                                          */7 P+ x; D8 M; C6 L
/****************************************************************************/& B, E, I; p% t* k6 Y9 C
// 外设使能配置( j- s* l# v+ Q! J5 H, r! y4 f
void PSCInit(void);
3 \) h9 Y1 w7 l( u
1 A. h- H- p  V. D! r  e' x/ P// GPIO 管脚复用配置
0 b( q4 x! P8 j1 v4 s/ Kvoid GPIOBankPinMuxSet();9 E7 @* B) s, J& n. V0 V  F
" F9 E* o! O6 A; t) w% d
// UART 初始化
! l6 p+ i) m/ f" i8 U5 f$ J& tvoid UARTInit(void);
( T" T# i0 C% ]1 g. s* n3 C// ARM 中断初始化& h' W& s; U3 u7 U2 ^+ s; v: v
void InterruptInit(void);
: R, c, Z& a4 U// UART 中断初始化
3 |$ `8 }$ f& S* R: o  ?6 P+ d; ^void UARTInterruptInit();1 C+ M' z  f$ J/ q+ ~4 A
// UART 中断服务函数
+ e% U: t. X( @3 V2 mvoid UARTIsr(void);& R- b( ]& o) w
  ?% J, [+ Y& I2 g" S
/****************************************************************************/  I' A* b& q7 Z+ w
/*                                                                          */4 D" i2 y2 b! @7 d- l3 ]
/*              主函数                                                      */: G1 Q8 K8 ~* U  r5 j+ d
/*                                                                          */
% U3 y9 K& u7 N; V: d% y; A" o/****************************************************************************/7 q* N: k: H3 P  H
int main(void)
' H( V5 t  t8 A& n  Z{
1 U5 u! d6 D% k) c+ n        // 外设使能配置
/ l& n4 G) X( C9 H( R        PSCInit();- O* j: U$ i, D5 m* ?, v. b3 c# |: k
        , o. L( T/ r: ^" ^7 |
        // GPIO 管脚复用配置
% Y& @" A' O! N& |        GPIOBankPinMuxSet();1 E8 X  r1 q' e( y' [
& h. _+ ?2 }  R+ [: h) `# p
        // ARM 中断初始化. H4 f5 a0 i. I2 Q  ?$ T5 s
        InterruptInit();0 |0 k4 {7 \: w9 c& p* f( _7 a

% q( r# J( q2 i. R3 `0 K        // UART 初始化" A1 L" ?2 Y' b
        UARTInit();
! E6 P0 c% \/ U+ @8 j( t9 y2 V: p3 m# B
- Y6 V, c. N( j% p) l) t        // UART 中断初始化; V- `- w3 ?7 A3 L" y
        UARTInterruptInit();$ U; f2 N& q( o3 v# X' r7 L
# f: m+ }  _! x/ z+ b
        // 主循环  C8 \  b8 m6 }6 O. G
        for(;;)( h9 @+ o7 K" |
        {
( T: A, D& k. U2 P: o) Y. i
: @6 F. K" k+ ?        }# n/ L3 k+ @9 R* P$ @
}& l; R+ K3 }+ m# T. {* _9 s. B

) r7 W4 E- k3 j9 l5 i; x+ c/****************************************************************************/; k1 `4 h. ~7 z+ a3 W+ d
/*                                                                          */: C/ a$ N$ `, Y, S
/*              PSC 初始化                                                  */8 Q! e8 g5 c4 ]$ _
/*                                                                          */
$ Z+ M8 k$ `. h  d/****************************************************************************/: n* N+ B8 Q& W1 j/ @
void PSCInit(void): R/ p5 H% D: ]# h' u
{
8 b& p. {2 j/ j3 G        // 对相应外设模块的使能也可以在 BootLoader 中完成
7 V/ B5 D" [( ^! {    // 使能 UART2 模块
% \' i" C* e1 ^/ b1 Z4 }" M    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);, w4 N8 g: q% X9 v
}
( u" M: s6 k& y1 W4 H5 l& ?: J8 ?3 V( U& R' I
/****************************************************************************/# J+ h% t# G5 }! Z& H
/*                                                                          */
: c; g9 r5 F) K& |) Y- Y/*              GPIO 管脚复用配置                                           */
2 q" r" v. t" t8 _) z/*                                                                          */+ s2 H6 q5 M! e
/****************************************************************************/9 Q& e9 f) `1 X1 C
void GPIOBankPinMuxSet(void)* W0 X/ ~+ g' |) q5 Y$ i( z
{
2 O+ U8 }; s- O# H( k        // UART2 禁用流控
7 k8 ~4 S: |  u/ b: Q9 V        UARTPinMuxSetup(2, FALSE);
! y8 ]) ~4 _0 X1 |}" j6 W/ D3 D" ]/ D" [1 \! S

4 [6 ~* i) N/ h  m/****************************************************************************/
$ p" d0 \* J% Z2 v9 V/*                                                                          */) t3 c& e  P5 h# N1 C5 p9 _
/*              ARM 中断初始化                                              */2 H% K& \0 X: b- ^; c, ^$ S4 A
/*                                                                          */+ S. G- C3 H* b6 q9 x) U  H
/****************************************************************************/
7 }1 F& ?! Z. L! k- o8 ovoid InterruptInit(void)! h4 \" p; w4 w$ R; f7 G" V, M
{9 ?9 z4 H, P9 i- b' R4 o/ u6 n
    // 初始化 ARM 中断控制器
7 [( t/ N7 O+ f/ t6 ?$ T/ W+ _- L    IntAINTCInit();# r+ C! E: a9 n; G/ {6 ^+ l- q. z

5 i7 Q* O. r% {4 t8 N* d9 J$ U    // 使能 IRQ(CPSR)
9 s* @) ~5 r( b$ U    IntMasterIRQEnable();
1 j/ x/ H% m7 ^  }: z) q6 b0 N, A* R4 k6 L& F. @
    // 使能中断(AINTC GER)
1 t0 o% U( @' Q6 f6 G0 {9 d# {3 r    IntGlobalEnable();
8 G- o( i  G/ H( g! m$ h5 Z3 s% `" R  O" j/ g
    // 使能中断(AINTC HIER)
3 e4 I5 U- K6 m5 A# Q9 x    IntIRQEnable();# L* u- _1 K5 t5 e7 w7 g# c' Y
}
% n3 D' @/ T- G. p/ c8 F
" ?5 Z  g1 P& w. |0 H6 g/****************************************************************************/2 A3 U, n$ K. C/ c+ E
/*                                                                          */: F/ [- D: w/ I( {+ d: c# s
/*              UART 初始化                                                 */
* ^. A, |" v2 o! J, D1 `0 Z/*                                                                          */
0 b9 g# Z9 R) m$ K7 J6 _/****************************************************************************/
) f5 U1 Q7 t: `- @2 {# Dvoid UARTInit(void): h0 c+ U* y& G6 v9 |* u- U3 M
{
  D9 Q. I* z  F. r0 t        // 配置 UART2 参数. m* |* U& R% y# }
        // 波特率 115200 数据位 8 停止位 1 无校验位& W7 r4 @# \' @9 s
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
9 n' f; y# e0 N  A                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);7 g  [( I; X0 q/ h9 s4 F. K
        // 使能 UART2+ s; U7 N) w5 ]" }. a5 ]. G
        UARTEnable(SOC_UART_2_REGS);. j" R  L6 E2 A+ X$ N
, Z* d% r- W( Z" h; l  q5 I9 g
    // 使能接收 / 发送 FIFO* P: \8 |% T0 Q
    UARTFIFOEnable(SOC_UART_2_REGS);$ n: l, P+ a0 w$ f. I# ^

  F% Y; \8 V& h( i7 r3 o0 R    // 设置 FIFO 级别! Y7 V6 n* U5 i
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
$ q4 D+ U; c3 [* a}
5 O( N2 Y. M$ [8 T( H, ~$ {! B& Q) v  w' M8 H3 x& W( h: S* R
/****************************************************************************/
/ T9 W' c' U" _4 \5 t0 t: ~/*                                                                          */0 C9 b. z' F- E. q- k: x2 A1 y
/*              UART 中断初始化                                             */
& f. P9 q7 m- i7 X! L( F6 B, K/*                                                                          */) C& M* v2 V# `$ j% [
/****************************************************************************/
7 v8 D) i4 ~% o1 T) {7 lvoid UARTInterruptInit(void)% ]5 z+ |# i" h0 E' M$ Q. }# ?
{( C9 P, N: b; |9 H. F: y
        IntRegister(SYS_INT_UARTINT2, UARTIsr);+ s* `0 U/ H- V1 A( {. f
        IntChannelSet(SYS_INT_UARTINT2, 2);$ B: ?5 z! o& Z4 O, Z/ C
        IntSystemEnable(SYS_INT_UARTINT2);
8 g2 _, a( N6 s8 a8 H: V6 Z1 B7 O1 p  ]6 v
        // 使能中断
$ O: |+ M. l$ g9 t! T1 l        unsigned int intFlags = 0;& }: J9 s" M: ^
    intFlags |= (UART_INT_LINE_STAT  |  \7 m% _# w& ~* d+ l% v: {6 J
                 UART_INT_TX_EMPTY |    \
% V+ M$ l9 B- h  C* }, R                 UART_INT_RXDATA_CTI);
/ H% F9 i/ x) P, {3 t    UARTIntEnable(SOC_UART_2_REGS, intFlags);7 D3 N) @  Z) R
}6 L' ]' }5 c  S  b+ C
* N) _0 X! G% g' X
/****************************************************************************/& `" |' F$ n* ~9 k, L
/*                                                                          */" W5 W: _2 ^* E1 S; S
/*              UART 中断服务函数                                           */
0 m' _5 ~+ J1 \1 G5 R) o/*                                                                          */
% W! Y( n" i+ a: T/****************************************************************************/% ~' p( C) ~' M/ r/ n
void UARTIsr()
& S/ `5 B# `8 H2 Z{
4 n  W, N9 G1 n) i& l    static unsigned int length = sizeof(txArray);! Y: `: z$ N5 a# Z$ N+ w
    static unsigned int count = 0;
# V! T% f% r; Y: x+ ~    unsigned char rxData = 0;, w. a/ q& X0 z- h2 B- d
    unsigned int int_id = 0;
0 T# b  V) M/ V! L- _' s( `
- _- m: T8 a3 J! }. l' m* T    // 确定中断源0 |; H* R: D3 S% [: G
    int_id = UARTIntStatus(SOC_UART_2_REGS);
; L2 ?. B* ^) q' T# M% K( A; f, H+ c2 c/ u0 ]7 _
    // 清除 UART2 系统中断
. e# N! _$ O: ^$ U    IntSystemStatusClear(SYS_INT_UARTINT2);
8 n7 n5 t' B7 p8 q4 ?
$ [9 n/ n1 I/ o0 H7 M0 ]    // 发送中断7 {) x, ?) L$ q* O  L; f" d! e% F. J
    if(UART_INTID_TX_EMPTY == int_id)
  h+ G4 f$ G6 {/ @5 l6 U: B    {
4 y! R5 F7 p  D( g5 F        if(0 < length)0 \9 x6 u& K' t: e* {, N2 Q# u/ i
        {( H5 i. T  |5 K" C* {# R, w
            // 写一个字节到 THR4 d9 J1 N- Y5 i8 g" Y) a0 [
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
2 I) [, O/ z. s8 H            length--;5 r  j' J0 U5 S# E, z2 Z9 D; F" E9 Y) X
            count++;
$ o/ I- i" H4 K" a. b3 z* h3 b        }
% E3 e4 w9 M1 n+ p) R& u        if(0 == length)
: t6 _2 R, _0 ?# M/ S; ^  j# v        {( S; N8 y8 i! i+ [3 ^1 }
            // 禁用发送中断$ }1 ^( z! [& k7 U1 z2 K3 D% O
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);& |- @0 l. j3 _- d
        }
  O7 J5 `' X. P5 b0 \     }' c# X2 w) _( S$ z3 o

9 u' n4 K' M! J# {0 ?% ?0 ]    // 接收中断
; y* I( M3 R% K    if(UART_INTID_RX_DATA == int_id)" C: `, Z% @9 y% t: r4 T; Q+ s
    {8 t# _7 G7 L3 q0 g: V  V# F
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);3 |) B8 t1 Q+ E- r) Y$ o: \, s
" Z. |: G8 x( o8 F+ ]
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
1 i1 F, ~* a/ {4 @; X7 u6 _* |    }
: B5 R. a# X  }4 D1 ^7 a& X
& A; u8 [" s8 D" h/ W) l# Z/ {    // 接收错误2 `" g- P+ z/ a1 F
    if(UART_INTID_RX_LINE_STAT == int_id)1 A) c. A  k* E* q$ {5 {
    {
: i3 a9 D- M; p# T: i        while(UARTRxErrorGet(SOC_UART_2_REGS))
7 S# J4 w# c2 J6 v: h! H        {
+ u! L! M1 R9 A- `" [            // 从 RBR 读一个字节
  ^" i- M& X, P, r! ~0 g7 Y            UARTCharGetNonBlocking(SOC_UART_2_REGS);
  N; D, C$ P: y$ w        }9 H9 O! G2 h8 A, K) b9 D
    }
/ Z1 k/ H/ M3 ?; P3 a   
& M7 I: ~, ^' K1 a    return;
' q9 e5 Z6 g1 s& w) t. K4 H! L* D}
) s" X* d2 W( [+ P0 X/ @) X
回复 支持 反对

使用道具 举报

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

0 X  i2 P3 M8 e) T' y2 v谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-2-7 15:56 , Processed in 0.052971 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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