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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8315|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
( K0 D1 X  A4 b+ l: H

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
# L! }  z/ g. N) I9 I, K3 B$ \
( O# O0 |+ j* e+ b- t& D- \#include "TL138.h"                 // 创龙 TL138 开发板相关声明* z! F5 c7 ^2 J' U9 `3 C3 ~

/ u  G& a# @: y4 B. g, k! j" d, M#include "hw_types.h"               // 宏命令
8 ~7 K. R: Y/ c" R. c, N; Y. n#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器
/ ~1 e% N9 W: q$ w" c; |#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
+ ]2 t: E/ m% E3 {
$ ^9 d- ~* q; ~, L+ d8 h#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明) T3 _: [  d9 u4 {' j# h8 ^! m
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明: h" p* f  `- O
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
7 A4 O* A4 Z8 O# W' ?#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
- a) _: J* |4 O4 M5 g2 R- Q) m; V/ a- l0 \& n( m" ~% o
/****************************************************************************/  U! n0 k, ?& A) G1 }
/*                                                                          */0 n* ~- W/ Z( v6 Z" W
/*              宏定义                                                      */1 F& t, y" d7 Q) y
/*                                                                          */
4 ~4 b1 g9 F  A0 ?7 [/ I" b9 ^/****************************************************************************/
; n. T* C  {% K; S) k6 U5 V// 时钟
! w/ s- z1 z( u8 h. I; Y, B, n, z#define SYSCLK_1_FREQ     (456000000)
. x0 j( s: U! H#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)7 p& {( F3 \+ T$ y
#define UART_2_FREQ       (SYSCLK_2_FREQ)
" U( L2 K% l; Y7 E: m8 |+ P4 ^% c. C! V  a3 w! y6 ]* y- Y- {! U6 g
/****************************************************************************/
  k4 R9 n" U- }0 O1 J* k/*                                                                          *// y0 p0 c- V4 e  u; I6 `$ T9 p
/*              全局变量                                                    */
- Y" _& V) ^0 d" m3 p6 S! j/*                                                                          */7 M+ k) X& p$ ~1 D0 l
/****************************************************************************/! V1 v: Q+ i( }5 k" P) @
char txArray[] = "Tronlong UART2 Application......\n\r";
2 ]( K: P5 M0 Y# s$ l* W
, x. P6 O* w: A6 q/****************************************************************************/
% f0 T( p8 F7 ]/*                                                                          */
$ h1 O5 w3 }) _4 M/ \; J2 j! Q# O- [/*              函数声明                                                    */( Q& @9 Q8 n+ t8 k$ K$ S, X+ n6 o
/*                                                                          */" ?! W) Y) P) p$ g, G2 D" b9 }4 F, O6 Q
/****************************************************************************/1 Y: j- Q, z: w) Z) f0 s
// 外设使能配置! @2 G6 m6 M8 q5 P* K
void PSCInit(void);
2 O* E& ~! W( v' o' l7 `3 v: U* N) t9 e0 i1 F% ?, \% X4 |
// GPIO 管脚复用配置
" x' v/ A- p& `  M) `7 B8 Kvoid GPIOBankPinMuxSet();
! ?  P- [) @( X6 t/ }
! X$ R& o3 f6 |0 k// UART 初始化
6 a8 i: M; ~) L- Qvoid UARTInit(void);
8 B5 Y- T# l$ p9 R( p% W* |8 Q// ARM 中断初始化# W1 `2 C3 D" f: S4 L
void InterruptInit(void);, s5 J5 O1 F& Z% t! r
// UART 中断初始化4 K- ^2 _: k7 M  j3 w5 L
void UARTInterruptInit();9 ^# o% H5 G( r. F
// UART 中断服务函数; _* E9 g# t' L; y& Y: i1 E
void UARTIsr(void);
) q* X0 a4 }  B: [$ j
0 N9 a0 \. B1 |7 S" I; Z/****************************************************************************/4 N% W6 P: R; k* V: B
/*                                                                          */
) M3 f3 l, D5 k) O/*              主函数                                                      */9 [! @& n  k# `2 X  @: {& H7 ~
/*                                                                          */- {( b* e3 q4 K6 M( D
/****************************************************************************/6 ~' r% ^' }" U# P$ t& `5 }4 v
int main(void)* T! Y0 B# f5 c0 F% V
{
( z7 }1 h) F* Y: `0 {/ v        // 外设使能配置3 f( U: A" {1 g) E( S, m
        PSCInit();
# I$ w) C, [" M8 M% T5 a       
: e) e1 F4 V! C/ F& {! b% O        // GPIO 管脚复用配置- B$ m: \3 e4 z% [
        GPIOBankPinMuxSet();, {& b9 @4 o$ w/ |0 I

( F0 y$ E8 K4 S. m        // ARM 中断初始化
/ Z6 `- }  H' }        InterruptInit();$ c2 Z7 c! a% B; F7 [

: s3 _; `" d+ T) y0 x. E        // UART 初始化
# _3 B; B4 y5 K2 N, I- M# I        UARTInit();  p, Z$ v" Q' j4 j$ f$ Z1 ]

( \+ J$ B) N6 r7 F+ C" s        // UART 中断初始化2 ?+ d; J/ W# {/ ^
        UARTInterruptInit();
, T7 S. i8 A( M' c: ?7 T' a/ c, f# Q* ~5 E! F: y2 ]8 u- E
        // 主循环; Q: L) g" V' m6 N9 u* ^* w3 f
        for(;;)
  K$ p. S: B% d        {
* z2 i1 q8 i0 P8 c* G' ~! _( Y0 A+ r6 @& T. L' D9 E
        }3 g- G3 N+ {. A
}
& q0 v% |: R7 B: m/ ^4 S3 D; N* i5 c8 G
/****************************************************************************/. M( |# v. W6 D, U2 V, p
/*                                                                          */! q8 S9 i( E# O; n) O; h  s
/*              PSC 初始化                                                  */
1 r7 H, ]4 x1 `% |  |1 D- i$ c# j/*                                                                          */6 }* f  J5 Y, ^
/****************************************************************************/. O: f+ y1 q- h8 P( c8 U) \. S6 r
void PSCInit(void)- R6 b* v; M7 R& k3 R1 w1 S
{
! N% U# _( |* P; L& \        // 对相应外设模块的使能也可以在 BootLoader 中完成! Q8 I* ]' e' u" ~& |7 R5 m  H# g
    // 使能 UART2 模块
4 T% _3 L% N4 {3 k  M# w0 U    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
" t2 o& M4 B, [}
4 ]8 |3 N8 B" L; H( X' U4 B: q# S- T* S  a' m- S( Y
/****************************************************************************/8 X0 B$ e4 _4 g# L! N
/*                                                                          */% H0 i: l, d2 n$ C2 Q1 E
/*              GPIO 管脚复用配置                                           */
/ V. ?0 y0 i: e, L/*                                                                          */5 b* h- @+ c) Q* @% m( p7 i) z3 s& V# C
/****************************************************************************/, V: V  r* A' ?6 R% q
void GPIOBankPinMuxSet(void)
2 b" X7 A; ~4 D2 L) f0 `{
  d) C% x2 A1 e/ |        // UART2 禁用流控0 ^! t  ~; j& a, J( ]
        UARTPinMuxSetup(2, FALSE);/ M/ |: J# \- I$ F! W& \2 `% \
}$ ~/ I- ~7 f9 E
, @4 d' {" k, O8 M+ R/ n
/****************************************************************************/
. Q0 O3 J4 [+ F! F/*                                                                          */2 Q$ W' U9 K0 W# V1 m
/*              ARM 中断初始化                                              */, V2 `% f. u0 d% U5 z( _/ j- |. b
/*                                                                          */3 h+ j* ?+ Q# t4 n; D3 |
/****************************************************************************/' j/ I) A7 s) d/ b- g/ J
void InterruptInit(void). {  T# x) S3 Q6 J5 Q1 L
{( P3 `2 J. ^( D& J# T) \
    // 初始化 ARM 中断控制器
: Q% W; [# i" v    IntAINTCInit();# t& n) a6 ~. [) J/ E0 g
+ e; ?* X: v: {1 K" i  c3 |5 l
    // 使能 IRQ(CPSR)
3 g3 r4 k- `! {0 R6 F  x6 _  e8 ]6 Z    IntMasterIRQEnable();
: a  t- K" e$ n% I9 A  p# w$ s! a: Y' T; N! C7 b+ F
    // 使能中断(AINTC GER)
/ L6 X. R$ Z3 S    IntGlobalEnable();& u8 {9 W# M: c% f; I

) ^" u. {  M0 f0 W% k/ E% Y" Q    // 使能中断(AINTC HIER); N" @; S% N" T2 {6 \0 b
    IntIRQEnable();
+ U# T6 B# b6 f}
$ W6 P. F' L/ p# U& L
+ l; q: R/ j' W* m/****************************************************************************/' W$ `1 k, C) i$ P
/*                                                                          */
$ [& W8 E2 `8 z8 ?/*              UART 初始化                                                 */3 {( M5 ^3 m& w& Z/ d
/*                                                                          */% x; S! e6 U" v- u  p8 v
/****************************************************************************/
+ _3 S8 l  Y# k5 u# Z7 O" Yvoid UARTInit(void)
8 b  H. d, ^' A- l7 N{8 h+ i, Q$ h; ]0 H$ C7 G
        // 配置 UART2 参数
/ I/ N) `$ x$ n' k2 v        // 波特率 115200 数据位 8 停止位 1 无校验位
6 n1 z  w9 p: |    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,6 B$ ~$ ]3 ^% U' b: J& ]
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);. B1 Y% M" o9 j0 K7 M
        // 使能 UART2, v$ T" @% n; P, i: M5 P! \8 _, X
        UARTEnable(SOC_UART_2_REGS);
7 U; B+ B- R2 ^
5 x& e1 B( a/ G) G, l    // 使能接收 / 发送 FIFO. z" Y8 g9 C& U$ h0 R, _- u
    UARTFIFOEnable(SOC_UART_2_REGS);. F) \; Y4 a5 ?- |9 p' O

. j3 f: \9 z" v8 B# n# e    // 设置 FIFO 级别8 q$ b7 T: D7 l0 _- Q; L+ m; `
    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
3 i! ~; O- d& M$ v9 e6 r}* q- t& {. t- y' Y
  @' v3 B! H% R
/****************************************************************************// G  X$ {/ n! b9 b- `  W% L
/*                                                                          */
0 R2 f8 B- K" }8 s% k' v/*              UART 中断初始化                                             */% g8 A) F: U8 B3 W9 h+ T  z1 c
/*                                                                          */1 K5 M2 O. v3 n
/****************************************************************************/
4 `5 P. o* ^2 k$ c/ @- b% kvoid UARTInterruptInit(void)
. h! g: H3 E; ?7 Y2 q2 y{
: e0 l7 F0 f8 ]. D) d+ n        IntRegister(SYS_INT_UARTINT2, UARTIsr);
' x1 D. ?: |% ~* M0 }3 d        IntChannelSet(SYS_INT_UARTINT2, 2);* F4 h& V# ]: g( t: [# p) {6 w' W: _
        IntSystemEnable(SYS_INT_UARTINT2);
% O% \7 W6 D  f: x2 ]9 b4 O$ J" ?  _2 r
        // 使能中断
1 Y* X) s1 c4 ^' `& }" Q' D) c        unsigned int intFlags = 0;  z! }: j* w! {, Q! v
    intFlags |= (UART_INT_LINE_STAT  |  \
' ]' c6 F( [/ l' ~5 p                 UART_INT_TX_EMPTY |    \
4 J) Z8 J0 l0 i# o4 ~7 |- W# v                 UART_INT_RXDATA_CTI);( ]3 s" m4 C3 Y% O3 T- N, L
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
9 ~. B! @/ l( {. Q}( M/ p. A7 y- B8 E8 R

) c) p1 H1 m3 n- X$ n- z+ W/****************************************************************************/
0 }& ~4 l+ E& t& J$ v/*                                                                          */
6 h! Z$ [/ a# ?, [- X& U8 V% Z/*              UART 中断服务函数                                           */
5 Y+ X) u/ o2 N/*                                                                          */9 y1 `7 _+ w0 v3 i4 [7 G
/****************************************************************************/" S* o6 w1 e% L/ D+ ^) q
void UARTIsr()
) v4 D: _. ~; K, e1 H/ ~$ x5 L{
* v( A( t/ ^% z. {  d* y8 d; {    static unsigned int length = sizeof(txArray);6 {" j& M. Y, l
    static unsigned int count = 0;
9 \" i, f% q4 |5 D    unsigned char rxData = 0;
  p" g9 O& d2 \! l5 e0 |    unsigned int int_id = 0;
# L5 v! _; L4 E  J# _' ?* ^' z& R2 x1 O+ I  q" q1 Y
    // 确定中断源* F/ I' g9 S* X  G2 C/ h
    int_id = UARTIntStatus(SOC_UART_2_REGS);
) w4 ^  E0 i: r5 D8 R1 f3 O9 T; f
    // 清除 UART2 系统中断
) r( W8 W3 W- w    IntSystemStatusClear(SYS_INT_UARTINT2);
( p- b" Y1 u; a9 |% u1 }2 a
6 O0 J2 ]0 T' g4 }5 t    // 发送中断
- K, \* p5 S. x4 g5 y. q- U    if(UART_INTID_TX_EMPTY == int_id)
; L. M3 \; S1 J6 V- W    {# a/ P" v! m0 i
        if(0 < length)  P: x0 w: U$ u, ^5 h# A- d
        {
; m8 c, Q9 I( v            // 写一个字节到 THR# T9 `0 }1 o% |& R
            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);3 [6 q4 j: ]* y( f! K& n
            length--;6 O1 W  S4 [8 q3 S' e# f
            count++;
0 O. G0 N. q4 T/ b( v8 R        }. L1 w" l3 G0 b1 R; o  O5 v0 o
        if(0 == length)
/ P  [' y4 d, _' p3 T; D        {
  j9 y4 u3 A, ]! v& S            // 禁用发送中断8 T1 z5 O( z: U6 W1 V  F
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
4 f( M4 @4 K* l- |3 \        }
& {. S( |6 l( K- f$ x     }
: ~" Q, v* \. Q7 |1 |
" u6 A  l6 M; m, r  l( n    // 接收中断
, i% _- G0 j: c    if(UART_INTID_RX_DATA == int_id)* o2 D# F2 A( J' J6 N4 E
    {
# q  {! M- _5 ?) d0 G0 ^& n: s        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
; x- R) P2 S# y1 Q7 a( I9 I
* B" ], M# W* v. F4 M# j" i$ j' h        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
) Q+ z# F" Z: Q5 ~/ c: b    }$ ~- Q% e' n8 {: B0 o0 w: l( u( P

  d; Y, J; L6 q9 y( ~/ p' B    // 接收错误
$ d/ L& |, P) c2 D% y8 x3 @    if(UART_INTID_RX_LINE_STAT == int_id)- X1 i0 K- d, X8 C  u
    {
+ v/ R% L4 I: s' J) e6 `2 j        while(UARTRxErrorGet(SOC_UART_2_REGS))
; T' R! ?$ u& j5 P" a+ F        {
1 }: {4 @, F& \/ F7 W            // 从 RBR 读一个字节# `7 d- l6 j% D9 p& n/ H  ]' U" g) f
            UARTCharGetNonBlocking(SOC_UART_2_REGS);+ }4 i5 u8 P1 n4 @+ S
        }$ a: g: U" o/ p% R1 y8 Z
    }5 T. B# a# _2 f0 q' w
   
2 q7 V! t$ X& |+ F4 e( z  F    return;) r) l9 k: e! G6 Q
}
2 |  A# ?& V7 W: d8 x! o/ m+ T9 z
回复 支持 反对

使用道具 举报

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 Z4 {5 w5 |5 J9 r
如果其它设备快速给你发送串口数据,你这边能正常通讯?
$ O. r7 t, p( g2 {0 K
谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-27 02:50 , Processed in 0.045140 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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