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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8570|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
% X4 S# Y5 S5 d; V$ a' o, s0 D( T

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
$ C$ q! o' f3 [7 m8 w# F* z( c7 h4 c% x; B
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
% E! I9 z: t9 a- L% d# V8 }# `( @2 H$ j) y; e3 W
#include "hw_types.h"               // 宏命令
4 A3 c1 A- [- E0 ?  R#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器$ I5 i9 H2 Z2 t4 g5 R
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器9 [$ q8 _# r/ s7 I, Q
3 \2 I5 \  _% N, ^
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
8 J# @  K; h& |% I/ o#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明0 j2 M2 I( ~4 d: T- z/ v. R
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
9 F7 o' J1 F2 ?7 A. U#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义, Z# h( Q* x/ w2 z4 d; N4 {0 e
. c% r/ H+ C: S6 I5 w
/****************************************************************************/; i+ H. L. y1 S4 i& j4 [
/*                                                                          */
% l' `9 D5 }% ]( U! V/*              宏定义                                                      */
7 l) s2 y  n5 k6 M6 c8 {% ^. z/*                                                                          */" I" j6 ?$ d/ ?# w
/****************************************************************************/
9 Y( l" ?& p$ s, C// 时钟) r0 c6 ^6 D3 ^0 z/ U
#define SYSCLK_1_FREQ     (456000000)
9 U3 k7 G1 k4 X/ x6 l8 d, N#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
& @+ b2 T/ X" ~#define UART_2_FREQ       (SYSCLK_2_FREQ)' n/ w; E# c8 u, Q
" _) u+ z2 Z  w/ J8 F
/****************************************************************************/
& n6 O7 y6 i$ T0 e/*                                                                          */6 w6 K8 K5 E# s. U( |. k$ V8 @
/*              全局变量                                                    */" b) x! H0 P4 S# S) O  Z  ]0 X
/*                                                                          */
3 f- [; `; `& n% r8 R; Q2 Z/****************************************************************************/: G. W+ h8 p7 b% W4 H- o
char txArray[] = "Tronlong UART2 Application......\n\r";# s5 L, H* b1 s  ^0 P; v
( u5 R( m/ p, j
/****************************************************************************/
" m1 g% V! b" `; q, ?, J' _/*                                                                          */
# }; c$ @8 H' l/*              函数声明                                                    */
. F0 L: p9 _' k* r/*                                                                          */
3 D7 f+ G; N% J% ?9 ^/****************************************************************************/8 r. V7 l+ K# c* K2 ?
// 外设使能配置! X6 U9 E6 o1 V4 a" N0 g
void PSCInit(void);
+ r) |0 J4 u' s
! n' {3 X) Z6 ~. _0 n. d, o// GPIO 管脚复用配置
# x1 P- M& h- A& {% pvoid GPIOBankPinMuxSet();! X+ c, @' H5 L; e2 A# C5 D$ i
- M3 c, _$ ?6 E9 K9 v
// UART 初始化8 G$ i4 A$ n4 l9 l8 H! f. q4 U+ o) w
void UARTInit(void);
) a' \& h8 _% F. G  d6 K// ARM 中断初始化
, ?- E; `2 A. bvoid InterruptInit(void);
5 T' h0 g2 N1 {2 F( q" x8 V: W// UART 中断初始化
9 \6 f% p" W: Xvoid UARTInterruptInit();
( ?. o  H& ^) t  e" C* L// UART 中断服务函数2 Y- B3 k/ `) u: J8 Y
void UARTIsr(void);
' I% ~- r, @2 A9 t, s$ ?( }' W9 x$ E  g/ q8 V
/****************************************************************************/
+ h2 a  a" ^7 o+ q* v$ m/*                                                                          */3 G) w7 N& H/ c* L! P( z  u* b$ [
/*              主函数                                                      */: N0 K, x: e: R2 ^3 k' [
/*                                                                          */3 H8 {$ y$ j9 p! B6 a
/****************************************************************************/& P9 r3 c$ j( p% {! U" Z1 t
int main(void)6 R. c4 ~4 s- v0 z
{  V0 F& O8 R8 x, t: U
        // 外设使能配置' ?7 V7 W/ ~$ X9 K* @
        PSCInit();+ x0 y. z1 B; O3 [$ g
        4 [; L$ Q7 x- I2 H* W
        // GPIO 管脚复用配置
; [- q4 B) D% w. o% }5 x$ X        GPIOBankPinMuxSet();4 a( _9 ?- b% c7 A( d$ i2 }

4 c5 }( @$ ?/ e) x$ n        // ARM 中断初始化0 W3 t( R* w4 S4 Z7 B$ d
        InterruptInit();
$ R% ~# f! C5 E" W* F" a
' T- w5 m' ~) ^9 H$ p+ y4 ]        // UART 初始化
: n, ~2 O2 J' k4 e  L/ Y, R$ {        UARTInit();
, F* q0 v9 C' \) x* W( Z; i$ U* t  }7 C8 O, \1 r2 R% [
        // UART 中断初始化
; l0 q1 ^3 `$ y" o        UARTInterruptInit();/ T: d# u# Y# {  m+ u

, l  U. W  @/ h, x! o5 i& D4 V        // 主循环* E$ Y0 ?: d# d6 g/ H5 u% {! [7 b
        for(;;)
) e4 o* J3 w) W, p! t6 z        {* m- M( i3 m4 v  u

+ w3 {/ X. O- W        }
8 O' x  A- L0 @5 s}
- l) |  T' }9 ]/ N: P7 ?) f) x# X: T8 X$ {: M
/****************************************************************************/9 Z! C! ^5 m7 }
/*                                                                          */0 Q9 w: ?/ H/ u9 V
/*              PSC 初始化                                                  */
1 ~1 G  ?8 R" Q/ e/*                                                                          */) Q6 B& a. z  Z+ D
/****************************************************************************/, v8 K. o" \* T
void PSCInit(void)9 q! \1 L5 n- d: y' N! t5 X0 z
{
6 C9 k, D$ S3 @& r        // 对相应外设模块的使能也可以在 BootLoader 中完成
4 x/ d1 t1 o* _$ E; Z- o, g    // 使能 UART2 模块4 N$ b& l7 W' Q3 ?! W; [) E
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
$ {- a  J# ~7 _  _/ `}
( k, F% l% D3 u" H3 m
% ]& k/ o# I6 n  L; p) L. F/****************************************************************************/  [/ `9 Y+ y4 `+ E
/*                                                                          */( N$ s- x, U& [
/*              GPIO 管脚复用配置                                           */
9 [. }3 Y1 W0 q' @8 Z/*                                                                          */
% j- G/ z% D6 f( K' H7 g/****************************************************************************/. B: l6 h) P+ v$ U5 h/ N8 @
void GPIOBankPinMuxSet(void)
) t" H* B: M# N/ i: A{8 m6 I+ j( ~, f# G( p5 i: g
        // UART2 禁用流控6 b6 R  F' i9 S( P2 o
        UARTPinMuxSetup(2, FALSE);/ ]. W9 Z: I: b" v5 H
}6 \+ w' M  D* F" p9 Q" n

) c' Q3 w0 \9 t% R: P/****************************************************************************/
. S! {6 B+ p) X. ?# p3 L4 I/*                                                                          */
9 M4 o, v% j3 R7 {% L9 O; Z8 [5 c/*              ARM 中断初始化                                              */
9 O7 m) o  f$ t3 n3 l+ {/*                                                                          */& Q* z5 v4 a7 K) [' i9 V+ D  u
/****************************************************************************/3 Q5 y! z4 r2 t1 C, \7 H# F
void InterruptInit(void)
* a# T0 {4 _' y& ?# l7 |3 ^" V" a: G{
' ~6 @+ d8 Q! s: `0 K0 |/ @    // 初始化 ARM 中断控制器
: j- [' G, H' r) z; T$ ~    IntAINTCInit();
4 N; A" e5 g2 h1 a1 d: ?9 q% f- k2 m1 m
    // 使能 IRQ(CPSR)
$ L* k7 e; ?; w" K    IntMasterIRQEnable();0 _# c3 A+ A: ~9 e1 y
( }! K7 h  Q! q& e, {
    // 使能中断(AINTC GER)! _4 H$ v) f3 ]. n
    IntGlobalEnable();
2 e; F) i6 K: A, N1 b
: d5 X# ^0 p7 k9 j5 N6 @. `, @    // 使能中断(AINTC HIER)$ a( a9 Q2 I+ s/ j2 K2 _
    IntIRQEnable();
! F1 @: T* _: O; O' R: {% r}
; [5 {% ?$ W  w0 W
9 N5 x) T3 U& b6 `( ^5 i/****************************************************************************/
. d! p- y) T. @" R/*                                                                          */
! C2 x4 E! W% h# g& R, `; B/*              UART 初始化                                                 */1 X& J  w: `( Z; ^0 |# q
/*                                                                          */4 z/ A6 K$ C. z% z- \2 N
/****************************************************************************/: J% q: i/ p& ~3 [# c  w. r
void UARTInit(void)8 ^( S1 O3 t# W+ C+ ]2 S
{
" p3 e. k1 }; _        // 配置 UART2 参数
0 f3 i( \; Q" X* F& U        // 波特率 115200 数据位 8 停止位 1 无校验位
0 O9 R' O5 w3 n! Y    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,  H4 a; q' V  U% w
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);' p% J% K! Z( X* ^8 d4 d4 O
        // 使能 UART2- H* @% Z4 O3 x* q
        UARTEnable(SOC_UART_2_REGS);
1 P! \6 z# N: M$ T
/ Y6 o2 c# w: s. Q0 Z1 L$ z  M    // 使能接收 / 发送 FIFO
4 b# u1 b: y' G- L" h    UARTFIFOEnable(SOC_UART_2_REGS);
4 |( f: g  |6 D) ^' [! v+ G4 L# Z+ b5 Y  j- a
    // 设置 FIFO 级别
) R. T6 Z/ b8 i2 j4 X: c7 L    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);  p0 c' P3 ?% h" Y  [, [* S
}0 g& {. r5 h( S
# S' [, C) k2 i" H% x' F* \2 t
/****************************************************************************/
7 Q- G; }8 M; ]/*                                                                          */
  Z; r, _9 F9 o3 c7 x( n3 n/*              UART 中断初始化                                             */$ P' v/ {7 V' M8 W# j3 g
/*                                                                          */$ a* t. }. p* X5 e6 f
/****************************************************************************/
: x# |0 M  C7 m2 R+ {8 V) ]. jvoid UARTInterruptInit(void)# p6 x  h- k) Q+ s
{
7 |! X' w5 J' j1 Z# I5 d        IntRegister(SYS_INT_UARTINT2, UARTIsr);
. A/ U* r1 F6 Q; g( z        IntChannelSet(SYS_INT_UARTINT2, 2);# |8 x1 W( p; t  u
        IntSystemEnable(SYS_INT_UARTINT2);$ U" ?! ~4 a( N2 g3 R+ m
% g' X. U2 H7 \7 I
        // 使能中断' ^  O! e0 R6 H$ p# {
        unsigned int intFlags = 0;" H# G; P, u, C+ `0 N% A" |! e5 V6 e
    intFlags |= (UART_INT_LINE_STAT  |  \
! K+ G3 B1 [; N& ~2 v$ ]/ ]$ \                 UART_INT_TX_EMPTY |    \
! e' }: p% ]  E                 UART_INT_RXDATA_CTI);
1 c$ m# ?8 c  F. N! }5 Z7 F    UARTIntEnable(SOC_UART_2_REGS, intFlags);" f" N% w% z* E/ b- d4 z
}4 J$ c# s. m' g+ h1 Y6 S2 G6 }' I

" g. n" d1 A8 F7 {2 G/****************************************************************************/
, o+ S" z! N4 Q, {7 O2 }# h/*                                                                          */
0 p) I. B- H7 g6 v% @. K/*              UART 中断服务函数                                           */) K- A# d& ?* w1 ^; E
/*                                                                          */$ N$ h% y" \0 H1 K5 F; S
/****************************************************************************/; C0 h% l8 F# q- G. a
void UARTIsr()! `3 Q  ^$ S! J: w; L& n
{7 K, g) f% R8 u0 w6 o
    static unsigned int length = sizeof(txArray);% x' ~' E+ Q& y  H4 E  {
    static unsigned int count = 0;
& T$ a$ {$ N$ P" [7 f' a6 z- e! N    unsigned char rxData = 0;
- k, k  p; l& K! N. b7 u    unsigned int int_id = 0;2 [4 H4 v: G3 S: o* O

) Z3 a4 @7 e4 l$ [    // 确定中断源
% b6 L3 q' ^" F) [    int_id = UARTIntStatus(SOC_UART_2_REGS);, T$ j9 u6 p% I* U1 e( m# x

) ], r" \4 u5 ~. P. k    // 清除 UART2 系统中断
& _) @+ Y+ E: p6 j    IntSystemStatusClear(SYS_INT_UARTINT2);
4 c6 }) ?4 p8 x1 Y8 X, `, o
$ B  Y/ y2 o3 ]& r    // 发送中断
: K/ ]! r# w' K% ~6 _# ]    if(UART_INTID_TX_EMPTY == int_id)
% V% U/ @# L" b- J* h& k% V    {6 e) C8 j6 ?# L! B$ N4 T
        if(0 < length)
* k/ x' [8 r* Y6 ^; m3 R        {0 ], w0 ~( m! _: ~* l
            // 写一个字节到 THR
+ v% k; D# e) r  e5 M            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);+ B4 X1 X+ |0 o, j0 B; S
            length--;
1 Q8 q; A3 Z6 U3 V            count++;
; f/ K8 \0 p- m+ _& T        }0 s1 f' [3 [# J1 }5 R6 z% _
        if(0 == length)
2 L7 U3 _2 Y& o( `1 Z, t        {
& d7 j! \9 A7 O+ h& |. ]            // 禁用发送中断$ ~3 H( h' _0 r& c& x$ W
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
' Q, i0 q- \# ~1 X        }
1 C% @* s; d0 X' C" M4 Y2 y8 n     }6 B" n. f1 V3 i: ]

# T3 g/ J5 F8 N" W3 j$ _- }    // 接收中断
6 Z; d6 |( W8 z0 l- Z+ ?$ T    if(UART_INTID_RX_DATA == int_id)
2 ?; \" \" a4 a8 M. ^- B& p" q1 R    {0 P7 |8 k" @: Z8 K$ }/ c% G# A
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);& a- w2 b4 o' [1 @7 [
; Z1 j( s9 z2 V# A% X
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);7 T2 O# x+ v8 l& V4 R8 V( H
    }, {, {( w8 \+ z  V( ]# V
8 f9 i9 b. x  X: f
    // 接收错误/ _! j* `( q# h/ c6 e9 k3 h/ A
    if(UART_INTID_RX_LINE_STAT == int_id). m) k1 `' L. V. \
    {
3 }9 ?5 o( t( Z        while(UARTRxErrorGet(SOC_UART_2_REGS))% J  O3 \" v) I( v
        {
5 a4 @* L" {$ G2 [" [            // 从 RBR 读一个字节6 B6 L: J, s8 |  c
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
: v, S, F* N, {' s% j) o% [        }9 w) x4 `& c! a# W6 |( c' x3 d& x
    }
$ H- i# q7 I' j1 Z) a   
+ k# Z  s7 p4 i/ u5 C' K2 G    return;
: N9 E; A4 L2 y5 Q# N% H. @}
( ]( U. A- O; V* W* Y
回复 支持 反对

使用道具 举报

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
1 E& R8 \( S2 b9 d如果其它设备快速给你发送串口数据,你这边能正常通讯?

6 W3 J: ~% b; d" `谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-2 06:50 , Processed in 0.042243 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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