|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。( ~* b. s' C% }5 d
! U) [/ s9 o" w& {1 M3 D#include "TL138.h" // 创龙 TL138 开发板相关声明% Z3 I; x+ j0 r0 J0 r; @
( t# ~. b6 ]' K) G' \
#include "hw_types.h" // 宏命令
! C% S" ~0 | R#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器4 I0 u) Q3 c6 q8 V, @
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器0 S" r. N% g9 y' c& G
8 F8 E' G9 `; F/ g
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明0 c s; I" d4 A9 a
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明7 ~0 q( k% H C9 m1 c" H G
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明, S, Z9 V8 {6 j! e$ H; j. R
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义) o/ ?& g& j) Y, i0 m5 `- E
6 f7 e7 N7 Q2 M" ~6 j
/****************************************************************************/3 |# _8 m$ o3 m1 V e
/* */
R! v+ Z! e9 u* E# |, w3 T0 S) G/* 宏定义 */# C4 h4 w& A( z
/* */
8 ~+ N# u6 z$ o; u' C/****************************************************************************/6 P0 `& x, m3 }% k
// 时钟
' _; d$ h8 S3 Q#define SYSCLK_1_FREQ (456000000)4 Y$ j. d: }6 E8 _; u/ e
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)- {+ O& j; h$ U0 K: _/ g
#define UART_2_FREQ (SYSCLK_2_FREQ)3 v X4 M' v: r- k5 g
/ f! [$ s7 J: B4 L- Q$ E3 G/****************************************************************************/7 M) I% K! `, m* a
/* */
/ ?1 M2 M; V* q0 \7 `' z y* [/* 全局变量 */& D! n7 W/ F9 _8 k
/* */
7 A1 U8 F8 T$ u$ K+ R/****************************************************************************/6 O( t$ q+ ]; I
char txArray[] = "Tronlong UART2 Application......\n\r";
) s8 z M6 r U2 Y- D$ i' p2 t8 \( v8 j
/****************************************************************************/$ b) d) }: _! R9 e* ~
/* */: ]$ o1 N4 S: I7 e
/* 函数声明 */
5 H1 ?: q/ i+ C" W/* */8 ^" A+ Q+ y0 k# K
/****************************************************************************/1 W+ `0 I* }1 p: N( s6 d* ^
// 外设使能配置
- S4 x4 _2 o4 ]/ k2 b3 @. n; B# Bvoid PSCInit(void);
/ @* } l! X0 { r5 R% {. X; S& k) ?5 V% u V8 f
// GPIO 管脚复用配置4 A1 T ? e$ Z6 c& y9 B6 Y$ o6 z
void GPIOBankPinMuxSet();
|: e+ F4 w2 x* k* j2 s1 u, ?# l3 g/ C* k/ a+ v1 m# L
// UART 初始化, a. d9 ~" T+ |8 d' E" Y( @( |
void UARTInit(void);! s9 \) I/ ~1 N: D2 j
// ARM 中断初始化
7 e+ K2 a; N7 i5 S8 @/ Xvoid InterruptInit(void);( S/ G. g. A" s9 R+ I
// UART 中断初始化 I1 p3 }0 c6 z! @. ?( r B
void UARTInterruptInit();* I: n% s% }+ d- `
// UART 中断服务函数& m' S7 U( K5 M
void UARTIsr(void);
B& K) Q# q2 A% ~) _) Z, Q6 `# W# ?6 H3 W6 x
/****************************************************************************/
; r2 d6 M4 b5 g Q& f- ]# s/* */
: L( U; c' ?3 d0 Y/ G5 n$ p8 T/* 主函数 */
7 j n" V5 k+ H& }6 H/* */+ |* Y9 C" r/ h' C3 H9 f; s( w. j
/****************************************************************************/
o2 @6 _9 m- B+ x: R2 s* n- eint main(void)0 H/ [" K% X- | Q) S$ U
{
# P: }: s k+ ~' x ]: o! N // 外设使能配置% y" v) _' o+ T$ ^
PSCInit();! O8 B& b' f3 f+ e
4 B: |& H5 m: O6 M' n& J
// GPIO 管脚复用配置+ i; r. ?! M8 h9 O& k% p4 z B
GPIOBankPinMuxSet();
% o; ~0 u7 d. j0 a! j H# u
( p' p' j& z5 F' I6 e) V // ARM 中断初始化
) z7 z+ R# E! q( C" Q: r* F InterruptInit();
4 B4 j, V6 q$ O1 w3 L o3 h8 u8 e9 I% e# C: f: U
// UART 初始化
! k0 W8 H' r4 a" _/ s UARTInit();
# H f- a3 r3 J( F# |+ Q
* \; e) y1 H$ S& f: p // UART 中断初始化* |! _2 _& j6 b# m
UARTInterruptInit();4 Z& N0 L t5 x4 H+ h" {, A
4 F3 |' A7 { M9 E h // 主循环( w+ J, c1 ^' F) V. N) @
for(;;)
; Y- X" c- h6 S1 j/ }5 _. }( ^. a" I, @ {
# E! i" }% q E& L3 j- w! C
9 q/ @, r7 |2 D1 J/ [ V0 y( E }
( a+ n `- Y1 b% G* k, `/ x+ D; b}: Y9 V" b/ Z( ?1 ?: O) K
1 j7 b% Q& O" d' \. t9 h5 x/****************************************************************************/
* o& k$ f6 N$ D! M/* */
' k5 M( G/ a' M2 ^2 m/* PSC 初始化 */
0 s8 ]: w# M0 R, N' X( T r) a/* */
9 k% w5 X# i4 i2 k/****************************************************************************/, ^+ d6 S, u8 H" K* N4 G
void PSCInit(void)6 n3 A; e' [/ _
{" ~$ @5 m; s1 |$ n$ @0 K: K
// 对相应外设模块的使能也可以在 BootLoader 中完成
6 b6 I6 |$ U, y6 o( ?6 t // 使能 UART2 模块
2 c2 x% [+ H2 F8 z3 P4 G PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);# y/ `2 k j! y2 O
}
; J! F- c+ p$ V7 r4 Z% p9 K% j1 D- ~. B. K9 Z
/****************************************************************************/
- F: l- b2 ]8 h9 p# r/* */ W# l4 ^" S7 |$ @2 A% G8 n( G' T
/* GPIO 管脚复用配置 */
. ~" U1 f! u& N& Z( o/* */5 N$ o$ e7 y1 M7 y
/****************************************************************************/; E5 {' i% U. f+ v) [* _
void GPIOBankPinMuxSet(void). z4 u2 p* d1 Z" ^# D
{( M+ {; `, T% {" `3 Y4 n
// UART2 禁用流控: o8 h; Y- Y& A! H+ m
UARTPinMuxSetup(2, FALSE);- L. I( l2 Y# a$ f
}2 V# [& N' i( E& k
* `: m+ Z# U8 ?$ `, G8 d
/****************************************************************************/
+ F% h1 ?0 ]( ?6 Z( S/* */8 T2 D# z' I a' n" b7 b2 w4 D+ }
/* ARM 中断初始化 */8 v) H% W5 b: X% q
/* */: H. n4 [: v3 r% g
/****************************************************************************/9 W/ T) G( I! J
void InterruptInit(void)
. B! r$ E# M3 m6 t{
9 R% c( m* [4 \5 O8 C6 l" ] // 初始化 ARM 中断控制器' J: C' g$ }# n, A/ o
IntAINTCInit();
8 a$ s0 v+ }! n) k9 c) B* w) L; ?, \
// 使能 IRQ(CPSR)
2 s$ J/ h4 H* z- h" w U# Z3 S IntMasterIRQEnable();, y. p4 d- B4 e$ N# L9 o
/ Z) z8 B/ K( i5 q- |
// 使能中断(AINTC GER)3 r# ~* X" L" B( w
IntGlobalEnable();
3 ]- ^' b6 P" [/ u# G# S3 O
( ~; I0 V2 U: `) M // 使能中断(AINTC HIER)/ ~6 L/ P" p4 [; k
IntIRQEnable();7 q7 q4 R! k- R; U8 j* B
}/ a. z7 e# n0 z# V) R* I
# \0 d# b- h* ~4 B/****************************************************************************/
$ g* Q( s! w2 S/ w0 x/* */
! C- r# X( \8 V/* UART 初始化 */1 J, k( q) @# Z/ W
/* */! a# P: |2 @* D+ {. ~7 R- K
/****************************************************************************/
8 s8 y: i" a4 t: ^, ~void UARTInit(void)
% g3 {, {0 @4 p! l7 C7 W6 a! g{
1 Q# f5 t; s) l. ?+ M$ l // 配置 UART2 参数$ m9 u" G/ r, i4 L
// 波特率 115200 数据位 8 停止位 1 无校验位) O2 u' c) [1 K) E2 D
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,8 _& z* F( u# N" U y% G
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);& B1 P( b" I J0 R
// 使能 UART2# H! c3 t4 C! ~3 n
UARTEnable(SOC_UART_2_REGS);
* r' m: u) C; x& T
/ ~, K: L" q! c! u // 使能接收 / 发送 FIFO
8 D# s# P7 Q' i UARTFIFOEnable(SOC_UART_2_REGS);
% k1 r; R1 ?, k9 K% |8 N6 M- h/ o4 L& `3 Q0 I% L' V: J
// 设置 FIFO 级别
" h1 C" t4 k# }% H4 K9 X UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
' | ]3 W& X0 f3 j}* X/ W7 ]% C/ f& C
2 }5 C$ ?9 K( O
/****************************************************************************/& F0 H i* f- H$ x/ e: b
/* */
& u: V% W' \; [$ X$ X/* UART 中断初始化 *// I. G) w: T6 k. ~' T
/* */" Z4 A9 B+ u! J: z; V; P
/****************************************************************************/; N; L2 v1 q/ }. E4 d0 {
void UARTInterruptInit(void)' T/ N3 G2 X3 K& f5 n, V1 K
{
+ k* O6 @8 a3 l* I+ | IntRegister(SYS_INT_UARTINT2, UARTIsr);
- g4 W5 f1 ^" P5 b IntChannelSet(SYS_INT_UARTINT2, 2);# o0 v: H" m. G' D1 H3 C
IntSystemEnable(SYS_INT_UARTINT2);
5 t6 B9 E' z3 n9 m6 s1 N: ~8 ~3 _: [' L* z7 W
// 使能中断
) @: O% A& I0 v8 B( _' ]9 a8 d9 B unsigned int intFlags = 0;8 p. X+ n9 O- m1 k" b4 K; F
intFlags |= (UART_INT_LINE_STAT | \( N# M* D* ~: r" @9 C' h
UART_INT_TX_EMPTY | \4 {+ C0 g; P! Y$ l6 I6 @4 Q* ~! q
UART_INT_RXDATA_CTI);! |, B/ j- u2 l$ G( W; O4 A* g
UARTIntEnable(SOC_UART_2_REGS, intFlags);- Z1 S' _0 M: W6 V F% M
}
; ]! D$ O: t% Q4 F+ K8 U1 k3 ~
8 L9 _* t* T: c/****************************************************************************/! v9 h: d" N9 m: u q) V
/* */
2 O0 `6 W0 x! @" e& J: s2 o/* UART 中断服务函数 */
) L$ b. d. m/ X3 i/* */
. R, H1 j6 _3 l/****************************************************************************/
' E8 S( z) s" |* d& u$ Q7 b* }/ }8 wvoid UARTIsr()
6 A r' h4 d7 D" r, t) L{& r" E3 O6 l' u1 I% S- W0 r
static unsigned int length = sizeof(txArray);
* ~+ F$ B8 Z& A5 {# J3 p+ F& C+ O3 ] static unsigned int count = 0;: s# Y2 g: N) V( l5 b; ]+ j; S* O
unsigned char rxData = 0;+ f. L0 R, U1 b+ f2 M* K! I
unsigned int int_id = 0;7 ~/ ^9 m, w0 T2 R& N h! ]
) `. E7 P- R& q3 e- Q: u5 H+ G' q
// 确定中断源
! K/ d3 D) j/ Y2 m$ K& M int_id = UARTIntStatus(SOC_UART_2_REGS);" o6 u5 f) \ r# G; J
7 j" i0 A: e& @& h% u& b2 [
// 清除 UART2 系统中断
& H% y8 x( D2 j$ w IntSystemStatusClear(SYS_INT_UARTINT2);
9 S" @5 Z g4 c. X5 o3 m$ }
0 @6 s. A1 s5 A4 T // 发送中断- N& s: v, m3 h# L- M
if(UART_INTID_TX_EMPTY == int_id)
7 B8 O' }0 m% x% J! ]- U$ W {; x4 ?. S7 C- i* M; A2 s
if(0 < length)
% g+ x! S0 U, z {
5 Y o- l6 n1 f+ [' m // 写一个字节到 THR: R3 l! @, T: A3 s- c: `. |9 L: j
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
" r8 e9 ^4 I+ u, t5 L( w0 V* S length--;
7 q+ \8 f- W% [* P+ u count++;
2 t; p5 x2 H$ n$ M }
9 R4 H2 Y& G3 c( Y if(0 == length): l$ h+ y8 C5 ]9 R
{
2 k; @3 Y S2 W3 _" o // 禁用发送中断: Z* h* ]9 f4 O6 |5 B
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);; I3 e" k" j6 G
}8 c5 q2 _( a+ B1 v6 B
}- `* x4 n* I' a7 _5 l2 |3 S0 o
% t7 F3 E$ \, M! u# p // 接收中断. o9 Q+ T0 P- G( ~! @
if(UART_INTID_RX_DATA == int_id)+ M+ f9 z* T: [3 \4 a7 H' V
{
: P- {2 ^! f7 f/ S* E" e5 v rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);2 j) _$ o7 f0 U- U7 D- ?; m
- R3 D- j9 R% j( G4 k' {6 z UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
1 V5 W* b5 ~( o1 W6 v M }
$ z5 {! i2 U( |1 z
; o; A& {# x! J; S% l: \ // 接收错误* f d) K: c( X" g
if(UART_INTID_RX_LINE_STAT == int_id)0 E( F* i* [. I# a: D, W1 l
{, B' l( e- [6 L/ l9 _" s' E# ~, i5 ?' }# U
while(UARTRxErrorGet(SOC_UART_2_REGS)), W6 P' @. a/ `: P. w% @( j% A2 N
{
* P3 d& ~% B8 Q$ E // 从 RBR 读一个字节/ w/ _8 b3 [6 m+ X2 u7 X
UARTCharGetNonBlocking(SOC_UART_2_REGS);
# P' g6 W8 U$ p8 u( W }
5 V4 i e+ T. {5 f% s }7 k4 [) |# N% o, x/ O
! @$ ^ h! F5 T3 U$ @5 O4 q) D
return;
( j6 b5 D9 r/ X% i; s& f8 B; ^9 A2 \+ y}
4 B5 ~5 m* Y. g |
|