|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
2 [- V& l# N! |+ }8 X4 d) r' p+ T4 |3 Z# D: v+ [
#include "TL138.h" // 创龙 TL138 开发板相关声明
4 ^" e7 {' C% V2 Y: n- A0 r Z- [" ]- d! b
#include "hw_types.h" // 宏命令
( \9 ^8 K- Q9 d7 S#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
: R2 \& t8 z6 }#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
% e' l6 A( p! v: i$ O) y6 J8 z5 q7 ^3 R8 V7 H) {6 _% |
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
% R/ D6 i1 e4 Z! X4 l+ i#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明$ v- t- n2 `# y( H
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
: M; q9 o$ \7 W, y3 K" {/ u& \- d#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
5 l, L/ H- S" q* l+ D
' G1 f, ?( C7 b+ {! m9 q. Y: X/****************************************************************************/ w2 y/ n* j( _ H- u
/* */! I' w% H6 Z% k. m
/* 宏定义 */
: k/ B t9 l) j c) n/* */
1 |2 `' w/ f; U/****************************************************************************/; E* R5 Z9 }1 {: q
// 时钟
; o( G9 F4 E8 Y" \5 p- p$ p/ v. u#define SYSCLK_1_FREQ (456000000)
9 E$ i5 f8 s# U F#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
* V& U a* O, R2 g! |9 S( X. V E#define UART_2_FREQ (SYSCLK_2_FREQ)
( n+ V8 H$ ^. T4 n9 [( @0 `, W2 U) R5 i1 m' |5 `
/****************************************************************************/# u2 Z6 w" [5 x q$ `
/* */# k3 I( Y7 F/ {# g* m" a% D* N
/* 全局变量 */
! P3 b3 U6 ^3 w: q! [2 f; Y% p K+ s/* */$ h# c* t/ r8 C% R- _5 F
/****************************************************************************/8 r7 s8 F) X) A+ J$ m# c4 k/ Y" J* y
char txArray[] = "Tronlong UART2 Application......\n\r";
+ _: U0 G& Q0 E( x1 e! G$ q/ j! O. J8 c
/****************************************************************************/, ]! o/ \3 ?; u
/* */7 x. A1 _) A4 [
/* 函数声明 */
/ @/ }8 `1 I+ k M8 ~/* */
& y7 l% o, E- q8 E. y6 n0 E2 [% ~/****************************************************************************/! L! g3 G! I) F4 f' u. h
// 外设使能配置# P5 C0 C0 t4 T1 n' n
void PSCInit(void);- U, e7 ^1 W1 Q: j
, V$ m& @3 ]1 P( r! v3 H# {7 r. p- |// GPIO 管脚复用配置
% a- U) g- I( m' N) kvoid GPIOBankPinMuxSet();
/ G9 E G6 P% t' o" M5 r
3 j P2 \$ r4 t& Z& N: V# q G/ `// UART 初始化
, V, @6 Z4 l ~8 n0 Mvoid UARTInit(void);7 n S8 `0 y5 Y% X8 A' u
// ARM 中断初始化
% u; Q% i- M6 H8 h `8 ^( Bvoid InterruptInit(void);0 p+ B1 E. C5 F, _1 [' ?; W
// UART 中断初始化
* l# J4 N! E1 A# r- k, Mvoid UARTInterruptInit();
0 W5 q, l" X) _8 |! Y" X U// UART 中断服务函数
: Q% e6 s( m% R, A# O) _void UARTIsr(void);
0 @7 H* n3 u$ {8 T2 ]8 D8 b0 w/ {: z. r0 z3 S
/****************************************************************************/( h% @" K$ P6 Q: {
/* */
6 L- m5 P# [7 k/ y9 `: J4 `3 d/* 主函数 */8 ?8 E3 ?1 t; H/ y) T0 V. p
/* */
& c* J$ X) y7 E% I+ M0 M! y/****************************************************************************/$ R; H+ c8 K- U- f/ E$ f3 ?6 d
int main(void)' \ e$ r# Z6 M$ H
{- o3 s. T. ~8 }' k- ^
// 外设使能配置
1 o! M9 G' p; {2 ]% U: W" i PSCInit();
( z' a' Y( z& [, N: c+ ^
) F2 I7 B6 |2 u# K# G# h // GPIO 管脚复用配置
, n7 D) |9 z& Q1 l. [+ F; h* T GPIOBankPinMuxSet();
: ]% L* I9 X. @2 H# Y
% H2 ? P6 w( L b1 x% Z6 z1 F4 Z% v // ARM 中断初始化
" b4 `' i" b# G' F% G6 t InterruptInit();, u% n$ C$ f0 q' Z- e# b+ \
8 T# f& w) \% i' V
// UART 初始化
' ~/ ?7 }( m& e# S& | UARTInit();
7 W% B- y, T" H; n$ ?7 B& H
. }+ h% _! M, @+ P' W* {7 a // UART 中断初始化
5 h0 A* z4 ^# p' Z UARTInterruptInit();! T& g: i2 ^6 Z$ y0 Q, a
$ [/ _+ R% R, `
// 主循环
. Q7 p& \" ?7 R8 Y for(;;)# J" D) Q. Y: T* r& q
{! s/ L4 o" k. H. \9 I7 [
0 @4 B3 B2 G/ z t7 s+ D
}
; D5 C& e$ d& U, w' }, _}% _: c3 U: m3 P6 ^) H
8 i) Z) \: T( d7 d: Y# z/****************************************************************************/% D5 A* J# K4 @- |) l% Z; @% f
/* */' Z. Y) o& w% r% A2 f% q( h7 v9 Y1 c
/* PSC 初始化 */
, m3 w, K5 y: A s" m/ J4 n/* */
3 e8 S2 [8 S- v- h: f% {/****************************************************************************/6 `' j8 E/ K6 R- }0 n
void PSCInit(void)
+ [4 c6 K' k1 w. l: G{+ {* U" S9 c. o( ?+ o" }
// 对相应外设模块的使能也可以在 BootLoader 中完成
+ U/ d w2 f3 v. |! {/ a // 使能 UART2 模块 k; V% \' X: d
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
1 e, P- \- m5 S$ [' }: k7 T3 J0 z}+ G! R7 {6 b% \0 r0 [- R! D
& v/ z @ L& L/****************************************************************************/
2 @& [0 D) S8 e! h' i/* */6 ? D- G& \. W8 L, s
/* GPIO 管脚复用配置 */. E7 J4 E: o3 d) J
/* *// V+ e3 q* e% t G
/****************************************************************************/8 D$ D- k1 L& A) l+ s0 p2 |
void GPIOBankPinMuxSet(void)! o" X5 R, N' p3 D; J$ _
{
, r2 t; e) f. U' N) r+ I W( n // UART2 禁用流控
( K) u) p: j# {* H1 X1 ?1 ^ UARTPinMuxSetup(2, FALSE);; G/ J* o3 L; A/ ~8 t9 t! Z
}5 k; a0 N- S* o! T
- D% h) `1 L. P. }' ~5 N
/****************************************************************************/
4 U, d9 f A7 i6 X) p/* */, c- O( m0 ^; s& h: p7 v
/* ARM 中断初始化 */* |7 y, @, y$ N) e, _
/* */3 D$ }/ D2 n, L
/****************************************************************************/
3 R5 x) e8 y, ovoid InterruptInit(void)( R( l, W) L* ~# h0 s5 B5 u& q' v% d
{! I3 T6 R* h2 a' m6 o
// 初始化 ARM 中断控制器* f$ e7 C& g! Q, y6 @' ?
IntAINTCInit();
' C% G7 }& d3 ]% g: G, Q" q' w n' q* R! D
// 使能 IRQ(CPSR)5 a2 r9 z! ~' z" ]. {+ C
IntMasterIRQEnable();
2 o: ?7 G* S0 J" @+ b* V9 g! [" i8 ?% C' A
// 使能中断(AINTC GER)
8 S7 |+ G& |. c: _ IntGlobalEnable();
* R1 v3 r0 R. l/ D, |7 e! J+ d: B: [
: J- x; p7 w ^8 H; n3 P1 n8 c // 使能中断(AINTC HIER)
4 t% b8 @7 \: K! I% |) u IntIRQEnable();4 u; `# i- P: g- }
}
2 y: a# T6 Q+ {; q
* P& K+ @$ w1 R( v, w/****************************************************************************/- P1 p1 G& {! p% u
/* */
% V( J) r# y3 ]* P7 a( `3 J/* UART 初始化 */) _% F! B0 J& S7 I9 L
/* */ u+ R+ V+ J, z I, z& N
/****************************************************************************/
" l/ X/ N5 d3 v2 J" ?void UARTInit(void), }' O a/ ?, }
{1 J4 l. Q4 V. g0 `
// 配置 UART2 参数
0 c" V8 }" d( W( n // 波特率 115200 数据位 8 停止位 1 无校验位( t6 _( E, c& h( h) y4 q
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,2 q" D3 U/ {9 u+ e- f# _* R
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
9 Z8 ~/ q, p2 `+ N1 e // 使能 UART22 P6 O. J: E- z! y0 Z6 I) P3 D
UARTEnable(SOC_UART_2_REGS);0 L) I5 T3 I) J1 H a; M
0 x3 H; r, g. K. G1 M/ }$ L5 E+ p j; w // 使能接收 / 发送 FIFO
8 H U+ |4 e8 _1 S8 I' Q' h UARTFIFOEnable(SOC_UART_2_REGS);
8 | g; T: \% S8 {# O8 u% C) @6 u G0 I' m2 o
// 设置 FIFO 级别0 E9 W7 @! C" X0 S( [% U" K
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);0 u W, b1 N: B& D' h; F# h* E
}
1 O+ E% Y, F/ g1 {+ z# e& P. N
/ p3 n0 {, y& z" l/****************************************************************************/
1 D) ?. Y) z& u# z% f4 h/* */( D" v8 @% r* T: w- R+ S
/* UART 中断初始化 */7 i0 _# [% i% e' \& ~
/* */
, F$ N% a7 | u) |8 P- ?4 b+ z/ I/****************************************************************************/
* O7 j8 d1 \0 H5 K% } M& Lvoid UARTInterruptInit(void)2 ^( V* I' g! s7 ?' \
{
. E5 ?* e$ ~4 G+ t. y IntRegister(SYS_INT_UARTINT2, UARTIsr);# H: R2 t9 J( i" d( v
IntChannelSet(SYS_INT_UARTINT2, 2);
6 b- j; L7 Y( u7 q1 f IntSystemEnable(SYS_INT_UARTINT2);8 ?$ ^- e( N" v8 I! N
1 @7 g# l% f9 w, |- _ // 使能中断) P4 v. }. c! H r. ^
unsigned int intFlags = 0;
* Q) P% [1 X, }4 P6 n intFlags |= (UART_INT_LINE_STAT | \
* V$ e1 } F4 F+ @9 R4 s: \2 l UART_INT_TX_EMPTY | \& `( a f1 J- X7 }5 j
UART_INT_RXDATA_CTI);
U: `/ o* F7 k4 f8 B' A/ P! d UARTIntEnable(SOC_UART_2_REGS, intFlags);& D+ d0 ~/ j5 a _+ l2 N9 J
}
' c% P2 z7 C$ {: A w: ~7 g* w6 O+ z% Z
/****************************************************************************/
7 T! S, n' p& ^- ~/* */
8 R; _1 h% b1 B4 ?/* UART 中断服务函数 */6 o: r5 m* o- H! T8 b
/* */+ A8 a1 @/ g0 p4 e
/****************************************************************************/1 o8 c$ u3 ? s( i H9 H
void UARTIsr(). z! e& e& m2 Y# n0 r" g, z
{) G# Q+ Z _3 r
static unsigned int length = sizeof(txArray);
8 _8 K, p" D- H% N# `7 v% `( y; W' S; I static unsigned int count = 0;" r2 w& r/ K+ u n
unsigned char rxData = 0;
/ m9 K$ Z. E9 e unsigned int int_id = 0;
7 w& J- F% {8 j( A
& L9 c' Y9 P% r1 [' Y6 o. C, Y/ r! r // 确定中断源) `. ~9 _2 _5 W) a, L: O5 x
int_id = UARTIntStatus(SOC_UART_2_REGS);
: c* l# y6 a$ u3 G n) A5 [
( O+ w/ x, S9 w7 N, n- W1 a5 c$ l // 清除 UART2 系统中断
+ s+ J0 [% U" \7 k s- c- Q6 x IntSystemStatusClear(SYS_INT_UARTINT2);
, k* B" B$ i5 ~0 l G" H; J8 h
6 _- w) [0 d# s! }- J# t$ E# b // 发送中断' i% i6 k ?( `7 O" ^6 B. ~$ t
if(UART_INTID_TX_EMPTY == int_id)
) K. M- c! @8 e {+ Y+ M# [1 B/ T& O+ J1 D
if(0 < length)$ z' O$ S( }4 M3 s, Q2 J; P
{5 }8 p2 j5 M' u" r! a
// 写一个字节到 THR* A5 ^/ Z5 v" J5 y
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);( X5 U4 J$ g+ e, F' C1 [
length--;
, e5 ]; Z+ ]* ?! @3 c, y$ |4 [ count++;& X& p* L+ h$ P( x5 H
}
, A' l& s; q" t' a if(0 == length)
; n G3 W& k) s1 P, ?) O" x {
& R% B0 n8 V0 v- |9 O# ` // 禁用发送中断
; N0 V) n; A0 A9 K UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);! v5 M/ |7 b/ W
}
3 M& {# ?% N8 @ }
0 y1 O2 r0 O( B4 [8 p
$ r! X/ K6 G- @9 N$ h/ B // 接收中断5 X% K! d5 B. i+ z+ p- g2 c
if(UART_INTID_RX_DATA == int_id)
3 d; `0 N* g2 u c6 t; z! d" V {( X9 ?; G- C. h0 L( C# p
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);" I# b0 L: L( B2 Y
0 r2 R, }3 ?) M6 c) o( J9 d2 }# u$ i UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);% ]& G; W( p" n7 M
}) g$ u* b d% j& L
) x! E: p3 ?- p: [( ]/ e
// 接收错误' g0 T/ X7 B& W7 T; A, e$ p
if(UART_INTID_RX_LINE_STAT == int_id) m0 k0 a- U$ L% }7 n- |7 R. L
{6 {8 \7 ^3 C6 |9 n0 Q0 C
while(UARTRxErrorGet(SOC_UART_2_REGS))
$ R4 o& r- K* l% q' l7 t {4 f) u' r0 e& i' L7 ?2 h
// 从 RBR 读一个字节
, ^3 {+ ?, E3 _% @' o r" R* c UARTCharGetNonBlocking(SOC_UART_2_REGS);
! o& ^4 g6 t; u8 O }+ @, y" e% l8 f$ [
}9 l- X. c% \4 d _; H
N2 A8 z: _; G% `! }1 h) i7 Q
return;+ {9 C. V" V, t5 e& y$ Y
}
+ W$ ?5 @, X0 W; r: b; m1 I; K |
|