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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8103|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
9 v* ~8 X7 k* x, {( I9 L

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。3 N3 d' F! c, o9 t/ V. j

) ]' g9 R7 O1 x- }  Y7 @! u+ k#include "TL138.h"                 // 创龙 TL138 开发板相关声明
7 ?; m0 ]  U' q% T6 m' w3 n
' L4 F* L/ Z# W! A0 q' o#include "hw_types.h"               // 宏命令
) O0 @4 r4 n+ _8 _. e' k4 g#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器- ?) U  N3 q+ Q0 D  @
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器- V. f( H1 u: I3 d# l& o5 w

. X% s/ c' b8 |9 \3 P#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明- F0 `7 C# k/ H* e+ n( u. Z% P
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明) ^! B; o/ A$ H
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
7 N7 z& z% h9 J* t2 Q0 v#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义2 y3 w0 N3 H% {" y6 l

) {. {7 D: a' s/****************************************************************************/
" I- b: h6 w7 @4 z/ L5 ]/*                                                                          */: M; _7 @7 w* o: E
/*              宏定义                                                      */3 j) I5 \$ A5 Q
/*                                                                          */5 h5 H8 I3 a( v  Y6 V
/****************************************************************************/
* y& J( T" F- F* c// 时钟
4 E2 W$ X" n, k#define SYSCLK_1_FREQ     (456000000)1 V" b# w7 X* x/ b- Y% u- I2 l) o
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
3 \( H1 S! F; B5 Y" U#define UART_2_FREQ       (SYSCLK_2_FREQ)
; H% q/ X" H8 s# v# s/ [# k6 ^6 }( @& M: }8 @
/****************************************************************************/
( q4 y& j+ }+ e4 i: Z7 s$ g! ?3 B6 d/*                                                                          */* N9 J( Q$ ~2 k/ w) i& _7 U
/*              全局变量                                                    */7 ~/ I, w3 }' l/ v/ H0 U
/*                                                                          */
7 s2 h7 }" ^) R5 L! v/****************************************************************************/! q7 ]  B; i: {! ^" E
char txArray[] = "Tronlong UART2 Application......\n\r";& L: |, B3 t  c: m) F- T. k- `5 a
0 ]* [* H( M$ J9 r9 h
/****************************************************************************/
9 \) ]1 S3 Q. R* v3 \' s: G/*                                                                          */! x- c( ^$ U4 ?/ [" L" l: |. ~
/*              函数声明                                                    */
/ _4 y6 Z2 ?- |0 g* o6 m% E1 R/*                                                                          */1 O  \/ O) z! g) t6 {: ^
/****************************************************************************/
: x7 [' Y8 N$ v& V// 外设使能配置$ |4 G$ J; U. k' |" o
void PSCInit(void);
& O) B# r- v2 [
/ _, R) R% t: i8 f, Y0 V// GPIO 管脚复用配置
9 H# ^" G3 ?5 `) L+ ]# o* d. {void GPIOBankPinMuxSet();
2 z4 f- m  L& x+ G9 R+ x7 @9 D1 d  U" S' m# [) D
// UART 初始化) _  R$ q8 L( b4 j3 z
void UARTInit(void);7 M2 s4 {5 ~9 i
// ARM 中断初始化7 ~2 u6 Q" p0 j4 T( F+ p. T1 n* y
void InterruptInit(void);: l5 ?- C3 }# E" D# S; }. V
// UART 中断初始化
' V: ]' w0 e. ^& _' }. z0 t! V) evoid UARTInterruptInit();, u5 U% D) d( c- w! a
// UART 中断服务函数- s. }/ O- F! }( h, G8 A: C, i
void UARTIsr(void);6 \4 `6 \6 `. r7 n% q
% q4 V7 R$ j4 V9 r- `- L
/****************************************************************************/
! o4 X- Z& u. S% ~  T* V0 O/*                                                                          */
7 Y# d+ L: i0 h/ l- ^$ p/*              主函数                                                      */
! a4 F" d7 X% {/*                                                                          */9 L9 D9 I( W' X
/****************************************************************************/
8 o! M0 W* Z1 r: }int main(void)' `- o3 v. S, r1 o- c8 R- `1 M- I- H
{
" o2 t7 a) Z# d  Y0 J; ]        // 外设使能配置3 Q* c( S$ K* V7 U, g
        PSCInit();
$ I: w* _  q# M6 l' q        & y! q. O$ G# l% _) `4 O2 [- w8 u& p
        // GPIO 管脚复用配置
; R5 n  y4 V+ S        GPIOBankPinMuxSet();
$ u! V! l, o2 Y( _: N& z$ g/ m! y! ^0 |$ q' M$ A& Y; s% F
        // ARM 中断初始化
5 q5 {0 [5 q1 o0 @8 a$ u9 }- R' Y# L        InterruptInit();. w1 ]$ S" t, C) p9 E9 @6 |6 v
* o1 ^# ^1 }7 c8 W/ [6 w
        // UART 初始化& V3 U. F/ L# n& q6 E" P; ]
        UARTInit();, w! |7 G& O' B% V4 [

7 P; e. `5 ]6 m        // UART 中断初始化( P" U* A0 S6 f& ?) B: r
        UARTInterruptInit();
4 L9 w4 z4 S) |: Y9 [: o/ U) `2 @  F% z: n
        // 主循环& D! C. _. g$ x# [  H& {0 K& ~
        for(;;)4 c) H2 z8 n$ J9 V' Z7 O
        {& H4 B1 A/ v/ X

- [' N; F! v/ N& W" ~0 X) x5 o        }4 J# E$ S$ y& u- G) i9 V
}, e7 s1 Z8 X- C+ B) K) g
; E: g- C, L# ]1 S$ V5 @0 f
/****************************************************************************/. f& ?$ _- e" q1 h
/*                                                                          */
8 m) o& D' W! \/ ~7 @- H+ ?/*              PSC 初始化                                                  */
  G& ]  g2 y- g5 s+ O, R5 e/*                                                                          */
) s+ _9 }% V' g5 R5 e) }  Z/****************************************************************************/
. i: {5 v6 t3 I4 I. c% svoid PSCInit(void)
7 \' Y$ a2 ?# W{& ?. w6 G3 I( q  j# K( s( }+ p
        // 对相应外设模块的使能也可以在 BootLoader 中完成
# P$ M  I6 e3 }2 c0 G8 }- A6 c' A    // 使能 UART2 模块0 j& O+ l3 |! f
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);- q1 w' h8 g. ?! _: O! ]& _) e1 T( e
}
2 }0 h5 a. ]" [; e; a. b6 W  Q1 [" i3 m' X
/****************************************************************************/. i$ T& I& b' J
/*                                                                          */
4 N* s1 U  G$ G& j/*              GPIO 管脚复用配置                                           */& T0 E* `$ t. f+ @! w
/*                                                                          */- A* M* b* [# u9 K" K1 @
/****************************************************************************/9 \, ]& d4 m6 G- Z% Z5 g  B7 T
void GPIOBankPinMuxSet(void)
5 N' K/ w& K5 f* N- i" q{
5 L, c, x; }) m2 X' D        // UART2 禁用流控
* x+ b- V1 F0 A! W$ T0 i        UARTPinMuxSetup(2, FALSE);6 g* }/ b, h. X3 A
}
4 t$ P, @7 n% ]5 Y) y
5 }3 b3 c: x9 h& w/****************************************************************************/
/ v9 J" h# D, i4 D/*                                                                          */
2 N/ q9 l/ C; F% }/*              ARM 中断初始化                                              */
1 N2 V, T! p  g; U/*                                                                          */
/ v8 [7 i: W" n0 ~% M! O/****************************************************************************/" U( n) U+ I# M' ?  n
void InterruptInit(void)
  B0 W! L+ _- o  C) `3 J' `. G- @{
% \7 G) e9 J3 b    // 初始化 ARM 中断控制器
& H( m" Y* |  C+ [. B. W% \    IntAINTCInit();
% ~0 d" N( q. f- e
6 r( u, I) i/ J5 d* i; |; U    // 使能 IRQ(CPSR)' S' F+ S3 q& P
    IntMasterIRQEnable();( V! I1 p, n1 R- T

! s) e0 Q( \1 H- r* e0 R    // 使能中断(AINTC GER)
- f$ O/ T/ u( {1 A) @4 S! I2 q    IntGlobalEnable();
& G: v8 |. C% a/ K/ D" L
7 q0 {! L' X: ~    // 使能中断(AINTC HIER)
0 N+ B: B, c( P" E# W' u% k    IntIRQEnable();
# A: t% S4 W( e- N8 Y. [; J}1 h% B, S, E) K8 m% q8 a
7 [& Y+ D6 r. J4 c2 B5 a
/****************************************************************************/
/ ~2 T, h! m, d7 x/*                                                                          */
! H2 {& h( @; N& @$ X" k: N3 r/*              UART 初始化                                                 */
4 q/ N1 w$ A! Y# `/*                                                                          */+ w$ x+ m. R5 K
/****************************************************************************/
# v, T& `2 O: Gvoid UARTInit(void); t0 o8 N' ~3 x% J6 l- L. I
{2 ~" C2 `5 c% t
        // 配置 UART2 参数+ M. t+ o' H  S6 P! @/ l' s
        // 波特率 115200 数据位 8 停止位 1 无校验位. K  ^% R) L. L: W& x4 x! l8 F
    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
/ K8 a: k. ^8 m& t                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
6 m' u6 _1 t6 h& D1 G" V# _        // 使能 UART2
! P9 w8 W0 M* w) X' o# U, \        UARTEnable(SOC_UART_2_REGS);
' y4 `5 \+ |9 y4 d3 s4 X0 q- |. l9 z5 B" t, u  x
    // 使能接收 / 发送 FIFO! S1 m$ z4 M  Q5 \. i3 M, C" B9 i. Q/ ~
    UARTFIFOEnable(SOC_UART_2_REGS);' ~7 L- Y/ K- ~0 @* [8 z6 h' B

: @5 i8 G, j" ^# G: K) }    // 设置 FIFO 级别
+ i" V: ?# v0 ~8 [$ o8 J. e    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
$ \1 l, e, Z" Z5 [}% M* S: [, a8 p7 ~1 \7 r  A  Y
' o6 o# t7 `$ h& Y
/****************************************************************************/
" i0 ^# J9 X3 p! {/*                                                                          */( F. Y8 \1 D, i  Q
/*              UART 中断初始化                                             */
# z7 @' \: [8 S/ N7 r9 n# N/*                                                                          */
; L) X* n# c' d9 F( a0 q: h/****************************************************************************/: _& P+ g0 K' x5 f; {# Q% z  H
void UARTInterruptInit(void)' ]5 Y% W% T; `9 l0 k7 M$ [
{( x5 r/ p' ^+ M% A$ H8 U
        IntRegister(SYS_INT_UARTINT2, UARTIsr);8 p/ o2 g6 C9 C3 l0 D
        IntChannelSet(SYS_INT_UARTINT2, 2);
) M' Q- X! H! }* s* u        IntSystemEnable(SYS_INT_UARTINT2);1 c  J- [! Q) ^
  o' h& ^+ {3 l: C; d9 \$ @6 h! w
        // 使能中断
% I, N) R$ M/ U6 [8 x; i* k" z! D& w% u        unsigned int intFlags = 0;* g2 W" p7 ^/ e" v' b  F+ c
    intFlags |= (UART_INT_LINE_STAT  |  \
6 n- ~1 E) ~! i* M, v( y                 UART_INT_TX_EMPTY |    \
! E+ Q7 y* u5 L4 P1 X6 e8 s                 UART_INT_RXDATA_CTI);' T  l1 S+ i$ H0 v, [- r
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
5 J$ I+ B% u  _) E' ^: R}4 j$ x1 v% O2 J- s

" X' f- h+ \$ @; J; {  y' w7 A/****************************************************************************/. A4 W) \5 \# G  s
/*                                                                          */
# `3 s2 F9 E3 h  u/*              UART 中断服务函数                                           */
$ M6 n5 y9 Z; j7 L7 g0 {* e/*                                                                          */' u2 F1 ]6 J$ X0 }5 G- o
/****************************************************************************/. p; `. ^  k$ p2 P, _
void UARTIsr()3 \, c$ m* ~: P8 w  _
{+ M& T. D) M5 d4 g; i1 o
    static unsigned int length = sizeof(txArray);
5 A! x6 P% f! {1 q. Y+ ^# {4 L    static unsigned int count = 0;# H& C2 [0 {5 l- p/ C- c; S
    unsigned char rxData = 0;; l) m" q. Z! o+ q
    unsigned int int_id = 0;5 y* f8 G3 O+ ]/ y- U9 H' T, x

" j! y! c8 {. W/ h" D    // 确定中断源: @1 `* s9 K, F9 D6 m
    int_id = UARTIntStatus(SOC_UART_2_REGS);
4 }% E6 `8 z2 F0 g! \6 R8 n2 [  m9 Y
7 ]; y# d  L" A$ k0 x    // 清除 UART2 系统中断/ y8 r" L' v7 m
    IntSystemStatusClear(SYS_INT_UARTINT2);
8 D. }1 Z+ b2 j0 a/ f3 E* M! k8 Y9 @
7 V6 ]: C& S8 r: E1 p+ p" g/ X- K( Y    // 发送中断
" Z; B2 t3 N, I% k9 ?) j& B    if(UART_INTID_TX_EMPTY == int_id)4 r6 k- ^% }  a5 N( ^$ P
    {. s1 F/ g- Y) s7 C7 W
        if(0 < length)8 p- T. A/ s. H# B, P* s
        {
4 R) S# G+ g- b. Z- W            // 写一个字节到 THR% A2 S3 t8 U* ^1 P6 V+ u
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);6 Z! y/ k2 T+ p# l& C
            length--;
. G6 H# [1 [$ W, [. N! Q            count++;4 C3 I! H; U' X2 k. a
        }
0 a( k7 X1 _, q! Z% R: a  w4 P        if(0 == length)
8 t4 `# K5 l/ i4 C/ P" v6 V        {
, k+ T4 p: ~9 B& M$ e( L            // 禁用发送中断. _) X; p) L4 @: o5 `; l% V
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
5 ]" p; {# _% X: v7 D        }
) @7 X4 O4 c( F' i# G* g     }
3 V- ~: |8 z6 M+ b  h% \3 o( G7 o5 n5 f% Q: g
    // 接收中断
( x7 H  X& {" ^: s% t' W' @    if(UART_INTID_RX_DATA == int_id)
& G$ t5 G! z! P, u' n    {
! e3 H" X6 ~. @: s. M& j; ~        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);0 A9 H1 w. G3 I6 Y" d0 G) I3 i& p
! c  j9 ~: }( ]- ^- Z3 F) J
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
' V; S+ j6 e% g9 p0 {; c- E9 w    }
8 X2 f# b9 O0 K$ r( I8 v+ {- y3 D6 O/ n# i. l6 C
    // 接收错误2 X# P5 Z5 R$ r5 V
    if(UART_INTID_RX_LINE_STAT == int_id)! M" u/ G' x2 l
    {
& j* T0 r9 m( M5 M% a; d        while(UARTRxErrorGet(SOC_UART_2_REGS))
& k9 G; i/ L, ~% ^        {
/ E; V$ B: {* f+ f. Q5 [& [            // 从 RBR 读一个字节; [9 S, A" U1 c# d
            UARTCharGetNonBlocking(SOC_UART_2_REGS);
+ _5 k1 Q, e3 U0 `( Q+ K5 c        }$ f8 y9 S7 a) I" ^' K
    }7 ?, C" ]/ a0 D/ m: }; s
    8 a; R( j5 e3 d0 u
    return;
0 v3 g: Y' \7 O0 o# t  B; w! S}
6 T. C+ l, ~7 z5 p( F, M0 A
回复 支持 反对

使用道具 举报

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# L9 e5 E$ P- c3 e9 M
如果其它设备快速给你发送串口数据,你这边能正常通讯?

. p1 U1 I* z& J& X8 D2 D谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-9 19:38 , Processed in 0.045196 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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