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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5590|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。6 L. ^7 e' s7 t

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 显示全部楼层
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
5 w3 S# o2 M: v7 Q4 Z
% z" W* h9 k0 \#include "TL138.h"                 // 创龙 TL138 开发板相关声明% o- t$ J5 E- L, S* P; q
' D# B- G' G! k% X' k
#include "hw_types.h"               // 宏命令3 _  B* h, x5 m: {/ i2 y8 d" s
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器; v+ M# t4 j& M) _; V3 z
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
  e. @# d6 x) O5 O' G6 J
8 ~+ x9 d' j* [7 y#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
2 Z& a4 H" O# J0 H+ N+ J. N#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明$ i: l9 G2 n3 S' C* e8 q" `( z% v
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
4 M/ h) e$ H% l  m% ^#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义# \- `& x2 L: e0 Z0 e! L

" C( E9 E4 y/ o, a- d/****************************************************************************/
* J3 b: e$ r8 ~% A/*                                                                          */
' v* x; R9 w) E% R1 l& z3 N2 b% X/*              宏定义                                                      */' ~' j" a1 J2 M/ @* y  m8 w3 L# a
/*                                                                          */$ [, z. L$ I4 n) ?' P
/****************************************************************************/6 ^6 E8 U/ e* ~  Z4 E! `* j
// 时钟4 r" N' P( b! f5 e3 N$ t! ^- }
#define SYSCLK_1_FREQ     (456000000)( _) z' e0 Y" I( a4 a6 Z
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)4 A4 f/ n" @' z- I6 q" d% k3 c* T9 V
#define UART_2_FREQ       (SYSCLK_2_FREQ)% R; A' |0 ]8 `7 E. l: i
' w" l" A; q2 i4 ~% f/ I
/****************************************************************************/, F& Y6 ^6 E  p: f& {
/*                                                                          */
2 }! \1 a! s6 j& [1 f" C+ B/*              全局变量                                                    */9 u- d3 _% D$ R+ C$ U* x. }0 m
/*                                                                          */2 x4 y0 i" ?# t1 P. }
/****************************************************************************/
; O. O6 ]! d. e; Y  Z- ^$ echar txArray[] = "Tronlong UART2 Application......\n\r";
9 W% i6 n5 ]4 _: Z5 }# w3 f8 P6 f9 `/ ]) r, F+ Y' X
/****************************************************************************/1 P$ \+ c' N7 `
/*                                                                          */
. Z- p7 ?/ `, \7 }4 o/*              函数声明                                                    */7 K" E+ c1 I+ M8 [
/*                                                                          */
+ ?/ k, p3 @. }: \/****************************************************************************/
$ W( [* ^. ~3 v// 外设使能配置
- H" Q1 f, M4 K9 xvoid PSCInit(void);  x0 T: ]  z- n; Z4 l

5 k+ j* ~; t/ w# @// GPIO 管脚复用配置
4 O8 Q" \) L8 {, Xvoid GPIOBankPinMuxSet();
" h$ \/ B4 E! K) h7 N4 N2 z9 F* H& A2 }# w: d
// UART 初始化
% r3 K8 K4 Q* B8 V" f; svoid UARTInit(void);
1 y$ p% e. m+ @* W' a! u# ~// ARM 中断初始化  e# p, [6 R4 O5 y2 S5 Q0 i4 W  d
void InterruptInit(void);7 B- X: a- Z" {  |
// UART 中断初始化
  f( l  i# t7 V, v1 h: zvoid UARTInterruptInit();
2 U( u4 w. S: q2 O* d, k// UART 中断服务函数
0 e' v8 B2 o% {. _void UARTIsr(void);/ d& i1 L* p4 {+ q8 E+ s. B

  F3 o' y: F% }% }$ v1 b4 x# f/****************************************************************************/7 _( b$ `# R" Q" S
/*                                                                          */
7 i9 i: J3 y. B/*              主函数                                                      */) r0 g3 F: W3 R- ~. R
/*                                                                          */1 z! |2 R* O6 {- o# u
/****************************************************************************/& \2 p! B/ _' ]  D  u
int main(void)9 _, m/ j5 p) Q% J% |6 O$ L: |/ [
{9 U! w  z; O, G0 U
        // 外设使能配置4 x8 l' A. q4 r: U! \8 `2 w
        PSCInit();
( ], X5 x( I$ Z+ K' w' d  C1 H$ C* Q        / R, w2 r- {5 F) Y9 o
        // GPIO 管脚复用配置
) Q8 @9 K: Q1 O4 Y3 N3 D7 s        GPIOBankPinMuxSet();9 R- Z- \$ ~# s. J4 N
$ P9 A8 D) ?4 U# c, g
        // ARM 中断初始化
1 `5 C) W# D7 T) W" U        InterruptInit();& T; h/ A& ?  f: K$ ^% j, X2 x
% t9 D3 X9 \' d8 Y
        // UART 初始化5 a8 c- j8 H+ Z3 K- D* c
        UARTInit();
4 j0 t, B5 }0 |5 P
( D$ }4 y4 u9 [! o% {/ y$ O9 I        // UART 中断初始化
* e+ j; T. M( j" H' c4 |  M, d        UARTInterruptInit();; f" `; o' Z8 [
8 Y( F  C& X, h0 B6 i0 F& g
        // 主循环; p. G1 |4 r7 [4 t- q" l
        for(;;)$ Z8 `# V' C1 B* z( }' ]$ K  Y
        {
! E9 P" u5 ~2 ?, p& J5 g$ l) j. ~
+ ?7 m# @& X2 U" y* k8 j        }* B6 a" v& N4 m& ]
}
% F4 u6 |. @% W0 t# r4 @0 r. P
+ k4 p# y/ x3 P$ X6 M" ~- {/****************************************************************************/
" P3 H4 u4 Y( N% r& ^$ p/*                                                                          */  [0 u1 E4 ^0 R& Z  z0 G
/*              PSC 初始化                                                  */1 x9 e  y, L- o1 `% f
/*                                                                          */
4 z% q! r4 p% }/****************************************************************************/2 t' p4 _: N% d1 w' o# @
void PSCInit(void)3 l- B2 m/ c3 m- n. K+ n& Y
{
5 v( s9 {% }" Z  e* E" J" T        // 对相应外设模块的使能也可以在 BootLoader 中完成
; A. V1 t$ [) y. ^$ O# n    // 使能 UART2 模块& D4 L& a- i; S- ^
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
! `' r% i; n5 V' q* D/ e}5 z" Z9 f/ X; V% \+ N
1 s  E# p6 z3 j5 i( A$ R2 h
/****************************************************************************/
7 e+ H2 _# n% V3 ]8 \2 `" _3 C/ a/*                                                                          */6 a4 S, P9 `9 ?
/*              GPIO 管脚复用配置                                           */
3 `. [( b6 h" O$ Y% T: T. s6 m2 r/*                                                                          */+ B) P& ~4 x, T5 I# H0 c
/****************************************************************************/
5 S  U5 ?9 U: R5 x& v# \void GPIOBankPinMuxSet(void)) O8 V9 K* A. w# C
{8 _/ E" c) e. C/ }" G5 `' q
        // UART2 禁用流控& d  t* B5 ~  k( M! b& j1 q
        UARTPinMuxSetup(2, FALSE);
6 B3 Z) Q+ v! d! _/ A1 F}' f4 o3 \3 x  g

3 w: }9 g" j, B: X7 e8 B: l3 ]- x/ l/****************************************************************************/4 Y9 f: m# D/ c9 X% y0 ?
/*                                                                          */
! t' ^7 [1 T: @# f! f/ K- x/*              ARM 中断初始化                                              */
1 c7 S; g9 L& ?/*                                                                          */
0 {0 a* W. m; Z0 o/****************************************************************************/
. L, _+ _; L% j8 N2 h# w3 S! Yvoid InterruptInit(void)4 _8 O( m" r) j8 ]" m
{4 X, M/ o- p! g* L  _
    // 初始化 ARM 中断控制器
0 x, G6 \) A" }2 _3 k    IntAINTCInit();1 G# C. V) B, a

# n! f8 j0 i/ ^2 @" D# k' W* `    // 使能 IRQ(CPSR)3 o+ B) L) |, x  s' a! ^. V# U: j
    IntMasterIRQEnable();
# l0 r6 o" R" y% R* P  l  I" {/ |& ~9 M2 m. r
    // 使能中断(AINTC GER)
# x. H7 ^9 f" `4 {2 p    IntGlobalEnable();& g* ?- \- e: _6 _% h9 f" R  r9 }
4 |' d# y, e- O! |& p( U
    // 使能中断(AINTC HIER)
- O9 I& T0 m* E' B2 H( ]$ H/ [  Z0 x    IntIRQEnable();$ A6 N* q# Y9 s9 w+ ]
}
% N' |4 a( j, |! @0 Z% }( @
" T1 d* @! ]7 w8 t/****************************************************************************/
  [4 o) L4 h3 H5 e7 a0 w5 x1 X/*                                                                          */' N0 T( l; B; S$ q3 o" h8 O- E
/*              UART 初始化                                                 */
$ P9 m: |. \6 R/*                                                                          */
; s: |/ `/ O  E+ v: R/****************************************************************************/) Z/ N8 o2 u; B7 _: t
void UARTInit(void)
0 J$ [' X7 \6 Z# W9 p3 [" w{
  M( n, w# o2 N4 p( K/ z, q, ?        // 配置 UART2 参数8 l0 x  E1 ]+ U' `3 s9 i1 Q  z
        // 波特率 115200 数据位 8 停止位 1 无校验位
; V- R5 M8 B1 K    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,) \# Z5 f" g7 _; f" X. r
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);( N; x6 b3 C3 {. E# x9 d
        // 使能 UART2
7 X0 g5 C0 C, L( H        UARTEnable(SOC_UART_2_REGS);0 V% \! s0 p) @& @& X( [

& N, [5 n( _* P4 O, M    // 使能接收 / 发送 FIFO+ J% f& Z" C5 ^& q( S! u" Y( T
    UARTFIFOEnable(SOC_UART_2_REGS);
+ ?" W0 x9 L( S* J6 `5 ^5 ^
4 n- e! R6 e* I' V    // 设置 FIFO 级别/ K! `- l5 G  r2 S
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);- p  \- Z. H% @# s
}
; M. u) z/ H( W" D1 w" a) @. o
0 g3 m; F: d& g8 @# n1 b/****************************************************************************/
+ F/ n6 o" F' Q8 Q6 ?' y, r- a" C/*                                                                          */
0 ~! L- B& N1 e+ }" L/*              UART 中断初始化                                             */) e& O* u0 D( g5 R( l- ^+ d
/*                                                                          */
6 P$ H9 z0 R7 \! z/****************************************************************************/+ |) M& V3 `) x/ c
void UARTInterruptInit(void)
9 ]; j" l9 X: b4 Q. N{
' H: ^* B! J8 o8 }: t' n2 p        IntRegister(SYS_INT_UARTINT2, UARTIsr);) X2 R( a/ D5 J5 `8 G
        IntChannelSet(SYS_INT_UARTINT2, 2);
& [" {# W- Q( W        IntSystemEnable(SYS_INT_UARTINT2);
2 V4 d6 u) K* y& o2 {  j7 V% f' a0 o6 f$ |! b
        // 使能中断
1 r. N8 e$ X3 O7 C        unsigned int intFlags = 0;
, F1 Z* S/ Q( s6 Y9 L7 G+ D    intFlags |= (UART_INT_LINE_STAT  |  \- f3 e, m, O9 E; u. l% C) G
                 UART_INT_TX_EMPTY |    \
9 a  P- j6 v* _" w) O" ~                 UART_INT_RXDATA_CTI);
% S! U; }" Y# v+ c' R    UARTIntEnable(SOC_UART_2_REGS, intFlags);
3 c8 r4 }% L5 j8 w! Z- o}0 k" C7 n8 f; E% j  S8 k1 A. u5 J
/ m* y9 b4 Q" F8 w
/****************************************************************************/( R+ K* _2 o: P
/*                                                                          */
- K# a* V! @! n! ]4 k& _/ Y0 L0 j/*              UART 中断服务函数                                           */
6 S, p! p$ p: c- i+ w2 d2 O/*                                                                          */
  @2 g9 w$ u" U' k0 k/****************************************************************************/6 K3 l1 ?" y. ~% K) H
void UARTIsr()5 F) O) ?; ?4 M2 L3 e! i1 w2 s
{5 F2 F3 h& U$ N  P
    static unsigned int length = sizeof(txArray);) v1 x/ b2 V* [) k: h
    static unsigned int count = 0;& Z6 r) u/ x* y8 |" k8 r
    unsigned char rxData = 0;
, u$ {( W9 o! p    unsigned int int_id = 0;
2 u$ F# @2 o4 C  F2 q8 _
% u3 a6 _' D% y    // 确定中断源
- v' n# B/ J! c    int_id = UARTIntStatus(SOC_UART_2_REGS);
' S7 R" a; P; e; `+ s# A$ v; {; d
) {: g# C& @/ h- D4 t$ W2 v8 s* L    // 清除 UART2 系统中断
  [4 @' ?) L9 p2 s    IntSystemStatusClear(SYS_INT_UARTINT2);# D. B) W% A: J
1 l5 x( R  Y- f9 }8 p- s. x0 T7 A8 H  R
    // 发送中断0 f- H* K9 s, i; j# J
    if(UART_INTID_TX_EMPTY == int_id)3 E! \9 G, J  B0 @6 c, s
    {
: U. D# W0 V+ O, U1 f5 b) m9 t        if(0 < length)
' E* t+ o5 x. v- |% C! W* l        {7 ]3 V4 T  D' \2 ?- U' S& N% I
            // 写一个字节到 THR
: L" u7 u" A/ u) l2 g$ c2 {. \: c: i            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
" x/ H% a1 Q2 s- D            length--;2 R  T/ i' _) E& U+ ?7 U6 o
            count++;6 A! B8 T4 s. C2 F
        }- q2 m7 n  b& w
        if(0 == length); h+ N  G% x/ ?9 T  ^) |: a+ I; ?
        {% A: x$ l/ o; n- H, L( u
            // 禁用发送中断
9 H) w: `% Q' ^9 q; T' m; D            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);# C# \7 v' s: w
        }
7 w5 p, h7 W8 l- O' o6 M7 G     }: \9 w$ C( E. E1 C7 i
. q0 F$ ^: n  ?  l
    // 接收中断
9 p  O, o! `9 M) z) p4 T: S    if(UART_INTID_RX_DATA == int_id)( f. m. e5 P2 Y3 [& q! I0 q6 q2 y1 \
    {
9 C# r) ]* R7 E: Q) N5 [9 S+ j+ I& G        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);) w" I$ o6 g1 E3 y
( \! C- [) o% L# u: y1 `6 O
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
$ d& K+ K: b/ L+ S( Q    }
+ M# k7 _2 q( A8 X; _# ^- ~6 n3 Z& j; _* P7 p+ l/ q% u( m# Y
    // 接收错误
" C0 ?( u3 K8 Q: A! `/ j# z5 y    if(UART_INTID_RX_LINE_STAT == int_id)
! u" f6 X, J/ E& v* w9 R    {
1 A, T% [# l: p) `6 C" }2 {        while(UARTRxErrorGet(SOC_UART_2_REGS))
( |- {, H& @) J$ q% T- l        {
0 c, q6 A% _# y7 U+ e. e            // 从 RBR 读一个字节
3 c6 [* ~$ z: ^& p! }2 G. B( o  c            UARTCharGetNonBlocking(SOC_UART_2_REGS);! C9 z% P4 g5 H9 ~5 }3 |7 X# l
        }3 H8 }3 I2 N  Y+ T
    }
6 d% _. U8 X" Q  [( Q  _    ( J( @4 D6 Y8 ]
    return;
. u6 `  Y$ B% @5 ~: `' f}
9 i# G2 W) n9 B2 N
回复 支持 反对

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
板凳
 楼主| 发表于 2019-5-5 22:36:34 | 显示全部楼层
785235014 发表于 2019-5-5 22:255 ]( g5 y  p. r, M) I
如果其它设备快速给你发送串口数据,你这边能正常通讯?
. c2 V% _. p2 V5 Y3 e, o
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 07:53 , Processed in 0.042050 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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