|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。8 t. C) b! C& T, x
5 v) D" l4 U& g/ L#include "TL138.h" // 创龙 TL138 开发板相关声明
5 ~3 D- M1 `9 n/ W: K" o: w- v8 q1 L9 W8 J5 X
#include "hw_types.h" // 宏命令* I3 y1 d1 D& M& J( q; ] o' o u
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器3 Y0 w; Y% h ^. o( Y. x# {
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
& L. k9 K" D8 @; l/ v- r6 C7 B6 A! y D! N$ K6 d- `
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
0 t& z, Q5 H3 X% t8 ^( }* p#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
! Y1 o; _1 s6 o#include "uart.h" // 通用异步串口宏及设备抽象层函数声明% O* Z: T( B9 M0 t9 ?1 N
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
# H( _( K+ l, u: [% B2 ~ C- A/ L+ ?( L
/****************************************************************************/; i3 H% Y6 c* R( ]7 O& s5 Z6 x$ g) h
/* *// V8 J' a: P8 }9 t; ~
/* 宏定义 */0 _8 {! p T7 n
/* */8 n/ G8 `8 m1 Y
/****************************************************************************/9 U8 o- C4 r8 T2 y! P+ e! R
// 时钟
1 ]/ ?, J' |5 m#define SYSCLK_1_FREQ (456000000): |7 ~1 u: e5 L1 F! D
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
- f/ i5 c/ B, R$ ^#define UART_2_FREQ (SYSCLK_2_FREQ)
0 I. o) k; u1 {1 O* D* V* H( T0 G+ ^* R$ M6 w
/****************************************************************************/
& y- {. Z- r m- z$ i+ e8 |/* */: {/ L/ e% L: o6 S, ?
/* 全局变量 */
3 U" w/ z! q* u. ~9 m. T/* */# h% `; V& a6 q
/****************************************************************************/* @# g }% ~% ?
char txArray[] = "Tronlong UART2 Application......\n\r";
3 h6 {5 D7 A% n' F0 v" X" G, j! m7 X
/****************************************************************************/
# U- }4 J, y/ K, y! e/* */
J( z( _; w* i8 }$ `/* 函数声明 */7 H# W8 K& N$ h
/* */ }, N9 g' ~9 C$ h; v
/****************************************************************************/0 O, v: x' f# }. L: U
// 外设使能配置
3 M& t7 u% X. A \2 f1 E- Zvoid PSCInit(void);
( J8 ?+ B* p9 I- N5 J g) w4 E, D/ [* ]1 C) H, ]( ~+ |. f
// GPIO 管脚复用配置
# x- m. m8 e6 s: D# gvoid GPIOBankPinMuxSet();* n0 }" o& a& T3 O' [
$ `# w5 z m9 U9 R// UART 初始化
. E) ]8 Z2 G7 D6 uvoid UARTInit(void);" U& ?: h% Q7 i2 n2 }
// ARM 中断初始化$ W9 Y: l4 D( d: r! F
void InterruptInit(void);
+ S6 O8 J4 f3 e+ y// UART 中断初始化
4 K x& ]; X, a! b1 `& o" l1 m/ Xvoid UARTInterruptInit();% o5 _" A+ w& W$ X' _8 R+ l% c
// UART 中断服务函数
( h% k0 v0 O5 Yvoid UARTIsr(void);7 U* F! }* Z4 u3 t
, o9 I" F1 b" M" y+ m
/****************************************************************************/
9 s8 l; A6 ]- }2 B N* [+ y/* */6 o# y- T/ S" u k
/* 主函数 */4 |" d6 t1 d( G& P( I" K! o
/* */
: G2 r! @# M2 |9 D i6 X/****************************************************************************/( C4 Y G7 l/ |! P5 D
int main(void)
- X, S: z b( W5 u( i1 v{$ e' g* Q! E2 i h. U* l$ j& B
// 外设使能配置& C; O$ n o- o, A- B3 v8 ]! l( ?7 M" q
PSCInit();
, V6 `( l8 {9 L; n1 Y4 K' U
3 t( g# s0 V* z! k* L; } X // GPIO 管脚复用配置
3 H% F0 B- c/ r* }' n z GPIOBankPinMuxSet();
* z$ }; p' e- n# y& a
?' n8 J q x2 v0 p // ARM 中断初始化
# {; W; U2 i/ V$ n% M6 W) p1 y4 } InterruptInit();$ Y/ | a) ?# w. G) @1 k/ T7 h
3 M9 U% z i6 P
// UART 初始化
m3 d; x$ [4 S9 A, j5 N2 u UARTInit();7 {5 [. o3 \0 X7 c T5 y
) w7 v% ~) s2 B# `$ U9 C // UART 中断初始化
$ C- K3 a2 Q+ f3 D, Q UARTInterruptInit();
3 N' B* i0 p( }. F5 m2 b$ Q* k! |) W! r( X9 \/ v3 Q0 G
// 主循环9 N$ {8 x- U( b' y0 Y. K# o
for(;;)5 q- D% x6 K9 N) p2 c
{
2 B) K. F* ^; N- i: G
2 T: l4 m0 ?/ v9 F( ]: H, B1 P# S }
. B; j. u. r; @; |% P! c}# W! m# G- a( n, d' ^9 ]$ o6 T
9 J) b, q0 k- o, ~4 K9 y/ G; ]! v
/****************************************************************************/
/ k7 {( Y8 v; K. H( {# Y8 n- o/* */% N$ q$ M6 l) G9 x1 p
/* PSC 初始化 */
$ X) A$ E4 O# \: w/ i p) m, m/* */
: ~) o" M2 g; A# p/****************************************************************************/3 o. [2 `( b& @
void PSCInit(void)! D" A/ Q1 z; z; c# p
{5 A7 ~* x, S |, T& G
// 对相应外设模块的使能也可以在 BootLoader 中完成
( h( i( z ~9 N# @- Q // 使能 UART2 模块- }: m, i a5 R d$ p
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
2 m5 b" s$ b) f}' R2 `) k; k+ c* V$ Z4 j5 Z; p. D2 D/ y$ S
3 f* ^" B, q: s# d3 o: y- v
/****************************************************************************/7 S( Y1 l& ^: J' u: Z
/* */+ B% s1 X9 m$ z, a
/* GPIO 管脚复用配置 */
$ Z$ F$ F/ ~% {) U* ]0 ]% D0 `/* */7 u% s% \, ~% H3 A5 l3 |. }5 G: _
/****************************************************************************/
- Z+ U& p( r3 z/ F6 Pvoid GPIOBankPinMuxSet(void)
' Q; q) J, q) T/ j. N{
3 }0 E& m( h H0 {6 o1 O: k // UART2 禁用流控
. u* j+ y" G3 A& _1 O UARTPinMuxSetup(2, FALSE);8 q8 K; ?6 j) w- W K" R- m
}" N& x, D! \2 [+ s
+ s1 w0 r# V) A, x: b3 U3 k
/****************************************************************************/ V4 a: X" p; h! y. O
/* */
4 J, _1 Q* R1 K6 P+ @3 L/* ARM 中断初始化 */+ T# @7 m* t2 C' ` L" f
/* */1 b7 @/ }5 V9 g6 b4 M/ u
/****************************************************************************/$ D7 T1 [2 F& t# @
void InterruptInit(void)
a3 _2 d. `- l0 s% N{
/ Y/ d+ F; ~- n; w9 M // 初始化 ARM 中断控制器
3 k F1 ~4 J; Y1 _& k0 L; c IntAINTCInit();& F+ E: ?+ j7 o* x% e: A
' Z5 B8 ~ r" [1 l; a // 使能 IRQ(CPSR)2 Q! _+ h: S4 x! P8 `* s, o5 @
IntMasterIRQEnable();8 X" z: [) g% h" K) ^8 a9 Q
, L1 C4 B# }6 b/ N3 ?" K2 ?/ p5 e7 y
// 使能中断(AINTC GER)
}. c! N. ~ {2 M& s, Z, t: W/ O IntGlobalEnable();6 p2 K8 X: z. w& A3 A
' f3 [2 o: B7 J // 使能中断(AINTC HIER): f5 P3 Z- \2 c# X
IntIRQEnable();8 `7 r8 }; ]7 j7 d
}/ F3 C4 Y* V: S+ D1 k3 b
% R; V6 \! u# I' w0 g. }, ~
/****************************************************************************/! w1 h& c7 m2 {6 R
/* */) J% m8 S# i9 }- B; C1 ` Q2 [
/* UART 初始化 */
. r% ^, s4 N! }3 T2 K5 f4 H/* */* d/ d( |4 y$ `; x' t0 U
/****************************************************************************/
9 Y) L& i4 n' q G, P) L' Bvoid UARTInit(void)/ B4 k x8 D6 D( W, a
{0 [5 h' c# a$ r3 T0 |# p9 Q
// 配置 UART2 参数! x! E5 _5 y$ W1 H
// 波特率 115200 数据位 8 停止位 1 无校验位4 d& [( ]) ^2 N; r7 H; |. B5 z' I/ A
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,4 z" u6 W6 G2 @4 b$ k& o" ]# w
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);' z: I0 \9 N. y; s. E- z: z
// 使能 UART2
s8 E) n$ u& M" { UARTEnable(SOC_UART_2_REGS);4 W( j- r( g ^$ e% {
1 ?' K9 [& }& x6 z% g
// 使能接收 / 发送 FIFO, @- T6 j$ z! j( l
UARTFIFOEnable(SOC_UART_2_REGS);1 W8 d9 x$ m$ \7 |+ m# a! g" a
, E. v# p1 e; G. n
// 设置 FIFO 级别7 e4 s- j9 y6 f) M$ K# T. L
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);. x/ s$ o5 R: T1 d
}
) l8 |& _2 F; _- C8 D* _4 Q& N. T0 l; p0 L5 m
/****************************************************************************/
9 ]9 o1 h5 C; D& I. g+ _# `/* */* J9 \) @+ O/ o9 |, y
/* UART 中断初始化 */
5 [9 f/ W8 g; Y1 Q2 e5 U$ R/* */" \8 U+ ^- D$ X% t! ~/ G+ p
/****************************************************************************/, k4 F" c6 j/ {) b' n" z
void UARTInterruptInit(void)3 {; W* O0 a0 W9 t: J
{
4 }9 N+ K0 U3 k- X7 Z4 j. ]. k IntRegister(SYS_INT_UARTINT2, UARTIsr);
+ Y/ c3 f: ~2 g- J IntChannelSet(SYS_INT_UARTINT2, 2);
5 \7 P$ ~, U5 O( c; d _, l IntSystemEnable(SYS_INT_UARTINT2);) h N# }1 q' J! W3 T/ k" X
7 d4 v, k+ ]. A: d# D* N5 T // 使能中断% K7 W+ W8 @ a
unsigned int intFlags = 0;
) y0 K5 k4 U7 B5 g intFlags |= (UART_INT_LINE_STAT | \% }$ \0 ~" H1 y. I; I# r p; O" M9 M
UART_INT_TX_EMPTY | \% ?1 a+ T* ?- n7 N# r2 B
UART_INT_RXDATA_CTI);: Q0 j! m, L5 S1 }' p% B
UARTIntEnable(SOC_UART_2_REGS, intFlags);
/ Y1 n# X7 i6 Q. t& c9 X}
, A, a0 D( k" o6 L4 C* ]5 y; J- C2 R- C6 [
/****************************************************************************/
/ f/ o N) C. J* q, g; |6 w/* */
% \9 ~5 N- _# ^& n" O. ~/* UART 中断服务函数 */) s9 N* r: m4 T4 H9 {) k5 u9 d
/* */
3 i4 a0 B D$ O7 C: ~ k/****************************************************************************/
; v5 R; F/ F! h8 H1 H3 o9 l0 \void UARTIsr()
! p4 c: Q3 }( \, W* n8 B$ ^{
9 p8 B0 M' o- Z+ v static unsigned int length = sizeof(txArray);
- ~. u: c( z/ W: I( O static unsigned int count = 0;1 e: C+ x- S$ R' q* b5 O+ e. _
unsigned char rxData = 0;$ p/ K0 p% n7 O( y
unsigned int int_id = 0;
* M, s6 g& g# \* a/ Q: f- N- r9 w
% D3 U# J* ?5 t6 n/ K6 `! K/ p // 确定中断源' O. ?8 k5 v8 S! Q0 u
int_id = UARTIntStatus(SOC_UART_2_REGS);
: _0 R: ^, U, _: v7 H
/ p+ ~& V: v9 }& j7 y2 ^' f. c // 清除 UART2 系统中断7 Z! ~5 p6 t* v+ Q! @( S/ U5 e
IntSystemStatusClear(SYS_INT_UARTINT2);( U# H+ b% j5 N+ u6 A" o8 l T
% v. n& w- [* Y" G2 U8 S // 发送中断
; T+ |0 m" }, [9 |: H if(UART_INTID_TX_EMPTY == int_id)
# j- k* \) z: K& o8 X- z {( j* G9 e. R5 B; d3 @0 K
if(0 < length)
4 H3 R) z% j- O q {
2 U' l% Q3 F0 h! ] // 写一个字节到 THR
! _2 N9 u) Q( [2 P4 P& ` UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
) u- m7 K8 ]! U( O* l8 f) I length--;1 T# P/ o+ h7 Z r- Z; b
count++;
" F7 U1 m" T2 r6 L# J' w }2 t: |$ w2 u9 h- Q. y6 @
if(0 == length)
# z9 ?% [0 H; k Q' Z {
7 o; ?* B' ?) ^; l e/ W // 禁用发送中断
+ d' @& P6 H' [0 x UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);$ t/ j: x: d1 |! s( N4 W
}
6 |2 `& ^8 n7 w0 k- e% w7 K }; b4 P# G: a8 i% @# h2 p: `- G
U% \$ |8 Z, P
// 接收中断# Z/ v% Q1 a T+ H
if(UART_INTID_RX_DATA == int_id)9 {7 j( _2 R! f3 l- W
{
3 L2 g* [- b$ a& E rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);6 Y* }* Z. S" G7 H; |* Z7 U) D
: k8 o0 b3 B: l4 L
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
3 ?* n/ v% }+ N7 f$ w4 ` }
% d+ M* K( C$ u4 ]' u4 d; S0 C( F7 b
// 接收错误/ [1 I: V/ n8 e% m# y, _- ~& d, z9 _9 G
if(UART_INTID_RX_LINE_STAT == int_id)
, s6 u4 ?3 c8 F' l {
& j/ e$ X; G. ?! L, Y1 ^: z$ u while(UARTRxErrorGet(SOC_UART_2_REGS))5 u0 y$ w1 w6 y2 y _0 m2 `. V
{
: J: C( \0 Z3 u$ u // 从 RBR 读一个字节
9 f5 h/ G$ X, g( j7 j/ G UARTCharGetNonBlocking(SOC_UART_2_REGS);4 v% [3 g, ^) J8 ` f% i0 U
}
+ e2 w" |0 l+ S }
( Y6 c& X8 z; W a & I9 F; }7 G+ N5 w, O
return;
: X* {2 J. j& D0 @' Z' F8 Z8 {4 p7 f- N}; G( ?1 p. Q; Q" R1 c
|
|