|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
+ ^& x3 @) K- c8 ?- i7 @" ]4 }* e" A' A$ I) S c& ~
#include "TL138.h" // 创龙 TL138 开发板相关声明$ g4 ~) a+ d7 h/ L a3 j7 }
. P% I' ^5 A1 B$ c
#include "hw_types.h" // 宏命令) `: H& }, |2 @/ \/ [
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
4 s* C# i- G3 s+ p" `#include "soc_OMAPL138.h" // OMAPL138 外设寄存器- P* t% b# I M! Q
0 V! Y" c- @3 Y* s6 ~; ?* u
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
6 z3 ^) ]. }6 J& \6 h! Y$ `5 Z#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
0 b% }6 R: |% u7 d" G/ F#include "uart.h" // 通用异步串口宏及设备抽象层函数声明0 u5 C, Z7 S C8 i# l9 r( u
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义8 y+ R/ y; i2 ? ^4 W; o
6 \5 G9 M6 W2 [4 a; K3 W4 P
/****************************************************************************/
1 w! h$ ]5 Q' G) n7 y' Y/* */5 P+ o2 f7 i2 Q+ Z9 j4 C& w
/* 宏定义 */" x5 C: v1 H8 l# i- ^
/* */
! {2 x+ z$ X) e% X2 X/****************************************************************************/
2 q3 x8 k0 \. J; X; g// 时钟
& ~+ {* {: i( ]/ I. v( K8 b#define SYSCLK_1_FREQ (456000000). S- v8 d& D0 a" R: N& y
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
' z5 H3 g4 G/ M N+ O5 e- z#define UART_2_FREQ (SYSCLK_2_FREQ)) j3 b, y: Q7 M3 _5 ~$ R
! O$ d# c8 @- h. Q
/****************************************************************************/
& F W* Q1 o' j0 m$ e# z @& r3 O% @- ?/* */
J6 C+ O! z( P! ?7 ]! c/* 全局变量 */
, N; \+ p/ w2 z/ G3 x5 v4 q/* */
w& F6 K% ?' s. L/ r J4 m/****************************************************************************/+ L7 S7 K8 h8 [$ O: Q( k; C
char txArray[] = "Tronlong UART2 Application......\n\r";
7 H0 a/ i' {1 p) D, Q# M8 C6 t: I
, M( K( P: I, g/****************************************************************************/
7 z# H! E1 J! W7 s" b! M9 u8 O K/* */
8 N; o L9 k& i/* 函数声明 */
3 e7 k8 N9 K% l" s3 a4 b4 v( u6 E/* */
5 g1 T0 {: j# k$ p/****************************************************************************/
; [, B3 f; N3 J' s' s// 外设使能配置
- G7 q5 U5 ^5 J/ i) S+ Z' ~void PSCInit(void);7 z$ Z" _0 j& S- S" V
! Y! {$ B) B' e& \) A* @// GPIO 管脚复用配置
- Z4 [4 [; [$ G Q' Y& C/ ~void GPIOBankPinMuxSet();
! M; t) A2 p4 F; C3 G+ h
# r, E7 o" S# l. A/ @: }: ~0 T// UART 初始化& s! o/ Q! D0 }7 c& b5 ^. W
void UARTInit(void);
( o, Q0 d# {. @' t# B, I// ARM 中断初始化2 z3 d4 g# _3 L4 _( z
void InterruptInit(void);/ |8 u) ]; j9 l# I' E6 X5 _
// UART 中断初始化
: h5 l& X2 Q0 W: `2 f0 I, Avoid UARTInterruptInit();" c6 _7 G" O U# C c
// UART 中断服务函数: [/ v: U4 e# @& f6 w1 G% z
void UARTIsr(void);, x/ v; ]) y5 X& ~2 x
4 V6 d- {* s3 v j8 M/****************************************************************************/
* q' r- y' z% H/* */- W2 M* m/ q# p) e, N$ Q' G
/* 主函数 */% p) A* G: o; o% g" y6 j4 K, \
/* */
n7 r$ E& r$ {! P* @& f- N1 h/****************************************************************************/6 j, s/ |5 N- `" _$ O7 n$ q
int main(void)% T* c! C, Y8 L7 @( X7 S
{
& @. I/ t6 [2 ?' Y" y- S$ [ // 外设使能配置- G5 k' ]1 \5 |* K7 L
PSCInit();' h0 O5 \5 h) j- g. ^0 s1 e/ ~6 N
( y& D: ?& I5 R# I. H7 B8 K // GPIO 管脚复用配置
, r5 g, O' x: q GPIOBankPinMuxSet();
, B- P W% [3 z3 f3 ?+ \% q8 r. ~ p, a$ _
// ARM 中断初始化3 ]5 ]' Y1 E' F d' y4 ~3 `
InterruptInit();
/ |0 z' v! @! o* p' A7 m
7 `; r6 }3 ^( m7 b. b- r% T- O // UART 初始化
7 n& `: J9 s \ UARTInit();, Q( {- ]! M) U7 @# i7 _/ b0 Z
T8 W6 \' {# k // UART 中断初始化
, T \. i) M+ F6 i5 S6 ?$ y UARTInterruptInit();5 {8 x( \, C8 S$ I7 L: C8 [
2 r) n7 C p- C
// 主循环- @. l' V5 v2 e( {6 q
for(;;)
7 V1 U* U! U9 K( r3 m: i1 A- o. [* h {
( a) }8 B$ ]* [ e Q# p8 y3 R- m9 h* t' ^+ T2 |; K; u
}% z- x0 E4 n7 E3 r
}
) h$ u% c D. M2 q9 N( w7 i/ s! K8 H, X& q6 N6 e
/****************************************************************************/* @: f5 p) v# Z8 V
/* */9 O+ z% k1 T. l+ l/ c& n
/* PSC 初始化 */
6 e( P y( q' s6 d) q- S6 P& k8 m8 ^, S/* */
6 h' X+ h1 {* b7 ?" |4 d. A/****************************************************************************/$ k2 A$ |- y( L* i4 J# w6 a( I
void PSCInit(void)7 N3 v$ k G8 M# r5 c
{$ E: U& K4 a. Z y, V
// 对相应外设模块的使能也可以在 BootLoader 中完成/ [( O3 }) D' n3 ~/ [- X, \7 C4 U
// 使能 UART2 模块" [$ i* T f( J @- Y: E
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
, Y; a4 b# E- Z- t% ?}1 t# a; T% z }2 q9 p+ I
. x8 J3 g: w% Z, q' S/****************************************************************************/
, V* ^) s* K, ?2 K: x" q) N& \/* */
, y% F8 r7 ?8 ]/* GPIO 管脚复用配置 */. k2 u; Y) E# M: C: [
/* */
3 b9 \$ ~, h$ X8 v/****************************************************************************/
6 t; M6 U" D/ a' }void GPIOBankPinMuxSet(void)
- v5 a: G: y% s, u0 \; m{2 p5 x. w0 _* r( ^
// UART2 禁用流控- _) o2 t' }5 i
UARTPinMuxSetup(2, FALSE);% c* ^& B' Y" W, w, w6 [; @
} Y9 V. y ~: z! N! H
# Q) C. T) w+ {, Z/****************************************************************************/3 `0 C$ J7 n2 V' A) ], g6 q9 K* s
/* */
. [4 A+ y* _& b3 D1 u5 [, a/* ARM 中断初始化 */
! v, y5 R2 P9 t, r5 |) L7 a. d; R/* */4 z+ u7 a7 @! ?) k; z0 ]
/****************************************************************************/4 l5 c1 H% H2 b4 }4 J
void InterruptInit(void)
4 I) a1 Y0 U; x8 e2 H/ ?+ x1 l{3 Y9 |% r( e7 V) x0 d8 s
// 初始化 ARM 中断控制器/ L Y5 @0 A) O3 _8 {9 m
IntAINTCInit();
4 O+ ~+ _5 B8 W2 w: M* x; `* [$ e2 M4 e6 A* Y7 _
// 使能 IRQ(CPSR)0 `( `8 J# H2 g0 c
IntMasterIRQEnable();
- a h+ D- t* H5 } y1 w) F& s
4 W9 ~8 D. d* m4 v! |$ W // 使能中断(AINTC GER)
: n" V: L5 @& ~" K$ r IntGlobalEnable();
2 s$ k0 N6 z' a1 m4 K6 e1 C' C+ {5 _
// 使能中断(AINTC HIER). d& t6 ~/ w6 h! j2 l
IntIRQEnable();
: ?0 |& v F3 ^" |}
# V" |3 s' u: ]3 o5 r1 X) E( U4 A# M+ v: |) l8 j# l: U3 t" l
/****************************************************************************/
3 t- T0 Z$ W1 t0 b6 X3 |) K/* */
2 s& }0 P. u0 Q/* UART 初始化 */2 B) t$ v4 d9 v9 V/ V) P
/* *// ~$ c! i4 a) _7 P) a4 p9 X
/****************************************************************************/ s. q. l, J$ A% c/ B
void UARTInit(void)
2 y; ?! W. k' }( g{8 ?0 I1 u# \. {" M% _5 A7 U j, l9 B1 O
// 配置 UART2 参数4 u# w! Q8 O2 \( e
// 波特率 115200 数据位 8 停止位 1 无校验位. n* A& P @& Q' S, ?) I& D' R
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
0 G& d" X- y, U- _% w/ Z UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);% c, P- |0 \$ \% r1 _5 H
// 使能 UART2+ N/ D. L+ J9 L' f6 T! ?( Q
UARTEnable(SOC_UART_2_REGS);
3 @9 m& R9 t+ g; `3 s7 }, s4 t; W* i& a2 K% ]0 V! t6 G
// 使能接收 / 发送 FIFO7 v( h, z r6 e! s+ R4 E
UARTFIFOEnable(SOC_UART_2_REGS);/ ?) ]0 Y, Z! i2 K6 H* q
+ H+ \, J. X* ~
// 设置 FIFO 级别' l( `% G1 z W7 j0 D, i
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
, Q4 v1 s. E8 }) M7 p1 w& D7 ~}+ w1 F5 X7 W: N; d
( y( l! X+ H: x3 k; B: d( C8 S
/****************************************************************************/
# ^4 ~- B- b! z2 l* y/* */7 j' |8 o& A# _1 A9 D8 K
/* UART 中断初始化 */
3 A E+ @8 S; }0 @9 u/* */
. C2 N) L% i8 g. y! \: A, X5 n8 S/****************************************************************************/
3 \1 R4 S& d& Q' o* Tvoid UARTInterruptInit(void)' r- J2 x2 d& U/ s. D G* n
{- o& u; T# p% v
IntRegister(SYS_INT_UARTINT2, UARTIsr);; i- k. L( {* G, L% r# b
IntChannelSet(SYS_INT_UARTINT2, 2);
! }4 ~4 a1 K9 B) K3 m IntSystemEnable(SYS_INT_UARTINT2);! x3 l% b. f4 l; H3 s8 }- w- ~
0 t0 |& v; }1 ^7 V& A
// 使能中断# A9 Q6 u: H9 h
unsigned int intFlags = 0;
* t2 g4 P; {& l+ m4 e intFlags |= (UART_INT_LINE_STAT | \2 W( x! v$ f a$ T
UART_INT_TX_EMPTY | \
% _- u: t. r& z5 y UART_INT_RXDATA_CTI);
# O$ b1 v$ o$ P0 |- H# }( L0 } UARTIntEnable(SOC_UART_2_REGS, intFlags); p6 _, }% X. w( D9 z4 m/ P
}
' k! C1 W; A) x1 v4 ?% a5 K; z8 a! D# v! O
/****************************************************************************/
/ N3 x* k4 _: ?/* */9 e0 l& A/ N* q0 V$ M3 M( K, P* q
/* UART 中断服务函数 */
% Y D( v* X6 r8 D- x/* */$ Z/ w. |0 `4 k" p! X
/****************************************************************************/
# a5 \" I# Q' r. f* t+ L$ Jvoid UARTIsr()
- C0 a( \" v1 L{
! p- W# ?/ G2 t# j j static unsigned int length = sizeof(txArray);
% C' L) f/ r! l& u' @ static unsigned int count = 0;5 R! N7 t% ?# j) d" z( x
unsigned char rxData = 0;+ n9 @# r2 K5 g7 o) ]4 X
unsigned int int_id = 0;
' S; B$ A) Q" R u% a5 s) t
$ I! W. J: y2 @2 X( t# f1 p7 T$ a // 确定中断源
; x1 a& g& d: W( H int_id = UARTIntStatus(SOC_UART_2_REGS);
. K% f: r, B1 u* x$ r X) Q2 Q/ X0 u& m) i7 v2 M3 m h3 x7 J- s: m+ x) V
// 清除 UART2 系统中断
+ O; l2 K5 I0 i7 ]+ W7 g% @ IntSystemStatusClear(SYS_INT_UARTINT2);
/ z4 F. |/ a$ e3 w7 I8 d1 @# i7 W4 [) L r2 r8 @3 Y
// 发送中断* t: M3 `' m4 z* @7 {: Y* Z" C6 {6 I
if(UART_INTID_TX_EMPTY == int_id)# F0 U. o4 w, V+ \* U$ h; Y) s; f
{4 u% X7 q H3 J f/ E1 i
if(0 < length)/ B- O6 t1 i6 ]3 r' N% |! O
{% l8 U2 c4 i- q: A
// 写一个字节到 THR8 k: f% c- m9 E% ]
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
3 J7 W+ H/ i) W' l: ] length--;
# h- |. ?2 S0 U9 ]0 ?; N$ u$ j8 A6 ^ count++;3 }$ O$ u1 T' A* @0 ]
}) Q5 |) g9 N! M! _
if(0 == length)
1 K; l7 f/ L- m% m( s! L( m* { {
* g( _1 G# w6 t; M- Q1 p5 s4 _6 ~) [ // 禁用发送中断
: d2 b9 V0 O' k8 K UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
' P' x. o8 |4 E" ` p: e) L }" a9 Y3 L/ q" y9 a+ @5 G
}: l2 a6 a* ~2 B2 h6 Y! e. p
7 Z% \- }/ y& s8 f9 f
// 接收中断! ?' C. S' x4 T2 L/ q
if(UART_INTID_RX_DATA == int_id) I3 x$ i) Q2 ^. O. i/ W
{
7 m# i% a* d% ]: A+ U5 Z1 f O) B rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
: G$ V0 C) V7 V' N" g. T+ y
+ @9 M6 `6 z) @5 v' Y; W# t UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
7 b& |1 `( d ] }+ ^# M. M) \. f* g" t
9 Q( Q2 q; A$ d% \5 t // 接收错误4 p9 h& k& a/ @, a' J0 x3 t( j
if(UART_INTID_RX_LINE_STAT == int_id)
6 j: ^ V: D! i% G# D {5 V; S& W) Q; o9 d
while(UARTRxErrorGet(SOC_UART_2_REGS))
7 J6 X# C/ W! s# p {
' x, T9 ^# X" C* G- ]3 N! @3 y7 t // 从 RBR 读一个字节2 U9 ?5 \$ v* M8 x, `; j/ G$ u4 N* `
UARTCharGetNonBlocking(SOC_UART_2_REGS);
: o- z) P( z! x0 I3 q }7 |) J1 W$ o: d1 v# }
}
" z$ ^8 [% [! H1 P/ e. U0 i
; s8 g4 u+ k. y# C. m% l return;; H* I! n8 ~* r
}
+ _, y8 S( p5 q7 t7 k+ } |
|