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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7801|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。4 ]4 x  Q2 f+ z* ?

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
# e% d3 F7 j" j" r) W1 f' h  K- n, A% g* l
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
& K9 H) p' q5 v4 P  E$ C, ]. x  J6 `7 i7 l0 d
#include "hw_types.h"               // 宏命令
- V5 a' V% r5 f2 c$ ^" V2 S2 R#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器1 \+ m% O, K/ B: @! D( l+ ^
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
- G5 L9 O# X" |$ a1 S2 G( g! M$ K! N; m
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
; k* H. i/ n5 P+ _& ?( v0 ?* `#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
5 y2 c5 j- N( g  \#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
1 A- Y, u( J5 n$ J( {) O" ?9 H#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
/ E0 M2 o8 @5 m% T& K; `8 X9 q  c. L$ T8 D
/****************************************************************************/, l, Y0 y" c. l5 r7 `; n
/*                                                                          */
! F) B" L% X& S) i! H/*              宏定义                                                      */+ y& v" u; S) W7 ]; c- \
/*                                                                          */
. X: w4 h, z3 T7 ?5 ?0 ?- s% L3 {1 g/****************************************************************************/  p2 ?* I' \* G# r" ^
// 时钟
0 V$ r! Z. B. ?) \/ z# @#define SYSCLK_1_FREQ     (456000000)6 R. N8 c+ s; r) x
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
3 X5 O( _2 |- t3 c/ o#define UART_2_FREQ       (SYSCLK_2_FREQ)
+ V1 Q6 K: A/ s' s# J" }$ ^+ Y0 F3 X9 x
/****************************************************************************/
. @& b; I" J( h( G& S- ]! g/*                                                                          */
7 y* @7 J. N/ g) x9 {( n/*              全局变量                                                    */
% M( g5 N2 W1 a5 u/ A9 L3 u- g& [& Q/*                                                                          */6 o9 d# N# p4 F- E# W3 [) `2 X
/****************************************************************************/3 i6 y' X2 C9 q- f, G
char txArray[] = "Tronlong UART2 Application......\n\r";
& m! l" x4 p" `" j9 f% d, V1 [, y' ^1 S7 }& T
/****************************************************************************/8 N- g' u1 t2 u& [  h6 z/ [
/*                                                                          */
- c" ]5 x: N$ C  ^8 B/*              函数声明                                                    */
) \' [7 d  y9 Q  t, J* J/*                                                                          */; i! C- \) C6 G9 P
/****************************************************************************/
* w; J2 _3 z& B) l# x+ f+ e6 \7 V7 X// 外设使能配置
2 W9 S! ~# o( `- G7 hvoid PSCInit(void);
$ [6 B0 t  S! A: B
6 P) H  Q+ I4 z// GPIO 管脚复用配置
* k5 I  o& g  D1 ~void GPIOBankPinMuxSet();
  X3 W8 P5 Y) r. D+ r$ _* L- o( w9 k! x0 [; ~' k8 l
// UART 初始化
0 }* v" z( E7 h' Z7 c3 T" [! u2 nvoid UARTInit(void);
4 d) t2 V. Z% C) C' v( H2 {// ARM 中断初始化, N  ]3 r& w- ^/ Q% i( v
void InterruptInit(void);
3 `$ l! d4 L6 a& B// UART 中断初始化
3 S: a6 e: e; ]+ ~5 ?. K. uvoid UARTInterruptInit();
" a' ~) `0 N7 ?1 M9 f// UART 中断服务函数# T, Y8 H1 o, t7 H" t* l- U; F) T
void UARTIsr(void);! `5 A; q9 Q6 e+ Q
- z! _& H: `+ _  v
/****************************************************************************/$ a+ _( r* y! ^$ \5 y
/*                                                                          */
3 z) G5 t1 E. P1 v& H5 a3 _/ \. W& v3 F/*              主函数                                                      */
8 w* S5 _& Z4 W/ E0 S) h/ Z! P1 [/*                                                                          */% Q2 S: D, W# x
/****************************************************************************/0 W; P5 X+ v0 K3 l  y' n
int main(void)1 J& {; D  ?3 }* w6 J) H/ X( V3 o9 `
{
# W2 `# a# t0 x5 q  B        // 外设使能配置0 o7 ?/ T% @, _3 d  }! ~- L
        PSCInit();- M5 Z7 X  x/ b; f# S# i
        3 v. k$ C0 m2 L9 E$ v! I9 {
        // GPIO 管脚复用配置! ]' z) V9 ^% \, z: S4 L
        GPIOBankPinMuxSet();
" C" o6 }- f( t7 I* p* E6 D; A$ R$ O/ Z: _6 q
        // ARM 中断初始化
3 c. j0 x8 x& z6 x7 {! s& @. L) J        InterruptInit();4 v& c% p3 q# [6 b- P. h

/ m2 l: r6 X/ T) t3 \        // UART 初始化
5 H& [: y8 H) @        UARTInit();' D2 j3 e5 i, K

: U$ N: ~$ ?5 `        // UART 中断初始化
3 N. O& D4 W8 _        UARTInterruptInit();
( r, i( ]2 L3 q' g' c  J3 A, k/ G) {. ?. ?7 ]1 m$ l4 B6 e) X
        // 主循环
* o' \' }" F3 A5 ]4 ~9 P        for(;;)
- a' Q$ f4 m0 q( ~& B9 |        {
& D$ n( a$ t% X6 \$ K- j  y) B! y' f" K* }8 o: |
        }. J8 n/ ]& |# ]5 s, {  t1 [
}
- ^% ~7 W- l$ K/ O
& T5 @/ N: h1 u) Z% U/****************************************************************************/" I4 ^3 E+ |! R" s
/*                                                                          */
5 @0 a+ ]/ {7 |$ u, G/*              PSC 初始化                                                  *// H9 T6 g: C* r0 E  ?6 _& V
/*                                                                          */
: E! d6 M' t4 j9 }/****************************************************************************/
9 D) M) k7 Z' x- z- U" P9 k: v5 ?void PSCInit(void)" P/ K+ z9 I. Q, K; B
{
4 x! T. |: |: I  W) H* M5 _; `% w2 ~% B4 J        // 对相应外设模块的使能也可以在 BootLoader 中完成
9 C4 ~. x& J/ L  W0 O/ A    // 使能 UART2 模块* A- f8 S+ ^* j  B
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
2 k7 O: Z) i# P3 G}; |1 B7 ]# G: S) C% w# i
: @' Y2 s$ }! x, g9 O
/****************************************************************************/- B* G+ T* W8 [0 h" X
/*                                                                          */2 [0 w+ z6 ]: c. M1 {9 ~
/*              GPIO 管脚复用配置                                           */7 v0 w" J8 X+ M0 I! I8 D
/*                                                                          */3 `4 a  Y6 C5 ]1 ~9 h7 ^
/****************************************************************************/  j! [7 u6 t: k7 ]& N3 @
void GPIOBankPinMuxSet(void)6 S! G; p* y5 Y
{! f' U: o% B; D: A% g9 `
        // UART2 禁用流控" r& _/ `, ^+ c5 i# p$ ^* }
        UARTPinMuxSetup(2, FALSE);# A/ n: O# D) e0 j- P* b
}+ [" o3 H1 `6 B0 N
* W- b2 @% y- h) F! V% S: v
/****************************************************************************/* M+ ^8 M1 m; @4 F! K$ ^, C/ O
/*                                                                          */2 t# x) f! z5 g) u' q
/*              ARM 中断初始化                                              */3 _$ L) r+ M7 C. E1 W! b: v2 F
/*                                                                          */
+ _1 L' v* H* y7 {+ ]% R/****************************************************************************/
- N; j4 N- ]0 ~5 s, s4 ]& r' dvoid InterruptInit(void)9 i% F3 ~$ a! K/ }, ]3 q
{
9 d: z6 f5 E, X" q    // 初始化 ARM 中断控制器+ S9 J. S& ~) a6 z" G; ~% u; J
    IntAINTCInit();; o3 ?2 B9 B; o5 T  ?

6 ^3 R% S! S% G9 v8 E8 D    // 使能 IRQ(CPSR)
1 Z# d) G  j4 y5 Z+ {    IntMasterIRQEnable();1 p9 S6 o! C2 y1 f( T5 U
9 U( ~4 ?1 ?$ Q6 n
    // 使能中断(AINTC GER)$ J, @$ g1 H& d' j2 T
    IntGlobalEnable();/ w8 }( r6 a3 l9 U
+ C4 X* o' T2 b( T
    // 使能中断(AINTC HIER), ?- ?1 G9 W; C& c. `
    IntIRQEnable();( l- O  U( `4 v
}
8 Z, g# L; [8 }6 Y5 V
, v5 q5 A! l' \! @/****************************************************************************/
8 J, ?% Z' `" S3 p/*                                                                          */
  s( w/ m; j. d8 C/ C/*              UART 初始化                                                 */
$ H7 o' M" s% @1 i" A/*                                                                          */
; {" f9 H+ d3 Z5 Y/ ~+ E# w/****************************************************************************/7 D0 f# ^0 n. l* H2 n) M) M$ H
void UARTInit(void)
& U- ^$ z/ t, t/ l{6 d( }  \2 q4 V2 u! p! U) j
        // 配置 UART2 参数
8 U7 Z2 \% {- h. \! J# `        // 波特率 115200 数据位 8 停止位 1 无校验位0 L* F0 i9 {: ]+ f
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,% ~* K* S( a1 a+ U0 Z, u/ ?2 E
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);) D3 ?( C- d- E2 b$ y: \
        // 使能 UART20 I# b1 C8 G  j2 Y
        UARTEnable(SOC_UART_2_REGS);
& a2 p) W- s  K! x$ i1 e. T' e; K" u9 o1 R" E# k
    // 使能接收 / 发送 FIFO
4 w0 ]0 T. t1 |( g    UARTFIFOEnable(SOC_UART_2_REGS);
5 y; j0 h1 _5 V/ D1 b: a* d  ]. w: K9 I+ S: S, M
    // 设置 FIFO 级别4 `2 h. Q/ W9 c) b; z2 X. V
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
. S1 n8 |( z( v}
3 r* L8 V8 j- ?6 W% m
& |: l% `% S3 A1 y, c: d/****************************************************************************/
9 J2 K2 k+ d, K+ j/*                                                                          */
6 f- M+ p4 Z3 I! @/*              UART 中断初始化                                             */7 u/ m( R& ^& j% L7 K5 |
/*                                                                          */- C& M+ S' I1 H; n
/****************************************************************************// y! @3 w/ _! T* n# ~# D. g
void UARTInterruptInit(void)/ q& N1 y$ H# A
{, T% ?; d" P4 K5 x9 ^
        IntRegister(SYS_INT_UARTINT2, UARTIsr);6 f. f8 B& g. Y8 Q2 J$ c
        IntChannelSet(SYS_INT_UARTINT2, 2);! j# s: X7 p) c
        IntSystemEnable(SYS_INT_UARTINT2);
2 s" R5 i& ]  s+ F1 {) J; q. {$ o% H2 K1 e6 b- J1 I+ _. r
        // 使能中断' T/ [' u5 B* _* A! O, j
        unsigned int intFlags = 0;
, o4 |5 ?. C; x5 q: s- `1 z* u. n! M    intFlags |= (UART_INT_LINE_STAT  |  \
% W6 \" u+ ^9 c9 U7 Q! t                 UART_INT_TX_EMPTY |    \: P0 X, Y$ D/ C9 V; q4 n( j
                 UART_INT_RXDATA_CTI);$ X# M- v* [/ p/ y7 X1 {, W. K; B8 Y
    UARTIntEnable(SOC_UART_2_REGS, intFlags);# _* }! F' C/ y
}
- D9 ^: \$ e( _$ k7 `6 F3 x& ~! h% U* p, V
/****************************************************************************/
$ c: ^6 @" C5 v& _# ?+ H9 O8 s" P8 X/*                                                                          */# D5 T! q. S* k( s8 L; e/ z
/*              UART 中断服务函数                                           */) [  w9 |6 I' I, x
/*                                                                          */
: A# u3 I0 e2 ]% \1 Y/****************************************************************************/5 h+ T/ q, u) ~: j. @, P; H
void UARTIsr()
. D" H; x) z  {1 W5 r& k. g{
" R! V& n2 s4 u, O    static unsigned int length = sizeof(txArray);
; R* T0 ^# B  N) o2 t    static unsigned int count = 0;1 {: C8 A( I  n# _7 k
    unsigned char rxData = 0;
2 f( C$ n1 Y1 ^0 F    unsigned int int_id = 0;
( z: L) m. {. f: P2 N9 b
4 i$ u9 \) `3 L6 B: |; _$ ]0 T    // 确定中断源
9 S7 `2 E; G. n5 V& d    int_id = UARTIntStatus(SOC_UART_2_REGS);; n$ R# R- U2 G' j- T7 N
; o& `! L, z# u) \  ?# Q/ X
    // 清除 UART2 系统中断
1 P! U* a' h6 R+ T' B, z    IntSystemStatusClear(SYS_INT_UARTINT2);2 F  m8 W& U% O* o+ J* c

$ a9 J% G: W3 G$ @% S$ [( u    // 发送中断5 |! ?* W% R- o% T& z: P
    if(UART_INTID_TX_EMPTY == int_id)
+ q/ Y/ e' o$ @    {
1 P  t7 z- Y% W, d        if(0 < length)
, [. u' q( g7 s+ G5 S% u. d        {7 V& G, \) |! r7 |3 m# {
            // 写一个字节到 THR5 X! F% V" f5 j3 G; P
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);- q& o2 Q/ C8 N! F
            length--;5 q$ X  E. }7 q* v5 C& r- T8 `
            count++;
% N5 C4 X) S7 v5 L, i$ G* ~& m        }4 ~) O( `2 N; w1 Z
        if(0 == length)6 y8 y6 I2 w/ I' e" ]2 I1 R
        {
* y. E5 m2 Y8 m, ]* m, w            // 禁用发送中断  s2 c- t( B7 Q# C' F
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
4 F# I9 U; l. I; G/ p# b        }# o& D) s2 \& |
     }
1 V* e# k4 O$ ?5 N- `! c0 {1 G* `( Z/ L. _/ g; e. S. F. i- E
    // 接收中断* j; }4 F, g. }; T) N
    if(UART_INTID_RX_DATA == int_id)
7 r( |5 Q7 u& I7 O( L6 l& Q: }    {! u$ \4 ?3 v0 V" ?. q4 T1 @' v
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);4 F7 ^' e9 Z# \" K5 K
$ E+ Q6 A) F; q
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);) |6 ]3 [# ~7 `1 R
    }7 t5 i6 y8 I8 \- R+ d
5 v3 i4 d) q9 M5 d- R% ~
    // 接收错误) j; [; k3 g1 `1 C" N# S
    if(UART_INTID_RX_LINE_STAT == int_id)% Z8 e) j! E' h* J: ~- F
    {
* t) M) X$ K/ o* z5 V        while(UARTRxErrorGet(SOC_UART_2_REGS))
  [9 j$ |  R# I' C. r; q4 M  F* T; m3 b        {; n/ d3 }, ~$ e9 W
            // 从 RBR 读一个字节
! S: m2 X9 f* n+ v3 i4 f  C' ?            UARTCharGetNonBlocking(SOC_UART_2_REGS);
4 S: v% z4 G; P6 f" j* U        }
" ^( x2 l7 F! j6 N2 x# j, S    }* h8 @4 d6 x2 i
    " n+ x; p' [. W* C1 n) v
    return;
) L5 d8 g& t: m9 _}
' G% ^2 q7 {' j! L
回复 支持 反对

使用道具 举报

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
5 h( u; I3 @9 |4 i2 s如果其它设备快速给你发送串口数据,你这边能正常通讯?

- k* t4 k# ~) L/ v& e' i8 ^0 L# ^4 E2 i谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-17 22:32 , Processed in 0.045132 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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