|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
5 Z1 [* j% R% f5 v# J) m
: w. B5 R7 V* L! X#include "TL138.h" // 创龙 TL138 开发板相关声明
3 T d( q; p: Y5 T/ Q, X# S" u% ?* Y5 l9 O# f
#include "hw_types.h" // 宏命令3 ?$ X5 ^2 H: i- E4 ]
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器; @0 T, L* H; z9 E; {$ Q" @3 Z |( n2 ?# J
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
! c- U" |, a5 e' r+ W/ s
* ^( S) y4 M0 F2 n/ o' o; ?+ F#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明 g r! p; I2 U0 ~+ J9 r
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明1 S2 x$ E1 k: n2 v9 X, \
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
# d* k/ p$ u* Y/ j9 s. L. o#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义8 r a2 x, v+ @: H k, a
' [% `2 {# X+ C3 Z/ C7 \/****************************************************************************/ ^( b/ g7 s5 o) g
/* */
2 W0 ^4 J6 w$ o% I/* 宏定义 */$ b" ? V+ D) ~! k. X' }7 B
/* */
3 ^6 u W6 i( d0 u* j: T/****************************************************************************/5 H e, v+ M: ^
// 时钟
7 Y( p; A; v2 S, ]5 A2 u$ M#define SYSCLK_1_FREQ (456000000)
. b5 w" y% z* }2 F( Z#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
" T4 }8 t; F, g5 u* ?/ p% D) D+ V#define UART_2_FREQ (SYSCLK_2_FREQ)
! l0 `/ y0 S5 J" Z/ {1 i
2 k; v- S3 c, ~! O/****************************************************************************/: z& ^2 J; K: R
/* */
" O6 _1 H* l4 e; k4 T8 f/* 全局变量 */
+ h1 \& }% \% a J/* */
2 y6 L+ |' P! l, X% i/ L/****************************************************************************/- [0 \# x$ L5 C$ E t% g
char txArray[] = "Tronlong UART2 Application......\n\r";! f% _. B2 B, _9 _; V% e' M: i
. ~- k3 h# P; _; o1 g/****************************************************************************/
8 `1 n: K! z; `/ z% M, F6 s/* */
1 k8 }8 h9 ^* t$ a& ?" c3 S/* 函数声明 */ H, c( m) E0 b+ j! _6 [
/* */. W, Y) b" ]8 ~/ d
/****************************************************************************/
% s; F' w6 R: U2 h7 G$ p// 外设使能配置
$ F- ^/ o# y7 r' @( M; Ivoid PSCInit(void);0 m% F. L6 M6 G8 t8 N
2 {1 c) I/ A( s8 s" k2 c, D& Z// GPIO 管脚复用配置
. V8 M- O! A2 ?7 b" m# O7 mvoid GPIOBankPinMuxSet();
) R. q" }5 M t+ z3 M
3 i$ m4 D. x5 K- j// UART 初始化 @: H" k- o0 ^& z
void UARTInit(void);
% ?( X& G& t6 p" P// ARM 中断初始化0 Q% X) Q' z# p9 y4 ^
void InterruptInit(void);
8 ]# ?7 S" a' M, h' L" ~// UART 中断初始化) |+ Q: z" b$ _0 D4 [
void UARTInterruptInit();+ p( Y8 b8 |% A8 U
// UART 中断服务函数
8 Q( `2 Z+ G5 Gvoid UARTIsr(void);1 t P0 J. c) u. e: j
- B- C& w/ _ w# Y" L; ?
/****************************************************************************/3 d, z4 I% `! h4 c3 W, |1 Y9 p
/* */" O- v- P% o+ y6 P1 e( b
/* 主函数 */
! ?8 S# G2 O1 A! P e/ S* C/* */
( t+ \/ J3 \3 A0 m4 o T/****************************************************************************/
7 |+ D2 V' C* [, V4 Uint main(void)3 M9 p1 g) k- h, w. g
{
! y# e" G) a$ O6 k1 K) s // 外设使能配置
- M# G. l/ N/ ] w+ N9 E% o PSCInit();
2 T5 u& f4 G$ V
$ Z- {/ o$ U2 N6 ?1 \% u // GPIO 管脚复用配置
/ x& J C) g( R- t# | GPIOBankPinMuxSet();% ^7 N$ O6 E6 e0 n3 y# l
, t) [* `- Y- o p. U // ARM 中断初始化
4 E3 R' x5 ~6 l( A$ s9 ?% ?( f InterruptInit();! }; }! p: Q; S( C3 h, A
, [6 g' b3 |( i // UART 初始化4 D: h* {4 w7 G% f! _9 L! R( ~) O
UARTInit();4 J9 @! a1 K; I. E6 ^
) L- t0 b/ K. J. |& x" M9 H* J // UART 中断初始化$ ?* [5 N; ^9 J, u; O, m, ?
UARTInterruptInit();
3 f' v$ `; m) N5 T1 P0 ]. z9 ?1 }$ Y# `
// 主循环5 ]( c$ z/ n( Y
for(;;)
0 K8 d& K! A9 }3 E% L" @ { z4 t) N0 T- k8 G# F. [# ]
N) U2 q; X4 N+ l3 [8 B$ a1 k }, |" I; m+ H0 S0 w D% Z: m$ k
}
5 ]. C* L1 y( u# ? m" l
; `1 T, `- E; D( Q+ c( V+ S/****************************************************************************/4 S' l. N: S W) y4 _4 ?- K# [
/* */, [: h1 Z' \. T4 p
/* PSC 初始化 */
5 Y1 l$ q$ ` Q9 b3 u/* */
; L; `7 V% M' F& E/****************************************************************************/
7 T3 Y! Q; E& J$ q Lvoid PSCInit(void)1 T. N& R+ h: D& k$ Z
{; H( @6 M4 x: w, N+ |# r4 G
// 对相应外设模块的使能也可以在 BootLoader 中完成
! a/ x% K. |9 G- {1 \) p) K // 使能 UART2 模块
) `* M1 b4 K/ J( |) E" P/ ~; [' O PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);% m9 h' ]0 W4 [& n. P0 T% k8 W1 i! q; V
}
' {1 _0 h1 u5 @; z) F% \# r/ h# e1 L
' x2 J9 R6 B2 b" d2 X6 N2 }/****************************************************************************/' u" M; @, o3 N4 v+ g3 m! v
/* */$ f' {2 v9 [' C- o3 y: y
/* GPIO 管脚复用配置 */
& X( a! B2 |4 P F3 h* C8 c2 A/* */
. t, S( Z4 W; B+ W* F/****************************************************************************/
5 x) c$ m! I" O! t+ Z$ Ovoid GPIOBankPinMuxSet(void)! Z0 ^. o' H+ d7 \- C+ R
{9 E M6 [" c e1 H+ Q
// UART2 禁用流控3 }' o3 ]8 Q0 c& x3 q* v7 D
UARTPinMuxSetup(2, FALSE);
* m0 P# r1 H4 ^2 e) T}
/ Z* W5 A2 R& w( W; q7 O1 [5 T, a& @& l9 l: P
/****************************************************************************/
! i% d- m- C; ?2 r0 ]1 I/* */
# u# \: \- b7 U! m/ h/* ARM 中断初始化 */8 t0 _# U/ e4 s2 Z( P
/* */
$ l4 E1 s; _/ b3 Z# d# j2 u/****************************************************************************/3 l& s" Z( X6 G; w
void InterruptInit(void)- m% }4 s/ `; @7 l; p
{
, d; S( z8 E2 l4 o' N% Z( r$ h4 o3 d9 B // 初始化 ARM 中断控制器/ A3 x: \9 i0 x
IntAINTCInit();$ H* V- j- s1 e
! {. Z) F$ N: v1 U7 q# C // 使能 IRQ(CPSR)
0 x. Z1 J1 T8 h1 \* c4 { IntMasterIRQEnable();
$ S- s6 ]9 S- d* j9 i9 y0 ~ P3 w6 w
// 使能中断(AINTC GER)
6 K4 q- h$ |8 p# B. k, g9 W IntGlobalEnable();* _( a8 n8 I. g+ `8 F' W6 W7 m
) q8 g- j7 i" |7 b4 {$ i" d
// 使能中断(AINTC HIER)
1 s B; r" c" V6 q IntIRQEnable();& t0 j- \* i$ @2 O0 v# n
}( q/ B+ u! z" n2 I9 F3 |, v% c
" }4 E0 N" m8 c9 U! X4 e- ~/****************************************************************************/( m0 W6 g; D- m0 y3 f% P
/* */+ Q. }4 e' L8 ^4 M7 H
/* UART 初始化 */
2 }& z' @3 b& E" ^, ^0 V0 D7 G/* */ k7 y. N! ^# [* G2 t
/****************************************************************************/
2 I1 J* {% }4 K2 Ivoid UARTInit(void)
9 R4 c! d# n- J$ p{
( T9 [- g" v' W5 L) E, q // 配置 UART2 参数
4 e) B. x8 j# z l9 b" k3 s // 波特率 115200 数据位 8 停止位 1 无校验位+ z: n. F7 s$ m; W$ Y1 [
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
7 [4 V1 o- G' d% I UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
# I6 Z$ m9 ~1 M# e& c' h // 使能 UART21 q4 ~. f1 |/ {7 P# E
UARTEnable(SOC_UART_2_REGS);
' f) l+ W6 T( t( M' n0 c# R2 ^& N% t; _5 H0 r1 s" X' q9 P! h$ Y
// 使能接收 / 发送 FIFO
1 m, x' E+ |3 e$ x UARTFIFOEnable(SOC_UART_2_REGS);
! ]/ l u% S# B- L3 h1 G- y% N4 J" @9 |$ R* X
// 设置 FIFO 级别
5 d4 L9 T6 v* j- b5 V I UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
/ M- L0 r$ }4 e7 e$ E' d5 B( S}& Q( B$ g9 w7 V* p
3 e- S2 x* q5 e$ I- x
/****************************************************************************/! M+ O" e" X3 n+ d& N
/* */. d6 w: S! r) s
/* UART 中断初始化 */2 N I' w- x& ?2 z! I
/* */
7 O1 l) J4 V: Q/ l9 F/****************************************************************************/& h: e$ d1 Q, U5 d& g% p
void UARTInterruptInit(void), Y0 w3 j" Q; D8 n, y: F) [4 Z$ g
{1 D, Q% o7 H, m4 A* l
IntRegister(SYS_INT_UARTINT2, UARTIsr);6 A. a; p/ g7 F2 p
IntChannelSet(SYS_INT_UARTINT2, 2);
w5 D6 T% [) p* T IntSystemEnable(SYS_INT_UARTINT2);
2 c6 c( h2 D. z( M0 l: K/ s U: W8 c; s' H z, c4 |
// 使能中断
( g5 Y, b! n7 X$ f& u/ T) A, @; _ unsigned int intFlags = 0;
7 d9 b$ Z% C# r( `# T# J& \% f intFlags |= (UART_INT_LINE_STAT | \: Y' A/ \! q0 U* Y! k' z# R: b
UART_INT_TX_EMPTY | \
( r( o0 X* \' t' a, R0 X UART_INT_RXDATA_CTI);( [& n: N9 O6 p8 |6 `% O9 r
UARTIntEnable(SOC_UART_2_REGS, intFlags);
0 h9 }. _1 W6 B/ ?; e}
$ m( q6 E4 y* X3 t& y4 t
; ~! ]. ?2 R0 \/****************************************************************************/
" J, g7 s% p2 E. N& z" m/* */
1 e$ V& \. h3 I0 `" {& g, |1 R/* UART 中断服务函数 */
9 Y9 e4 X! _4 n8 h# t1 y/* */
& F% a @/ M) H# }/****************************************************************************/0 b+ t6 w, P( b b' n2 m0 C
void UARTIsr()4 E2 h- j4 P" _' {, P5 E3 z4 t, p1 p
{
3 E4 a, m; R3 b$ s8 h static unsigned int length = sizeof(txArray);
5 v8 F7 R6 x" r# F2 }% w/ t" r static unsigned int count = 0;
% a6 _+ Z* \( d9 z unsigned char rxData = 0;
+ ^5 i, o9 K O$ ~! f1 c9 |8 o unsigned int int_id = 0;' j- J3 c& N6 o' {8 {5 x
* z y* [! c4 _6 _! [ // 确定中断源6 C- v9 n& M8 N0 P
int_id = UARTIntStatus(SOC_UART_2_REGS);
5 q% a0 V0 i, j1 d( K" r( W, X% |: J5 ?7 X7 B' k- f
// 清除 UART2 系统中断, W9 S5 M3 F7 V+ ~ {
IntSystemStatusClear(SYS_INT_UARTINT2);6 I$ P4 [3 p7 W9 X4 N; G1 m4 E
7 g6 O. R0 I4 F: F // 发送中断
2 A4 H( |6 Y: |9 f2 ~, `7 v5 Y1 ? if(UART_INTID_TX_EMPTY == int_id)
4 b- F6 G0 e [ {
, h4 k+ Z; [& U0 o+ f if(0 < length)
* M& {7 }* |& ]: Z# a {
/ W* n& H* C% A& b( U // 写一个字节到 THR
2 l3 i5 O# `7 t+ M8 m UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
# i1 a3 X1 Y& E3 ` length--;
" ^( W* R+ C& ~) a5 z6 r count++;
0 ^6 y/ s x, h5 r! E5 s, Y$ h }: ^% k4 H, Z9 N" M; o/ b' t8 Y
if(0 == length)
9 g; p+ \5 ?1 @ {
+ Q, F8 f2 ^- V9 ?6 [ // 禁用发送中断
% C, [+ {( f" w( ~0 A# n UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);, i$ |1 j2 p6 h/ P& |! ~' x
}5 |# P" l- c8 R$ z
}
- U7 `( O7 x5 z+ O' T( r1 w; ]8 ~
! P) N6 w: U2 E; d6 l: w7 q& Q, b // 接收中断+ v8 [5 Q. o3 z$ R' N' }8 k
if(UART_INTID_RX_DATA == int_id)
: q/ O, k: |5 x8 R' o {
: ~) P2 K' H: z rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
- J, u8 R% N% G, H% @0 l/ Z; G# @6 V2 R8 R6 o$ H
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
- @: r3 Y% {) l9 t% [/ I/ N8 c }
& Y( p: u: b3 C) \4 q
8 _! Q( u8 d9 N$ t- Q# k/ u // 接收错误0 z- ]! A% H( I; O5 W
if(UART_INTID_RX_LINE_STAT == int_id)- u* n" J. M$ j9 b
{
/ G0 A, f+ O Z+ ^: \ while(UARTRxErrorGet(SOC_UART_2_REGS))
@# ^/ g1 B1 L4 U! n2 p- a4 | {. s. R, h% p. r7 }- J. I
// 从 RBR 读一个字节3 M& o- Z4 l1 A3 h8 M% D$ B
UARTCharGetNonBlocking(SOC_UART_2_REGS);6 u0 T$ v; a! D1 G
}# t! W9 R8 _# c1 D/ l' y
}# f: S4 e3 ^4 B4 }7 W) g+ a
8 V8 z, N$ o. z G; Q: o
return;
9 t. y5 J/ H/ g' ~" A}3 ~/ `' |8 @ }, B! I
|
|