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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8685|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。
" J: f7 F% g; I( L6 ~

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

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

5 D7 H2 |! {' M/ n: y- o5 J#include "TL138.h"                 // 创龙 TL138 开发板相关声明
5 q" i% T+ O  m# F  W0 A% K! e; x
% L* Z/ M2 E  r#include "hw_types.h"               // 宏命令
% v( x& l2 L0 J# j9 ^& [#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器' x7 F+ v6 C. ]( @) x
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器
& A% D6 K- e- ?( _( C4 ?
/ X! S! q+ X: [' }* |9 Z9 U5 ~- N#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明4 p5 t2 k+ c& I) X7 K; U
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
% |$ o4 t- Z& l3 D#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
( Q( H8 _" O% R9 U' D#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
1 ~6 c6 c5 _; W6 i7 Q9 r% x6 Q" [( v$ H3 y2 P0 E# z" l
/****************************************************************************/
; P6 h' r* z( U4 l; G/*                                                                          *// f6 C/ t% @# t; z: t' U5 D
/*              宏定义                                                      */
  @+ O8 ]# Y0 M$ O4 i/*                                                                          */
! |3 e  S- B5 _/****************************************************************************/
/ B5 S: S. D5 K; J( {// 时钟# S) v- W6 z2 Z4 o& o$ g9 c
#define SYSCLK_1_FREQ     (456000000)
$ o( @3 u0 \. |$ U& M+ h! r#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)3 a4 e. Z+ v4 m9 T" R% A# ?7 ?
#define UART_2_FREQ       (SYSCLK_2_FREQ)0 e. S3 j) E! {: k* j
+ H1 n8 b$ ?7 t( a# Y
/****************************************************************************/( h  }. T% ^1 m% L. ?
/*                                                                          */
8 i1 \! ]; a) `9 ^/*              全局变量                                                    */
. ?" F0 k' C9 J" ~/*                                                                          */5 r2 |5 y2 b* I. U8 b
/****************************************************************************/% x, f. J5 }  P8 H3 d0 [
char txArray[] = "Tronlong UART2 Application......\n\r";
! ~/ s$ ~5 R7 C7 d, e# a* Q& X( @( c" u
1 L/ i- {2 }) y# b/****************************************************************************/
1 ?2 {8 E. s9 v/ a. H/*                                                                          */
5 _% Q+ G5 C3 q/*              函数声明                                                    */
; j7 u" B7 K- ^- \- V/*                                                                          */# Q: v! a$ ~5 t1 y, k+ B. z
/****************************************************************************/3 P- B7 s* Q4 `% T5 `5 h- i
// 外设使能配置) I9 [9 g8 x% P+ z- F5 R
void PSCInit(void);
) {/ e' \' E& s. k2 n% v6 @
. g1 B; S' f: f" e6 o// GPIO 管脚复用配置; F: g* Y/ P# y, B  X
void GPIOBankPinMuxSet();
8 z9 g) f$ G: e% J' B* ^$ {5 y  u; |
* _: G$ w4 o, P+ w' [6 V// UART 初始化& O' {1 W+ M. V8 F# X
void UARTInit(void);
) U: O2 p7 k. {7 M) ?5 r, X// ARM 中断初始化
( A9 L- m! x0 ~) xvoid InterruptInit(void);7 j4 r# ^) }& ^8 _1 G
// UART 中断初始化
. x' u9 n. H" P' Cvoid UARTInterruptInit();7 A, d% O+ n' f! c; E, i% x, f
// UART 中断服务函数6 U( I4 m* g( ^7 r5 n' D
void UARTIsr(void);
+ H3 E- g  |5 ]/ D/ i. I; ]
7 O, q& C0 t; ]8 A# C/****************************************************************************/
! Q$ ]0 a: I' S8 w/ S' k1 K) m  c/*                                                                          */& `  Y0 N( R2 b3 t
/*              主函数                                                      */- }- _! d4 `7 k( P
/*                                                                          */
/ U% _# {5 R9 c3 m/****************************************************************************/4 ^; {& K4 m) o. {  Q0 k; ~+ [
int main(void)
4 [6 B" p; N( _& S5 H{" b; m" L! Y, y4 I
        // 外设使能配置1 [  K7 @$ _: S& J8 _  E! {
        PSCInit();
7 D0 R% x: X# `* U2 S# O0 t9 X        ( x' T+ C+ W  C8 W1 R$ N1 d
        // GPIO 管脚复用配置
0 ~5 p: D) N. ]        GPIOBankPinMuxSet();' b3 s. M: X* G5 A. r8 t# v# O" G
- k, c2 ^& Y/ _& L
        // ARM 中断初始化
4 k/ ~0 B$ t) W4 g+ }7 Q3 P' c6 y9 G        InterruptInit();' j; y+ f6 k; j8 V/ C- n0 x

; {8 f) G! e' e( g& u0 d4 r        // UART 初始化1 q- Y+ C1 h# \- C
        UARTInit();
. C' g6 d; o3 D+ o' R1 A; X
% f: R  H/ |4 B1 j6 y* q% y+ b        // UART 中断初始化
. Q2 J2 y$ P0 g+ y" Q        UARTInterruptInit();9 v- M+ x3 M2 n. [
, s6 p, p. J! A4 {- g1 D
        // 主循环% T6 p; ?4 \9 d6 T- Z7 d
        for(;;)
7 k. M4 r% R( m        {- F1 A6 [. q" P* T2 W. [6 C  \+ m1 r

$ L/ a$ Y; h: _0 M+ H7 F        }
/ I7 d3 o7 p- N/ R0 C}& S$ Q" I- b' U6 c8 ~8 e% t6 N

6 ~' ~" q5 i" Z0 D& J/****************************************************************************/5 x! {0 x( n+ b( m. F" g2 b) |, \
/*                                                                          */3 n; j" i) t3 X# x+ a5 U5 f
/*              PSC 初始化                                                  */7 A% M+ b4 X( ^+ _- a! o
/*                                                                          */" n' r- ]: P8 X/ \$ k6 \3 R
/****************************************************************************/9 z6 Q0 j, Z9 {  E6 ~1 C3 u
void PSCInit(void)2 l/ K6 d  E0 a7 r) {3 s
{& u. N9 t# M, R+ f
        // 对相应外设模块的使能也可以在 BootLoader 中完成
# Q" q$ s( L- H7 Z8 f    // 使能 UART2 模块
7 H: _; U# Y  I) I' F" _    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
0 n. X- |1 K: o, U3 ^}
% _/ ?* V1 t" Z5 A# L$ J
( h6 ?1 A  H! Q" \/ Q% T6 G$ w: y1 c9 z/****************************************************************************/6 O- S7 X4 l2 n) R( S  ]1 i1 m! n- B
/*                                                                          */6 j9 ^2 Q- F' k( q- i
/*              GPIO 管脚复用配置                                           */3 o$ ^, r  \: Y
/*                                                                          */
2 W% n+ ]* I) X/ A3 H/****************************************************************************/
" q; R$ ]9 }% Y4 a2 d1 L# uvoid GPIOBankPinMuxSet(void)
) l( m% a! q6 h& Z0 ?$ C0 f{
; w! H/ V& `+ w6 I        // UART2 禁用流控/ ~9 l* [) r( K
        UARTPinMuxSetup(2, FALSE);
; \% {$ z$ M8 {& H+ B6 J/ p}- N6 n$ Q, {9 g' U7 m; M0 L& i$ O. m: w
7 F; h7 T% z/ {# n
/****************************************************************************/, ?/ [9 I1 N+ `6 x
/*                                                                          */- B: B! w( G% t, f+ C
/*              ARM 中断初始化                                              */' F; [; n  m& b2 L/ {" u( u
/*                                                                          */) X- q" l3 u) m* ?  m. b1 Y
/****************************************************************************/
  D1 g1 _' }5 ^8 o; P1 @" Qvoid InterruptInit(void)
9 r* e9 H3 f/ `7 p$ \" F{0 Q" A  N2 @8 K7 Q; [" ~' E9 {9 D
    // 初始化 ARM 中断控制器
0 @3 `6 ]* }. P. D    IntAINTCInit();
: d1 o9 v- s) ]
" y# B/ O4 M' H( {    // 使能 IRQ(CPSR)$ g/ w7 I% p6 z  _3 A
    IntMasterIRQEnable();% r/ t8 n8 R+ Y; U# ~5 x

$ q2 u- y9 z# f" f' q    // 使能中断(AINTC GER)
' M1 Y# N! v+ C, L& |/ d7 V    IntGlobalEnable();0 h% o0 D9 P: [3 h9 w3 n
1 {) J: l, w$ L/ X5 B& s' f! x
    // 使能中断(AINTC HIER)" W/ f2 i+ A% k7 e
    IntIRQEnable();
, ?4 `! U. I7 ]$ ~2 U; u}
+ Y! G( H5 \; J" D/ i+ L
  U# J6 d$ b  }: E  w/****************************************************************************/1 c; T" L: p, W8 P( s
/*                                                                          */2 j! Q. K5 z$ X% S
/*              UART 初始化                                                 */- H# x- h' w$ \3 U( Q' }6 o
/*                                                                          */
: s) a8 i) t4 s6 w8 @7 {* ?/****************************************************************************/
# K; a, v5 I9 W# ~9 j* fvoid UARTInit(void)
# Q* a& b, ^% C, p3 P+ |" M+ a, E3 F{
+ C( J; a# V& Y1 N1 @1 x        // 配置 UART2 参数
; D" @2 K% E: y& a9 j  I9 x/ W3 X        // 波特率 115200 数据位 8 停止位 1 无校验位
; _+ J- t  J# q& a( J) X: c1 g    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,$ R/ q9 D( D7 u, }* t$ n
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);/ U6 a) Q* t  P  d# l2 V2 R8 p
        // 使能 UART2& a2 @$ g8 ^$ f9 b8 f) l) _6 z4 B1 Q
        UARTEnable(SOC_UART_2_REGS);
. ~, c0 Y) s" F4 H
9 {$ C) i) T+ _% H6 {! i; t9 W    // 使能接收 / 发送 FIFO* O+ ~! n! u; O1 L' \" T
    UARTFIFOEnable(SOC_UART_2_REGS);, p' R; N) _- ^) ^& P- O5 c% y

+ R- ^% Z7 ?  T/ i2 ~/ G    // 设置 FIFO 级别
: j. Q3 P2 X$ {7 }    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);: b7 Q8 Z; x! [
}
$ V. O4 `; {" K. H: ]  \. d( T* w% J* D% C3 \4 Y6 L
/****************************************************************************/& |7 A- {; m+ Z4 _' {# F. o- D* _/ n
/*                                                                          */9 X: c7 |* W1 P7 l& v5 r
/*              UART 中断初始化                                             */& Z) X, P# D/ ~4 k- n8 J
/*                                                                          */
/ ^3 `/ Z! K5 ]" L+ c' p. @' [* B; v/****************************************************************************/5 |& Q5 Y0 O- h& o" }! a
void UARTInterruptInit(void)
: ]+ k  i! L$ y{, |0 u& q( G4 C5 z- k+ o
        IntRegister(SYS_INT_UARTINT2, UARTIsr);
: E5 |, F% ~& D        IntChannelSet(SYS_INT_UARTINT2, 2);
: V  J+ X' ^3 T" V! w        IntSystemEnable(SYS_INT_UARTINT2);
1 g: f9 ?" o+ H; H
- S# Y2 u$ N- _( S% T/ ^9 L) ]        // 使能中断- @, q- ~: r9 `" B3 l7 {
        unsigned int intFlags = 0;- Z( o6 W; [8 c; U! m+ X4 W
    intFlags |= (UART_INT_LINE_STAT  |  \
$ g2 Z; B6 O( d% T: v0 S; O1 L                 UART_INT_TX_EMPTY |    \6 ^, z) e! ~' W1 U% \
                 UART_INT_RXDATA_CTI);& R; W* ~8 L* a( W) s
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
1 \# _; s" \5 {; }2 t}
! n6 m7 O5 x% Y% I! p
2 Y  b) T0 K. p6 U4 p: y/****************************************************************************/& p0 y5 I( ~9 f! ^" X7 A2 P
/*                                                                          */
9 w1 L; l" k5 c* }3 c9 \/*              UART 中断服务函数                                           */
1 @$ E' H$ ~) T0 L/*                                                                          */
. n$ j' \- E9 p( \4 |/****************************************************************************/6 _% {8 m! w+ i6 V; S7 s) R
void UARTIsr()
8 A1 Q4 n- y1 K+ B4 R* b{
& [. t; x9 b8 y! |, P8 e/ q9 a- U    static unsigned int length = sizeof(txArray);
/ s8 I* x& g$ b    static unsigned int count = 0;
% b# o; e8 ]! }! W    unsigned char rxData = 0;
5 r2 U; C  G0 \6 d0 T, ]    unsigned int int_id = 0;- m" _) C3 }0 a* l% v( K" L9 m

. t" m. G2 ?, B! @$ ]8 z8 H* R    // 确定中断源2 S! u, M$ l" U3 m
    int_id = UARTIntStatus(SOC_UART_2_REGS);2 S0 ^5 P4 \* Q$ x

' `) k/ f2 r$ J: ?$ I1 r% r. ?- `    // 清除 UART2 系统中断
- x8 z5 Z" v# p: ]2 _# }2 q    IntSystemStatusClear(SYS_INT_UARTINT2);" o9 F& p$ [+ ?! S' U3 T) w

0 q4 d5 j, Y, f1 w9 P6 i$ p% U    // 发送中断! h: Y( w2 a# z- p4 V; S7 Z1 R
    if(UART_INTID_TX_EMPTY == int_id)1 E( H9 b0 s8 R/ `+ F. u$ t
    {; F6 `8 y) `1 t6 c/ l
        if(0 < length)% O5 l& u$ F% ?1 p
        {
! i5 B' F* G, m0 z- d            // 写一个字节到 THR
2 X8 B0 F$ w. u            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);6 s2 z5 J6 q9 c
            length--;
: Q: ]/ K( x5 j- ~2 m0 X7 B            count++;8 W0 b2 Y/ N* A; i, y$ K
        }
; F; Q1 T" m) Y' m5 J        if(0 == length)
$ F8 L( _( O1 b. Z& ]* i        {2 Y! i2 H4 }+ E  B  G9 t
            // 禁用发送中断4 P. Q' T7 n  Y/ R( ^4 J$ ^5 |
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);1 _. e* \& c+ y" G9 d
        }1 R' F2 C" Q: Y8 ]
     }5 g' h  P, [5 V' v& F9 g, \

0 Y5 S" h7 _/ ^3 w, J; A* y    // 接收中断$ }8 K( O4 J/ N5 P8 u" M% B5 a
    if(UART_INTID_RX_DATA == int_id)
; W" K& P) q0 l) M6 |( p0 [5 v0 t    {$ o4 l7 F5 L5 K0 f9 H
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
# s) d3 g# t9 m! c4 |4 V2 ~8 A( K' B! I) q# K; b/ a
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);- e- t: X% u0 k: N" `& {! F
    }
# p+ ?: ^+ @; Z% |& i6 V. {/ a  K, q2 _0 `
    // 接收错误
0 t8 [2 x6 k( w2 |+ r" F7 t    if(UART_INTID_RX_LINE_STAT == int_id)# D! I+ v2 G0 L
    {, P% T$ s3 I$ A3 v5 }& U5 r
        while(UARTRxErrorGet(SOC_UART_2_REGS))  Q, S( i) R4 R( `. e% r: l
        {
" X, d3 ]; c2 _0 _/ d9 l5 E            // 从 RBR 读一个字节
9 ]8 P  ?1 z7 f& N0 G5 s. g            UARTCharGetNonBlocking(SOC_UART_2_REGS);
2 C5 V; V5 ^2 R2 f        }
8 E  P% `$ E: ~9 K1 ?* s+ G    }
& [+ U$ m5 C) u6 r   
1 L9 M. W$ p2 r1 F+ K' J/ ]9 [    return;
  ~: j( }5 c$ m1 `* g7 o, W}9 E. Z4 K# g9 Q( ?& 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, [$ F! J8 @/ W2 Y/ @
如果其它设备快速给你发送串口数据,你这边能正常通讯?

9 I7 a1 s$ v( m% B+ C4 P1 s谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-30 20:54 , Processed in 0.047214 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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