|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。7 J: Y) d% n$ W5 e( R
! C% l9 d/ f4 w( o
#include "TL138.h" // 创龙 TL138 开发板相关声明
) I+ w: ^+ i. E, ~/ v! v; w
; D* W* [- ?' W! w- P/ p, z#include "hw_types.h" // 宏命令/ \3 o b8 W* A! E8 B+ Z
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器6 ]5 h8 P% ]/ V9 m; s5 f
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
3 W4 |6 s7 s5 X% x& P, v+ t% O0 s. R9 t
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
3 f; A3 Z2 W: U) n. S0 H4 p#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
3 f: c, k2 U5 e& Z+ a#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
* v! b J v6 j: F& A) A. H% E% x#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
; O5 f. P# c1 s# R& J' V! h: |# x' X2 ]8 m% s2 Z2 _* H8 G7 x
/****************************************************************************/+ V/ }" A& L1 S' X
/* *// k4 v' ^; v0 B; i& s9 h
/* 宏定义 */
1 j: d F; k/ J4 b4 B/* */
" y8 I/ f" w o+ n {( N) \/****************************************************************************/
7 W( g" a. b) j( w$ {/ n! H# S k7 X// 时钟
8 b5 ]- H! K: _. Q* N#define SYSCLK_1_FREQ (456000000)6 W' @8 H) w/ T2 Z% m
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)8 ]3 |# Y; R& M0 S
#define UART_2_FREQ (SYSCLK_2_FREQ)
7 F9 B. d+ {; O/ s6 J/ W7 e. E$ N2 ?4 ^( i
/****************************************************************************/- W6 t- }7 Z% @4 e) u$ a
/* */) V# X7 a0 J* Q
/* 全局变量 */, d' n- |8 ]2 m6 v4 z; J
/* */ T" l' Y: `& a3 z3 X
/****************************************************************************/( L- a2 M" p2 X
char txArray[] = "Tronlong UART2 Application......\n\r";; I! F) O4 A4 z, g$ U
; J' _( B) t; O2 m
/****************************************************************************/
' c# [, Z+ b, N% r" V/* */
, z0 U( }/ A5 P7 h( {, M/* 函数声明 */
5 Z. ~2 ~; E) w/* */7 n% R; A; H3 }, Y& Z
/****************************************************************************/
3 J* \5 ~9 q- ^6 y! F b; P. q4 f// 外设使能配置
+ E9 k8 l* U4 f5 xvoid PSCInit(void);' U' l1 G- g8 i, O
' a5 [. N7 `. p- ?
// GPIO 管脚复用配置
' t% R8 W1 T; A" zvoid GPIOBankPinMuxSet();
8 C/ H: P2 Z z5 y8 L5 v0 R, W6 S# g9 G. N
// UART 初始化
3 T8 q, A# I0 S0 E8 i; @6 ~void UARTInit(void);. x+ g2 b, l+ J j. R, o
// ARM 中断初始化/ M; X: s) L9 h% i8 |" ]0 S
void InterruptInit(void);: I s) H9 d$ X5 `5 a! _7 v
// UART 中断初始化' Q2 v& M6 ~3 a3 h6 ]+ W
void UARTInterruptInit();
) Q; X8 |0 }" R; B, W; {% R+ Q' L) k// UART 中断服务函数1 V1 V& d! j ]- X8 B5 [0 R4 S' v* k
void UARTIsr(void);
7 O/ n6 X! ?+ \: A6 G; K
0 \8 r& o% Q3 Y7 w) `/****************************************************************************/* O7 d* K9 _' }3 p5 C0 u
/* */7 f8 w3 n7 \4 ?" Z
/* 主函数 */9 S' G; w/ I* u0 Z3 \$ T
/* */4 Q, Z8 H ]7 y1 @7 N0 g: G6 G3 Q/ Y( [
/****************************************************************************/- u; W: e6 z, A+ @
int main(void)
' R" B/ B6 a( ?! n) \" V{
/ K! R0 B1 k0 g9 n // 外设使能配置
; V$ R3 ^' W$ D! {* J PSCInit();/ Y6 {- z; X1 W. ?. |: Z |" Z, I
5 B" X" q# ]) `# D // GPIO 管脚复用配置+ e3 ]) }9 N+ z8 E/ g8 V5 E. S! R" K
GPIOBankPinMuxSet();
3 Y4 V( `* R& T4 D
; R1 F: d0 K# X4 u, d+ v7 N: Z // ARM 中断初始化
* I d7 y8 y, O4 M InterruptInit();5 G% V t5 a- Y& r# j
9 ?8 k. k7 A% l1 ]
// UART 初始化) R- w, F" R- M- ]6 b
UARTInit();$ S( f# }' L3 e- v" V7 N; U
: t2 Y; T( A% r' \; O# h
// UART 中断初始化
: f, u4 }/ ^- i; }( h UARTInterruptInit();, g& m& L; n) c. O
- J( }" ]0 J, w+ `8 o. }
// 主循环9 ~! |" `- ]1 ~) D t) J, v
for(;;)
! z) J% ^5 q" X: G" I( M9 W {
0 k8 L3 f3 Y9 e! C2 J- L: l' T2 `) m+ ?: U+ B/ p6 _( q0 \
}. Q. ~% e5 d7 H" z1 ~9 D
}
1 K7 E" r7 G2 b' y) p( T: y8 R' b+ Q4 E) x6 b4 d
/****************************************************************************/* J8 S1 Z+ Q. N6 A# s+ X
/* *// \8 N+ Q# t9 C3 w- d7 `4 k* p
/* PSC 初始化 */
0 a: z- p- l* _. W) p8 }2 s/* */
6 M: n3 @0 e: M/****************************************************************************/
3 A& g+ K, n# Lvoid PSCInit(void)
8 {: y5 E: ^5 C) g% j. ^& s# G{. W+ L) B$ t8 }3 u+ N' Y
// 对相应外设模块的使能也可以在 BootLoader 中完成
3 N( G$ B7 {$ A1 e. P+ k) X/ C0 K // 使能 UART2 模块# t3 M$ D! ^- F
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);( l2 K, b# x& @% ^6 v
}
: F) V& P! |' k) L# G2 X8 V a8 h
/****************************************************************************/
& R8 G1 @0 f( [' U G/* */! a! T" S9 |# v3 ]# ~" [! Y, P
/* GPIO 管脚复用配置 */
7 f) F# z! W4 h1 m& R. c/* */
& v- R$ ~: @ X. c7 R3 B$ Z/****************************************************************************/, b6 p+ f+ n8 n+ D& q6 {/ I
void GPIOBankPinMuxSet(void)
/ x* M' I7 @/ V9 N3 v( ~9 U{4 I/ A7 p7 b) L6 U
// UART2 禁用流控
; ?/ j/ m2 ?0 s UARTPinMuxSetup(2, FALSE);
, M2 P. U7 U# n}. t# ? B% Z" p! g: b5 S9 ~ m# o
?' _/ J/ z' ^7 Y/****************************************************************************/
7 w0 a2 Q/ E! c( o% u8 o/* */
# ^7 J: Y% P2 x9 e/* ARM 中断初始化 */
% u5 V- z# j: b0 F/ Z# ^ y/* */2 X# _/ Q' X( b2 n$ Y- N
/****************************************************************************/3 c! s9 ^# k' Q# L: J6 b5 c7 |& P
void InterruptInit(void)
/ a0 u' t' K+ ?2 z2 }: q{9 v( Z0 \& B# a1 ]* ?
// 初始化 ARM 中断控制器
/ W3 I8 V F9 F% P; J/ B% C IntAINTCInit();* A- |5 n( R3 V5 u; P
X% z0 P$ X% U9 C; m // 使能 IRQ(CPSR)% A$ }! r9 }9 [. X6 p
IntMasterIRQEnable();
/ w# z4 ~+ I1 S! S* W/ d8 w* j" _. d6 P+ F! Z! c$ D
// 使能中断(AINTC GER)* B4 l3 G3 x' n+ m' d2 h
IntGlobalEnable();% G( u9 x" O. P V
+ _# ]2 X: T' p- C5 L
// 使能中断(AINTC HIER)2 B$ n7 \" O5 A; d! n
IntIRQEnable();
" |" {) [2 L' Y( S' @4 `. t}8 K( V0 w) r6 r' ~0 g
: ]$ P" F! d6 g1 J9 S6 [
/****************************************************************************// [2 c/ l3 Q! _9 P$ E0 x
/* */
% \' h/ V5 [/ ?; W; T6 {% U/* UART 初始化 */
" {2 M6 U# e7 E E; E6 h" V/* */8 M2 V5 l0 V+ \5 {! a2 i
/****************************************************************************/
/ n0 b3 O3 p+ f. S4 F: Vvoid UARTInit(void)
; D0 {. q0 v! O4 O( M7 A{
* i; M7 j5 _7 I V k* G* g // 配置 UART2 参数
4 u3 Z. g6 k" `/ b/ r // 波特率 115200 数据位 8 停止位 1 无校验位
5 ~- {4 |2 n2 O% M- m UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,; |) x. D7 n( J" _. W% I/ y( |
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
' c. y2 H3 J/ Y2 ]- X, j // 使能 UART2
- m! T. h1 y0 a+ E* U7 C1 H UARTEnable(SOC_UART_2_REGS);9 M2 G9 a5 F8 d0 {
3 s& m$ d) Q/ u3 A' }% |/ F& B2 L( {
// 使能接收 / 发送 FIFO
- a6 {5 m/ O- V1 @# V UARTFIFOEnable(SOC_UART_2_REGS);& N* u7 h7 k" Y, h
, n" f6 h- }' T" x
// 设置 FIFO 级别1 n3 U8 i; |, {# E1 s# |% r
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
4 o Q: q ]4 ?% |" _& E}0 k- g5 V( C8 Y4 s( q* S
( E5 A; l ?; }/ e0 ]/****************************************************************************/
. q! I: d K$ J$ |/* */( D; k8 i' u8 D6 v6 D
/* UART 中断初始化 */# f% \1 f( Y) B6 ~3 B
/* */4 w2 j/ u! H$ C6 o! w& U k7 t
/****************************************************************************/+ L0 s& { ?* ~5 c
void UARTInterruptInit(void)1 i6 z) K8 v' M+ t4 L! c
{ t9 c1 k1 X9 x* b7 N9 o; V% G
IntRegister(SYS_INT_UARTINT2, UARTIsr);6 x2 e% L$ F, R3 M* E
IntChannelSet(SYS_INT_UARTINT2, 2);; ~0 p4 Z3 z/ t3 d, Z5 @
IntSystemEnable(SYS_INT_UARTINT2);& _3 U) \+ z' G( t F8 x
: B$ S5 c: L- y
// 使能中断6 |; ^' ^9 R2 c$ [
unsigned int intFlags = 0;
- A, q8 i+ E$ |' T' V intFlags |= (UART_INT_LINE_STAT | \+ {2 @9 w$ S" l4 ^! K
UART_INT_TX_EMPTY | \
3 O, f. [4 Y- k/ C' r( g( k+ o: l! a UART_INT_RXDATA_CTI);7 s7 o) S' G: f' a K6 M2 B# ^
UARTIntEnable(SOC_UART_2_REGS, intFlags);
( \$ N# k' ]6 r: r} g/ u/ r H+ r6 p+ z
+ }7 @3 r" y/ Z/ I: C6 F6 B
/****************************************************************************/) ^4 H/ J* O/ g! f
/* */
0 z/ b: p; M Z: I% b; E/* UART 中断服务函数 */
6 Q2 T* u4 a: d% c& j0 H3 }/* */
6 f8 ~( C [ H6 g/****************************************************************************/" C# a6 U9 ^! X
void UARTIsr()" k# q5 k a1 n; O- y0 n# Z: S- ~
{
1 Y# g: O4 u0 z0 } static unsigned int length = sizeof(txArray);
1 a3 f/ f' k* S' }- K$ [# v static unsigned int count = 0;
5 I8 ^2 g# w) _$ {% I unsigned char rxData = 0;
$ ]' B; B: [4 M& C/ P unsigned int int_id = 0;
! l8 g/ a! w5 a/ K9 y1 X; h' q
// 确定中断源
1 G% B7 m# ?8 j J int_id = UARTIntStatus(SOC_UART_2_REGS);8 J! b/ }" H( i3 n/ o9 G
3 A2 D4 a- i; Q // 清除 UART2 系统中断* _& u+ R1 x9 c- v0 m. }9 J% G
IntSystemStatusClear(SYS_INT_UARTINT2);0 v: W* Z) l4 G5 I: F6 Y
, Q3 }5 `3 `! M4 Y7 C( J1 f // 发送中断
2 b( m3 D5 p5 d if(UART_INTID_TX_EMPTY == int_id)/ m4 S4 j0 [7 u8 G
{0 c, C+ M) y% p1 y" T$ K. u
if(0 < length)& v4 g# v; o$ s2 F$ j0 }
{
2 X4 g; ]; I, V1 J4 ] // 写一个字节到 THR/ |" J% w. G1 W$ {0 w
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);8 }8 [( A/ V W+ A' F, ?/ ?# I
length--;
: ~% a8 E. x2 {) b/ k! ^ count++;* v6 W6 ~5 }- M
}
2 Q: ?/ d1 g- q) w9 u; i& k3 F if(0 == length)
1 J2 e, U5 H, f! h- O" \& M {
: F3 p+ H0 h( H# N- N: c2 h // 禁用发送中断4 f& J4 ^/ D2 y; m/ ? F; c- P
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);, |# p' m) f, R; o. G* U2 q: p
}
% p" R. e! `# S }6 o, Y5 [, ], G2 m2 G1 L
# t e: i! Y3 D2 y2 f // 接收中断2 C& j; |( V& H# b
if(UART_INTID_RX_DATA == int_id)
% @3 e% k& q1 |! G8 w5 c3 I( ^3 N {
6 X. c; m/ N9 R+ u5 S$ R, o: z rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);5 G2 r, [" [4 o3 ^- S: L3 R
* V/ E! i4 z @4 q
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);( L% E6 p: `6 K- \6 |; k& M9 Z
}9 U( I" [4 I" j8 G3 \
% E7 D9 e7 p* `! _1 l
// 接收错误1 s* F3 V; H; O' b- X; C4 T
if(UART_INTID_RX_LINE_STAT == int_id)
* C7 Y0 @* }' l( _ {
' }' X) K; @+ B8 {5 x while(UARTRxErrorGet(SOC_UART_2_REGS)), d. C, ^' K/ ~. D
{
5 y5 |% I; r Y4 i1 u // 从 RBR 读一个字节
* u; s) H) q* q8 z UARTCharGetNonBlocking(SOC_UART_2_REGS);
( ] d& f' |9 J( F1 {9 l }- o: v; w. q/ x
}& M, f$ Q+ b6 `2 ^) N( ~
+ g' c0 M" @9 U
return;
: f- N9 z6 e( n+ a- T}+ r G/ [# x' K) U
|
|