|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
0 z0 ~+ P* B& U0 m) d9 d; {# ]" x9 W& K) p! e
#include "TL138.h" // 创龙 TL138 开发板相关声明
! m3 }3 h0 `7 d6 j4 w' I# M
0 K& A4 N1 i! k! ~7 |4 Y b9 c# m#include "hw_types.h" // 宏命令
/ H1 j8 c# \! ?5 L#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器2 g$ ~& g4 H' U3 I1 _4 R. i5 Y
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
f( X5 V+ U4 u) z( Q
5 G j+ t' E5 `! }& A, t#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明. Y+ F/ r& p* y! s
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明0 X; }. ^7 ?+ Z) I/ O$ P
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明. m. ^. ^8 p; E) ~. Q; E
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
4 S+ M o g4 F" q
6 f$ N3 A9 c5 r* M, N. ^7 d/****************************************************************************/. D+ p7 B1 b [) K8 @
/* */7 v0 F4 X/ F3 @! Q* C7 ^9 a- S
/* 宏定义 */
8 e3 z5 C: P8 T* K# F/* */, T `2 Y6 _" Q0 X
/****************************************************************************/2 X1 Y2 k7 W* w1 [5 K* ]
// 时钟3 \4 |5 [8 f# ` ^
#define SYSCLK_1_FREQ (456000000)/ p6 t# G1 O+ w* V
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)6 F* B7 A7 ]' v) a' u9 q0 u
#define UART_2_FREQ (SYSCLK_2_FREQ)
9 i5 S' A3 j) S: a
( P9 d% j# g) f$ O; e/****************************************************************************/" f8 z( j4 {+ s: |
/* */6 S4 b0 L8 J( F! D
/* 全局变量 */
9 H& v* C7 Q/ _- D! X6 c1 _/* */- ~$ T3 m o5 e4 Y1 Z9 M6 K
/****************************************************************************/# _' O& U" R+ ]% u- T
char txArray[] = "Tronlong UART2 Application......\n\r";2 X% C( X% b6 S, p# H, A2 W; A
7 J }6 P% X9 P- y: ^/****************************************************************************/6 _5 N/ q! _1 c* A3 ~- O6 q! `
/* */& P+ m/ ~* `$ g, v5 g% N; u
/* 函数声明 */# _" a; ~3 x- P
/* */# O% y5 I+ l/ s" [% [7 f
/****************************************************************************/
6 g+ v ]) l( H. N& c M; N% A// 外设使能配置$ z8 n8 y! p$ u0 c1 v+ Y- M
void PSCInit(void);
8 y# ?) Y8 V2 B; h# }$ s, J1 i: _8 r3 p4 t, x2 d
// GPIO 管脚复用配置
% p7 U/ o2 ]6 ?5 B0 w9 |void GPIOBankPinMuxSet();2 h0 D2 j- K' J* \
6 ]1 z; M$ M# L Z// UART 初始化+ @- x6 S1 r9 S; H8 [: }
void UARTInit(void);+ d# x* M' C# l' j4 }# I% c; p
// ARM 中断初始化: m" s R8 |- B% c- D
void InterruptInit(void);
; e# N( N1 a' R8 J// UART 中断初始化/ N# k2 e" `3 B& s A( E; {
void UARTInterruptInit();
2 C2 F, y3 Y; s0 O" X// UART 中断服务函数+ h& }- |( m9 _8 [# F& b/ t) G
void UARTIsr(void);
* z# T% m" Y8 W( a# K5 i4 n' f6 w2 L
+ ?$ c! e% c0 S. M/****************************************************************************/
6 v y1 O* d: `/* */+ x. f, i( g/ Q' ^" ^
/* 主函数 */+ Q/ f3 ~6 c, g
/* */
: L$ Q7 C1 o# R+ y# p0 k& @7 h/****************************************************************************/
9 W7 r1 [. ~4 h; X2 K- n- _int main(void)
. {; p2 k8 L2 k# {8 N, F{
; U. L t( m' j9 u- }5 o4 K // 外设使能配置
. m! L( o& o6 d% N; x( v PSCInit();& I# e! j5 z+ L) {" j, t6 A
0 _5 t# }( L0 b \: l0 `
// GPIO 管脚复用配置( [1 V' f) I' u- z+ @/ N
GPIOBankPinMuxSet(); c2 F4 p2 z& q( x7 _' k' c9 ?
+ M) g) Y/ Z" y' S! `
// ARM 中断初始化
9 S2 f" d9 C" \3 | InterruptInit();
: ?* ]) n/ |5 f: S% J# C6 t
4 Y! L* r- }. y // UART 初始化8 ^! I# o7 e+ H; r
UARTInit();
/ I9 [! o; _3 e8 f# B ] @. g! E7 x2 |, L1 b# W( C/ u
// UART 中断初始化0 P' k3 {( A$ y+ K4 x* B$ H
UARTInterruptInit();. }0 [* E0 P. b2 h. \; C
/ v* t6 Z: Y) i2 s. j% B
// 主循环9 q3 ]1 w/ S+ \1 f7 A* X
for(;;)
2 H2 S/ G& v) S# p {
8 B' u* S+ w8 @: }! I; V5 n' p4 f! p0 c' e9 y
}
# C" l- s$ _ R* i6 e9 Q}
' [5 b" q/ K$ x& K% K* N, G, Z; ^2 _0 J9 L/ Q
/****************************************************************************/" r- Y5 ~* B1 [9 S6 l/ Z
/* */
7 B8 @: J7 J+ s+ o) W3 p5 F O. c/* PSC 初始化 */
( ~ @. U5 B# [6 H! y/* */
1 L+ a4 V! m" s# m6 S' `$ P/****************************************************************************/% Z; s4 S4 s) O# _# ^( `$ J1 M" d, V
void PSCInit(void)
5 t; b, O/ ^+ C+ R5 s$ c9 l{) X: @8 A/ m9 ]; `9 m# m! d
// 对相应外设模块的使能也可以在 BootLoader 中完成3 E7 y9 a0 i5 w3 Z! C, H# d
// 使能 UART2 模块8 B5 e# u' ~& q3 g
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
, c8 L! a: T( Z& |) t3 G}
" [0 H+ J1 S( y6 V% Q2 | Z( I3 j9 d
/****************************************************************************/
2 j' J* x! ]3 ?8 R$ P! X; e/* */
; `5 F# V2 J* f! i/* GPIO 管脚复用配置 */& V6 C6 b g) h' c
/* */
# W, b. O9 e2 G6 l* W( U# x. C/****************************************************************************/
8 h1 E. T9 ~' U+ C# l svoid GPIOBankPinMuxSet(void)* D& y$ d3 @4 Q( K
{
) Z- M+ |4 _4 q8 I, B6 y // UART2 禁用流控
( b3 H# ^: d* q UARTPinMuxSetup(2, FALSE);7 x8 n4 @. S8 A& }& ?0 d5 a, q
}+ q' I; `/ ?8 p( P( U" K+ m5 T
8 H2 N, b; _3 n8 z
/****************************************************************************/
3 }8 }6 X2 S5 a/* */
: K2 j+ }/ U [6 m6 t9 g5 [/* ARM 中断初始化 */2 a9 y7 K/ c" V
/* *// v, m5 c# z( [' u" d
/****************************************************************************/
, @/ [0 X0 A) r! g5 Evoid InterruptInit(void)
( @5 A y" G$ x" j4 f4 F( G Z- h7 W{
$ l/ Z' y! U' i4 ]) \ // 初始化 ARM 中断控制器
7 m: U* u; M* i IntAINTCInit();& |2 _% T* l0 d7 q( ?( v( H# t9 V
S9 [* S8 B5 ~+ k1 z) H, e( y4 u // 使能 IRQ(CPSR)
% p: w& t5 N" y9 _0 Q IntMasterIRQEnable();
* l5 f, p0 {3 t6 f3 p
8 L( \- h' {3 c) y/ R+ d5 ~ // 使能中断(AINTC GER)
1 n+ ]$ P( P, ? ^) S+ @ IntGlobalEnable();/ j0 ^) J& ~7 w0 d$ ~* ~4 ^! b! p
. n P. ?# Q, _$ @3 `- {& S+ x$ o0 G
// 使能中断(AINTC HIER)
! v# H! V8 i \' W' x1 s4 X IntIRQEnable();0 k" _ i+ o$ n) ~
}' {8 @; J2 H- ?3 g0 _! A
. J' `0 P5 Z7 f& I5 a5 w8 L/****************************************************************************/
, g8 t# v: _2 c/* */( u. @/ B3 @) \ U c
/* UART 初始化 */
' l0 v4 l2 }4 a* ]6 ]& j/* */+ r4 z7 f9 v- U- { q
/****************************************************************************/
/ w. z* m( H# q% B3 ivoid UARTInit(void)1 }# {" s- ^; ]* Z4 ]1 V& S
{
2 @8 f1 R8 U: u2 Q2 O // 配置 UART2 参数6 L! n% r4 P6 y* d
// 波特率 115200 数据位 8 停止位 1 无校验位/ P' V2 ?. M- d! e- F0 m7 N5 o
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,+ {' H% v$ W0 V
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);5 s% O: X4 R2 I
// 使能 UART2
! G- j6 L: }9 C! c" h UARTEnable(SOC_UART_2_REGS);
) O- o X9 u: p& x; }
: D) g" J7 J6 J& ?% E+ x // 使能接收 / 发送 FIFO! N, P2 j( w# M8 Q
UARTFIFOEnable(SOC_UART_2_REGS);7 H9 A/ ?% g( n$ [4 W
1 y$ {! x5 [# a6 |" Z
// 设置 FIFO 级别
3 y* [! k a. W6 N! P" Y2 l% P UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);6 b d0 u8 d: f4 W$ `8 R4 P! X
}. s R* A, x, f8 X& ]
5 s' V' y8 f2 ]: I( i6 v5 |
/****************************************************************************/( L a7 N; C4 E
/* */$ S6 j: h& |$ i& T' c
/* UART 中断初始化 */
# s5 {- D0 B0 B2 J1 A) R3 {6 L4 ?8 _/* */
; z) v' e6 Y5 y/****************************************************************************/+ W4 q5 d4 v* O1 @5 d
void UARTInterruptInit(void)% o+ `* Z4 e/ S: u* x
{; i8 p# H7 T& A7 T$ R2 j
IntRegister(SYS_INT_UARTINT2, UARTIsr);6 u- l4 o( G$ m' f1 t) F
IntChannelSet(SYS_INT_UARTINT2, 2);& F6 j# R; {( ^) p3 n' y8 ?5 @
IntSystemEnable(SYS_INT_UARTINT2);* U( U3 P: R# R
. n; u9 Q, r' L- Z6 F! I4 C8 c
// 使能中断" `: }3 L5 i7 i g
unsigned int intFlags = 0;
; L& ^; f- B e: j intFlags |= (UART_INT_LINE_STAT | \
: x4 M8 F( v6 S6 R+ e9 m UART_INT_TX_EMPTY | \7 \0 k5 i% {: J; P8 l# ?6 g
UART_INT_RXDATA_CTI);
9 J f# _. z2 Z' n" K' k# q3 G* G UARTIntEnable(SOC_UART_2_REGS, intFlags);
/ `5 @4 |- J, V2 v) L2 M; O' t}
6 W. D- W! r# g1 T' W* A
1 \! o5 @' }4 K4 v/****************************************************************************/2 _; i. a1 u. {2 Z; P2 U7 i7 T& a/ S# y
/* */, c* g( C O) ^/ D0 M$ _( D1 H
/* UART 中断服务函数 */' u+ L: @5 }- n: s# Y0 |. y
/* */
2 v( L7 @- G: V+ D, L! O& ^/****************************************************************************/# a- J3 D! X" X8 C. c+ e2 a6 |
void UARTIsr()
P h! V4 O6 m, {2 y{5 D& o$ S. u( ]9 A! D0 \% o) R
static unsigned int length = sizeof(txArray);; n" E# w% [( y9 Q: u
static unsigned int count = 0;' n4 x' p( N- I2 q/ _: L9 Y T
unsigned char rxData = 0;
& k8 L+ j5 h/ C2 B7 y unsigned int int_id = 0;
* R9 U8 `& L4 ?3 R, `& j3 B! u8 m8 I
// 确定中断源; L+ o- A% E. E9 f8 r( `9 Z
int_id = UARTIntStatus(SOC_UART_2_REGS);
' {" A7 h4 {8 C3 e) C7 q& X+ I2 F3 z1 B, I- w& r* S* M/ A& {# ^$ L3 M5 A
// 清除 UART2 系统中断- W7 v8 h4 E; {+ Q! z/ f5 ~
IntSystemStatusClear(SYS_INT_UARTINT2);/ Y4 Y: g4 y7 R6 k/ d8 E' `( `/ A
/ L7 r8 Q: @ N# p7 i
// 发送中断- Y5 N+ A8 Z6 J1 c E
if(UART_INTID_TX_EMPTY == int_id)4 `" l% M8 Q7 T4 C. S
{
9 Y5 I0 Y0 T) |$ q- ` if(0 < length)
@" s3 u5 L# t, C+ e' V {
: d+ A& |& } @ // 写一个字节到 THR& l, d7 }1 D; T: Y V% @
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
9 Y5 n# z. [: N, } length--;1 k* K P) D" L6 I* f
count++;
& T# Y9 j- F6 N0 D3 E } F" Q: T" t; J/ z- ~/ q
if(0 == length)6 ^7 }6 W3 _* z4 p& D) A
{" t) ?9 s* y9 `" ^
// 禁用发送中断
6 ?& y, ?2 G3 ?: U0 z UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);/ n0 k+ Y9 W2 M6 c
}4 {7 C2 u- \, ]( x, ^& [. s
}1 M4 ~) v9 |, ?* F( y3 H3 z2 M
: D0 v: {6 p! a+ _2 I0 G
// 接收中断
8 m& p% v/ _! f4 o! w if(UART_INTID_RX_DATA == int_id)
- ]( d z1 I% x2 X( R {
9 X2 x2 _( q- C$ |7 Z rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
7 Q6 ?# J) c: @( D) [, A
5 b2 b* z. N4 [5 p/ I( [$ P$ u UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);$ C+ r6 d/ Y; t1 o) G* |
}! f; ?4 x5 M! ~; p/ I6 G( Z$ W' g
' z( i8 D1 i/ b6 g3 P0 X // 接收错误
( ~1 ]/ |+ w3 c1 v) l6 g1 s6 B if(UART_INTID_RX_LINE_STAT == int_id)
: ~/ k& v$ [0 F) e' l. k* G/ P" X {/ n. Y( n8 a# ?+ k' I- }6 h
while(UARTRxErrorGet(SOC_UART_2_REGS))5 b3 ~# X* }- v* P
{
4 ^5 l l* I% ~1 S7 C // 从 RBR 读一个字节
6 [6 m+ k! q" |* \& b UARTCharGetNonBlocking(SOC_UART_2_REGS);
; I" ]) y# q0 C: G: g& y }0 u( [0 k0 R/ d) ~" n
}( o) m( `5 N5 i9 v0 P
' G f# G( O6 F& r return;" R9 E" t& L6 d! m
}3 {* K, r( U$ X) U
|
|