|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
/ @: Z: g! q. ~
8 ?: R! h. ~- {0 t# d+ X# U#include "TL138.h" // 创龙 TL138 开发板相关声明/ W- {7 ~: c- }& U3 p
" X# i3 b/ N1 x* P0 q9 n#include "hw_types.h" // 宏命令) C! T+ z1 I* N6 `
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
0 T4 E' ~2 X/ g' S( y#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
% o- k; U2 y( q& d: z/ i
6 ^( u: `5 a/ _! A4 Z9 p2 y9 [#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明3 u5 ?6 a/ p- O4 [* S
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明" S$ @' U2 W- P* L
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明1 [' m- z% ~) I: a7 X; U8 D! c
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义' |" K) o+ O! J, R# r
0 }: S% V* O- }; y/****************************************************************************/
8 Y3 z( x6 A1 n5 T" @- t/* */
- c, p0 F$ n7 H3 a3 P/* 宏定义 */6 v+ Z y+ \8 x0 X: E% b- m- ]
/* */
8 W! W% t/ `9 G) p# W/****************************************************************************/
2 g* `. w. U$ P4 r( h- r// 时钟
5 o$ N4 D: Y7 l) H#define SYSCLK_1_FREQ (456000000). T; p; B7 j& p+ v% G8 [
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)/ P) L9 K7 i+ \* V8 x% h
#define UART_2_FREQ (SYSCLK_2_FREQ)6 K, B k; s6 g. v Q, \
8 @1 k/ {8 n, i! ?: ? I
/****************************************************************************/5 O& Q2 t [0 l" D" p! @
/* */
8 ]/ R2 F1 i! q8 H/* 全局变量 */
6 m& X& m1 F8 [; n! [/* */
; A9 N7 h( g/ @' E; u; r5 W' N) L/****************************************************************************/5 C0 V; s5 e6 J: I P1 } m
char txArray[] = "Tronlong UART2 Application......\n\r";: {) ?3 V- J7 T3 s3 S/ E% I
7 B& w/ S: b& s$ H7 s- u7 X9 _/****************************************************************************/. M" |0 t8 U) H1 `7 v- E2 {( |% `
/* */, f8 a, P+ E# [
/* 函数声明 */
- k/ H$ |& p+ d. O/* */" M% q/ V, Q+ ]3 G4 S
/****************************************************************************/7 K$ u( G* n8 O0 Z1 ~
// 外设使能配置% t! c/ W( E0 r
void PSCInit(void);" @6 P3 s1 S$ l% e& C$ S9 B
1 A7 j, Z5 b% y3 g# O
// GPIO 管脚复用配置( Z7 {, e; Q- b3 W$ f: o) L# f
void GPIOBankPinMuxSet();
8 ]- j7 P }( C6 q3 g: A8 Q
& L7 `- S$ `( _) ^4 b& N+ s. J// UART 初始化$ }/ O5 Y0 ?$ g% r4 Q
void UARTInit(void);3 ?8 c. ]) q. |8 {4 f* L
// ARM 中断初始化
: P1 E7 Q# @/ o+ X& K% z! @: x, uvoid InterruptInit(void);3 O' U( C3 h: r( F }5 W/ ]2 \
// UART 中断初始化+ E/ s* K1 {, ?9 D2 _
void UARTInterruptInit();
+ e; ~' A1 }6 d" }2 j/ r// UART 中断服务函数
% N9 P$ q2 Y5 F; F3 yvoid UARTIsr(void);4 f. d; V: k; H4 n$ h
; o8 Z( c" R5 y; E. ]" r/****************************************************************************/
h( C4 }5 g( t, R4 J5 c+ s/* */
; f# c. q/ {, B; t) v3 W% w/* 主函数 */
+ n% c5 D# e( F/* */
c! _/ J y. D/ V" r" x/****************************************************************************/
8 g+ S' t. H8 `6 ]2 I: |int main(void)
2 s8 ^4 R) C& D( C9 c{3 t+ O& [9 I* o/ l! K! j k4 `
// 外设使能配置
( v8 s! A: X! z' k$ _2 c PSCInit();% F5 e. O2 f0 T
/ x' j' @. c6 a5 ~0 C1 S // GPIO 管脚复用配置( b5 H% c: \+ v0 C2 a
GPIOBankPinMuxSet();( m( T5 @. ?) P
! r+ o" @" H S; V // ARM 中断初始化
0 X* |) ]" o3 ?4 \ InterruptInit();' n9 R- r$ j- e$ x3 W
" m7 z3 T2 l/ k; b9 i3 m
// UART 初始化
/ P2 @+ A4 Z1 N. U1 w+ ` UARTInit();& _" K# E0 k) G& j. }0 p Q
: g, m" J& m2 G // UART 中断初始化! e3 X; b* f) d' U' ?7 S# G- z
UARTInterruptInit();
( }; ~' m( J( b: P# N7 p/ N. u
$ j$ N7 L, k4 K$ u% T // 主循环6 f$ b" F, _( X4 u7 E
for(;;)
* Q: g2 P. @" ]9 Q0 P {
! z8 j# y- P6 C- d, Z$ S- l* x6 l% F+ v) G0 E8 Q
}9 c% p, W. ^% s- s l y
}: n& B( i, ?$ k! H7 d- R
5 ^. X; p9 E9 N
/****************************************************************************/* L/ q4 ]/ z! S" y
/* */0 I Y$ @6 R9 [2 P" |! a, Y
/* PSC 初始化 */
( V! G0 V2 ]% a# @$ V( o/* */! W8 w$ Q8 ~8 V5 C! i0 a& L
/****************************************************************************/
4 u" V+ e; ~2 }3 g' J$ D F5 s+ Uvoid PSCInit(void)& F Y O/ S) h. H
{
3 F( S1 }, p0 J! X0 J9 C // 对相应外设模块的使能也可以在 BootLoader 中完成9 b- C8 N9 |1 c3 J. R& U7 w
// 使能 UART2 模块
0 H1 g0 `. `- Z PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
$ o: m. ` o$ h+ x, D}
. p# Y9 \6 |: M3 \6 z& w$ z$ j+ ]. g$ G8 c
/****************************************************************************/
8 w4 U, Y9 W* G) d0 ^/* */, u; U- G" A/ h
/* GPIO 管脚复用配置 */3 O/ p N4 {6 r% v, h
/* */
1 b% \8 E8 w. B4 h/****************************************************************************/
. }% K. J1 h' |% P3 C$ _void GPIOBankPinMuxSet(void)
% J* o- G1 A" ]! v1 u: V% n# n{
. g3 S$ [& A8 D; y4 ~% j // UART2 禁用流控& r( b' |8 m7 F j _8 L* _
UARTPinMuxSetup(2, FALSE);
9 ~8 S6 y* _6 h, x* a {}2 U: \6 I& i, F, W% W j
: J3 j# n9 V0 ^9 ]9 `
/****************************************************************************/
1 w1 h2 u* }( t, j. i" N( q* c+ ]& t) t. B/* */
0 R. f* ?; N3 f6 x4 k: C/* ARM 中断初始化 */
o) w5 N Y+ |. @$ y# f/* */
% x( I# W1 d7 X! c' q, o/****************************************************************************/: o" ]( s0 G1 f v( g
void InterruptInit(void)& J. k% t) m1 R7 i! C' F. H
{6 G2 H2 K# ]& u7 A: e% ~6 n9 p+ Y
// 初始化 ARM 中断控制器: s/ _1 ~ s! i5 h' E, Y
IntAINTCInit();
: d5 q- K3 }; w, P; C3 @% R
3 i7 o* D4 A. p. h; f // 使能 IRQ(CPSR)
/ D1 H# g; C; Y* t- T2 q$ p d IntMasterIRQEnable();
$ C# l7 |5 w/ c# Y4 l1 U- f
& W! x) \ a0 [% q; u1 ` // 使能中断(AINTC GER)
4 G! ]1 J& [ B! h" f) y IntGlobalEnable();
8 g7 k$ J+ p! j1 |
! V0 R+ _7 w9 E& ?* P" M6 h9 e // 使能中断(AINTC HIER)
: m9 j; v( v8 x- f! \, v% w- a7 D1 g IntIRQEnable();/ H0 ?6 Z& o. z' c( F) S& t
}
. a8 L- N7 `- r. a3 d! P. {7 m+ R1 A" T- g
/****************************************************************************/0 W; V# [- S# ^( C7 {) |( j) _
/* */
! Q- m" V2 Q9 _/ g: C' V) M/* UART 初始化 */
+ w3 b# A4 o6 z6 Y: H3 V! F/ a B/* */
) }8 W& c* T, V6 ?$ C; }/****************************************************************************/
5 b% J" C6 O5 _ N* V" h, J# Yvoid UARTInit(void)& Q G1 i. n; S. x5 g3 E
{
! v y% K- m4 c8 c5 R // 配置 UART2 参数
. F- A7 G6 q: Y // 波特率 115200 数据位 8 停止位 1 无校验位' S/ C% I/ ~% y
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,7 l+ w. S& |, S9 m1 j$ E
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);+ Q/ q, e# X# N$ O. g5 [
// 使能 UART2
) j0 N0 |: R# ]% U6 K UARTEnable(SOC_UART_2_REGS);- R% G: a4 Q- r
' _0 Y4 }- S6 J3 U# A1 f' J3 k6 v
// 使能接收 / 发送 FIFO+ T8 q6 Y/ b. ^& n: r7 j
UARTFIFOEnable(SOC_UART_2_REGS);
/ o5 ] X2 L+ F( L$ x/ b& ~/ G4 i% i& e, t8 x
// 设置 FIFO 级别
% n! a+ \. G7 y8 Z3 c UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);) b3 v4 u% a9 P/ i1 u
}
0 T( |* F3 n6 L: E- ~9 z* w: G+ B6 `# |1 ?; v
/****************************************************************************/( e4 t( V9 p& O/ M; X
/* */" l; P' l& D% C
/* UART 中断初始化 */
3 O, T' \) l; B/* */
8 ?5 ?1 f" i( c+ w* s/****************************************************************************/
- O- d: H! h& |void UARTInterruptInit(void)
4 U9 O* a; x& E/ ?$ S, H ~{
/ k) b0 y# a( J2 W+ n, F IntRegister(SYS_INT_UARTINT2, UARTIsr);
( {2 S `+ M$ J! d8 i0 \ IntChannelSet(SYS_INT_UARTINT2, 2);- J" d+ M8 \3 r; ~- c+ L
IntSystemEnable(SYS_INT_UARTINT2);
2 s K6 P3 M# T8 q, E. q- V, T1 h
// 使能中断
3 @8 Y/ a( b. w0 t unsigned int intFlags = 0;* r1 i, V% G$ h
intFlags |= (UART_INT_LINE_STAT | \
5 T. @3 o: y9 `% c UART_INT_TX_EMPTY | \( ?# J) r* i. K" p
UART_INT_RXDATA_CTI);
' a s3 D) E) l3 F5 o2 U UARTIntEnable(SOC_UART_2_REGS, intFlags); a8 T. S: [+ a( J
}
% Z& e' a, f1 L
/ r- I' s" l& `' o; O/****************************************************************************/) I( m6 p8 ]9 s m# F
/* */
, k( _* A$ i7 m# A" M! {4 f/* UART 中断服务函数 */' j4 Y6 o9 W. T/ E( s/ o
/* */
3 t: b6 w2 f& s0 m/****************************************************************************/1 @: \, R- o. I: X4 B8 f4 U
void UARTIsr()
& k. } b: }2 m9 F0 m{
5 G a/ W' [: l \. h static unsigned int length = sizeof(txArray);
6 `' A2 u5 s _1 V* \ static unsigned int count = 0;7 D) {' }7 \ u7 o. ]
unsigned char rxData = 0;4 r' G8 S$ o0 g# T, z1 W: Q
unsigned int int_id = 0;# v/ m7 C9 k6 x' @* a
. M* i! P' i: d // 确定中断源/ O& a; V) u$ Z3 Z- Z
int_id = UARTIntStatus(SOC_UART_2_REGS);
' F" U. O8 m5 ^: C% [
" Q7 B! R8 G6 h' ]# W$ { // 清除 UART2 系统中断1 v: G1 ]) M) W) X6 |2 P2 _, y" O9 e
IntSystemStatusClear(SYS_INT_UARTINT2);: N$ x% k# \- ^
- D" K1 m" Z5 D3 P0 ]( E3 x // 发送中断
* E. f0 ]# Y) ^1 v$ H if(UART_INTID_TX_EMPTY == int_id)5 \/ e/ D( E) ^! Q. a! q) ^! N7 e
{ c' l0 r9 t- s5 l+ k( }. r
if(0 < length)
" K0 B9 Q: L) u3 n {1 P+ ^5 @5 R. \/ q. Y* k0 G3 j
// 写一个字节到 THR$ R0 Z) _; g4 R& v; c. E
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
0 Y. }% L0 t |5 e1 W length--;
' h# p B* j0 z count++;6 [0 {& }9 ~: ~) i* @
}
& }& @& s& Y H% @ if(0 == length)6 i7 d( m0 \& v: V$ p. h# A
{
+ C7 Q/ T6 {+ f3 t. n // 禁用发送中断1 ?8 \7 d9 f2 S- L$ D
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);' |5 q8 a0 M# w( e) h* h) o
}+ c% i6 r7 v ^2 c3 F' @
}$ d2 X! l0 d( j: w
3 S3 V/ o9 G: j- s7 B; B
// 接收中断7 w" S9 J, x. p1 f' e
if(UART_INTID_RX_DATA == int_id)
& w' x2 l) D' e& \- } {4 i& n- [1 D' z. y" P4 e5 S/ t
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
% E9 x2 d; v9 X
+ U4 [* G) Q; j1 g4 d) j UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);6 S! c3 E( |! l" q0 n
}
* C3 x* V# G# I* \( a; {2 \! V, o+ O8 M# v
// 接收错误 U0 S1 U! o2 f5 r9 W8 u2 F+ N
if(UART_INTID_RX_LINE_STAT == int_id)& ?; J5 I u9 c- _6 U
{
( i' e0 c+ a) m. R! _2 m while(UARTRxErrorGet(SOC_UART_2_REGS))0 \7 i2 z/ a D1 G7 u9 U4 G
{
$ H4 W, [" |! q% Q: R5 B$ A& r // 从 RBR 读一个字节" p v, D" h" k2 J, |
UARTCharGetNonBlocking(SOC_UART_2_REGS);- t3 l# [2 c# y/ I
}/ B) t6 @$ ~' z3 c4 W- r8 l+ d2 `8 n r
}6 r* c: s, J1 x1 h
! `' Z0 s$ n$ E6 J return;* _. W' H# y0 g( M6 j7 ~ j
}
( I- H& D+ R8 J, j8 p9 v' i$ c, V |
|