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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5652|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
  F$ u, c' C3 o, f# u' A0 I

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 显示全部楼层
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
/ Q- ], M# O+ P5 e" l* a+ m% q
! E  V9 {3 d8 A8 `#include "TL138.h"                 // 创龙 TL138 开发板相关声明4 j" d$ s5 T+ l
/ T. m& s+ H3 g' w% t$ j
#include "hw_types.h"               // 宏命令, S6 g( [$ u4 t. {+ K* |
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
, r$ j" X; }, D- J#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器' x4 I. m5 C& s0 ]0 S$ q$ E& ^

' Y7 X8 l7 C2 o9 ]$ V: l* F" w#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
  @! e7 O3 ]7 V  @" c% \#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明6 l+ D: `: p: y( |% x2 j+ W) s9 A
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明" l+ I; u8 u1 n' e, w
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
+ M7 ~! M8 {* w+ l8 B0 @  @7 B  A" [& b! X# \: X0 n# i
/****************************************************************************/
/ ]2 U0 a8 R" c2 F8 x; u& x. X/*                                                                          */
) A2 Y( C& A' m" \9 x; x+ d& F5 @/*              宏定义                                                      */+ l4 z/ c' ~; \1 t! T: F5 p
/*                                                                          */! `, Z4 _8 y9 K0 f! |7 s6 s
/****************************************************************************/
+ }7 I- h. c& Z( e// 时钟" g1 G4 S  ]" Y* a( u) H& R
#define SYSCLK_1_FREQ     (456000000)! p; P' |$ V' h
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
+ L! T  H  j$ N6 |#define UART_2_FREQ       (SYSCLK_2_FREQ)$ l) _- w) o! f
; t  e( s* Q* }* [
/****************************************************************************/
1 F: h6 e9 c  f9 X/*                                                                          */1 ]' ?; s9 _: a7 {( K. V; C
/*              全局变量                                                    */8 ~' C, Z/ h5 A! b7 t7 o0 y
/*                                                                          */( T: p0 |% M2 x- ~/ D( {
/****************************************************************************/5 _5 v2 ]; W: {" c9 V
char txArray[] = "Tronlong UART2 Application......\n\r";
! J$ {/ \1 H8 \/ E# ?  @( Z, m- j( f3 {: H, o
/****************************************************************************/
9 W0 X( q3 Y6 p8 z$ Z/*                                                                          */
( B( e- @" _# _/ D. c/*              函数声明                                                    */
) {3 d( ?  H4 R, h/*                                                                          */$ X+ S* J5 x' k. I. L
/****************************************************************************/
' }9 |  N4 d' R$ Z9 Z// 外设使能配置
% M2 r% J" {" P: U1 @void PSCInit(void);
5 ?/ t  t3 }% [8 O5 v0 P3 l  k7 A2 E4 j6 U' ]7 p0 C! D
// GPIO 管脚复用配置1 V! f' @. d$ g: Y3 ~; `0 W
void GPIOBankPinMuxSet();
$ e' m0 X) z4 Q
8 V1 Z* z- ~% j% G. d// UART 初始化
0 e+ N% ~* q! v: pvoid UARTInit(void);
: c/ j+ c; e& b8 E+ R& I& z) n$ O// ARM 中断初始化
" q% m' G/ j9 T3 P9 Fvoid InterruptInit(void);
3 G# o! g  K- B2 w% Y// UART 中断初始化
9 K( m4 f: a- }. i9 @9 A$ [/ T9 dvoid UARTInterruptInit();
* _% Q5 f) O6 g, J# f. q; A% U/ ^! G; m// UART 中断服务函数3 w4 R" D# ]5 o( E3 c1 e
void UARTIsr(void);
# ~, [- w( f/ Y1 p$ g' B, B
$ S' p  n" |( @: V  J6 r/****************************************************************************/- t7 |: ^% W3 e5 @- k. I  d8 L7 s: ^
/*                                                                          */, v/ f7 E% ^: o4 F5 O
/*              主函数                                                      */
8 Z' @. @/ D1 N  u! d0 [" i& T: I/*                                                                          */& D* R2 o! z) {1 r$ t
/****************************************************************************/
/ b3 h; V" e9 [2 ?, Z0 l/ u) [int main(void)
# R, E8 {5 y4 M4 q  K4 G6 U{
; g7 t  X% `: F  A9 D        // 外设使能配置
5 G  p% R* N  I  r0 m, q7 F        PSCInit();
; e/ j) E$ v3 }1 ^  v8 }. |       
: S4 E8 A+ `( s3 K        // GPIO 管脚复用配置
9 C/ X8 \+ h  I& A        GPIOBankPinMuxSet();
  h1 e% Z8 n$ l& g5 p8 X
2 j! y$ c6 `2 {  I        // ARM 中断初始化
! H3 J3 u# g/ K+ S8 z        InterruptInit();
4 G. s  F9 }! y* B& M2 W/ s$ |9 T% q
$ O3 B" A, _1 U$ T1 O& P        // UART 初始化0 R' [1 |- [& O0 w
        UARTInit();
' p! |% u- L; _; r* k
/ s) o# p0 d$ a, N. V        // UART 中断初始化% ]! W3 r9 ^* |, S* |1 w
        UARTInterruptInit();
3 c; n' `2 ]# [1 S: u1 F/ n: P/ m+ [2 K
        // 主循环
, |3 ^0 _1 D1 I& q( k3 G( s        for(;;)& T. H4 n3 f) ?: F4 W
        {$ a( _6 k# w% w0 f/ z$ Y# f$ {# K
  Z9 |/ c( ^3 \1 L7 ^% o
        }
" o$ @& w( o1 c8 r}
" [! W! I- _. O0 q  i/ z, A' l  t+ b5 G* f
/****************************************************************************/$ H8 B6 @8 C+ b% w. c
/*                                                                          */& X9 X7 ~8 W* D1 h: E6 J
/*              PSC 初始化                                                  */. t+ W. X' {' N" f, p- c( O
/*                                                                          */
$ P5 b. v+ d5 x/****************************************************************************/
: T3 i4 _" G$ c& H3 vvoid PSCInit(void)
+ V# P) M5 y, Z- K6 E+ ~( f{5 P* F; A+ d" M/ ~# x
        // 对相应外设模块的使能也可以在 BootLoader 中完成
! U$ |. U3 W6 V" B    // 使能 UART2 模块
$ M5 ?6 [- P% ?  O    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);. H3 b+ ]$ g8 i+ f( |
}* E6 s% M' X4 Y

" Z& {- l5 v6 M! B! s  h$ r/****************************************************************************/
) d  p( d8 ^6 `! x4 N5 m6 z! k9 e/*                                                                          */2 N; I& g: j+ {& o! J# L
/*              GPIO 管脚复用配置                                           */
& I% K2 i; ]. `: u& \/*                                                                          */
& [/ J; W2 ?, [/****************************************************************************/
) z  l% E4 U( Q! b# cvoid GPIOBankPinMuxSet(void)9 h: E: _2 q% u, _# ]0 k
{$ H: w8 {- L9 H' l9 M
        // UART2 禁用流控) z1 u) C7 B9 {
        UARTPinMuxSetup(2, FALSE);( B8 H; g- q% Q/ @2 ~: `' l8 b/ b
}
- v& z: Z& t4 ]. F% i
9 T) k- `1 _* D' b/****************************************************************************/6 c7 o1 {5 D5 c
/*                                                                          */; e5 F  s; H, d5 L% M9 G* D# b- p1 {# u
/*              ARM 中断初始化                                              */2 S) e) U1 g# \, k: z2 {9 O
/*                                                                          */
2 d; g- Q+ {! t" m/****************************************************************************/' r8 p9 _$ G" V$ _. X, w1 m2 j4 _# T
void InterruptInit(void)
- Z" A. u! v2 v{
( Q8 O) I, W9 T' ^( y1 Y    // 初始化 ARM 中断控制器+ A" y/ w+ a$ n( ?& s8 w  y/ E3 A
    IntAINTCInit();
7 _- |: L/ q5 |7 ?
& x9 `, [- M3 x0 x. L    // 使能 IRQ(CPSR)7 r. J8 p) U$ u% {; c0 c  q
    IntMasterIRQEnable();! b6 }" x: I4 `8 e& h* S

9 w6 Z% w. A# j5 M    // 使能中断(AINTC GER)2 Z4 Q4 _: U, C7 |! x: {
    IntGlobalEnable();
; H1 @0 S" Q, T+ X
, Q3 N" ]4 Y& y! E- m" E    // 使能中断(AINTC HIER)
. n. [+ @9 k  l" K; d7 K    IntIRQEnable();
9 g7 m' T) z7 u- Q0 d}' I2 g" h+ j4 v% O6 H- V5 L

* ^% N7 S0 j7 N/ x0 i* s/****************************************************************************/6 A, a  c6 [/ N% B, o' ]  a/ c) d
/*                                                                          */
& y5 i" `3 G% X# ?/ P/ d. \/*              UART 初始化                                                 */
/ S+ r. r; S# U, B7 |/*                                                                          */. o: d* `/ ^3 [. g: N2 b
/****************************************************************************/6 @" v* {' E* z5 `2 M% w2 M% W
void UARTInit(void)
3 L: o0 A# P0 Q* P. U* u' Q{
8 ~# H) J: g& M; h: U, x) h        // 配置 UART2 参数
4 V  s# y" e$ a7 q        // 波特率 115200 数据位 8 停止位 1 无校验位
% V$ B8 j3 l; f' m9 e    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
' S2 z. `" O) ]# Q1 A                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
2 d0 H( g" u6 X; i- u5 ]. z        // 使能 UART2  M$ |2 k- Z: f5 y4 N+ [
        UARTEnable(SOC_UART_2_REGS);7 F. F2 T; g+ W- e9 W; O: N/ B
$ o/ J* {' I% e
    // 使能接收 / 发送 FIFO
/ V+ Q6 ~+ c+ N- P- H3 }# @    UARTFIFOEnable(SOC_UART_2_REGS);* f" u& Y, w' K# ^3 y
" P2 Z1 m# X% F' D! u
    // 设置 FIFO 级别' L& @+ W" t& r4 {0 v- ?$ Z
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
0 ]9 _. t2 X9 F8 L: ]# O0 F}! ^" j" L' r2 L/ s+ ^# F8 N" z3 E2 o

' C- Q, a- V, e, L+ q, f) H2 l/****************************************************************************/
7 F7 ?6 G7 P% P! ]) n6 k/*                                                                          *// A& ^3 f) n  Y$ b( u
/*              UART 中断初始化                                             */
% ?$ [4 J* i" V7 Q( Z- v( P& z4 p/*                                                                          */) u+ y2 k2 c. e0 q
/****************************************************************************/3 W! \$ A( u1 y5 y# ~0 U+ {4 v
void UARTInterruptInit(void)& j. B- ]: I: a# S$ L; R4 U5 B
{6 K$ ^3 K/ g% u' [* @8 o8 Q' y
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
- _( @& ~6 e8 [/ N3 e5 f        IntChannelSet(SYS_INT_UARTINT2, 2);1 U+ U2 v& G- a. Z5 R; s% v2 z
        IntSystemEnable(SYS_INT_UARTINT2);8 M, d& A* r0 Q5 n

" _2 b( o9 E6 E2 z  e7 [        // 使能中断4 P7 Q8 W1 X0 ~1 I2 u
        unsigned int intFlags = 0;6 B8 d) \: ^8 r6 D+ ^4 w# [* H. A
    intFlags |= (UART_INT_LINE_STAT  |  \
, A1 p, Z1 E+ B$ i, p* V) I                 UART_INT_TX_EMPTY |    \
# u% m9 A. t' s" d                 UART_INT_RXDATA_CTI);7 D  O2 W, F  [  ^
    UARTIntEnable(SOC_UART_2_REGS, intFlags);, _' X  `  l2 L* y( ^. u! m, K5 N
}
" ~5 u2 [8 {* Z
) D* B/ l8 Q2 |: b" r  M/****************************************************************************/
( j) G: I) z& k0 C/*                                                                          */; @# a5 O  a+ P, E8 l; @
/*              UART 中断服务函数                                           */
( _- s* _3 g6 V; u- f/ ]* [/*                                                                          */4 P6 s0 ?! v$ a# Z2 {
/****************************************************************************/
% B$ n! G, d- S: ~- E5 ?void UARTIsr()8 m$ N. S# E* `3 m
{
% A) e- v* z; d3 H    static unsigned int length = sizeof(txArray);0 D9 c8 x* u$ I1 [
    static unsigned int count = 0;
3 R0 x& w" _( k) h# X' ^    unsigned char rxData = 0;
9 }, u6 G) b: f; N5 d' A9 h    unsigned int int_id = 0;
3 ?1 r/ F- N, x
; t# s+ b  Q$ _% ~    // 确定中断源' M$ Z4 ]! w( M: Y6 f0 |; j3 S$ W1 ~
    int_id = UARTIntStatus(SOC_UART_2_REGS);
3 K  |8 Y8 \- T1 S9 I7 N2 c+ p. K' `) n
    // 清除 UART2 系统中断
* P) z8 M2 C3 b  P8 p+ t    IntSystemStatusClear(SYS_INT_UARTINT2);
+ h" g6 z2 G  h7 z
! I* D3 \5 O; a    // 发送中断' d+ @: G1 }8 ^" y' h5 l' |
    if(UART_INTID_TX_EMPTY == int_id)2 u5 k# {; m# @( j; l8 e9 I+ s
    {
/ A  x, h; R9 `  A8 b. C( Q        if(0 < length)
3 E% R4 R- {) }# B        {
  A8 G6 P' a! m& _3 ^% e            // 写一个字节到 THR& ]  a4 U) T& i- v8 B, k. M
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);* |5 G' }& W0 B; M" a
            length--;
( K( V7 t8 j9 |) [            count++;( k4 e5 R- A# @* ?8 M. J9 G
        }7 j% E$ w4 ~; H9 R, m
        if(0 == length)
  ~$ g$ d7 b* j2 H! C        {( s+ g& @8 n' S6 ~, g  P* G; ]+ r
            // 禁用发送中断% W( i4 Y. L: Q/ f$ }; h/ C
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);1 W- o, w( q3 Z, X! x" N  ?, X! [0 `
        }8 i0 q" I: q  u- [
     }9 ?$ ^2 A- R/ e. o1 r* n( ?

5 O0 o. p7 \' y9 v; g    // 接收中断
: p6 G& o8 Q6 w, K    if(UART_INTID_RX_DATA == int_id)2 C8 {, Z9 l& K4 m6 D+ C' P
    {
, w$ M. [9 B, {; E  I; j( P5 n0 g        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);! `  O0 v" H( u0 H1 d  f
( N  E4 k4 m' f+ [  q, K5 W
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);7 ~  F! T  L$ V# d. }
    }2 k& D6 O3 {& @1 B

. H- r9 j" o5 L/ m- p4 W    // 接收错误' w7 h9 ?" a' e) b) ~1 e
    if(UART_INTID_RX_LINE_STAT == int_id)
% M) J  |" R6 c    {8 v. X- K% Z" U# `% G6 Y" j7 w
        while(UARTRxErrorGet(SOC_UART_2_REGS))* e$ A; _2 R+ A1 _/ m
        {9 ]6 k0 m* h- k' d; G! U
            // 从 RBR 读一个字节
0 E# {( m& ?, h8 G) A1 R9 p" k            UARTCharGetNonBlocking(SOC_UART_2_REGS);
3 T5 p1 P; `7 f. k6 y% [# ?        }. x' d) c4 x. \' b# z
    }
* L1 Y- @9 g: M) Y" S   
/ j4 t6 B1 o  u    return;- ]- @! f( Z' M" ]
}8 d6 ~0 H4 v1 M9 g3 l
回复 支持 反对

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
板凳
 楼主| 发表于 2019-5-5 22:36:34 | 显示全部楼层
785235014 发表于 2019-5-5 22:25% N$ a4 L7 T6 D5 e
如果其它设备快速给你发送串口数据,你这边能正常通讯?

7 c$ Q9 e9 c* ~( V% s% d9 y谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 03:53 , Processed in 0.052278 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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