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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8631|回复: 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);我看开发指南上,发送中断就这两个触发条件啊,但还是进入不了串口发送中断。5 x8 a* W1 P) J. `& I$ t

本帖子中包含更多资源

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

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

使用道具 举报

1

主题

5

帖子

1036

积分

金牌会员

Rank: 6Rank: 6

积分
1036
沙发
 楼主| 发表于 2019-4-30 19:45:08 | 只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。" H. @; @$ P0 C! e. y% f
$ x  R9 s6 K( J7 m
#include "TL138.h"                 // 创龙 TL138 开发板相关声明
5 {9 ^0 |" i) r; Z
$ S8 r( u$ u* v3 i2 _5 V#include "hw_types.h"               // 宏命令
* k9 j& f8 \5 G! f" _' D& @#include "hw_syscfg0_OMAPL138.h"       // 系统配置模块寄存器( h7 u" Z9 [7 E1 C7 i
#include "soc_OMAPL138.h"              // OMAPL138 外设寄存器' S; z2 N& A! f1 o: _
( |# V# Y# Y; D* e
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明7 `" I. m9 z2 _* ?) _
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
# \3 r) p. g) d: h# p( x. P  s& d#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
! z0 g$ }* t# z4 v" N4 U#include "interrupt.h"              // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义$ C& l% e# }2 s2 V: P

( B$ \2 @: Q* `* j/****************************************************************************/
: Y5 P) q6 B/ M4 N/ |5 D/*                                                                          */
( U- q9 k5 A) K8 ^( q1 F$ N2 M% O7 A/*              宏定义                                                      */
3 E8 S* I2 U, l# Z$ N  Q7 z/*                                                                          */6 e0 u8 H' Y5 q$ b6 _, Q% A" `2 h% O
/****************************************************************************/
1 C, C  c$ {" b1 F; f3 W) G// 时钟5 I; s& s. b. Y" f
#define SYSCLK_1_FREQ     (456000000)
, f8 i- x, k: K2 b# R; m9 Z#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)8 w+ b' N; _- Z' c
#define UART_2_FREQ       (SYSCLK_2_FREQ)/ e+ q- s, Z. `* u4 j1 a: n
& v0 p) h: g! R' X* s2 ~# Q
/****************************************************************************/
" b. L. N9 @# M) }- v" U* S5 l/*                                                                          */$ d# h8 Y% U4 X3 f) l
/*              全局变量                                                    */1 B$ e2 r2 a& I5 [8 Q
/*                                                                          */
$ a) p4 X( P6 S% t' S6 o4 r/****************************************************************************/
( B8 s6 R7 `! d" @' ichar txArray[] = "Tronlong UART2 Application......\n\r";
+ o) V+ i1 U7 O3 z( x
5 u; |" S  i6 Z- ?/****************************************************************************/4 X& _8 a' U7 V. o& J
/*                                                                          */
; U3 K3 s+ ^# Z/ A: f9 a" M/*              函数声明                                                    */0 N+ Z. t0 Y+ q* ~( o2 `
/*                                                                          */0 w% M  c5 |% E% I( _( O, R
/****************************************************************************/
. M. J4 q7 K8 I1 r/ Z9 T5 R' ^3 F// 外设使能配置
( e1 p" s9 F) j# J. f0 o7 qvoid PSCInit(void);  G2 k$ r: N" U* l$ W0 `' t

; w! y$ E2 O7 b* v# [# E" A- n7 [// GPIO 管脚复用配置6 _# _+ \# j+ F. d: Z" `! X3 }
void GPIOBankPinMuxSet();; U7 e4 B3 ?- h+ E
1 _7 t( Q* p; Q6 S5 e4 M7 k9 i. q
// UART 初始化
" ]6 W9 v: j2 V3 K  T9 @2 z3 @+ ?void UARTInit(void);
! Q# o& d) j  _& H6 ~0 v// ARM 中断初始化5 e* @' b9 E8 T
void InterruptInit(void);
6 s  H4 V" k3 f9 y( O8 Y$ J2 E. U// UART 中断初始化
& ?6 H5 s: J9 ?! v0 O5 d( `void UARTInterruptInit();5 S7 C: b) t8 l9 ~
// UART 中断服务函数' ?! K2 S  C. M) Q/ F7 p/ [4 N
void UARTIsr(void);$ c4 k' J+ N) i) B

9 P( }" J% ^- K3 t) Y% y1 X/****************************************************************************/" |" h" |" V+ J( T# F6 q
/*                                                                          */
. W, j  \2 ~+ P' K: P+ o/*              主函数                                                      */( F5 `. W0 ?/ @. C% J% g1 d
/*                                                                          */
7 p" A& j6 [# W) j/****************************************************************************/, u9 u. s" e* j# g2 Y# k: k
int main(void)
# h1 T# c. k) N+ _. B1 }5 L{8 M1 ~" j; G$ Y2 u4 o# d
        // 外设使能配置/ ]. g( n( n1 m  M. l& \
        PSCInit();
5 g+ Z  |8 Q# y, N          O7 E5 e% b7 _/ J! D* B; |
        // GPIO 管脚复用配置+ r; ^/ L  o4 p' U. r7 B  K. ^4 M2 {4 ]
        GPIOBankPinMuxSet();. W1 j  _' ]1 }/ C( _: k7 @1 Q

! c) N7 ]0 `  {+ Q" _* j- h        // ARM 中断初始化
9 f+ U* w. |" t6 X9 e8 R3 P# M2 n/ j        InterruptInit();
+ [, y. ?- D% B! r2 U' Z5 `& ]
$ X0 M% n6 H7 j7 i        // UART 初始化
0 F6 f5 N; ^: W% N4 F$ x7 J# a        UARTInit();
  S# V4 m% m$ J  C, g2 D9 C; V9 q0 r2 N" L, f' x
        // UART 中断初始化. Y: L9 R2 I/ y: w
        UARTInterruptInit();
" R8 \* D6 Y* p8 Z. `
- O5 ^" [4 w6 ~- W) u8 H        // 主循环& v6 k# s/ Q+ e  D, y
        for(;;)/ O0 u/ P" ^- e+ N% b  n
        {
) I: ?, R* l+ U- d. i( R- O$ l  _8 v- @# Z6 a4 R
        }2 M8 M! c" S0 P9 P, T
}
. W% {- N" m' i; T5 u% Z. f/ r. g" Z0 E6 k0 F4 q" C* N
/****************************************************************************/) s# q/ s! C: T) R
/*                                                                          *// m8 ~: Q, u$ v- D( P
/*              PSC 初始化                                                  */
; _! |* t3 T- h2 n; m. r' y% w/*                                                                          */1 E  o4 Q4 t+ Q' N" k
/****************************************************************************/
8 N( P( \- {  s" j! H% U3 `* Hvoid PSCInit(void)9 S) C! W: i/ R
{) R% _, J- b4 i0 k& r
        // 对相应外设模块的使能也可以在 BootLoader 中完成/ n5 V  j1 \- P, Z4 B
    // 使能 UART2 模块# P& k5 a+ ]! M. ~( o
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
9 _6 }2 o* `" o1 [}
" P/ y8 u4 o1 @/ [: @0 }) f
  _6 g* r( m0 X8 h( i/****************************************************************************/
3 f1 m) i- O0 k; g6 N( V" t6 u/*                                                                          */
# S% U+ Z0 g5 R+ a/*              GPIO 管脚复用配置                                           */
9 a6 T" Z9 u6 {& k7 ~/*                                                                          *// L* j: x$ L. E9 y
/****************************************************************************/- m4 t1 y2 m4 k1 [
void GPIOBankPinMuxSet(void)( {* Z. K9 q, s' F/ s
{9 U. h# t; E  u! W2 ~
        // UART2 禁用流控$ I" k+ D  S, z# K6 r3 B' o3 w
        UARTPinMuxSetup(2, FALSE);
" X+ A$ f3 N  I4 Y. |$ `3 P' d0 n}
' C' D* i  R/ w- d+ m! p, v0 d" |* H( n$ p' Z/ c
/****************************************************************************/
3 N* i  X% h) Z: O/*                                                                          */, n4 [, T6 ~9 d3 _+ S3 H
/*              ARM 中断初始化                                              */
% c* k) o( S1 Z& o/*                                                                          */: I; E7 X7 G- Z$ D) x+ q* K
/****************************************************************************// ~& M" R( w$ }6 D9 l$ m
void InterruptInit(void)* R7 |' l$ @# b! |6 L2 M
{8 F! w) [9 O" g
    // 初始化 ARM 中断控制器
' O+ A: l2 T, ?" d* `    IntAINTCInit();
( A7 Y/ |8 P* Z1 e0 T- e$ c" N3 k: i) n( z
    // 使能 IRQ(CPSR)
5 ]) r; V$ F, K% Z) @% n+ n    IntMasterIRQEnable();
% p3 t: {4 ^3 A; A7 a6 Y
) g, @# x: Z$ `    // 使能中断(AINTC GER)
7 ]7 j/ a+ n  N' H! E; |; W/ H    IntGlobalEnable();# J" ~) e6 k. t( I* ~8 e* e4 q
8 y- {5 r# ^0 ^% n3 c
    // 使能中断(AINTC HIER)6 f* k% T( a3 _) B% k6 }# \; z
    IntIRQEnable();
, N* ]: a+ A2 C( l1 u}; x2 J* j4 {. b4 X& u! s6 q
7 T) N# o! B8 Y
/****************************************************************************/
; W) R$ z  h0 u0 e/*                                                                          */1 _) m- V- E% ^2 r$ K7 `
/*              UART 初始化                                                 */
+ ~% J6 ?  L  v- y" v/*                                                                          */
3 m0 _0 Y% ^1 D0 Q$ g) t2 e/****************************************************************************/$ f5 u& y; s4 h
void UARTInit(void)+ y! D* h) Y* X
{9 [/ I$ W$ Z) Q3 P! k/ O
        // 配置 UART2 参数
& g1 B* P7 {0 p        // 波特率 115200 数据位 8 停止位 1 无校验位
# X) k. o0 S8 B9 q& C( K$ y    UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,! f+ `/ V. y4 r% J0 K; x
                                  UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);, S; z. U$ b& q  c5 R/ `
        // 使能 UART2: ~- U1 z6 b3 l) g: m  M6 ~
        UARTEnable(SOC_UART_2_REGS);
$ w2 \( {- \2 V7 z' k' K9 ]" E+ `7 j) B+ M
    // 使能接收 / 发送 FIFO) _! V! E/ X  ]" F
    UARTFIFOEnable(SOC_UART_2_REGS);
6 D' [( s+ o+ M2 U/ ?
( H3 ]9 U: p" v- \7 a    // 设置 FIFO 级别
& D; i* u, Q4 [. s  D: @: s! k% S    UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);" i/ d" f8 Z* D# R  H# p! K
}
( G7 c" y- G! W; g
6 P  F/ i+ A: H/ l$ l1 `! O& v/****************************************************************************/7 V9 ^0 L3 P& F4 S  F  `4 B+ j
/*                                                                          */
3 K! k$ p( x! H  r  @, y) p: V/*              UART 中断初始化                                             */
; }2 k: u) r2 h# Q. x/*                                                                          */, e& G* {5 T0 U9 r7 C  M
/****************************************************************************/
* w4 d. e7 I& \1 z/ r) Z% \/ N2 vvoid UARTInterruptInit(void)
' c9 n) l* h% f& c9 S{# N2 E* U5 T2 t. l# i
        IntRegister(SYS_INT_UARTINT2, UARTIsr);2 v7 U2 p* x6 M+ |% x
        IntChannelSet(SYS_INT_UARTINT2, 2);) q: a& R8 r; h" `
        IntSystemEnable(SYS_INT_UARTINT2);
) I& V+ t: ]& t. _7 S& F$ U& B& E7 _
        // 使能中断
. d$ U% M8 h6 Z3 l        unsigned int intFlags = 0;' r. v, X# t# V# m# H  L5 K
    intFlags |= (UART_INT_LINE_STAT  |  \
9 Y$ W/ u/ j% T0 m* P; L4 b. z2 v                 UART_INT_TX_EMPTY |    \$ h, {) k- C) V- k3 ^+ u
                 UART_INT_RXDATA_CTI);* }. Y. x3 X- I/ B/ S3 X( i: _, a$ F
    UARTIntEnable(SOC_UART_2_REGS, intFlags);
  T5 A% t9 m* w/ g- C}0 m; z& }1 }9 k2 _
) ^0 G2 |% p3 z' U4 V4 x# G6 Y+ ?
/****************************************************************************/2 L4 s* Z* g& x, @5 H& T
/*                                                                          */: ^, _! n2 U, v% U  r
/*              UART 中断服务函数                                           */9 d, h, R: B; y% w
/*                                                                          */$ S2 o7 M6 f) ~
/****************************************************************************/
3 U. _& s. A, ~void UARTIsr()
4 p" b: i5 L9 q& ^9 H{
3 J8 _% u; P1 y' F5 G4 G; Q5 m    static unsigned int length = sizeof(txArray);
1 i& V. `+ p& W1 \. [    static unsigned int count = 0;0 o; ~8 Z% O4 k% h* I% |' I
    unsigned char rxData = 0;6 o3 ~  W/ G  {
    unsigned int int_id = 0;
7 c( k- ~& K: I9 G! o# m) k* q0 {/ z" k3 b  r2 v% L
    // 确定中断源
8 n7 j$ \; L2 l$ m1 }    int_id = UARTIntStatus(SOC_UART_2_REGS);) ]: Y' D0 R4 d* H% [+ _
2 F$ J7 e  \" }
    // 清除 UART2 系统中断
1 {; q5 T! ?' n0 r8 q    IntSystemStatusClear(SYS_INT_UARTINT2);
+ T7 K; o1 [5 j6 d: L) u5 M3 ~: G7 V, x/ C8 B+ R& q6 U/ L
    // 发送中断
$ j5 H& F+ l5 Z* T9 q+ k    if(UART_INTID_TX_EMPTY == int_id)
% r) P' p, L& P, Q3 u! A3 Q) J    {& @9 ]* L1 S2 ^$ N5 R
        if(0 < length)
: i, _& z' d/ ?/ H% Y' t* e        {
% |- A4 o! Q; C7 O6 w. U            // 写一个字节到 THR
6 Q, p) h4 g7 _' U            UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
2 K8 j# D: |% Y+ A            length--;0 b3 R: x* H  d  k; Q6 P( Z( P* d9 p
            count++;- U, a0 ^# [3 y4 B
        }( ?) J" `- q% s' }
        if(0 == length)" ?# L# @0 _$ Y2 _& v
        {
6 k! {/ P: B$ Q5 {9 ~8 a3 e            // 禁用发送中断" K2 E1 @8 L8 S1 [0 R: o+ [
            UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
& \; i& r/ X2 \+ C. ]        }
2 `  e3 D1 ?+ ]- v& e+ r     }  P4 |2 W0 c5 |: r# x
( B  N6 z# u- M4 O, Z# ]4 z
    // 接收中断* J( i. l  O6 L2 |
    if(UART_INTID_RX_DATA == int_id)3 W, U% Y4 ^2 Y5 T7 [; ~+ b$ b
    {9 m6 T* Z) f* g+ T1 P% `
        rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
, ?) e4 f  v! y8 U7 [4 b/ L4 c% F1 R5 L% l3 b
        UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
# k/ Q& c" s+ R& n    }
* p$ t. R- W! ~- V' o
! N! @7 J* ~; ^9 ^. H    // 接收错误, q/ x3 N5 m9 V5 l2 j" v
    if(UART_INTID_RX_LINE_STAT == int_id)3 y* q& O6 W# f2 O2 H3 t$ a3 R8 G
    {
+ l. n% r; z! }        while(UARTRxErrorGet(SOC_UART_2_REGS))
2 u' D" y: s5 o5 _3 N' |: A8 E        {1 B# X7 ~- u) H& ?# A: N
            // 从 RBR 读一个字节3 I; s: g% o% ^; H2 g& o
            UARTCharGetNonBlocking(SOC_UART_2_REGS);) b/ y: |* N) x  P' d* Q
        }& ~4 P& p$ ]6 G8 U; U  Y! L$ T
    }
. V% T/ z$ Y, h: y, J+ i   
2 j: h$ W( R9 c; p! U' Z8 s    return;& I# y, Q' ?) p
}
% r/ G/ A! J5 F' P1 o
回复 支持 反对

使用道具 举报

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( g1 T4 k5 g" k
如果其它设备快速给你发送串口数据,你这边能正常通讯?

, P1 Z. \4 j9 h8 k' ?谢谢,已经知道不是程序的问题了,但串口2还是只能接收数据,不能发送数据,具体什么原因还不太清楚。我换串口1测试了一下,结果只能发送数据,不能接收数据...明天再看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-17 03:52 , Processed in 0.047126 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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