|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。! b( q, E7 H2 n2 V' M4 ]* G
4 L- A' q8 {( f; ]8 L
#include "TL138.h" // 创龙 TL138 开发板相关声明. K. M ?: s0 L: O2 {+ ^: r
; q2 {' O& {" ?/ W, i2 F
#include "hw_types.h" // 宏命令
' {) `. n, F* e% u( W#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器' ^4 b4 x7 C- a$ p- m5 n: d
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器4 a" {- n' D. {, g- o
. X0 j: N! c! I* a+ t#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
4 ^; Z1 n" v5 c#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
% A, N) \% a& M ?' `#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
K ~ N; M/ Y9 \#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
, q/ |* J9 X# ~9 w) b8 x2 ^
# a4 t1 }& M6 y& j; T/****************************************************************************/
. _( W) L2 @% L" t! k3 z, N/* */; b4 y/ e. B& B, g
/* 宏定义 */
) i9 ]: P8 _" ]! V! S+ |2 W, F& ]/* */& x* ^' W: Y: N+ G" a1 s
/****************************************************************************/& R. a0 d8 K$ ^: f
// 时钟4 D5 j" c* e% U+ D; i& O
#define SYSCLK_1_FREQ (456000000)
8 R! r X% p4 i#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
5 s) T) z* }( {( c8 {* l, U#define UART_2_FREQ (SYSCLK_2_FREQ)+ d8 n. z9 o8 L$ B
( Q$ D% J, K( }7 }
/****************************************************************************/% R( B0 |2 d A! z, B6 J* V; `, l- U
/* */
N: T2 v5 }7 P O7 h* V/* 全局变量 */
& @$ X; A# H1 T& p" Z9 X/* */! j s2 e$ b2 c) u% ]7 j
/****************************************************************************/
: {" O- _" m5 g; wchar txArray[] = "Tronlong UART2 Application......\n\r";& m3 |- X; C6 K1 k) L5 z6 H% ?1 m" q
- {) y. [3 {7 w
/****************************************************************************/
$ a: X( [( ~' m5 C# A/* */) f+ A! J# u6 h, ?
/* 函数声明 */
* `4 `6 _4 f2 p6 v' d i( q/* */
O/ @: \ s: p2 }* H/****************************************************************************/7 X; z- \) u% T; d
// 外设使能配置
; z- c: G+ N0 n: g' Qvoid PSCInit(void);
' M1 d5 }/ O/ S( m
6 r3 u/ @# E2 f Z( ?9 ]: S// GPIO 管脚复用配置
( K4 m6 H. |; }- m3 pvoid GPIOBankPinMuxSet();3 i* c9 O$ a6 |
9 r1 c. B' r1 {5 i2 t* e4 s- g// UART 初始化
$ c- B! g4 @& M6 s; \& ivoid UARTInit(void);
; U* U% ^2 j: h1 i: H// ARM 中断初始化# m4 y4 \3 F/ k7 I: y7 C5 w. I
void InterruptInit(void);8 f; L. w U( g5 n, M3 R" ?
// UART 中断初始化+ _% e$ t/ a9 K% D/ k: ]
void UARTInterruptInit();: K# T1 @/ ?/ Y( U! ~* _( H
// UART 中断服务函数' B9 o [' e9 x" o3 j
void UARTIsr(void);
3 X# U, g; w, _9 s. d/ m1 c* \! v* K2 z
/****************************************************************************/7 i }+ K* U+ [: b9 F3 F) a3 B( l, B9 W
/* */
' n( b7 `) m6 K7 g9 d X; z$ y" _/* 主函数 */0 x; Y' _3 O3 t7 r
/* */
; P Z N8 G1 f. C/****************************************************************************/* R: @4 t- B. _( R
int main(void)
3 `# `6 G/ l* |* X4 k{4 K$ S0 D: e2 V$ N# W9 v4 H
// 外设使能配置
. f# z0 Y8 {4 ^$ r) X( ^6 n% t PSCInit();
. h# B4 @# G% y' X5 Y , s, [, G" F$ r# v9 B& W
// GPIO 管脚复用配置
; h, o( H7 D [% u2 z) f0 @ GPIOBankPinMuxSet();
8 ~" T& j& ^% v! \6 ^' V4 T. |5 R. r
// ARM 中断初始化& q8 E3 N' D7 t0 @( a8 ^ F
InterruptInit();
; e1 I( q% k1 q' u! G% V; I$ m7 M5 C. F5 _4 l4 \0 d
// UART 初始化% J0 }1 `8 `+ N* x2 L
UARTInit();
# i% e9 J6 J" I+ n" Q3 P6 A! `/ m9 w9 [& {! W
// UART 中断初始化5 @6 Q( M& x6 [$ x' H
UARTInterruptInit();
. ?& D3 @6 J# h9 y/ E V7 {- g7 h$ \* N0 S; v
// 主循环
9 Z/ C' V0 r# E6 X: B9 |6 p for(;;)
w, y4 {3 Y) ]% a {
) s' j* K- ~! v) ]; d: n+ O7 ]; j* u+ m8 I$ o @8 Q. X
}( O' m s p; ]
}4 [ `4 y! B% s( S' s U( T- @% z7 q
% o! b4 Z( t4 C$ F$ t
/****************************************************************************/
/ z% P& _ R0 G8 r/* */
$ L0 M5 H' B8 M" L. @/* PSC 初始化 */6 x0 M; f2 l0 M! M" h1 B: ]
/* */
# X! U. P, x5 j _+ e/****************************************************************************/
; Q- E: x5 @8 g/ \- pvoid PSCInit(void)* P& E! s- M6 j ^
{5 x$ v' g. l( o: P9 E' W
// 对相应外设模块的使能也可以在 BootLoader 中完成, s6 d4 R. ]) r# ?
// 使能 UART2 模块 P& u( Z& r$ u5 a) f! d! u
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
3 X- {4 p& U0 c3 s: h7 I}9 j# B6 {. K3 p& y/ s
1 O* k6 X0 q' r$ w& Z; C" G* h( l
/****************************************************************************/% w ~3 c' g# `7 M( o& u
/* */
0 C& r- z, y J0 M( C/* GPIO 管脚复用配置 */
% o2 G. r( P4 B% G5 L+ E/* */
$ `4 h- Z- S( L% _/****************************************************************************/
" x+ C) _/ r# L+ Rvoid GPIOBankPinMuxSet(void)$ k2 R! |: ]$ Y A
{
+ U: g7 a0 [# s0 C8 @ // UART2 禁用流控 D2 f) M9 }; Z D
UARTPinMuxSetup(2, FALSE);
' Q9 w1 {- A6 S9 n}) H( M* X) x! B+ f) f# i) v' K
# D! R' [) V$ ]6 L3 I
/****************************************************************************/
8 g3 i. Y2 Q- u7 H5 z/* */ p# L5 I+ n A; E- ~; a
/* ARM 中断初始化 */
4 E$ Z* s- H# m" j/* */
( ^: G# n! U2 D; P- T- k& u/****************************************************************************/
/ Q( l5 [; N' N/ s# Y+ u1 L2 dvoid InterruptInit(void) f" l% h& E' I- k: V' f" B
{
7 z0 q$ Y6 G3 M/ o# b9 m: j // 初始化 ARM 中断控制器( T X$ {3 z4 D, R+ A0 \
IntAINTCInit();3 R4 B9 j8 V0 j$ a1 p8 n5 l
, M- ~: ]+ s4 d* V+ r5 u% s
// 使能 IRQ(CPSR)
+ r/ G1 k6 I' Q! q IntMasterIRQEnable();( H( N* e8 t; E
' p( J! Q2 |# `% P2 w
// 使能中断(AINTC GER)
3 J% `2 v0 [* a K: @8 ?6 g6 v7 ^1 i IntGlobalEnable();
% G+ y$ r3 G- N
2 v& E: D: M8 P7 m7 @ // 使能中断(AINTC HIER)
: y1 Q! I8 w, e" R5 w IntIRQEnable();
1 H* F! m9 c4 y6 J2 O}& b+ R# R' M7 K0 v! m& ~- ?
$ H/ k$ }# _2 E L! N6 Q9 u. D
/****************************************************************************/
: C: I2 J, u- C/ ], D/* */! t4 W$ R8 `; r5 C6 A3 p
/* UART 初始化 */
% A( R" g$ c2 S8 j( r/* */
2 b7 S$ t7 M1 v4 v1 Y* w/****************************************************************************/ J) w9 M! ]* H# B( D/ M% f, b
void UARTInit(void)' O2 G+ u8 B0 H
{/ t1 }0 l- z4 e& E
// 配置 UART2 参数/ K& {' O# B( o
// 波特率 115200 数据位 8 停止位 1 无校验位
$ O6 U+ v6 w8 h( |5 `. ]$ p UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
& K' b8 H9 h# A) r- O+ u" r4 Y c UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);7 s# \ V3 k# f! a: E5 R- c( U& _
// 使能 UART20 k" e: q, ~" I+ W
UARTEnable(SOC_UART_2_REGS);, q1 B' d3 y8 u& [' _. G: Z
c" u% ]& f: s* F/ {- R2 l0 b // 使能接收 / 发送 FIFO
6 t$ P! q- Q' a+ C( j3 i UARTFIFOEnable(SOC_UART_2_REGS);' G. c( \: @# |) X. }, H
/ g0 B# v; Q: h( J( h" m // 设置 FIFO 级别
' X( z& @' V5 L UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);! D4 D* W9 l0 O0 u5 v6 p
}9 {% }7 P/ b8 G4 K) `
- B- U3 G: c1 Y% \1 w, [$ }/****************************************************************************/
. M( y! s$ e5 P) `! l" A/* */% o/ k3 u6 A' ` X$ ~
/* UART 中断初始化 */5 Z5 t! H" h6 p% F
/* */
. h/ g; o$ y4 J" b) T& n/****************************************************************************/
- {2 ~! K% e$ wvoid UARTInterruptInit(void), g. C+ u% w* U& P9 e% Q
{4 q' b/ @% o( u) u3 x8 B" \3 K
IntRegister(SYS_INT_UARTINT2, UARTIsr);! h" Z4 e& L; W& }. O
IntChannelSet(SYS_INT_UARTINT2, 2);: r& m! _) M7 B# B0 y+ N. x- }
IntSystemEnable(SYS_INT_UARTINT2);! X6 Z3 ?* J* p9 O. R0 Z }
/ o# M N% ]" B& ~2 p7 C
// 使能中断4 O1 o) z3 n: J1 N0 [- u0 g6 l$ q
unsigned int intFlags = 0;. N, m6 u! ?8 u8 ]
intFlags |= (UART_INT_LINE_STAT | \" k/ S) |0 z. l6 e
UART_INT_TX_EMPTY | \
^! g e4 G$ Q8 f1 A UART_INT_RXDATA_CTI);! b- W" g* z) q K
UARTIntEnable(SOC_UART_2_REGS, intFlags);% R( m: @9 N# S
}2 I& B! Q1 I- S& t* N! C
' b) J. j: L8 @8 o( e/****************************************************************************/, U( [. _# C5 B( `, |1 _( r" x: J* N
/* */. L b4 C% Z9 C1 ~8 n7 U
/* UART 中断服务函数 */
; e: Z, ~# a \% |! ~1 w( ?/* *// R. z. L) a3 A* l
/****************************************************************************/& m9 `+ h, C% V$ A0 X# H
void UARTIsr()
$ B3 J* W$ p" Z1 J{: l9 g8 a$ ~3 X. p8 V
static unsigned int length = sizeof(txArray);
/ {( R6 x% H; a, `1 \ static unsigned int count = 0;
8 ^ |3 R2 T; S' r8 k4 Y unsigned char rxData = 0;
. @3 o$ T% d* t2 _ unsigned int int_id = 0;! n6 e3 D% @4 @8 F5 Z E8 j2 I
4 a- `( q; v0 p+ X2 L5 n& l
// 确定中断源
+ l% P; ]- y2 a! n; o6 q int_id = UARTIntStatus(SOC_UART_2_REGS);, u6 P. R7 P8 _6 Z* z( e3 [
$ c5 p, |6 v( E" B2 _: m3 N // 清除 UART2 系统中断0 f! F( @3 L5 h5 d
IntSystemStatusClear(SYS_INT_UARTINT2);
& y- q6 W: [2 d# S9 u6 [2 a- I4 a0 H3 F8 o
// 发送中断9 a- U* ~! x2 ~ e/ u
if(UART_INTID_TX_EMPTY == int_id)
3 w+ L( Q( {. H: ` {
* ?) x7 M0 `+ _& V! n/ f if(0 < length)
5 C/ R( \; b2 x) w+ [ {. D: E0 {* n( r& E
// 写一个字节到 THR
8 H" N8 L' {5 E4 e+ |! u4 n UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);: E* o. M9 |: S
length--;
* I8 q1 T/ k' x8 l: q5 { count++;" s* y2 y" G7 r- P; v+ U2 f3 n
}. q; b% O. N9 A F, A
if(0 == length)( ]: O# G) e# q
{7 t2 u) D# x9 ]( b2 c9 l
// 禁用发送中断
8 N) k9 s% `0 h" _ a UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);$ T: w8 ?. `' U2 J( r
}9 ~3 L2 K: N0 e( z9 S
}$ C4 f5 W, G8 Z4 l% T4 Y2 P
" ^ P. e- B% ^: O // 接收中断* X4 R9 c8 V6 c/ w4 R
if(UART_INTID_RX_DATA == int_id). J: @: j/ ~; d" {: @) S U3 m; t
{3 Q) i) V, @4 X- P: B
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);/ X) \ N$ q. T2 V3 G! i1 H
( g# }5 f: |+ n2 n5 K1 |. V
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);! F) C& }4 X; B3 W! i: y8 M
}$ ]0 u: k6 X4 O3 U$ G
. ^, D; e7 w: B/ Z1 q+ G
// 接收错误
% m! W( g5 S& }1 P ^. U if(UART_INTID_RX_LINE_STAT == int_id)
/ I' n2 Z) K& d; L7 i$ Q {/ u3 R9 ?, ]8 D' u) @
while(UARTRxErrorGet(SOC_UART_2_REGS))% U6 P- k9 y" n/ N- Q. w/ O
{
* f. n! |% B) Y: H! p3 M& U- D // 从 RBR 读一个字节" s' c( B. q/ ]' ?: _( i
UARTCharGetNonBlocking(SOC_UART_2_REGS);' s/ V/ l6 @/ z+ j" l/ X) k
}. f( F1 p1 r4 \% ]; F! X( |, {! }
}5 X) ]+ b3 H* x! r
3 K) s+ R* v& ^) v6 Q( [
return;
3 L. v4 f) o4 o}$ s0 b, i2 l" y4 V" v0 u
|
|