|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。, b; I8 v1 E4 P- v0 w! Z) v/ {
: h+ u: U2 V. k
#include "TL138.h" // 创龙 TL138 开发板相关声明$ ^) z% k9 a+ P4 o) n7 O2 H
. m0 ~2 e# I8 o+ M9 F! d2 _& u#include "hw_types.h" // 宏命令: C9 p# L) a! L# @
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
6 K7 T4 e1 e7 y, _0 n5 R8 Z/ g#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
% G$ }5 h# [' S& d2 a
% a1 T6 Y6 t9 i#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明+ |) V; }1 g3 B
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明9 C [; e5 B/ X# r7 \
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明% |* h4 Y; R, d3 P$ U. f/ J: B
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义5 ]/ a' _3 P6 d+ k$ I9 ~- }/ c, P
* O( X S/ Q9 t! N5 g
/****************************************************************************/3 K! |9 E4 h5 K( O
/* */9 P& h: P4 F0 q7 I% s
/* 宏定义 */
( T/ ]; J8 w: r, J8 N/* */ Q9 ~# M& f+ e6 g' R
/****************************************************************************/
$ A6 {3 {2 _# S4 \// 时钟 } j+ N" t1 b' t3 V( k
#define SYSCLK_1_FREQ (456000000)! @1 Y: ~6 D4 c) F# F
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)& R/ Q* u, L# J# j. p: E
#define UART_2_FREQ (SYSCLK_2_FREQ)0 m- z6 `, t5 A0 T/ T
}; \% W- H8 t# R8 ]# J- Y0 r/****************************************************************************/
; R/ ?, u5 J0 r# g. W. L- I0 L/* */
7 c E2 f; _( i+ c' n0 e* ?* |/* 全局变量 */- v1 F: Y+ H6 @ l7 P
/* */: d I8 x3 d. @ G8 Y3 W! Y
/****************************************************************************/# Z& k6 w# m3 R* s* G0 E d
char txArray[] = "Tronlong UART2 Application......\n\r";) m. m6 R2 \. Q9 s3 F w( v
" ^8 m0 \1 `7 f
/****************************************************************************/
& b$ _* D. b% K$ n8 K/* */
: Y' e5 x1 }& j* q( ?3 z/* 函数声明 */3 K6 y3 W5 D& W+ y1 E
/* */
5 `' C7 E4 T) K' v4 ^/ R/****************************************************************************/& u: e4 l" t% M( E" ?8 @, q3 K% |; A5 @
// 外设使能配置
4 P/ U+ t. X. `! jvoid PSCInit(void);
9 `) {- }$ Y2 n5 Q& A4 a$ U2 u1 s% X3 k, M' G n) o
// GPIO 管脚复用配置
) i& U! P' U R1 svoid GPIOBankPinMuxSet();
) a7 L) j1 _; l) a7 Y. o$ A- b" Y8 ]9 L
// UART 初始化" c: e, b7 [1 ~/ Q" I
void UARTInit(void);
% h! v, \4 y' e! b4 }) ?6 z// ARM 中断初始化
4 `7 G( R* a5 i: @$ |! F' ^void InterruptInit(void);; w( ]6 D2 [: ]
// UART 中断初始化
" O) |2 Z% U# [/ Qvoid UARTInterruptInit();' g+ s+ t- l5 D, w+ U% c5 C
// UART 中断服务函数% r! [0 O1 R1 ^) s
void UARTIsr(void);
" {- |! Q/ @. D4 Z8 j' m U6 s" z, T* ^
/****************************************************************************/
' n- t+ T: |: l$ s5 p6 V/* */
$ s3 c3 X! h$ U5 B/* 主函数 */7 v& E- ~ X4 ^; E! \5 c1 h
/* */1 I- Q* L8 V J8 w
/****************************************************************************/
1 B3 v& J* G f2 r& _9 q9 K oint main(void). g, i) m8 F$ I1 [
{0 @7 o; s* S. {
// 外设使能配置
}0 V/ M3 Y* o+ } PSCInit();
* j9 ]( a( L& g+ l
" S) X4 |: x3 v/ `3 U // GPIO 管脚复用配置
7 k& F1 K' q* C- A GPIOBankPinMuxSet();
1 [) V7 ]- |0 Q& x6 B. E
. p" z7 f6 s8 p3 J( X& ? // ARM 中断初始化
q& F9 Y: {9 |* t InterruptInit();
# | z: E3 o: k
7 W8 L* m# p4 F // UART 初始化
% K/ k! _$ S; B- W UARTInit();
! v( c, l# ~2 p/ e7 y3 e% h2 S- n/ @3 k* i' B
// UART 中断初始化
# d/ V/ y5 @1 N# t' v4 E- `- M UARTInterruptInit();+ f* W# l4 y" d& O' Y
8 D( R7 i9 p+ w, G: s$ T
// 主循环+ p# K6 _1 u! r) F
for(;;)9 e( ^$ Z& G) _& ?2 F& ]3 J$ [ G5 F
{' |4 c2 m+ w' t+ `' L2 B. u
( W* K5 z0 E, C0 N* C' T% F
}
# s: o0 T) \3 V# K}
% y O/ C/ v+ o/ u' [% e4 @5 S: I8 `+ K
/****************************************************************************/
2 o" {+ Z( l v/ U! ?2 z2 r/* */
) j- t: t' c9 ~4 o- N/* PSC 初始化 */# z- [4 G u8 h3 ]2 |: @: |
/* */$ @. t" I/ p1 z7 ?- M$ G" V- `: G
/****************************************************************************/# o& k$ Z1 h6 S3 E( N N
void PSCInit(void)+ T: z# J& w8 v& d8 R* R
{
: S+ `7 j- a- m, r6 z4 F# K) t // 对相应外设模块的使能也可以在 BootLoader 中完成
, ?6 [: T/ n1 U$ _. k // 使能 UART2 模块0 q5 r# e3 Q/ ?- Q) e/ `
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);* \8 ]& g+ R8 R
}
9 `; U4 k: {3 ]( P' f" J
2 L N5 F$ M: u( I, B- N" Y# M/****************************************************************************/; K% v t1 r/ u7 B5 {
/* */7 C- J, r+ ?# n& x1 e5 f
/* GPIO 管脚复用配置 */
) h- S6 e, u6 s" T$ P6 T/* */
2 H8 R4 e/ F) U* t/ z/****************************************************************************// C5 D3 M9 t! f
void GPIOBankPinMuxSet(void)
( E h7 C. u, Q' W# l K7 j. W' H{
' m3 M+ o7 i7 [+ n // UART2 禁用流控
" {/ O- V9 ^1 c5 q UARTPinMuxSetup(2, FALSE);
. b+ H; _% Q: f: r}- }) s% k: [% e6 t; s. \% p% |6 S
7 z0 x) r; m% L! d2 W2 V" h( x
/****************************************************************************/( o4 G6 P4 Y6 V7 b7 R
/* */8 Z! [! u" C. E) r x
/* ARM 中断初始化 */* P3 E/ P& K1 Q
/* */' n9 }1 p8 q! K
/****************************************************************************/6 q9 G' p' k# p( r
void InterruptInit(void)
' s( U' ~+ p% p1 t; i! ?. Q! [{
9 x9 ]0 k& w, R3 F# @* z" u8 l# A9 D // 初始化 ARM 中断控制器
1 @/ {5 F# E2 D S S; w IntAINTCInit();
6 k0 {0 e- N; c2 Y; o1 v" p5 L# z. A7 ^- ?/ h7 \5 d
// 使能 IRQ(CPSR)2 ^* v2 t; w) g; M
IntMasterIRQEnable();
+ R9 x5 I* L6 C w' D+ i* F7 _$ k/ p$ i8 i5 G: Y& M/ }
// 使能中断(AINTC GER)1 M! k4 }9 n. q9 E
IntGlobalEnable();
8 y) y( C* X1 s+ O! i' n8 c; k; N v+ ~0 `7 J' g! U0 Y
// 使能中断(AINTC HIER)) A( n$ S# C' w
IntIRQEnable();
H; S; k; d: L2 p2 l* s; P% C. w8 _; Q}
- a q- d, t1 X0 x; B
4 K5 G! Q8 ?# G: `* l ]2 h! a/****************************************************************************/
# u( n) l- a$ z3 e/* */8 u2 s; F$ W9 ]
/* UART 初始化 */4 U$ e! U! }& l/ M: W; Q; O
/* */
1 F- {! _- _7 R" e% B* \/****************************************************************************/
. _" r( E, u' g3 Hvoid UARTInit(void)
$ ?- y& w0 d& z; j, i0 T+ ~{
* l# W- P0 \: \2 c // 配置 UART2 参数5 Q+ a. G4 G' V
// 波特率 115200 数据位 8 停止位 1 无校验位. y0 Q" I; @& H' g) }, i. C( e
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
: D9 f" g. |8 ~ P3 p6 ~ UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
- |& }, g' O9 i# E // 使能 UART2
' U9 s4 {; l* Y/ S2 S8 G) q3 Q6 J' Y UARTEnable(SOC_UART_2_REGS);
# l( k/ `) s2 [- R3 D8 u; J* z" e) o* n; C' G" P7 @
// 使能接收 / 发送 FIFO
' d1 m$ m' y4 Z. [' |) g2 {: k0 u4 | UARTFIFOEnable(SOC_UART_2_REGS);. Q' h% |1 t/ p2 Y: I6 d3 Z6 F
; P4 X8 G% ^! \1 Y // 设置 FIFO 级别& z4 C' J! ]# p0 Q- i5 z1 g
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);. d4 O) n* @- v& Z. \
}
6 S6 Y' z! K+ g
; ^8 C( D/ I$ }, k/****************************************************************************/
' ^: G+ H; Q. P/* */
2 m. W! p8 P' a: T0 X W/* UART 中断初始化 */
- g, Q9 _3 M7 W: L/* */
) |! I; Z, l; ?; @3 I2 K+ V/****************************************************************************/
- {' h' I: _( b, E3 D$ ?" Nvoid UARTInterruptInit(void)9 v; q3 h; a8 _9 |: `' Q8 m9 ?
{
4 z3 N- O) N% T6 O! E% D5 q. D IntRegister(SYS_INT_UARTINT2, UARTIsr);
9 o5 y7 W4 `# u4 ? IntChannelSet(SYS_INT_UARTINT2, 2);
/ y1 j) z$ I- n: h0 \0 u+ J: c6 { IntSystemEnable(SYS_INT_UARTINT2);
+ v# k, k/ @2 l* c3 {4 o4 p4 w- s% u0 X
// 使能中断* x% t; [2 Z4 I: j) M( }' D
unsigned int intFlags = 0;0 K! S. v( ?- h: O
intFlags |= (UART_INT_LINE_STAT | \, x$ X" y) |2 D& }! q& b, E
UART_INT_TX_EMPTY | \
. H9 a/ [* H4 v UART_INT_RXDATA_CTI);
2 w( U" x2 @' e UARTIntEnable(SOC_UART_2_REGS, intFlags);
/ [. U {# D5 K7 h. k! ~}
# C9 {# l% S) g: m: v$ i! Y0 P0 y% Z0 W5 c0 N$ Z7 x
/****************************************************************************/% x) ?/ y5 z1 B$ G) f* E
/* */ s% T E6 S& f, m- a- J+ u
/* UART 中断服务函数 */: D3 V: V9 H: l" e+ G. n
/* */2 k- |( [. O0 H% v: y% R% p
/****************************************************************************/- @0 l V% F& _ O0 y. u1 _
void UARTIsr()
$ c/ e, O* C3 G0 y. P5 T{
- z- s' S$ u6 Z9 S static unsigned int length = sizeof(txArray);
% i5 C5 i. b. y' C2 ] static unsigned int count = 0;
( u! W" J) J+ u" K' J7 m% e unsigned char rxData = 0;
3 u, P$ }6 j% p, U* ~7 s3 [ O unsigned int int_id = 0;
4 O2 e: _' F- m2 Q+ P: _
! h- e7 U# {( F1 `. g. } // 确定中断源
2 C; @/ j' Z$ R( [8 D/ d+ c int_id = UARTIntStatus(SOC_UART_2_REGS);
1 M( X* D" e6 m! | V! G/ g: z& ? A0 i
// 清除 UART2 系统中断
) ~* p2 C6 a' q5 K1 J, a- \( d9 K IntSystemStatusClear(SYS_INT_UARTINT2);/ g5 B! B& L( V# G" e: u
* I E) k4 D6 i0 u // 发送中断
9 l) ^- U7 b# R) k5 v if(UART_INTID_TX_EMPTY == int_id)
# X7 ~7 g5 e5 x& q" i" r {$ o; `' ? N. X/ ?) s7 P" }
if(0 < length)+ [- U) x3 |5 ^" G l2 [$ L# q
{ K7 r0 s7 W9 i4 P: X8 b
// 写一个字节到 THR( h8 G. u l" Q+ u* g5 Z! i
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
& L, r2 V8 f1 V7 p' A4 o length--;
8 n$ j7 A) D3 v% H+ [; o6 W$ ] count++;+ ^/ K5 h+ A; V, r
}) h& c" ]8 W2 f, S% \& ?
if(0 == length)$ F: ]" ~2 i7 ?2 ?1 i
{2 Y, ?$ M( e: ~/ Y5 b& }$ `$ T
// 禁用发送中断
8 r6 k7 O2 B9 o- e2 I9 U UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
0 H& n+ b; y' y I/ r K }
! q- U7 r+ \( F, s }$ s0 f4 A2 }) e
0 M3 Z6 M7 z$ d$ y, d) G+ n! D // 接收中断
4 s- h, Q( N( k if(UART_INTID_RX_DATA == int_id)
7 R" t' }4 s: b9 l8 r: c4 ^5 I {
5 G: C# G; k+ l, f+ J6 f8 ? rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
% g) o* B ~3 q& G0 \* e6 e. r7 d) z0 @7 u2 m& |) v
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);. W+ p* G( j/ ~6 {: P0 U
}0 k' o. O# R+ b3 m6 _3 N
s8 x! h- i8 N }8 s* G // 接收错误# Y0 ?( z; q" Z0 y/ ]* I6 O
if(UART_INTID_RX_LINE_STAT == int_id)1 D- F% G* T6 Q# G! w5 i
{
$ n* [+ G7 U5 x0 q% [. y% I while(UARTRxErrorGet(SOC_UART_2_REGS))
& z" S9 @1 `9 f: Y; y. B {
" [4 R9 M2 g+ [! S5 ] // 从 RBR 读一个字节
9 G! t; I9 s" l* T UARTCharGetNonBlocking(SOC_UART_2_REGS);
( q+ I9 `# _ |( c0 W" J }- f; w8 j& S$ G; W
}
, Q0 x" [* x# B6 G. m, B! l: c8 z* T
: y' d3 N% L7 w1 v6 W return;" k' y' @) C8 E0 S/ O8 H
}" o# z; s( Z8 [) T0 T2 E
|
|