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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8304|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
- `3 a" z3 g6 y( ]: F: Z

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。/ ]2 E/ C5 H3 |
. u3 Z# z' B2 a- C4 |1 \
#include "TL138.h"                 // 创龙 TL138 开发板相关声明# L: m! Q: ~; A: e4 W( a' p
" L" n6 i7 `8 D* y0 D+ P4 T* F( m
#include "hw_types.h"               // 宏命令! B* _( W. w( A
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器6 r, F! g) p; C6 X7 x  U1 b& L
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器. P! x' a9 Y0 Y. t: `; q4 \
1 Z* g' J' X* k  ~" N7 T( u2 T7 {
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
4 t4 @) p% d; w- \#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明5 p  G% R- O; K
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明, B0 o' N, }6 g" F5 a1 r
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义2 n+ K1 r9 G& W8 H/ s$ A6 y$ c2 [3 R
5 U( x' h! X8 {  K7 W( l& [; ~
/****************************************************************************/! J. m9 R" V% q; Z0 ^/ a
/*                                                                          */
) z3 c7 B2 P' e/*              宏定义                                                      */3 k. b! r( C  j: l/ n1 J) V
/*                                                                          */2 ~& r# ~5 ~# N, {) n6 _
/****************************************************************************/4 i/ }) h$ ]) c* I: j/ T
// 时钟! W* B/ v, S2 O
#define SYSCLK_1_FREQ     (456000000)
4 O( ?) H4 _; P( ]" n8 D* p0 E) h6 F#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)- e: I0 v% H' l4 S
#define UART_2_FREQ       (SYSCLK_2_FREQ)! R. O1 c, r- K
' o2 G* J2 `# G& e5 f) }
/****************************************************************************// v9 V  ^9 c9 _# ]$ d' |6 h
/*                                                                          */
. I# j2 m! h% K9 W/ U' u/*              全局变量                                                    */9 G! n" p3 s: }' o
/*                                                                          */) o: K: p% s4 v3 w/ k" r0 m
/****************************************************************************/
  [" E+ X) h2 o2 }1 D$ F0 vchar txArray[] = "Tronlong UART2 Application......\n\r";8 _9 g; c$ P- p  c( o- P7 l
' s8 V! |9 b+ y
/****************************************************************************/; |: L3 N! O  j* z* @2 c* c: l
/*                                                                          */: F5 e+ t5 Y$ Q7 {2 w
/*              函数声明                                                    */) E+ i: p$ V# L; U' |
/*                                                                          */
" ?& v4 h  P! S$ T% @* ?5 p/****************************************************************************/  U+ }8 m, b! l  y& E6 R$ O9 b
// 外设使能配置) p" a  |* k: `' x. O$ t% k
void PSCInit(void);
6 g- N& p( }  \
3 X" q1 Y5 S, d/ m// GPIO 管脚复用配置
; y1 b6 [4 _9 ^void GPIOBankPinMuxSet();5 \2 ?; q8 g1 N
: T. _  I: E( V2 p& X+ f
// UART 初始化
2 B# R9 l' W2 b, B: Y5 D" X: Jvoid UARTInit(void);+ x) ~8 m5 {. C! L  r
// ARM 中断初始化
2 k+ N* H5 W% I2 ~void InterruptInit(void);* S& S6 B: W2 ~2 Y! ]% c! }
// UART 中断初始化- N6 n; I$ e& }# n2 z; [
void UARTInterruptInit();
& N' u- B2 Y2 ^// UART 中断服务函数
" h0 g5 ?6 [9 A: Y8 qvoid UARTIsr(void);
2 k% Z6 w, J) m7 v6 @9 s/ U% M$ H2 K, G
/****************************************************************************/' F" ^: g5 D! t- L& I, Z
/*                                                                          */
; j4 d. Z4 {8 s: q8 u6 f/*              主函数                                                      */" ?- g$ g  R6 g; z$ v. M
/*                                                                          */8 R. C/ q$ f; n. O
/****************************************************************************/1 W" Q# F! n$ b
int main(void)
6 X) _0 L! l6 r  y! J/ g{+ o3 k4 z4 ]6 r% A; g
        // 外设使能配置) P1 w. E; O6 \
        PSCInit();2 A4 |% l; f0 M) |. M' k  n( S
       
/ y% U& u: X/ R6 R9 L% S7 Z        // GPIO 管脚复用配置
9 T; }" s+ }3 U# f5 d" T4 d        GPIOBankPinMuxSet();
) f! T8 |2 x6 q$ I. [
0 D* J9 d) x, a) I        // ARM 中断初始化- L+ X5 m+ {& X  i
        InterruptInit();1 a! G$ T) X" }6 K

3 \0 B! e5 L, @& P) L        // UART 初始化
! N; O. u6 z* Z9 v8 j! D        UARTInit();# i9 k* N/ M6 `& Y
9 k+ S2 {* _: _3 V' [# ?. x
        // UART 中断初始化  }& b, i. Y8 R2 {  n5 g
        UARTInterruptInit();9 a9 K" ?* {1 P5 x$ {7 s* Q
; s1 p5 x: n! N
        // 主循环# Y# @% |& i, J0 L3 c. r/ ]1 B
        for(;;)
' N6 @; l3 E, }  k& e: v        {
* g' e5 a2 ]  K6 h. O* G& k7 G
! M1 @! B; n- W5 k4 x6 N        }, ~4 q. P- Z# y* t4 L
}' a- U' w* T1 |' z; s/ M
8 s& t  p" g4 j2 F3 t; E$ S4 f
/****************************************************************************/4 N. ?4 g# }; Z! e5 y
/*                                                                          */
' |$ H# s' b% z3 S7 V/*              PSC 初始化                                                  */
/ \" B5 Q: D" U9 d/*                                                                          */
7 w6 l% A! j1 o% C- d, `/ j& E/****************************************************************************/+ t3 J; m5 `; D, @' u8 Y
void PSCInit(void)
$ N: `- C# D+ k# P; e7 u- K' b  l{
9 x3 b" w' R- |5 j        // 对相应外设模块的使能也可以在 BootLoader 中完成6 K% r; F9 p& s$ N
    // 使能 UART2 模块
1 R: \" @# P# j) h; ]    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);' S. f8 G; B$ |
}2 P5 r9 w* q8 r( {0 c

3 s  I  [8 u2 m" a; r+ t/****************************************************************************/, p( o" D( |  K& d: O- O$ E1 r
/*                                                                          */: S) k7 b5 s5 h1 V- Y; q
/*              GPIO 管脚复用配置                                           */
% X% r- w# w" h5 |6 W/*                                                                          */7 Z0 }9 W3 h7 _8 R& `
/****************************************************************************/
, a9 U* [( j7 g# @) dvoid GPIOBankPinMuxSet(void)3 s, L+ c1 j* x  O% t
{
3 s' s; Y# I) c* G        // UART2 禁用流控
2 R% F( e% W: }" P        UARTPinMuxSetup(2, FALSE);4 I) E, ?' y% }1 ^
}& c/ y. O: ^& v2 n

7 b; {, B' H) b2 e! X/****************************************************************************/
5 R+ ?( p0 b  j1 m/*                                                                          *// M" c4 e- a/ Z; }2 a& m( x1 F
/*              ARM 中断初始化                                              */
9 d* U$ p7 U# F. G. S/*                                                                          */+ }+ c) f2 f; s; W: Q
/****************************************************************************/
) ^! D/ K7 W- v6 m& Rvoid InterruptInit(void)
4 |  c5 a( x1 n/ t{4 W0 B/ j+ n- ^" e7 B
    // 初始化 ARM 中断控制器- G1 ?' D% @; H) R0 x( |" g
    IntAINTCInit();
' \# r+ u  k# t, ]& b+ {5 O9 j. X' d. r2 J' B' N
    // 使能 IRQ(CPSR)% P+ ]  ~$ D4 A4 ?" b
    IntMasterIRQEnable();6 a& K2 N" J# ?( t8 Y% l* j0 ?' W
9 c  y4 R, k/ ?( W$ l
    // 使能中断(AINTC GER)
1 y9 N/ }8 A* y  H% I    IntGlobalEnable();
6 D. F1 a0 x3 H3 @5 P" {3 G; v8 Q6 h; H% g+ s# z
    // 使能中断(AINTC HIER)' u0 l2 Z# w3 S* {" ^$ u: I
    IntIRQEnable();
' B# m: s8 ^$ R}  _0 Q' z! d$ c2 r
1 ^! `3 @  m9 V# c+ K
/****************************************************************************/
8 `7 Q' E/ s! _/ y/*                                                                          */8 L" \. M' Q) i1 j
/*              UART 初始化                                                 */
6 i* I- i, U7 W, g$ d: I( p/*                                                                          */  L+ v! U7 {9 O& y
/****************************************************************************/
8 R. U$ M/ ~/ t1 \$ g) |1 `void UARTInit(void)
' L/ i6 Y7 [6 S& p- E9 `$ w{
3 z" W6 f3 O3 R0 U! E0 h        // 配置 UART2 参数
  Z# Y5 G* B. w- G0 ^6 [        // 波特率 115200 数据位 8 停止位 1 无校验位
( F- E% _+ P* x) N5 k9 T    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,, b# w8 K6 u3 V! O, B8 d
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);4 t) e: y, Z- d* M
        // 使能 UART2) f) q* d% q8 X) [# S
        UARTEnable(SOC_UART_2_REGS);( A8 L' ?: c+ S: a" I8 M/ t- `* s
# g2 a1 I0 M* s- q* Y; i
    // 使能接收 / 发送 FIFO4 G6 F+ k# Y3 D* V1 v# w
    UARTFIFOEnable(SOC_UART_2_REGS);
; C7 a1 \' z( u0 Q( [( @9 w/ n: E5 E; G
    // 设置 FIFO 级别
6 ~/ _$ _& y& Q1 H' [$ N) s    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
7 {5 w- D7 M6 O( q* V3 y5 C}' ~  [6 @3 W" ^# u0 a

7 ]) ~0 ]9 `% c& C" R% q7 l/****************************************************************************/1 O# P$ w' A* k* @6 t1 o+ Y
/*                                                                          */
% J; O  f. g% Q0 L: v  ~/*              UART 中断初始化                                             */
8 H3 F6 g* J8 C7 S& H9 D/*                                                                          */
! @& M4 y% T" G  B) J' q* I0 K2 b/****************************************************************************/& w- |6 ]) f; ~' R
void UARTInterruptInit(void)3 A8 E. U. I; G6 B
{% [6 d+ s9 R! l0 ^/ T
        IntRegister(SYS_INT_UARTINT2, UARTIsr);5 i. \  c7 L! O3 c
        IntChannelSet(SYS_INT_UARTINT2, 2);* h* E7 C  P8 m" U
        IntSystemEnable(SYS_INT_UARTINT2);
5 r3 m2 y1 @% _7 N, s) Q+ @% y/ K! l  j7 K+ Z! q
        // 使能中断3 p5 N5 q: h& }+ I9 J: o8 Q1 |
        unsigned int intFlags = 0;) A4 F  H; ?6 i
    intFlags |= (UART_INT_LINE_STAT  |  \
  u& Z; l6 W. B1 m                 UART_INT_TX_EMPTY |    \- b6 X. \5 c8 d8 L4 L2 }
                 UART_INT_RXDATA_CTI);
; i5 F; X" \2 n: M) }( ?2 I' `    UARTIntEnable(SOC_UART_2_REGS, intFlags);1 q$ l( K2 V1 N! ]7 L8 r1 C  U
}
$ G6 W/ j( w! E7 m9 {/ u/ v/ K$ ?0 n) T! r' ^4 @
/****************************************************************************/
) Q2 r1 ^5 }+ c/*                                                                          */+ _: b+ U* ]% I( }) W  X
/*              UART 中断服务函数                                           */
) \  F; B3 k7 K: e/*                                                                          */0 t4 f8 v7 {# W7 b1 B0 q6 L  u
/****************************************************************************/
9 N* p( B" R/ gvoid UARTIsr()6 p. b1 K+ D/ \: K+ U0 ]# S3 R! |
{7 h  k6 y7 \0 g* Z! e' p5 z
    static unsigned int length = sizeof(txArray);
$ H& x3 T& V, l( {8 h8 h    static unsigned int count = 0;
" c$ Q( i. ]0 u6 E7 v    unsigned char rxData = 0;
) V) K& w) o7 q0 S    unsigned int int_id = 0;5 ?: w9 h+ M3 ]: I

7 G3 U, h1 ~( }! P  c* q! S    // 确定中断源
1 q. w! ?, }$ Q    int_id = UARTIntStatus(SOC_UART_2_REGS);
, P/ C+ @; ~/ B& R
5 m. o3 ^3 g: B+ A: n8 v: X8 q  X    // 清除 UART2 系统中断
2 L6 n1 P4 O* \7 S/ x& @    IntSystemStatusClear(SYS_INT_UARTINT2);
: V0 W$ ^$ d2 `0 w5 G& k- u8 K: h7 G: w" m3 y
    // 发送中断* S9 {  F& o5 Z9 ^
    if(UART_INTID_TX_EMPTY == int_id)7 D. W& U" x- z: i
    {0 ^1 g6 _1 S) R
        if(0 < length)6 _/ ~9 ?# e6 C) ]: e2 D$ s
        {3 Q$ q: D( M9 I5 ]' I/ B
            // 写一个字节到 THR
5 \+ g, {; r# l- I$ ]            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);- Q6 h  ^  k. j& Q
            length--;2 n' B' O. o2 p: B
            count++;9 t$ |1 D& h* y% M7 h, E9 W$ {. j
        }, l5 H# e, q4 X' V$ X# h( A5 L
        if(0 == length)' j* h* b; _% p9 G' ?
        {
# D1 e- U9 K6 k6 @8 k5 ?1 r            // 禁用发送中断5 ?& f% s5 T# H  v/ A$ f. G* l% k1 n9 f
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);( p" d5 f; N3 D6 ]
        }
1 B- @, k! P4 z4 D7 I# r5 J     }8 D1 u, Q. B! B

3 S3 P1 K. h3 V0 Y    // 接收中断; x0 _2 _" O; O: ?; m
    if(UART_INTID_RX_DATA == int_id)
. {. e3 ^; O8 R    {( h3 k; W7 u- v5 [! a
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);$ b6 k  t, w% z1 ~1 N' W* Y# ?
& E5 h$ H' d: ?+ }3 P
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);5 |2 d; t" o, x1 O3 ^0 z
    }% X" u- [5 E7 {6 h& d9 z$ [

0 N7 |% }4 U) ]. r. c6 @6 }    // 接收错误
$ t/ T4 ~( ?8 Q* n& P    if(UART_INTID_RX_LINE_STAT == int_id)
* e7 X: h6 N! B    {
9 Q1 V! k- q. ?& i        while(UARTRxErrorGet(SOC_UART_2_REGS))
1 F0 r; Z' e5 l6 i6 f        {4 ?' S4 O1 Z* _! Q) V
            // 从 RBR 读一个字节
  c8 e& g. `$ X8 @( f            UARTCharGetNonBlocking(SOC_UART_2_REGS);
+ K0 ^4 V/ m' r; Y* m5 c' J        }) s/ C) {* ?. [6 x& N
    }$ t1 D( X6 s% `4 |
    # ]) p) z, V4 f$ e3 G5 e" ?- A
    return;2 l, `# R7 ]% m8 D
}7 x1 F1 i; l$ Z+ V3 R7 e& |- G
回复 支持 反对

使用道具 举报

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:259 C% \' d6 }: \  R, H
如果其它设备快速给你发送串口数据,你这边能正常通讯?

6 O- Y5 \" W( H6 p/ [谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-23 02:59 , Processed in 0.043789 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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