|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。7 z5 W Y$ v1 m: k3 b, Q" K) U2 L
+ j: ?' w. W4 X; U. y#include "TL138.h" // 创龙 TL138 开发板相关声明
# h9 O" p8 y( Z+ V8 J
) h8 V3 `+ }) U; ^2 ^ v! o#include "hw_types.h" // 宏命令
2 R* U, c* S- _* ]8 Y& d* k f#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
+ J: A& J+ C8 f0 M/ }#include "soc_OMAPL138.h" // OMAPL138 外设寄存器, j1 v# \/ |1 b7 ~
+ S2 o: A5 X8 i) ]0 j#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明+ p: A% v% y, x
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明7 a! H4 p) u3 I* V( a
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明. M) h4 y) k7 i5 j7 ~
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
9 a6 c8 v' e/ u- M! O, f, I
7 P7 N" m" V! a& ^% z: k/****************************************************************************/
) P; D" K. t4 Y1 y/* */
9 o7 \/ |& `/ N- S7 r. k/* 宏定义 */ a+ x/ e- @/ _6 K: s
/* */
G) W0 Y: W6 h/****************************************************************************/. x; ?, H1 x( }) G3 G
// 时钟; r; t9 N7 |6 U8 N9 O
#define SYSCLK_1_FREQ (456000000)4 U: n6 a8 h6 s
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2): Q3 ~( M0 O* B& p6 L; @! A+ T
#define UART_2_FREQ (SYSCLK_2_FREQ)0 C) \+ _: D* R' }: H/ g; F' K
& Q& e! w6 f1 I3 C3 ~$ P
/****************************************************************************/9 K r$ g* T t
/* */$ b( I; f. L/ u# N' l
/* 全局变量 */
D" M+ @0 ~, t3 |' H8 q/* */( x0 x* p6 g: f, R3 S' ?/ S
/****************************************************************************/* x: G( ^3 Q& i4 ~( S
char txArray[] = "Tronlong UART2 Application......\n\r";7 e$ v# T0 X7 g( Z
! c2 S2 q1 a& Q/****************************************************************************/: U2 S- J' {4 ^
/* */* y1 f9 E% C' F( M' H
/* 函数声明 */
' [1 k5 C5 \2 [( W1 J8 w/* */
! i2 a( X: M$ F2 o& N5 {/****************************************************************************/
V: \) U, Z6 I5 l2 y// 外设使能配置- `. I/ o: E* L$ ]5 t! V
void PSCInit(void);1 t! A* i5 j: j% y9 J4 J: \
+ D4 o% ^) X5 v
// GPIO 管脚复用配置/ P% I# |+ K3 r, ^
void GPIOBankPinMuxSet();
" r5 I5 \- @+ P: c1 d+ z* p- s: p4 s8 D: |+ y* j3 @3 w/ C- B
// UART 初始化
4 H; F5 ~( ?1 v$ n$ ~5 ^7 gvoid UARTInit(void);
% ^( S2 Q6 H# e! K ^* i- h// ARM 中断初始化9 t, Z# U" n! V0 ^# T
void InterruptInit(void);1 b- u* X, h4 T" N/ r2 g0 E
// UART 中断初始化
+ O7 V/ @5 Q# H% S) p1 n; dvoid UARTInterruptInit();
. C% x6 C3 d8 w2 {7 Z2 b+ f; W// UART 中断服务函数2 `4 e" X0 i# u4 V
void UARTIsr(void);: B0 ^* B8 ]5 U/ F+ J' ?+ r
6 i8 _& b0 v# w% L
/****************************************************************************/
" \& j3 o; n6 ~0 B7 e3 D/* */5 r! C+ c7 l0 j' _
/* 主函数 */
0 K6 D* d. B" x) K/ j/* */
% w u1 J/ X5 ~/****************************************************************************/
3 j6 d' z' J- l! w, cint main(void) g8 r: d7 j: n8 I$ N/ b; X1 ~7 x8 F+ U
{
0 s1 R6 { @" Y. }* c4 m // 外设使能配置8 l, e u! X, p: N p1 i
PSCInit();8 f& K' P4 b6 T! Q0 u
' _; Q3 G }: _& ~; J( S. [ // GPIO 管脚复用配置
3 u$ z( y6 Z) K3 ? GPIOBankPinMuxSet();
1 Z% u6 e& ?5 T; E# L8 B/ E: J
& C2 l& C& q; Z' D4 c$ S( d // ARM 中断初始化; u1 C* R4 X9 O" J
InterruptInit();" b/ J$ `* c! k0 A( Y1 m% T
/ `5 L6 ~; a, v( i! r! K$ Q5 F
// UART 初始化. t# e/ F+ e1 C6 \( q/ {/ o D
UARTInit();
' w1 g! p: L) d1 r) ?; V% I- V% p1 c# ~7 O! ?/ R! t5 ~
// UART 中断初始化! r7 U) H1 r) a: u0 o9 c! z5 s
UARTInterruptInit();
Q9 s7 i5 i$ M2 t0 F* z* N, r
: ^. e$ A3 s* q( g // 主循环4 t! F- D8 f& b" I, b
for(;;)
! z D7 i! t; ? {1 N; W) `; \- R9 ^ B% P" ]( z7 y
. H7 e. w2 J, w' c5 z }: e4 [6 O7 b% _8 v) Q
}
) d8 b) D& N9 V& @3 R; ]
0 k, e- d3 o i9 _( D/****************************************************************************/; h- Q, t9 d% i8 M8 [
/* */5 }$ t- ]8 c% q# Z4 I7 `
/* PSC 初始化 */
5 I4 R9 G3 C f$ J8 m/* */
0 c, v6 \& i0 L5 |4 p) q# w1 T7 ^/****************************************************************************/
' L+ H5 z w4 g, y+ G5 Fvoid PSCInit(void)
$ V$ @5 S' X) y" {/ o$ w2 \{+ n/ ^+ O8 b; m
// 对相应外设模块的使能也可以在 BootLoader 中完成
! k% p5 N4 c Q: b" Q // 使能 UART2 模块0 a9 P! Z1 U# T- S3 c, r
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);/ N% s* {* y% ? R! ] H
}# m; Q1 B4 j1 {; S
- g" C- i3 A& I, Z/****************************************************************************/
) Z9 l4 }7 i a; z7 [9 {- a/ }/* */
+ c! n8 @& P; f8 M3 g$ I/* GPIO 管脚复用配置 */9 {1 X# y' @2 h! T' M2 S. L# _
/* */! V: e4 M- J: d7 O* H1 q- n
/****************************************************************************/
( r! J/ O- y4 cvoid GPIOBankPinMuxSet(void)
9 |4 d2 q }0 y{# \" S5 [8 F' w5 q9 ~4 w) j
// UART2 禁用流控
# T. V( l+ t& U y5 x9 V UARTPinMuxSetup(2, FALSE);
# J$ ^+ J6 m6 i7 G$ O7 Q7 r/ W0 t}
3 B4 H2 v5 `1 g h- {9 y0 ? h0 o8 i7 e) b+ Z/ H% R# |3 Y4 R1 E$ A6 V
/****************************************************************************// H4 a: s' W5 h) {
/* */
! C0 c5 m' T1 n* D2 D7 x/* ARM 中断初始化 */
7 q: y9 d9 T- L* n+ E. |% U+ P2 u/* */$ {* m; s; }, {+ Y# E, [
/****************************************************************************/; I2 }( {; o3 P- t
void InterruptInit(void)9 Q+ m3 N$ y8 F% E2 F% [
{+ F+ h$ ]# A* R# f8 s- y
// 初始化 ARM 中断控制器. l" }& S2 c* V- z- p
IntAINTCInit();
" U) y1 h! _) D1 R8 e
% I2 n9 l8 ~9 X# |& M // 使能 IRQ(CPSR)) R6 j3 p3 u" G* B/ f, S/ g. o3 h
IntMasterIRQEnable();/ y1 p! H" N( i M$ U% C5 R
, Y1 n+ y# ^7 c$ p* I' x6 l* ~ // 使能中断(AINTC GER)( ]9 K7 V/ j) S
IntGlobalEnable();
* s3 L8 g3 B( O3 O0 D
% q8 ~5 e8 O2 T; w2 `3 m% Q // 使能中断(AINTC HIER)
4 k' M8 u. v1 @+ N IntIRQEnable();
: Y& Z# |! h3 C' }}2 E7 J/ }' G1 p5 c* u% w
- c- Z+ P$ E2 c$ K E
/****************************************************************************/; ^( p e. L. Y* n* C
/* */
; }9 k. B3 t1 F" ?' Q& D- d. Y% E* Q/* UART 初始化 */& b) ^* L- ^* c7 ~5 @, L! S, v
/* */
+ q' I9 `" J, t$ q0 m# l* c M6 J: t/****************************************************************************/
8 X1 w- V- e% |( svoid UARTInit(void), K+ l3 V. j2 H
{7 q9 _" C) }: f; ~# m4 \% W
// 配置 UART2 参数
8 I0 h: s) I+ Q. o" ^; O* [ // 波特率 115200 数据位 8 停止位 1 无校验位
) J0 b' \) V: ?! Y* L/ c; u1 f- ]/ D UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
0 i9 W/ V$ U5 T- E* s r5 }% _3 S3 q: N- S UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);1 q1 d1 s- t, D2 Z3 _- T% W& Z7 _
// 使能 UART2- X! C& ]# p* i- X$ K
UARTEnable(SOC_UART_2_REGS);
7 q6 H m* F; c8 P q& x0 p2 ?4 W! S
// 使能接收 / 发送 FIFO4 r: N; T) i, A" ?' ]# K
UARTFIFOEnable(SOC_UART_2_REGS);0 c4 u O8 E# A5 j1 v! B
. H) U( S; z$ S+ s // 设置 FIFO 级别
8 H( Z8 d W' q UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
+ C w3 x% A/ j" K}" W) _ N: V3 k9 P5 }2 @0 m' O5 X
2 q& A2 a* J- y1 c# e5 i; [* N6 C! k# o
/****************************************************************************/! H8 w% s; o% x6 M" k3 b, V# a
/* *// C8 a. H8 p6 `" Q4 I( d
/* UART 中断初始化 */' b" R" K3 M! t l2 r: @
/* */
2 N% ]( ]6 ^% W; _/****************************************************************************/- A- R+ c1 u1 k$ D7 B" k' N: D
void UARTInterruptInit(void)
7 R& L v# F" M{( \, x i/ r2 U7 W
IntRegister(SYS_INT_UARTINT2, UARTIsr);# s6 j7 l6 D& e
IntChannelSet(SYS_INT_UARTINT2, 2);- m2 E0 ^" N8 K
IntSystemEnable(SYS_INT_UARTINT2);
+ r8 c( {6 ? J: A' J& o& t( X9 C7 _
// 使能中断) f. i# O6 b, K( O
unsigned int intFlags = 0;3 G) x. H8 T2 v& r* q$ U' R- u
intFlags |= (UART_INT_LINE_STAT | \
- g3 M: t2 `* { Q6 n UART_INT_TX_EMPTY | \
7 u, M8 a/ ?& j UART_INT_RXDATA_CTI);
' H+ e; I- [ |4 Y0 @ UARTIntEnable(SOC_UART_2_REGS, intFlags);
8 J! H' v0 c R}
; r% v- t" y: s2 c* q8 [' W- j9 D3 S. S j
/****************************************************************************/
! b, d1 R! {4 M8 o/* */ C* l% {" U$ r' s' Z' j( }
/* UART 中断服务函数 */: U: H3 d) t0 y) O5 k' ^
/* */& W0 A- L/ j H7 W. E3 j
/****************************************************************************/5 H6 U9 `1 R0 i9 n# V/ x: F
void UARTIsr()
; o8 E: }9 }2 S& ^& S9 F1 h{
9 y% ^1 G7 M9 O) l0 b4 O' | z static unsigned int length = sizeof(txArray);
4 Y3 o' a" r _; N static unsigned int count = 0;' e( j) i$ H1 E/ B* L/ u$ I
unsigned char rxData = 0;- T" U( c. X1 I+ l) Y3 r
unsigned int int_id = 0;+ n y9 j5 K$ [" _$ r3 Y
~ a; T5 q' j1 R // 确定中断源 m& X4 d' i/ K/ A
int_id = UARTIntStatus(SOC_UART_2_REGS);# `. J+ \9 ]$ g
* T# c' P4 E6 f4 A2 n% G
// 清除 UART2 系统中断
, o ~, Y6 P* ] IntSystemStatusClear(SYS_INT_UARTINT2);7 N# ?; \2 F7 T( z2 B& `5 P2 _
) P/ P" w0 F" N* r7 M! y6 U
// 发送中断
2 v; |2 F# ~( v+ q/ c if(UART_INTID_TX_EMPTY == int_id)
8 c, r7 X( z" i" U: s {; u+ c4 c& P8 L. H) ^$ I @
if(0 < length)
# Q- A3 k# p" P {
* g# j) T# y3 A& Y- a // 写一个字节到 THR
' U! v& x8 @7 O, s4 T, z! M: ^ UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
, S- ?2 S. `' Q& t length--;
: [' W: c0 x6 x2 u! J5 f8 X2 O count++;
, t* @. a* }5 K }- z' z1 K) x- ], p' H* c5 b* d# n! p
if(0 == length)" \) V j* G& T; p
{
4 ]# L3 M+ f' A' V, U // 禁用发送中断# j! i7 B( g+ j
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
( P! [7 {" u1 e }, U) R& |; f& n. J$ b
}
# u2 [' ?! t9 D# [7 [( d; y+ |; e& r9 g W3 q+ z
// 接收中断. Q! n& w8 y7 @( l8 S ~( w
if(UART_INTID_RX_DATA == int_id)7 r" M; Q' k1 v. Y
{
. C. f3 Y+ j$ d- ^% Y% g rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
6 F7 T' g& W2 {8 e# g
( B$ V5 @; E. \- a/ W# ?! W UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);% Q$ Q$ n$ [" Q" t- S; L. x
}' g. r3 E% J) I) @; F
/ D) w" i- P1 q* i
// 接收错误 j5 a! n. {; P1 z
if(UART_INTID_RX_LINE_STAT == int_id)" f) b' \. |! j/ E0 }
{! {- r7 i( \, i8 r
while(UARTRxErrorGet(SOC_UART_2_REGS))
; P* A+ n5 E" O' N: [ {9 K& T K/ G4 W. r% X( h4 o
// 从 RBR 读一个字节
+ u6 G: R( T; s3 S) a2 [" r UARTCharGetNonBlocking(SOC_UART_2_REGS);
/ t; @$ {8 ]2 t9 `' [ }. D% d( [( N$ Z _# ^/ l* R
}
7 g2 a0 S9 T# c8 V8 j ' M" X8 i" b4 y4 f1 S3 `
return;9 U6 J4 W. \! E3 S ~* v* Y7 j$ ]
}( I# _5 q1 S6 C
|
|