|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
+ W4 `) @) j K; J7 ~, u I% X& ^% U0 I8 j( g- y9 c, M4 d
#include "TL138.h" // 创龙 TL138 开发板相关声明% n! k J6 j8 e7 L* m: O
! p, G# T# e! P, z; |! w
#include "hw_types.h" // 宏命令
$ E5 o! g% s5 `; O* `( R#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
2 A. K( }8 e5 E3 n#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
1 R+ g; J; v# l, }/ Y. J8 m- U k- B$ F9 h
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
$ p T0 R) [0 y/ d#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明 j$ z; {0 D7 W4 j: R8 C' [
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明% S- s+ e+ g* Z8 N* x9 `
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义5 }4 c5 P0 {3 F7 Q/ F
: A n! ` T6 P% E: s0 ^5 c- \0 b
/****************************************************************************/5 k. F7 X8 m9 Z: V( V
/* *// s4 z% k% N: @
/* 宏定义 */
0 |' @2 E+ C# _4 F% j Z/ f) A: H/* */& R: @/ v: K4 ^7 U' o1 t
/****************************************************************************/
' f+ p8 l! S' o' }" ?// 时钟 L5 z- {. g9 q6 I& k' P( w
#define SYSCLK_1_FREQ (456000000)
$ D7 C0 y. N6 {. z#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2). m) t# t: h1 a) F. K' z/ l% Y
#define UART_2_FREQ (SYSCLK_2_FREQ)
- ? x. p/ E: M8 ?* J2 u6 C: a% b: N8 S3 L% {+ L0 y0 {
/****************************************************************************/
! \ W8 e% {) W& c/* */1 s0 f4 S% k* G3 t! r: d
/* 全局变量 */
& k, t+ w& O- c1 i4 O0 W/* */6 d6 u F1 S: s" W- c# U& q9 Z
/****************************************************************************/
# l0 K# p/ g" V0 E+ E! `char txArray[] = "Tronlong UART2 Application......\n\r";$ B! {# x2 \, D G1 z7 I) w
5 u4 ?6 [+ m# C' d) z/****************************************************************************/
% h! o. J: {0 \3 c* [3 d+ b4 X9 D/* */7 r0 I+ K& b" z9 E7 W4 W2 V
/* 函数声明 */+ {. \! p# }. t' U
/* */4 n) v6 L# h, H: w1 G3 o2 C; e6 r
/****************************************************************************/) K: e# u: c5 Z+ @$ @9 S, i2 l
// 外设使能配置
$ z1 j" P1 |6 d3 \4 L5 d* wvoid PSCInit(void);
( ?2 O, F0 Y0 S' t. D
0 h/ K7 i$ |2 q// GPIO 管脚复用配置
5 D- |9 S' A' K+ U4 N( Nvoid GPIOBankPinMuxSet();
- L! P; l# K" o) @: K7 w9 x
. ~( e( r; @' y% _' Y* z// UART 初始化
0 w T- k1 n$ @ Z( A- dvoid UARTInit(void);
. J7 `7 Y4 h! d: K% l& `// ARM 中断初始化
" W1 H; O5 t- r2 h+ Fvoid InterruptInit(void);( }! P, v/ t) T7 @+ U
// UART 中断初始化
6 z: o5 W8 e1 fvoid UARTInterruptInit();; C; f y& _' @: z. p
// UART 中断服务函数0 S' N3 q+ p4 R. Z: B0 E2 O
void UARTIsr(void);
3 H* U$ E/ i4 A( X" f7 ^: k( X' k! u1 N+ _ S" x D+ t
/****************************************************************************/1 D& I. `6 g& f1 p
/* */
# [* c/ l" `- v+ g+ D/* 主函数 */. b8 l5 J0 |: |+ ]
/* */$ A8 @' g' h( G0 p- e3 w; Q) B
/****************************************************************************/
8 V5 h' W; p4 f4 b3 E: O3 @int main(void)- }; N$ ], W1 H/ I& }. q8 k; Y" _
{9 N1 K" ~& @$ W7 y1 M6 N0 ~& y
// 外设使能配置
9 ]4 t$ o3 p; D6 a$ `# ?/ m: q+ m PSCInit();& R q/ r* F0 r
9 X; c1 M9 c# I H, t // GPIO 管脚复用配置3 u! W S! l( c& k. ?
GPIOBankPinMuxSet();
: p0 l: M) G% _( A- \1 T
6 g: F2 E) e4 O, i9 O# n8 C( R2 L // ARM 中断初始化
# \8 t/ T) q& h0 w) Y3 w2 z InterruptInit();0 `( A8 y4 u5 w+ ]8 ^7 n+ {+ q2 o+ F
# j* z7 G; k0 i4 [# s( h
// UART 初始化* o9 N3 y% R" b/ t9 s8 [4 P3 y
UARTInit();2 m, k; T3 D' g% `
- ~2 g+ ]7 y: s( v // UART 中断初始化
7 t( [) \) B3 O+ l D UARTInterruptInit();
" i* C- y. D$ o* S7 f. ?/ R) D+ _# [( l- q, s$ A3 B
// 主循环4 Y( B9 C7 I7 A$ o
for(;;)+ I5 Q* h* ?) r9 `; S
{
0 P2 l- j( P; a" r- {1 Z' l7 D; d S2 E' `$ j9 W: C0 v
}+ c7 k. u7 }4 t# f2 I' {
}
, ~- ~( D7 g8 t8 q/ I/ i
1 W" A, U1 v" C4 h( O5 n4 J; t/****************************************************************************/
% a! z' y( A! F, X* m) ~/* */
1 X G+ f1 m, z9 @. G( q2 \% X/* PSC 初始化 */
# Z2 {- Y! K: }% u! {6 ~5 J/* */
' O4 r+ W/ X ^7 x) A/****************************************************************************/& o+ G: C/ ]) c/ u
void PSCInit(void)
1 E. g$ W, u0 N, M4 n1 i; L8 {{/ y" x- O p8 n3 b8 v; D2 H
// 对相应外设模块的使能也可以在 BootLoader 中完成" v; Q6 W$ i6 `, Q3 F' R! N
// 使能 UART2 模块$ b1 w, [8 q) X- o. Z$ d
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);6 S8 a, u7 M1 X3 S. c
}+ D9 D7 ~! q0 G, V4 {$ E
$ B* z: ~6 O! G- R! Y/****************************************************************************/9 S* |9 W1 z) N$ d* Y
/* */
" p7 d/ {" _3 g( r$ M2 P/* GPIO 管脚复用配置 */: H! b1 w1 h8 p1 r+ {. W" e- T
/* */
8 `9 h- K2 ^2 ?4 d- K& U' c( A7 M/****************************************************************************/
1 w; I& k! N, O6 G l b* C% @void GPIOBankPinMuxSet(void)
$ ]* R2 q, L1 ?$ e3 ] H{/ e: N( h1 x9 X8 v# N- m/ p
// UART2 禁用流控
1 s; p% z# r- D2 s8 _ UARTPinMuxSetup(2, FALSE);2 ~. a: M# E( s4 m8 O m) W+ D
}
# h# l' c6 \1 s+ t6 u# y- }3 Q* k# e
, {) p+ d: {' N) c, T4 K8 h* f: f/****************************************************************************/
7 n' J( E T, f. X u% G/* */) y! m0 Q r5 l& A$ o$ ~, I# F
/* ARM 中断初始化 */
2 q* M) E4 o! ^/* */
) T$ ~% o/ {7 K* i* i5 p$ M& z/****************************************************************************/' j7 ]" @* {' a' G) q
void InterruptInit(void)
2 M$ \6 t. P4 @' w{. ]9 ^. ~* u0 j6 y" o
// 初始化 ARM 中断控制器
. b5 K& H" w% L# T9 c, r6 ^ IntAINTCInit();
+ ~$ S+ i4 l) P* P* f, o F0 j( ]# f; H/ H7 ^5 Z& l
// 使能 IRQ(CPSR)
8 h5 q6 ?$ V8 J$ S IntMasterIRQEnable();7 b* u2 }5 @' k, p
% Q1 v; X% a! J3 [: G- A // 使能中断(AINTC GER)8 L8 T& I- T* q) i7 ?
IntGlobalEnable();
: N( a/ A: \( L% p" L2 O7 @7 y/ P
// 使能中断(AINTC HIER)
# L4 O! b+ \+ R' O: s IntIRQEnable();
1 c, V& O- ]# g% v0 V}/ e+ U: h4 m6 H3 F, F( I. ?
- C" U8 w& `, o/****************************************************************************/
$ R5 P& x. f' {' @. B/ Z/* */0 T' ]9 f" ~# ^3 x
/* UART 初始化 */) \2 z7 [: |% B' W
/* */) H: w3 H0 {) C) j
/****************************************************************************/7 V8 J# e3 h) ?* @' f" E
void UARTInit(void)
* ^# ]4 P9 b' Q) T{
; \* t& J. ~8 x7 q( B // 配置 UART2 参数" c, t! ~7 [9 f! }1 j5 V4 I
// 波特率 115200 数据位 8 停止位 1 无校验位, y' s+ F l5 B/ Y. W
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,' e3 ^- W8 t# a" p
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
4 ?2 l$ S' b, d z* j // 使能 UART27 \& n7 Y2 L3 Z N5 y; S7 a s d: W
UARTEnable(SOC_UART_2_REGS);
0 c J) b& X/ ~0 Q) q k
- }; y# T% D: \! x( ?2 l3 p // 使能接收 / 发送 FIFO# e7 r( n) z8 j! U7 X# B
UARTFIFOEnable(SOC_UART_2_REGS);
0 c( `, e% S0 ?) c* s- `: ]7 K: g8 B0 I0 v
// 设置 FIFO 级别
) V5 v1 l. t7 J" X* i* y3 m$ Q UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
/ j5 a: R$ V r5 Y1 d}6 z! s8 \% E i
" _1 J; B% ?; j+ @, W
/****************************************************************************/+ @4 ~4 b1 I; r- M2 ]
/* */
2 \5 \# X, j5 H/* UART 中断初始化 */
) o. a8 f, G! B9 x6 ?9 j' H/* */7 J- }# T' h4 h
/****************************************************************************/
3 E. _. g0 ^/ {7 U0 ?3 V2 z+ {' G6 h$ bvoid UARTInterruptInit(void)
2 y8 { j; W u) z/ c{8 f. b" \7 l% S# i! T
IntRegister(SYS_INT_UARTINT2, UARTIsr);
! K- g) W7 G; |7 F IntChannelSet(SYS_INT_UARTINT2, 2);) \; f# M5 w8 K9 a; M$ q5 s
IntSystemEnable(SYS_INT_UARTINT2);
/ d- S* J3 L- b8 u- t( Q+ q' O$ r
) b9 \" I8 o* k! b // 使能中断
+ c: j( R2 a5 h O! x, V unsigned int intFlags = 0;. I; T( z3 ^4 A+ U
intFlags |= (UART_INT_LINE_STAT | \
5 K. P. D( ~8 Y0 C w UART_INT_TX_EMPTY | \; n- @- ?! v) i
UART_INT_RXDATA_CTI);
8 R6 j) G1 E! C% e3 U5 _ X UARTIntEnable(SOC_UART_2_REGS, intFlags);2 _7 |. ~4 z* Y4 x9 H. G
}
. l; U* K) W5 d, {; w0 E- c# c, ~% j7 ?# l" M* c
/****************************************************************************/
! K. H7 v5 _8 ?5 a+ i/* */) G$ M1 [: |! @2 V* Z
/* UART 中断服务函数 */
* c( X5 d7 R& i" Z1 Y7 N' v/* */2 Q5 {( i1 u% i7 M+ G8 p. T
/****************************************************************************/5 m3 @% L9 Y W3 Z
void UARTIsr()" W# [& b: b+ h b: M8 K" j9 @* n
{) V+ F8 K0 I' R- a3 [
static unsigned int length = sizeof(txArray);
- p7 M9 \6 v% O# u! u static unsigned int count = 0;( V) t- o5 w [! k
unsigned char rxData = 0;1 }) B0 k! b+ O9 r( s1 @
unsigned int int_id = 0;2 O5 ]1 A8 M" e: @; k$ y( t
k3 j8 ?% V7 i( z0 B4 Z, Y4 p
// 确定中断源/ \/ x& ?! r# ], T% x m, m1 d
int_id = UARTIntStatus(SOC_UART_2_REGS);4 e/ w9 Q2 l9 c/ E6 T2 A: X
: w8 F; }! v& T( A5 {
// 清除 UART2 系统中断
! r, S" @6 {' U |2 u0 V( s8 C IntSystemStatusClear(SYS_INT_UARTINT2);
5 B& o$ A2 _, `( w! \$ ?* j9 r+ Q2 L. J7 n4 h, j
// 发送中断
( R; g a+ x+ z% a* E if(UART_INTID_TX_EMPTY == int_id)
& v6 I& t& ?3 y( c* w' N {
, c9 X$ N( R J- ~( U if(0 < length)
3 j7 ?8 d: r' e% H2 Z3 L {: M! A( R/ O- {) w9 n
// 写一个字节到 THR
3 p8 [& f( ~, z: `2 p! n UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);" @' C$ I7 ^8 X! W
length--;
- V6 ~% {. W) f. g; } L count++;
1 e6 C, I4 ^1 S1 c5 w' T }
9 s6 {9 _0 i+ b9 Y( _- u$ U8 S if(0 == length)
& x( w$ |8 O1 K0 [ {
! G) g% R& L" R( x2 |$ @; R T3 q // 禁用发送中断# n+ T6 b3 q+ L2 A# ]) s( m% M* B
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
2 C" A- y& a7 l( I+ M' N }
+ U, {4 P0 ?5 U: B }
+ ?/ ?! y0 O9 t3 u2 q6 @5 _
5 E$ M2 J: [" B3 H* ]3 H' @ // 接收中断4 X) O) P# f% B) \
if(UART_INTID_RX_DATA == int_id)! s# C/ W5 l2 t
{ m- Y J6 S; V1 U
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS); b; g, ?6 u9 c) {6 N3 h; w+ x/ K
3 k0 Y# R0 v. r$ S2 d# g1 |) e `
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
$ U1 c: A2 i! t }
P$ U( m& m' [
/ o& ?+ \1 l5 X // 接收错误# X3 h0 F/ m, v4 b* Z/ n2 |1 E! ?3 i
if(UART_INTID_RX_LINE_STAT == int_id)
$ i" |- N" S% o/ q2 t {
/ p5 {$ `6 _. c& A" y while(UARTRxErrorGet(SOC_UART_2_REGS))- Q$ @2 |3 G5 z" ~7 W+ t# ^: ~
{; u. D% d; E6 O8 Y$ P+ v$ ]$ \
// 从 RBR 读一个字节1 Q% P3 F* [' D
UARTCharGetNonBlocking(SOC_UART_2_REGS);
6 }- T h# W6 N }% T4 I9 X# c4 r& a* |" @2 w
}4 s* k3 w+ k H& C& [' y. T0 A
7 x+ V0 }0 o3 {* ?. G3 h return;
( Q) M7 o& S& A) R}8 }& U6 D; m: G
|
|