|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。- _* {0 ~9 G" G4 h, v+ ~% G! j
1 ~/ @; q- Z* U: `0 {#include "TL138.h" // 创龙 TL138 开发板相关声明, ]& D2 Y0 s$ v" l; N0 a# ? O$ D
& m1 B2 w" Y1 @+ C. H R( l#include "hw_types.h" // 宏命令
! ]. O7 J: p3 |0 P, N" r) ^3 r#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器1 U3 A I+ I# c' w8 a
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器9 X4 e* A9 e V1 e
4 K. r0 E, v& M7 v( O. x% ^#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
, x- v3 Z( _# ^( E#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
x4 q& `/ o' q5 Y+ ]#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
- J' U2 d& u" Y- ~. s% c( e#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
5 O5 N4 W0 y* C. e& s
8 L* M+ k% N4 S/****************************************************************************/
8 L- i3 U/ c3 S: r& W/* */, P1 c) ? n0 b5 T9 V" a; V- r) a/ c
/* 宏定义 */& h4 |, g4 }- s$ Q a$ r
/* */
Y! d. q& j3 f7 y/****************************************************************************/7 ^: J! `4 H4 s3 a
// 时钟5 ?1 V! \/ R8 Z" F' r7 s9 y5 _
#define SYSCLK_1_FREQ (456000000)
# t' L% ^2 Z: T7 a#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)% `2 I, w( G, f' X3 }
#define UART_2_FREQ (SYSCLK_2_FREQ)2 _3 _2 o" n2 O1 Q
! s: G7 ?8 ]0 }1 |) r/ x; X
/****************************************************************************/# k4 ~. O( A6 b
/* */, H4 B5 s6 R7 k6 {! W
/* 全局变量 */
: q( r2 ^! Z3 S2 V! Y/* */9 J- Q( `, q9 h, M( @
/****************************************************************************/
& a: ^9 w3 S, Achar txArray[] = "Tronlong UART2 Application......\n\r";5 p2 C' N$ d) O6 [, R" b
' Q: q3 E2 R% F3 ]/ s! w6 Z$ X+ b
/****************************************************************************/9 o6 v2 {5 L3 f( F8 }6 v
/* */
6 ~6 ^2 ^8 q9 ?4 A0 }) _6 |/* 函数声明 */4 J% D3 }* L( @% f' R$ q6 q) c
/* */
8 S; C& M/ I! ]% d7 `/****************************************************************************/2 g& n, O& `- n, x' N$ i U* K; l
// 外设使能配置
9 }. E: P" r' t, a2 ~3 @void PSCInit(void);
8 M8 v5 m7 u* [ {" W! V" t( k2 @! }8 V+ J0 l7 X
// GPIO 管脚复用配置2 L0 \7 [/ P/ o& _! z2 m/ J$ w& Q5 u/ X
void GPIOBankPinMuxSet();
7 J1 u& t4 T6 B% s5 A3 h5 ?
, x! q$ x- Y3 C, e" h L( E// UART 初始化
' f# V! Y5 ` Y# q5 Ovoid UARTInit(void);
0 I9 X4 F# q8 c, [: ^: v// ARM 中断初始化
8 e+ s- O6 u2 fvoid InterruptInit(void);' l* p0 i+ y( E ]% [
// UART 中断初始化
3 N1 [ C* q9 ]6 }# Rvoid UARTInterruptInit();1 e0 k' P* W$ u$ n
// UART 中断服务函数
% z" ^0 }+ E" P/ N" O, Nvoid UARTIsr(void);% H9 c$ _& s& D; [8 P# |# k9 i6 K
% G# \8 s/ \+ M z6 X
/****************************************************************************/& z& |/ s, \, R# K7 o
/* */2 L4 L5 M8 J3 v) [
/* 主函数 */
Z) {+ K& G* w; S; S! u# z' R1 S: x/* */; l3 H; H% Q. c( B3 Q
/****************************************************************************/8 {: s& G9 o- g
int main(void)
4 Z+ P8 b0 h% M5 H) T{
# }7 }* v3 n' E. ?- C& B) r // 外设使能配置) Q0 E2 M2 s3 M! I7 Q7 f6 w6 V
PSCInit();
+ T: x& U3 ^, v* |* I5 P% N. h' O9 I
' z( S+ z" s: P0 x5 ~ // GPIO 管脚复用配置5 c' ?- x/ N2 t/ Y1 `9 ]0 {7 j# B* _4 o
GPIOBankPinMuxSet();
" S2 H. G: t; `* O/ h
6 n# E( e+ J/ ^ P& E // ARM 中断初始化7 t1 W/ |& x* j+ s3 U# D2 t
InterruptInit();1 o6 c) K% U9 i M
T6 ]. c7 B* }- K* L" ~7 K
// UART 初始化
1 y, c7 e d R1 r; J UARTInit();
- W% J, Z6 w0 t0 I/ w& l t
, b( P+ y& V9 X$ F // UART 中断初始化5 T. C1 y: N1 V& E5 f6 H
UARTInterruptInit();
, n0 E. i e- F: y4 E
2 B( ]5 a9 L+ b! ?& F // 主循环/ z2 w% [/ p) t0 S7 q
for(;;)/ z0 N1 `/ w/ G+ z: V P
{
9 ~! Q H( ~" M4 j* Z ]
7 B5 }- G+ Y2 s/ o8 [5 R }' a1 U! O' e. L8 A5 w3 S' l. l
}* {# r5 K5 n6 W/ T; Z- u+ \9 O
4 P& y4 i% }' G/ }- N/****************************************************************************/3 E+ \' ~" l7 j n
/* */
0 m$ y4 `1 m) l! G2 a/* PSC 初始化 */( F" d: r: R( g7 c$ I
/* */9 O, J% ]/ ?' }4 X( D3 D4 h
/****************************************************************************/# w( Z1 K3 V- B$ j" O8 G
void PSCInit(void)4 s7 f% S" x* j. ?0 x6 m5 F
{
) T0 X1 K" T) s4 x // 对相应外设模块的使能也可以在 BootLoader 中完成
! [- }# D" ]. v! s6 _ // 使能 UART2 模块
, _8 k2 w* I3 d$ ` PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);+ J3 d3 R& h! c2 {/ I
}
, S5 q3 v7 M3 q/ j1 d
5 c# b( v* B( z, y. N/****************************************************************************/
7 w9 B. I8 ~! \3 d/* */" {" \4 @! N; d3 S: M4 ?
/* GPIO 管脚复用配置 */8 x$ x7 }' y8 G/ X
/* */1 I: N3 I, F- P& Z6 V4 n* ]
/****************************************************************************/$ [8 ]. x$ Y+ T {
void GPIOBankPinMuxSet(void)
6 |8 [/ q4 w: x; ]9 v" O{/ o6 {( ]( @: r. G% m7 s$ c+ Z
// UART2 禁用流控
) K8 B# c* ^8 \6 ^' J* e3 j0 J UARTPinMuxSetup(2, FALSE);
8 i1 @5 Z6 N" S Y1 m! _8 a}
" {/ v% n: G7 ?* ^) D7 N( E S+ S# \, v; R+ d" ?8 l- Z/ @
/****************************************************************************/ g5 b* J4 A7 J+ j+ ]" l
/* */4 @5 |" K1 n7 g
/* ARM 中断初始化 */2 R6 Q3 \* @0 n6 ]9 \
/* */
3 b t$ @3 ~$ b U* T" V: e/****************************************************************************/
' Z9 u+ `2 l E- N# {void InterruptInit(void)
, r: B/ E" |% c. T2 o1 O2 r$ c{ D0 t2 g2 R5 d' [8 e1 q# n; X; p- g
// 初始化 ARM 中断控制器8 @6 ~* v5 i/ o) j/ ]* ?. R
IntAINTCInit();5 D* A# O/ O9 ^0 E: O6 }- z3 f
+ z8 b E* f3 o/ t // 使能 IRQ(CPSR)1 J3 L+ ^& X1 c! ^4 n5 U a/ Q
IntMasterIRQEnable();
9 ~/ L& M8 \0 A. t9 e6 ]! { Y( U/ o; X
// 使能中断(AINTC GER)& e+ j1 o" `# x5 E
IntGlobalEnable();2 F3 W u( b$ j2 _1 q3 ]
4 c0 g* k* z R
// 使能中断(AINTC HIER)% r3 ^) J7 h A% v
IntIRQEnable();
) }" ^6 }# N1 ~9 Q}
: m( } j) a# V9 K3 `5 w: n, f F- m3 g
/****************************************************************************/
# U7 k5 y7 F1 i, S/* */
6 a$ B- h" v7 Q' M$ B: [( ?' ]/* UART 初始化 */
2 W" g1 Y3 K* u2 ~) N+ c7 g2 T: E/* */+ X$ `6 l& u1 L! x J3 ]
/****************************************************************************/% N. q, n5 b: k6 d6 N; B
void UARTInit(void)
, V3 r( }" I# }( f+ p- W( v/ b* P{
. ?% G3 r. K6 r M$ E O% ` // 配置 UART2 参数
/ w& f b% D6 d- F$ }7 m1 Y // 波特率 115200 数据位 8 停止位 1 无校验位
7 S6 @2 C, v o: j1 C+ p3 ~# w UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,# n6 x% o& N+ O( Y6 V& W5 G% j
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
: h& F/ a# ~/ V. H // 使能 UART24 u/ r$ [; U# n
UARTEnable(SOC_UART_2_REGS);
+ P' q) Y! }, T" t
. E& A; u2 M7 r- ]8 O# E* b // 使能接收 / 发送 FIFO% h7 m! [' |* y# L* E
UARTFIFOEnable(SOC_UART_2_REGS);4 U4 s# f7 F5 z& g6 X5 d
+ Y$ H8 ~ n* E( K/ z# s6 O // 设置 FIFO 级别
& B! v; X( I6 ?8 |+ X; H UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);% X. K' u4 t, e1 a( E) E
}
- Z: u8 H! z/ l( P( e3 }
$ k7 v3 @' P# J$ Z2 B; Q, n4 Y/****************************************************************************/
# ~7 ?" }% `0 b) @, V8 Y/* */
2 [' O2 U( B) k7 W- T/* UART 中断初始化 */
5 E, q) r3 A5 P, u D/* */5 E4 z1 j7 ^, `. o4 }6 y# g
/****************************************************************************/; j N6 v: M! ~2 h8 s0 I
void UARTInterruptInit(void)
$ |( m2 A5 w9 z7 A, u{2 J8 `0 [* |7 h. Q( Z% [
IntRegister(SYS_INT_UARTINT2, UARTIsr);9 C G; p/ F9 x$ j: ~% I3 ^: U, C
IntChannelSet(SYS_INT_UARTINT2, 2);
' i* j3 f T& A3 B X H. x3 X6 I IntSystemEnable(SYS_INT_UARTINT2);% O7 A( T7 ^5 S2 w R
4 G: j4 b% J! B
// 使能中断
, j* z4 G* r6 Y7 a unsigned int intFlags = 0;
% S0 P8 q. O9 @& x6 K* U4 u intFlags |= (UART_INT_LINE_STAT | \
2 _1 n/ d+ ^9 p UART_INT_TX_EMPTY | \
6 d. z5 m) z b8 Q/ M0 S UART_INT_RXDATA_CTI);3 O/ W5 M# n1 A. l
UARTIntEnable(SOC_UART_2_REGS, intFlags); E/ t" M& C/ X# ^2 U
}
$ H8 w4 V9 Q# J4 ?& |( m1 c+ D/ S. W6 K! F5 ]: e
/****************************************************************************/* O% j2 M$ h% [- d2 g# h
/* */
7 E* Q5 E, E2 D4 Z& b" k# K/* UART 中断服务函数 */4 P1 H0 E8 [3 l9 \2 G! O& T5 _% S
/* */
' ~$ h, U) [ a0 ~% A1 u, a) |/****************************************************************************/
# q! m7 C! ~" y" f+ D% z6 Hvoid UARTIsr(), I+ ]* f7 D$ q
{
, V. B+ |5 b9 u static unsigned int length = sizeof(txArray);
( ?, L* S* }, h2 P, {* U7 S0 y static unsigned int count = 0;
) [4 X" Q: L3 P- }. N unsigned char rxData = 0;
+ d* W+ R W" p0 k8 }' H unsigned int int_id = 0;
% a1 E$ a8 G2 ?; p7 K# S% t& {0 v+ |& r& b
// 确定中断源: ? A3 F) r/ `" ]* A6 d j
int_id = UARTIntStatus(SOC_UART_2_REGS);5 b$ j# z' _$ w. Q# S# q F+ ~/ ?
$ [& L/ {: B6 C9 C- D$ m4 A5 m1 I
// 清除 UART2 系统中断7 _5 s9 W' ^2 |+ Y
IntSystemStatusClear(SYS_INT_UARTINT2);
+ ^. S7 |. j- a4 d$ z; `
2 Q! s5 _ G7 N4 W& c; ~& O5 t // 发送中断) R+ f4 @* v: l2 G
if(UART_INTID_TX_EMPTY == int_id)
O9 V, p2 @" l1 q {
0 M2 z( n5 o% e- h9 v if(0 < length) S/ l5 L3 [% s. n2 G
{
% r1 J0 e5 W0 b( k0 A // 写一个字节到 THR* \% T" V2 \1 x; b
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
1 ~. r0 K! p; b O1 y& x- J8 F) w length--;* f. }- R' a, y6 ~2 D* U/ B
count++;
. h. @$ t, h% ]: S }
2 r+ v1 K+ S, O0 X6 |; C. Q if(0 == length)
4 I% f1 R+ C+ n. F+ a {2 o+ K& ~ J7 S6 z
// 禁用发送中断
/ Z/ L5 p" s. s: t; ?/ D UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
6 Z8 ]6 G8 K9 u; ~& d0 [2 p" z9 T2 m }
5 U, J8 v, e `( I1 T' B }) n5 @& [( R" L$ K
$ I- z9 @1 D+ `3 O! {
// 接收中断5 Y$ Z8 `& Q0 o7 I& D+ X5 D9 F- ~
if(UART_INTID_RX_DATA == int_id)* B( X# S, O, M
{
1 a' \9 C# J: M( S rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
( d1 d" X7 U9 ?8 w# r- W4 n) M5 c* r
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);/ w6 q) l9 {4 m: L( M
}
/ M- n# K- N$ n1 K3 y, t2 L& e' G9 v1 U" Z0 R! Q
// 接收错误4 n4 d& X8 A- S9 ]) N/ ^. |, O
if(UART_INTID_RX_LINE_STAT == int_id)
0 _: j: U- r# c* O5 w1 H. w {
* C! p8 u. v2 K while(UARTRxErrorGet(SOC_UART_2_REGS)). H; o& E$ o2 Y# C
{
5 Q' Q% G! m: c# I+ i // 从 RBR 读一个字节
2 ~5 R3 ]0 q& I0 Y UARTCharGetNonBlocking(SOC_UART_2_REGS);
# C0 C0 V- B7 d9 W+ N' M }5 y% [9 M7 o# P+ X% C
}! a2 Z t! e/ H9 ?4 h
1 Y/ Y! f0 i4 ^+ G7 d return;7 f; p3 C0 k! }- ~% }
}* z, H; w. Y+ @, e
|
|