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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5598|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
5 t; y9 n' H. o8 o& b8 c$ ?" V

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。* u8 Z$ n1 Z% o3 V
% w& Q8 }, n- r" n
#include "TL138.h"                 // 创龙 TL138 开发板相关声明6 C. T" m' r: `3 n( g% r, @

# Y& K! X+ O! r) A#include "hw_types.h"               // 宏命令$ Q; c) r3 k3 P+ j
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器) F5 ]' G  y! b8 x
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
; d! l! s! x4 U) S. ~' s. F
: [: X9 j& c# {$ T5 q3 ~3 P, ~#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
$ f" S9 C( _$ N6 Q/ }6 w# z#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明5 r3 A- ^) ]5 k9 D  J9 S7 K) @1 Q
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
0 h  ~5 X; S* M* j4 ]- v8 E' E#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义5 q1 k# v( M# h" ~8 b' z) W

, h! T3 U% I/ c3 H" `: ^( j/ l/****************************************************************************/3 E9 i7 q0 m' k) m. u
/*                                                                          */
# j1 S. z( N$ I) o) @; Q/*              宏定义                                                      */
# @0 n' b' s+ o4 U* v/ q/*                                                                          */
- I2 t! y1 E) ^/****************************************************************************/
! j9 n- _$ V6 r; K1 ^// 时钟
1 D& e# z6 b6 n- o  J* l#define SYSCLK_1_FREQ     (456000000)
1 Z: b/ `1 X/ Y( x: L3 Y#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
, h8 m: \1 k0 Y4 d) p#define UART_2_FREQ       (SYSCLK_2_FREQ)
. T, z+ U$ P/ u( C% m- ^5 a4 U; E" _* e# V1 ]/ s/ l6 a& Y4 y
/****************************************************************************/
& U) u; n9 M2 l" J7 x1 |/*                                                                          */
9 S8 m& w* l2 Y$ n/*              全局变量                                                    */
' Z. O4 m. K3 @: g/*                                                                          */
, z* Y4 P; @$ R, b/ f: D+ {. i/****************************************************************************/1 q8 b& U# c0 d4 v4 \' n8 I) ^
char txArray[] = "Tronlong UART2 Application......\n\r";; B* O( T" @- v0 D' [6 c! P
  q) V3 L7 q) @7 x8 M+ z
/****************************************************************************/& j/ a) Q: U5 @; d
/*                                                                          */
) L1 d% E( Q7 T; t* n/*              函数声明                                                    */
' T) b3 j; @' l# \: k# e- q/*                                                                          */
3 {3 F! u% ^+ i9 u+ q+ `' K% a/****************************************************************************/
1 H7 M* N" V8 g// 外设使能配置. a3 p- n. b- y  n- t
void PSCInit(void);
7 W. G: ?4 ?  E6 u' |; s4 L8 {. `& O
8 D1 N( a( z7 L// GPIO 管脚复用配置
8 R2 y' J( V! e! s  R$ D9 e" `void GPIOBankPinMuxSet();
2 s8 [. d, |4 A$ h$ v0 s! k
# m6 g: v7 S! @+ _8 J( z3 {5 y// UART 初始化
- h7 ]; w- F* b. `  avoid UARTInit(void);
! l" o1 p3 n  A' Z- z# D2 W// ARM 中断初始化) l! F$ l5 [4 G5 O+ I8 _
void InterruptInit(void);
2 H% M2 Y4 s& p4 [7 I2 Q3 e1 j# H// UART 中断初始化/ o+ v4 R7 L* H# ^$ Q1 k( }# b& o
void UARTInterruptInit();5 X5 N8 f. Z$ l( X% ?0 k6 f, K
// UART 中断服务函数1 W; [7 Y" h1 a2 H5 ]& F) J
void UARTIsr(void);
$ b0 u2 [( o4 s  f( {# T2 A1 P, G- z' P; ]( e
/****************************************************************************/
) {& j4 {; r7 n7 I' D/*                                                                          */" e0 }* p4 w  U+ F( `- @5 g( F0 s
/*              主函数                                                      */: Y( x0 b0 h* @' g5 M
/*                                                                          */
4 B$ [) D& ], \. A. `, ?0 Z9 S/****************************************************************************/
7 i5 k2 x5 N8 S2 Rint main(void)6 U2 z& X$ o( s* w2 g/ N0 ?7 l
{% K; E/ V( j- k' k) J5 n  c, d
        // 外设使能配置
% Q' f7 }8 f8 P9 A0 r        PSCInit();( v% T8 t, r) r
        , D' J% D/ c6 f! H
        // GPIO 管脚复用配置& n4 S3 j1 n! C
        GPIOBankPinMuxSet();$ J7 _# a/ B  t. N* v% \, f2 v7 ]1 `

7 v, Z1 K. D' D0 {/ k        // ARM 中断初始化2 _3 N/ ]% [  Q. g2 y8 Z( S- J
        InterruptInit();
3 N, f" X9 W) \1 ~/ F  c9 u  Y
  p" e8 B5 Q5 O3 R3 y5 S, w$ I        // UART 初始化
0 Y" W% ]0 D/ L3 U) ]1 g5 V        UARTInit();' [1 \1 k4 P' j! Q0 P. I
# K# V1 l+ S: {# y2 n- ~- r0 j
        // UART 中断初始化
7 I  u7 e8 ^8 M8 p5 o7 m        UARTInterruptInit();
0 j/ ?; c& O9 \, j" x! a6 k4 @6 `& L, H  j+ u3 V
        // 主循环
! B+ B9 t+ G, [        for(;;)) c' e9 r: `2 m+ C0 G' [) G: g' h
        {
) o- k9 M) c  ]4 U: G( D0 ^: _# {0 {8 H/ s
        }
- o$ s% B. K3 J}
$ b* i8 \7 P" ^! R) w) G3 _. O
' e) O; T9 w& S! ~/****************************************************************************/! R, Z, Z8 @) {' U. M" Q% X, U2 |
/*                                                                          */0 H: ^) U) t4 c
/*              PSC 初始化                                                  */
; b/ A) B+ t- k1 ^. s" u/ e/*                                                                          */
5 j2 v2 p! i$ c) d# G2 R( A# ^9 A/ S/****************************************************************************/
3 i. [* n: X( Z5 `0 zvoid PSCInit(void)
  [" V8 b" L; E1 [{
& C1 k3 {8 ]1 ^% H: m! H" Y" D  b8 N        // 对相应外设模块的使能也可以在 BootLoader 中完成
6 j  K% n* {4 M& |! W9 Y    // 使能 UART2 模块
, ^: E2 m3 f2 R0 d    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);# [; u8 {) a  |9 A
}
4 n9 b/ @+ {/ b- a% g6 w) d, q( [" x8 O! \; I1 e
/****************************************************************************/' _2 U1 {0 p+ u- z6 Y3 W4 Y  L& E
/*                                                                          */2 F& l, k. Q" N& N4 Q- D
/*              GPIO 管脚复用配置                                           */
  x/ m7 i: r9 i# ^3 _& t/*                                                                          */
: V7 j! V# O+ r1 d& V2 e/****************************************************************************/5 O" T2 R$ V7 T0 O9 t& n5 P( F
void GPIOBankPinMuxSet(void)& f8 {# R! V: k
{4 e  b9 @+ T9 x, B
        // UART2 禁用流控
3 A/ ~9 c* ?( A5 S        UARTPinMuxSetup(2, FALSE);1 M6 F# a8 i3 l8 n
}
  R( G& d2 Y0 c8 @8 L# a4 r
- b# t( D2 L4 k+ Q* [% A* q% d/****************************************************************************/! o, e& p& r/ m" Q
/*                                                                          */# O: E: V, N: S0 C7 V
/*              ARM 中断初始化                                              */( s: |( C; `0 a" s' m
/*                                                                          */
$ o9 P$ b8 f0 C5 C/****************************************************************************/" B* c8 }7 {9 s& o5 S0 v
void InterruptInit(void)( ]! S0 x) t: m
{
/ u8 J3 e0 C  z0 R    // 初始化 ARM 中断控制器
# X1 G9 K8 f! v9 Y: _/ N# }6 S; ]- m    IntAINTCInit();
# g0 l- p9 a8 w
( ~- x" q$ c4 y  ?$ r0 [    // 使能 IRQ(CPSR)
( N6 _& H: j4 n6 M9 H+ l  t! K- I) n    IntMasterIRQEnable();
' Z! _8 X& m* y) H7 i. G- \, b! G% R
    // 使能中断(AINTC GER); s; ]+ ]) J1 y4 N
    IntGlobalEnable();& w* |5 c! @. {
5 U  p' \1 f5 A2 K4 V2 g
    // 使能中断(AINTC HIER)
. ]1 z- l( O7 K+ b; P1 v8 B    IntIRQEnable();# B$ e) M% `, O5 N
}0 M# Q# D& E; i. [, _; A
+ a4 K0 j& U, F. Q* q: ~
/****************************************************************************/- l" U4 c5 P' j6 ~: s# _
/*                                                                          */
4 `2 n# @7 N1 n/*              UART 初始化                                                 */- ^5 Y5 y2 }# S. H* {, c* x7 C
/*                                                                          */
1 |% ]$ y; @* N3 V9 T/****************************************************************************/
: w; |( t( y3 D& O$ g: [( hvoid UARTInit(void)
/ d, y5 f9 {5 g0 B# L{
$ d  R  m2 \/ h6 R; m        // 配置 UART2 参数# L: O6 F8 D" H2 f" |0 d/ v% `
        // 波特率 115200 数据位 8 停止位 1 无校验位; G. a3 K$ w) T3 n
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
  s' |2 Y% ~5 \# H$ M4 ^7 X                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);) F! ~! ^* O& U' ]8 t- B; v+ H
        // 使能 UART24 f8 R: h2 r6 C( {# }
        UARTEnable(SOC_UART_2_REGS);" J7 o& m% o$ q  Y/ u5 A+ {* N
6 ^' c$ E. q$ d6 o
    // 使能接收 / 发送 FIFO
- y7 U9 D  y3 E, R3 ]2 R    UARTFIFOEnable(SOC_UART_2_REGS);- |: g+ q. j! n9 e5 @" @/ |. |

6 H) X9 K; C& d4 g0 A( v- Y% G    // 设置 FIFO 级别; \* G$ U5 B% f! X. G/ W" ?
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
* N- _& \& R; Y# N}
, h) R4 |+ a8 m0 g8 t# K! \( d% O3 z+ H( G4 r( Y0 }
/****************************************************************************// X' B) {5 g) ~4 k$ B( o
/*                                                                          */
/ V" t0 O0 ^" T8 E" K/ R$ M* L/*              UART 中断初始化                                             */9 y9 A  q  g. v
/*                                                                          */+ w; ~. ?8 Q$ a* Z8 e/ j
/****************************************************************************/2 N4 ?$ x. C& V0 u. ^, O8 @
void UARTInterruptInit(void), B7 o8 _0 s' g
{
  _; _1 F$ w3 M# D- H        IntRegister(SYS_INT_UARTINT2, UARTIsr);5 z) g- b7 U8 ]  J' a7 Q# C7 c1 Q3 T
        IntChannelSet(SYS_INT_UARTINT2, 2);% n. \  j6 }" u; }, ~2 @
        IntSystemEnable(SYS_INT_UARTINT2);
' r( P2 a; ~# M" K  g
* }1 n2 I9 j+ u" e: T7 I        // 使能中断6 {& n0 @4 W% e% U, d$ A. J
        unsigned int intFlags = 0;& J. e& X" T& E
    intFlags |= (UART_INT_LINE_STAT  |  \
0 g- p! y( d. t  t' r                 UART_INT_TX_EMPTY |    \
4 A2 k, K8 j; ]                 UART_INT_RXDATA_CTI);
* @6 w0 F1 B) D+ A$ x* j+ U4 Y    UARTIntEnable(SOC_UART_2_REGS, intFlags);4 A: k7 M0 G, G# g: K" e
}& d1 q6 n& |. c0 J
3 w1 C0 U' X3 C7 Y  u
/****************************************************************************/
6 b$ J- S0 @5 t/*                                                                          */
0 b4 {8 H1 ^, R/*              UART 中断服务函数                                           */( A) w2 S( A! ^6 J7 p& q, s
/*                                                                          */
& g- b. X9 [6 T6 R5 J. T/****************************************************************************/
  H+ c; g; d; h. E+ f+ hvoid UARTIsr()
+ k$ e0 x2 M. q# ^{( [( n* M) Y4 @5 A2 H& e
    static unsigned int length = sizeof(txArray);
) o' T* g$ n5 \1 c; ]! x    static unsigned int count = 0;
$ y0 ?6 p; m" M- p$ k0 H: M    unsigned char rxData = 0;# O$ F( q1 q4 F' _# T4 j
    unsigned int int_id = 0;
- n- g$ e4 R3 J) y
, k, h) z; X' ^: n2 O    // 确定中断源8 M2 Q- x" N' I1 l
    int_id = UARTIntStatus(SOC_UART_2_REGS);
+ T8 ]+ h: L  z  S% s8 i2 Y+ n: D
; ^2 j3 I4 N& O, j. r    // 清除 UART2 系统中断
# q5 j& a& z% m    IntSystemStatusClear(SYS_INT_UARTINT2);
# K% v! e# e" r5 [( m3 S+ z: L" Q; C6 K. y( @
    // 发送中断
/ t/ w  p+ }2 m$ P; N9 W2 A    if(UART_INTID_TX_EMPTY == int_id)$ w' f  I7 Y/ P8 ^3 X/ P
    {+ a7 _! Z" g3 E2 _% X
        if(0 < length)/ c- L; J2 ]  n) o
        {4 z( O4 m( U" M, \! C: N2 P
            // 写一个字节到 THR
# \( F/ {/ Y) c            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
" k6 P$ A& ^) }# Y, z+ a            length--;( i/ g1 Q3 f6 O
            count++;
, e/ [( L' l. [" R" u; @' s$ W4 W        }# K7 n+ w6 o" M% d1 @% X) p
        if(0 == length)
& V9 W/ Z% o$ E/ q$ C) L' Z        {
/ e/ T1 l9 A+ B% S            // 禁用发送中断8 h' y4 O5 `; z
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);1 ^7 O' _% H% n8 ?# H+ R) h
        }
* S$ W; R$ _$ s8 x% h. U- z     }
5 T3 E2 ]$ l) H, y! w# e: w! N/ _7 p$ [$ Q
    // 接收中断& n* v8 f" |1 {1 A
    if(UART_INTID_RX_DATA == int_id): j( n4 S7 ~& P' s" n  ^* H% l
    {& l: W6 c; p2 Y5 s' q6 [2 x, t( i
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);1 S- y! B  g. j9 `% V

; {4 u1 H& e% H( a$ q6 B6 z8 S        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
5 B% ~" ?, g7 K& l    }
2 d8 _1 s4 g  N% q: ^% B( m' I+ t& y. \$ y, }6 E1 b& A% |, m
    // 接收错误) I# s0 Z0 [) E. O
    if(UART_INTID_RX_LINE_STAT == int_id)/ A. d) m+ y' h) |3 [
    {
& L; z% S1 i7 s) s6 z6 E2 e! c        while(UARTRxErrorGet(SOC_UART_2_REGS))
. ^# q6 n, @* e        {
7 Y2 B, o' l0 u/ a' o! F            // 从 RBR 读一个字节
" {; _4 A, @; E3 Y- }/ e            UARTCharGetNonBlocking(SOC_UART_2_REGS);  ~$ d& c! O7 E# p
        }3 K' i) ^% F. z6 f3 [1 a
    }
6 U, b' B6 _  H+ A! i2 B    - A+ s# t. ^8 [  ^! C( \1 n" l
    return;% A3 a) F5 I! X) H* p
}
6 \' a: N+ M% A/ P
回复 支持 反对

使用道具 举报

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
! f" l% S  |7 |* \如果其它设备快速给你发送串口数据,你这边能正常通讯?
! E& h% n8 J3 N2 x( n
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 10:50 , Processed in 0.043476 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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