串口发送中断触发条件 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8442|回复: 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 Z. l! g2 X3 ^

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。1 |4 @) ~3 I) A$ O
" b  I) F/ H5 C1 E
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
- B9 x' b) R- Z; S% U" M, c
2 h1 O5 l3 K) h! A( Y7 }7 P#include "hw_types.h"               // 宏命令# D, r3 ]) C2 K5 Q6 W9 Z
#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
5 N' h- E0 C; _" a& h6 L' U1 C#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器$ U& s4 r0 Z* @$ [: M" |4 N4 \

! J4 u% n3 H; P( J9 P' ^#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
) x0 ^/ T* o: x7 q#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
) X7 b9 @( }3 V$ a/ Z) T" i#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明2 X& I) L' h/ K; o
#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
/ {* W3 p# s/ A5 [& {5 c/ ^# O- g8 t% X$ E" {5 X* a6 S' V* [+ ?
/****************************************************************************/
6 M" ?* x' i5 Z& ^1 |' \/*                                                                          */
0 Y: d4 R3 q  q/*              宏定义                                                      */  f$ C. y3 m9 b
/*                                                                          */
. @  I. t  G6 E/****************************************************************************/. S9 a+ o: ~% z, D' j) ]/ Q4 B
// 时钟- k0 q1 C; j' j/ D& g7 M
#define SYSCLK_1_FREQ     (456000000)
- Y6 L" o; |1 Y/ L' k#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
6 g! i% ^# b' F( P#define UART_2_FREQ       (SYSCLK_2_FREQ)
4 y+ h# m: J+ G6 x, s) W
9 l8 ~. z# E# z) ^! G/****************************************************************************/; j* b  G# C% B; n) j" ^1 V
/*                                                                          */
' _- @# Q, S1 F5 m/*              全局变量                                                    */  N- a% W# X4 D5 h: g: T
/*                                                                          */* g! W* G9 g% C6 x! S* k5 R
/****************************************************************************/2 _) [7 e; N5 J5 p
char txArray[] = "Tronlong UART2 Application......\n\r";
; I' M7 U$ _! b9 o9 E
& g* z- }2 f2 Z2 m: U2 {/****************************************************************************/: Z6 v" i5 U7 t' l- P' ^  T3 x) {
/*                                                                          */, k' c( y0 t8 @) A8 `
/*              函数声明                                                    */, _5 L  B3 }' Z6 Z, K; f3 O. f
/*                                                                          */. n, j8 s5 P/ M% P; ^
/****************************************************************************/
/ l4 p4 }8 J; m6 H// 外设使能配置( u/ n1 g& ?' T# p: C" S' u
void PSCInit(void);
+ t8 R- `6 Y7 _, @! z1 |9 x$ O4 `: d$ b8 d
// GPIO 管脚复用配置9 G1 d8 |8 n8 }- |$ K+ \
void GPIOBankPinMuxSet();& k. u  C2 U, a- l  M6 S1 ^* d$ [
3 ~& R  ?4 w' {" }6 P( P
// UART 初始化9 H6 [3 I$ ?7 w; Y9 @/ L, C  r
void UARTInit(void);
1 W4 h, j4 I; k$ L+ y# F2 U// ARM 中断初始化
- T4 r8 l) o- V4 A: f5 ?void InterruptInit(void);
) O  c: u- U1 \7 L- Y% B// UART 中断初始化( ~3 U6 S$ h0 U4 {" ]3 D" K  i" a
void UARTInterruptInit();, N% p* v' c! M) e5 [2 t& D
// UART 中断服务函数
5 T7 G& Z& h' l/ ]" n8 _  Gvoid UARTIsr(void);
; C+ Y! x$ s" U' K1 c- `3 a+ W( q6 x, \
/****************************************************************************/
7 G8 k$ U, Y2 O% ]) C) o/*                                                                          */
+ K* t% f/ k( ^! [5 [" e) m/*              主函数                                                      */
1 z  q) ?' n( j) ^: C/*                                                                          */. p, K9 E4 b- D( U' m2 T
/****************************************************************************/
: r* C/ N) v2 a2 [+ T9 E3 D+ [int main(void)
1 U4 m! Y9 e7 Z" F  s{: o+ ~$ T/ }" S5 W
        // 外设使能配置* L: L8 M! e* o$ Z# {
        PSCInit();- {* \) }3 ]3 c1 ]( ^7 e0 ?: r
       
# c5 g9 @$ X* t3 J: R4 Q& G        // GPIO 管脚复用配置
. b0 V2 T( u3 k( `        GPIOBankPinMuxSet();" f% b  W( p* w" q6 j
) H4 ]( j6 T8 _; U; z1 p
        // ARM 中断初始化
/ r- V/ c8 _6 ^( H5 O        InterruptInit();
8 g  A$ V% D( B& E) F& g
. j* m$ T- E# t. c        // UART 初始化0 _6 O4 Z, V# U
        UARTInit();
6 \+ ^) U. ^; o2 K$ b
) N& h7 q6 i, C) ?; @' O        // UART 中断初始化
: p) }8 }9 O* H' N. _* x        UARTInterruptInit();
+ _* J7 x! ^% @! u* ~1 H. s! R+ r' E& T! v  w
        // 主循环
' S( T  q% b4 x3 q        for(;;)
, x  D6 F' U0 t$ d! r6 i- t        {
/ [( s9 a% W, X
/ c2 g$ I8 P. c5 [8 f        }7 k; K' S- V, z% R1 i6 ^
}0 Y& m$ R# C- C

$ B1 u3 w. m4 o# |% K7 L3 I! X7 f/****************************************************************************/
4 W: ^& f# L: `- e0 [2 R# |/*                                                                          */7 }9 C6 Z8 n9 G4 D% g
/*              PSC 初始化                                                  */
; z$ ^: F; U# A  r+ `& X/ o) ~+ }/*                                                                          */  q0 {0 k  [  t: p+ o& ~
/****************************************************************************/
+ ?7 N4 v; O. K5 x8 |0 ^3 X" e! E0 ^void PSCInit(void)
* m6 V, v* _' E/ _7 B8 ?% R{
- H# y0 W3 i4 b8 K  q9 V( O' V: x* G        // 对相应外设模块的使能也可以在 BootLoader 中完成" u+ J* p# O, T5 L" {
    // 使能 UART2 模块
6 a( n6 ^7 \. r& q/ ?8 b  e    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);! e/ Z4 w, B! p0 w" }" U; i5 o
}
6 t) F- Y6 c& G" ]" n$ y/ R
7 c) ^: c  Y1 v- U! S0 U1 `/****************************************************************************/  ~3 d+ k; B; h! R, C1 p, B
/*                                                                          */
% e+ x1 E0 f6 G4 }2 s4 d, @( w/*              GPIO 管脚复用配置                                           */
6 A" }% M) T8 C1 v* u4 `/*                                                                          */2 K, [, ?5 E* k8 W. v+ O" c
/****************************************************************************/
& M0 G5 _+ L4 K( Z; Lvoid GPIOBankPinMuxSet(void)
$ y2 f; H4 Y" ^" L* g7 Z4 h2 ?! |{
) Z3 u5 A9 u/ Q! G7 y        // UART2 禁用流控
- c8 Y( }; q3 j3 S: G& F        UARTPinMuxSetup(2, FALSE);
9 d! Z) e+ u# ~8 _}
9 A; J9 a* Y$ Q4 m
3 i. J: u" ~. w0 }* ?/****************************************************************************/
0 o' j  ^" g$ H2 [9 G9 O3 ]+ {/*                                                                          */% i3 K" b2 g$ {8 J- j- O9 T
/*              ARM 中断初始化                                              */
$ Y" O7 \$ r# d  L  g/*                                                                          */
; n" w1 T- Z" C6 t$ V" @4 [2 B/****************************************************************************/& U% J) R, X& i) B5 K" u+ i
void InterruptInit(void)
3 r# k1 Z4 K$ D6 W* H& o1 a{  A: f' ]; z% S- R& M% h+ u) c
    // 初始化 ARM 中断控制器
7 w: M4 u- ?* v9 F    IntAINTCInit();
8 F0 O/ r- I! \3 \) B6 P8 ^' u6 y8 N: C1 i5 r( n" ]5 p
    // 使能 IRQ(CPSR)" W- x, B% t3 r, X& e9 C
    IntMasterIRQEnable();$ d; i' j: E. v8 {  a6 j

' \' u8 H" r6 d0 F  Y    // 使能中断(AINTC GER)
9 T$ ~. t1 U% V. D  z. g    IntGlobalEnable();
' ~( K+ G- A# ^+ h+ ?8 h5 F
: Y" W% H9 O8 G/ D( F: X    // 使能中断(AINTC HIER)
4 D! n9 F$ d* `+ }0 L4 R    IntIRQEnable();
& z+ }9 L9 P7 _1 ^. j. P}
. [* M8 e8 s! q) Y% L; _: z) j" Z6 k+ T4 [& \! S
/****************************************************************************/
# Y( V8 c3 t% v# G9 F, @. w/*                                                                          */
' h- c  M: a: t4 Y% _1 W/*              UART 初始化                                                 */4 q2 J% e% V5 i' m
/*                                                                          */
$ K0 K! y2 L8 i/****************************************************************************/
4 D: G8 E, P0 J9 x" Avoid UARTInit(void)
* y2 c8 ^, P* y) G{8 y1 g9 v$ B1 r* K. o' [
        // 配置 UART2 参数( D2 M" q( S8 _8 i# F0 ?+ m( ^! V
        // 波特率 115200 数据位 8 停止位 1 无校验位
# X, [5 A1 q& F4 g( o: T    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
0 p4 c1 }. i3 Z! @0 ^: h                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);1 n4 b" t3 R0 h, Q$ M; X" h8 }* O
        // 使能 UART2
3 q" b4 U$ c& Y* m$ ]5 x+ E# Z        UARTEnable(SOC_UART_2_REGS);( D3 }" G' e! E2 r& v* m

+ c' ^7 e# K+ ~9 J' \5 g- m    // 使能接收 / 发送 FIFO
6 o! j6 K: P5 G* v+ D    UARTFIFOEnable(SOC_UART_2_REGS);/ ?  z+ V+ f3 Q, V8 X+ d: ]& W

8 k  `; X* A: Z9 P0 D6 {    // 设置 FIFO 级别) K7 ]& E- ?, J: X
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
8 ^9 d4 y8 O+ `, C6 j# I}
( ~1 x% S: ~- g; n* x: J% ~& H) C. ]! v& c& ]4 R
/****************************************************************************/
. `, \1 N" R, e% f. \* O/*                                                                          */
7 q: ?+ q! J, z3 R' c3 Z6 X$ A& E- v/*              UART 中断初始化                                             */
3 \1 l) z: v4 O0 F) U! ]7 M/*                                                                          */6 q) v$ l) Q* f4 l
/****************************************************************************/
; [2 d3 F% |2 P$ Uvoid UARTInterruptInit(void)0 K! r6 @% R- |  x$ q# m5 |
{* Q2 M* M6 h" I8 M$ q
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
& [: a& C; W1 S! e        IntChannelSet(SYS_INT_UARTINT2, 2);* @# [; S$ r5 Z: m
        IntSystemEnable(SYS_INT_UARTINT2);; R' i, L* o6 L. G. `

9 W5 L  p7 ~' w8 h        // 使能中断
7 x+ o1 x6 `# h. u% y+ L& P/ Z$ _3 z        unsigned int intFlags = 0;
! Q& y( _4 `% b: s$ ~( @( K2 ~    intFlags |= (UART_INT_LINE_STAT  |  \, O3 n- s7 Y, ~# M7 ~6 F
                 UART_INT_TX_EMPTY |    \1 y  K/ R8 b3 G. e+ [( Z4 ?% X
                 UART_INT_RXDATA_CTI);
' u, ~; I+ J1 ?8 W  V+ j! @5 C    UARTIntEnable(SOC_UART_2_REGS, intFlags);: L& A; i5 |. W# a
}& S" y1 ]% Z) Y4 D, Z

/ e$ ^0 e  [& o) F3 P% A/****************************************************************************/% z4 B* k; b% F) ^! \
/*                                                                          */8 K4 }, I* `, D; `; K0 q
/*              UART 中断服务函数                                           */
0 i+ F( |1 r$ e, O& ~/*                                                                          */) M2 c) E1 E) @; F5 h* R0 Y
/****************************************************************************/
/ Y! A' j) ^- q! D9 ?void UARTIsr()
, ^5 x+ C/ a% x, D- D{( M- ^% J3 d0 @5 {$ c+ y) b/ t; c, T
    static unsigned int length = sizeof(txArray);
: M; _2 P5 h2 C+ L* V    static unsigned int count = 0;
: |4 O7 |( S6 e2 }( m5 r    unsigned char rxData = 0;# j1 s% A/ R# |, X7 g* W
    unsigned int int_id = 0;* f* x) v6 L' m  G5 \

2 G5 q, K0 A& ]. G. r    // 确定中断源* ?+ @( q/ X& s) w. A7 A
    int_id = UARTIntStatus(SOC_UART_2_REGS);9 [0 W* t6 _9 b- K1 n- |
. U# J# u4 E% N
    // 清除 UART2 系统中断
. ]- [/ c7 c; v- w1 ?    IntSystemStatusClear(SYS_INT_UARTINT2);
  o- X7 E1 N" F2 z0 \2 D; A2 }# ?3 B& `( _* U' V: @. z8 ?: ^( c4 y
    // 发送中断9 e2 F" f# H. B# W) d- [" H8 ?' Z8 r
    if(UART_INTID_TX_EMPTY == int_id)! c0 `9 \" n" g( K  A! b
    {/ k+ x+ h& K5 |# _0 N7 x9 Q* E8 |
        if(0 < length)
6 a- Q0 j1 M0 {+ y1 [. k8 o        {
0 A. ?  ^0 N! u            // 写一个字节到 THR1 v9 `7 M! e( `& b" R% [
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
4 H7 T+ C& V. D5 q            length--;
9 c3 H5 u" ]) j( `1 q            count++;
& D* ^1 _5 {  S- i. M        }
/ P- v: k9 f$ h: h) e        if(0 == length), w$ d: ~; @% f7 I3 |: `' x  H
        {
% R5 K( I2 F' `( Y6 k' B* q: \            // 禁用发送中断+ [  f! s: k3 |2 {0 j: S
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);7 u* O1 ]% X0 r" ~. w
        }
+ J' W; i* d$ b- t5 k     }2 e8 v6 y* A1 M' S$ K9 B
, \! q5 b2 W' v. C' |) @9 [
    // 接收中断
1 h2 K/ _" ?7 J- s/ z0 b9 `2 O, u# z    if(UART_INTID_RX_DATA == int_id)* N9 i" H1 y$ J4 f% z( L
    {
& T5 U( l' O3 ^! Q/ ~2 T+ U        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);/ Q7 O* R5 x! O9 l0 }' n
8 r. `$ l) A0 E1 p+ J/ d0 e
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
; i  h+ r3 `3 F  T0 I    }) {: C1 t! x& B4 G
# ]; X' M+ o; l- |
    // 接收错误
8 H! j% }7 I7 @3 G    if(UART_INTID_RX_LINE_STAT == int_id)
2 w9 D5 D9 e! W    {
& m9 W+ P- Y7 S: c- ~6 ~4 x7 T' r        while(UARTRxErrorGet(SOC_UART_2_REGS))" K. O7 b- J3 @
        {
, Q, Q! G. t% F3 T9 e            // 从 RBR 读一个字节
% p5 t5 G3 @+ e8 D            UARTCharGetNonBlocking(SOC_UART_2_REGS);- c8 l$ v8 o7 j5 [" p+ E+ M5 |: s
        }
' l! |: G, s+ T& c4 N. y    }: j# b" H2 t0 d" c( H1 \# F
   
  |+ c" X: J+ q* Y1 e    return;
9 @3 s% t1 ]2 Y6 n4 ]. q) U}
0 O# f9 \8 d, ~. @
回复 支持 反对

使用道具 举报

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:250 @$ i% g2 ^* b& k* }
如果其它设备快速给你发送串口数据,你这边能正常通讯?
7 h+ }! O$ ^  I' z
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-2-5 05:11 , Processed in 0.045653 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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