|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。" V: j- H! T- z7 `
G/ v8 ]( q5 R7 O+ h; S#include "TL138.h" // 创龙 TL138 开发板相关声明7 {* c" J% r3 n( z$ `
/ _( u* g& Z( |, K0 J8 K. E
#include "hw_types.h" // 宏命令
+ ?/ v7 W H0 e: v* Z: h, U1 i1 C3 W#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
; ?0 _8 ^ m+ \* _4 W" e#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
. t5 }( `' s, A/ l0 f# y% A8 W2 D
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明, M" s1 S) P+ S+ v3 z! h1 A! `
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
# V- a0 R" b2 f. i! ~% c#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
; s5 q" J; K" o& K#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义& l) x, b" |6 g
: x9 l' _! u$ c# S7 M6 h
/****************************************************************************/
u" N$ n/ f# \/ B/* */* \3 V5 S6 p" ^
/* 宏定义 */
) x: U4 I/ X: ?9 V/* */ b$ c1 [; V3 }9 U! r* x
/****************************************************************************/
8 R) R* e5 p7 L. R6 s6 R// 时钟
2 w u# x, h8 Y! u6 w4 b#define SYSCLK_1_FREQ (456000000)
$ I: O/ T' D* Q; N#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)! B$ ?% w9 y; z& J) Y: U
#define UART_2_FREQ (SYSCLK_2_FREQ); H Q; |; f( U3 g; T% x
: M; D& K8 _) J+ P. A% J2 N/****************************************************************************/5 ^/ N3 h% A" w7 W, {& z
/* */
1 `& ?2 F4 c u' e: |" _- L7 O/* 全局变量 */8 A4 Y" i/ D+ L8 u
/* */
+ y# N. J# ~! M/****************************************************************************/$ g5 p E. a0 h- ^' Y2 e4 ~5 j
char txArray[] = "Tronlong UART2 Application......\n\r";
( i3 u3 G: \' ^1 |. U. j& v6 F6 F: ~ ~
/****************************************************************************/& k- m+ g' \- |
/* */1 w2 Y" P" y6 S* J7 a- f$ T
/* 函数声明 */
! x7 I' E5 S6 o6 ?: c$ ~/* *// N5 a D, U- k8 M7 j" _+ W# i
/****************************************************************************/
$ s# [3 Y- G( I3 O' i' ~7 W// 外设使能配置- |' _" @* F+ x9 i+ Z9 o
void PSCInit(void);2 J0 \) d: g7 w
) I; \8 R/ B$ T P
// GPIO 管脚复用配置+ Z, S9 T2 C% `5 W! T4 i
void GPIOBankPinMuxSet();' a1 {7 T% A @) v- L! b* o4 O# x( j
5 W4 V) o0 b! \, h+ u( v// UART 初始化
9 }: V+ ?8 K8 ?5 i; e+ Cvoid UARTInit(void);9 y3 b% R$ V( i: e% p
// ARM 中断初始化
3 N( X" q! H5 evoid InterruptInit(void);3 c. R+ f3 t( c5 V& w
// UART 中断初始化
' |2 n4 ]/ I* U7 _8 U2 xvoid UARTInterruptInit();( k+ n! E! Y0 k7 N- D, L, E
// UART 中断服务函数
. r" I0 A; E0 Y# \0 xvoid UARTIsr(void);
" i( q4 I/ m# r6 S a, U2 t! k8 U
/****************************************************************************/& {" h6 G, f* F! l; Q/ D- D- i( h
/* */
. K4 @/ e& e/ d8 g4 W; H4 I: q/* 主函数 */
2 N* V$ h5 Y7 N8 }4 l# h/* */+ y Z/ B2 g# z! j1 k/ p
/****************************************************************************/
" z+ v4 `! a* q* W7 D& n) {; oint main(void)
. X0 y4 q0 C" I: M* a+ w{
& n1 i( e- [& h: P& l2 J& ]# P // 外设使能配置
" n- R0 E$ L" C PSCInit();
: ]7 @; h/ V4 U! ?. g . M2 I2 U0 z$ z/ K! Z
// GPIO 管脚复用配置# J9 w5 s6 J, E- a5 H9 v
GPIOBankPinMuxSet();
0 b% Q& I. y2 z' m% O/ G9 V9 B% u5 Q3 T% G5 @( v3 e' Q! y0 l7 D
// ARM 中断初始化
3 s" {) T/ o- C InterruptInit();
6 w: B. |8 ]9 P9 i( ~6 X
. I$ q l. h: f4 f+ W3 T# x // UART 初始化5 k7 `3 f5 i" H; @- ^" q6 b ?+ D
UARTInit();
q! q7 J5 Q3 y- y& {* W
* D0 q+ _: l- b4 P // UART 中断初始化
% q; a; ^0 B# R, q8 [2 b0 s; l UARTInterruptInit();
. m) M6 G4 j3 S1 G; I. n
! _0 ?: T! Y8 p8 o0 j& L. A // 主循环& G/ K% Q$ z" w* o" [5 G
for(;;)! S8 ]$ k. i, J( X
{6 B6 d& L, O$ { r
9 l" U) ~3 H |' @ l
}
5 r8 E$ D2 R4 b% T}5 [. `5 n5 K1 G6 e
3 J+ X- \0 w9 `
/****************************************************************************/
2 G! z& P, v3 j/* */' V( _& l0 @& ]+ T! H; x! B
/* PSC 初始化 */ X; f* i$ @" M4 ^. U
/* */; C+ E$ J( k+ U) N" `# w) v
/****************************************************************************/: t( `( U) G8 c; q% ]9 j. v/ p
void PSCInit(void)$ G* Z( X9 \% |) ^5 P* l; h7 q5 m
{
+ P0 n8 `9 m& ?( A; a // 对相应外设模块的使能也可以在 BootLoader 中完成9 n9 h+ C: _4 Y7 z* X6 ]- v1 J0 t
// 使能 UART2 模块
0 e' ^. s* S7 W, _6 d( R PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
+ m/ Z. o u5 l}. O$ I+ I9 [6 O0 J' V1 g9 e- m0 W, p
3 n* l+ m, l/ a" Q- y1 C/****************************************************************************/
: _- f0 L3 A1 E" \/* */+ K9 i3 `! u7 O- @4 d8 S
/* GPIO 管脚复用配置 */) T3 L9 u- Z) [1 O, ?) G
/* */6 L7 c4 ]" _" [3 p
/****************************************************************************/
) U4 w+ X# ]+ R) t: hvoid GPIOBankPinMuxSet(void)
. D4 _" V, b) e- {) G4 `0 G{
, x! g8 o4 I0 ^4 G6 e. z5 @ // UART2 禁用流控 n# `! r5 P1 h. {5 d+ |
UARTPinMuxSetup(2, FALSE);( s( [) Q! f$ k h
}
* Z6 m0 j) f- Y. T
* X+ w7 o) r8 w1 I0 c/****************************************************************************/
- M8 s% F' F3 g e; @/* */
! E+ j2 x B4 e1 G8 a/* ARM 中断初始化 */
9 d. \2 `. a' I/ b8 W* b. D# Q: W/* */
- ~8 S& `, X q' M/****************************************************************************/* s% c! B, b8 H/ r; q
void InterruptInit(void)
# D) m% f* E5 [- S{9 ?5 X( U: b8 \; t: k2 o4 c0 q& I
// 初始化 ARM 中断控制器+ ^; u& c. G* H' r
IntAINTCInit();7 S2 f' h9 A( b- O) I- J
5 k# S$ }- ^! ?5 C
// 使能 IRQ(CPSR) Q4 I6 a7 n8 ~! E7 S* c
IntMasterIRQEnable();
2 h6 o- |) Z2 M B! F6 U2 ]6 {+ |5 T# `; [* x7 y
// 使能中断(AINTC GER) c( z; ^, I7 R/ r+ e
IntGlobalEnable();
& ~ d0 {8 K7 B) }8 P+ Q. H0 w- g6 I& c9 t0 d9 }
// 使能中断(AINTC HIER)
) ^& P5 e% T+ O5 e& ^ IntIRQEnable();! P: O- `. H( C* C
}% `) I" n+ `' [- e( {' h' k
& h- @1 D0 U- C$ O! m! x9 {9 D/ R' @6 g& w
/****************************************************************************/" \6 o5 t/ H- a# g! ]
/* */
* G4 [ B2 M' Q: Y/* UART 初始化 */
" R( F3 ]! X8 g6 u/* */
* A* ~4 j- j$ S, L/****************************************************************************/
$ _6 N {$ q8 gvoid UARTInit(void)
6 I/ H6 O. W; r/ Q/ _& D. R# R{
2 V% S4 k8 P" G2 W+ x! @" k) q // 配置 UART2 参数2 I$ o( B1 w* s6 k
// 波特率 115200 数据位 8 停止位 1 无校验位
; K- _; r$ p& k UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,1 T" l& H; G, n5 g# o+ v
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
: t u. d5 K7 z; Q9 r# I5 o // 使能 UART2
2 S1 M- {- `0 ^$ U# b UARTEnable(SOC_UART_2_REGS);' O% i5 z: p l& W9 J5 h
6 t4 i; I3 l2 r) y4 u5 L4 v
// 使能接收 / 发送 FIFO
0 P$ ~6 u; S9 v& ? UARTFIFOEnable(SOC_UART_2_REGS);
, C! Z( c- K: ~4 U3 `; e# @* t- w l' l
// 设置 FIFO 级别
5 j: m. y9 G7 A$ t: F% A UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);* U6 ]5 }( V* j: i
}
T, v1 K6 ]' J# h: c: D. u
8 P. w: g! A! t" t/****************************************************************************/3 N( R- o: `- R3 d1 u
/* */
4 b! [7 j8 |6 A, p+ {- B. s/* UART 中断初始化 */; X( J: H) |& e: x: Y
/* */' B5 f! y% S' r7 k
/****************************************************************************/
r. D7 R( |% P, |0 U' e( Q- xvoid UARTInterruptInit(void)
2 y# Z! P( Z2 p{% r: Z/ N! \0 Z F O4 t
IntRegister(SYS_INT_UARTINT2, UARTIsr);: u8 L8 W i' S# @9 C7 P# _$ y
IntChannelSet(SYS_INT_UARTINT2, 2);
! z0 U _, U. }5 Y* _& k7 W IntSystemEnable(SYS_INT_UARTINT2);% s- J9 i; P9 ?! P: {) s B
6 D: k4 S% v, G
// 使能中断2 a7 B# g! P' l
unsigned int intFlags = 0;5 p: T; J' p+ b6 J
intFlags |= (UART_INT_LINE_STAT | \
1 m, C$ g% F" Q) r UART_INT_TX_EMPTY | \+ F& G* W# W1 \# U6 u
UART_INT_RXDATA_CTI);0 r0 G, b& E1 x6 ]6 d0 O
UARTIntEnable(SOC_UART_2_REGS, intFlags);# Q. d7 `+ M+ O J; j5 d( N: L
}1 k" U2 A t1 {1 |, Z" }
% U* ]( G$ x% h0 I, b5 w/****************************************************************************/: r7 z# E; ~" H* f! O
/* */6 w4 e! w7 s; e; f2 E
/* UART 中断服务函数 */
! f) q; X# L9 m8 n/* */, a9 B/ t1 f) @9 r* V6 t" f t2 B0 V
/****************************************************************************/
- X/ p2 d) Z1 I! |9 x* f2 h; `) x; Rvoid UARTIsr()
: C$ f8 O% G& b: U$ H8 B{8 m; `# ^ s; p8 m+ G, E
static unsigned int length = sizeof(txArray);
( q2 B# W) u" J: M' g8 R: R4 a static unsigned int count = 0;% q6 h! n7 }9 F3 a0 e5 s# _
unsigned char rxData = 0;1 N, a) n( X4 R% \. L
unsigned int int_id = 0;
# z0 I6 ^! ~$ H9 B5 o0 x, ]) T# T6 D/ {# @3 G
// 确定中断源3 k6 ^0 Y8 F9 p* P6 _1 y
int_id = UARTIntStatus(SOC_UART_2_REGS);8 ~" {1 U4 \( l, s( e8 D$ G
7 s5 J" y" u3 S4 T$ S# r
// 清除 UART2 系统中断, c. w( Y$ j: S9 V: H, Z
IntSystemStatusClear(SYS_INT_UARTINT2);/ Y, x7 i! N3 X% n5 L% ?
. X5 F/ x6 N4 p b1 r$ V // 发送中断
% Y8 y( G L8 y$ r2 f if(UART_INTID_TX_EMPTY == int_id)7 x$ K0 p) |7 m/ j5 v4 X6 Q, E
{# Y5 X3 f! r( x& |
if(0 < length)% S! @4 ~4 t# p" e- |8 w
{
B8 e! \( K! b/ x' t6 d' [; S // 写一个字节到 THR8 B8 B* i8 s" T9 Q- m( R1 T
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);2 J. M- V o& ?* _. a
length--;
4 t: m! ~! [) @0 G count++;
p0 F" g9 t9 d0 ? }8 W8 |# T/ i# ^1 w& T
if(0 == length)0 B: O4 x' H9 G; `- x( K* D
{
4 a& S$ p3 W- V2 [) I; ] // 禁用发送中断
, b7 h2 n) y" u/ W UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
7 b# k" R6 r; q# E. {$ p& O }
. W4 \. B% F# y: I. O }
6 j3 ~0 [" @2 D6 f5 a7 b8 t v \* f) M5 c& {, B
// 接收中断7 I6 f$ Y# B! B+ N* n( X$ ]
if(UART_INTID_RX_DATA == int_id)2 V. ]( I. B+ x3 ~
{3 P9 g! C/ u. a6 _# C/ G+ m
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);% y% H0 k& k; K
1 w% Q4 G/ r( V2 Y8 G1 Y$ H UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);/ Q* D7 o& R1 O( D4 r Q
}# m K2 h- q0 d( M- h- m2 Z
$ A$ c" h% N* L d7 ? // 接收错误
& B. X: L6 y7 c O5 i8 u7 m" x if(UART_INTID_RX_LINE_STAT == int_id)4 g$ `; L6 L7 w- O. r6 Z: D! { ?
{
, W: l( ^$ ^8 C- m5 ]! c6 S3 ?9 R while(UARTRxErrorGet(SOC_UART_2_REGS))
6 O7 C8 b- e7 f: y {
' z; u2 B1 m$ C9 z, r // 从 RBR 读一个字节# q- @7 U% d' d7 a
UARTCharGetNonBlocking(SOC_UART_2_REGS);
' h' Q2 x7 P \ }
) N; k+ [# x4 P, Z# i/ G- ]4 x" g }
2 ?: L, Z* M7 Y. j x# _# K7 E3 R4 P1 E! C4 ^7 k7 }. V
return;1 v5 N* x2 Q2 }; N8 ^
}3 }! e9 ]" ?$ H
|
|