|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。3 N3 d' F! c, o9 t/ V. j
) ]' g9 R7 O1 x- } Y7 @! u+ k#include "TL138.h" // 创龙 TL138 开发板相关声明
7 ?; m0 ] U' q% T6 m' w3 n
' L4 F* L/ Z# W! A0 q' o#include "hw_types.h" // 宏命令
) O0 @4 r4 n+ _8 _. e' k4 g#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器- ?) U N3 q+ Q0 D @
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器- V. f( H1 u: I3 d# l& o5 w
. X% s/ c' b8 |9 \3 P#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明- F0 `7 C# k/ H* e+ n( u. Z% P
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明) ^! B; o/ A$ H
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
7 N7 z& z% h9 J* t2 Q0 v#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义2 y3 w0 N3 H% {" y6 l
) {. {7 D: a' s/****************************************************************************/
" I- b: h6 w7 @4 z/ L5 ]/* */: M; _7 @7 w* o: E
/* 宏定义 */3 j) I5 \$ A5 Q
/* */5 h5 H8 I3 a( v Y6 V
/****************************************************************************/
* y& J( T" F- F* c// 时钟
4 E2 W$ X" n, k#define SYSCLK_1_FREQ (456000000)1 V" b# w7 X* x/ b- Y% u- I2 l) o
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
3 \( H1 S! F; B5 Y" U#define UART_2_FREQ (SYSCLK_2_FREQ)
; H% q/ X" H8 s# v# s/ [# k6 ^6 }( @& M: }8 @
/****************************************************************************/
( q4 y& j+ }+ e4 i: Z7 s$ g! ?3 B6 d/* */* N9 J( Q$ ~2 k/ w) i& _7 U
/* 全局变量 */7 ~/ I, w3 }' l/ v/ H0 U
/* */
7 s2 h7 }" ^) R5 L! v/****************************************************************************/! q7 ] B; i: {! ^" E
char txArray[] = "Tronlong UART2 Application......\n\r";& L: |, B3 t c: m) F- T. k- `5 a
0 ]* [* H( M$ J9 r9 h
/****************************************************************************/
9 \) ]1 S3 Q. R* v3 \' s: G/* */! x- c( ^$ U4 ?/ [" L" l: |. ~
/* 函数声明 */
/ _4 y6 Z2 ?- |0 g* o6 m% E1 R/* */1 O \/ O) z! g) t6 {: ^
/****************************************************************************/
: x7 [' Y8 N$ v& V// 外设使能配置$ |4 G$ J; U. k' |" o
void PSCInit(void);
& O) B# r- v2 [
/ _, R) R% t: i8 f, Y0 V// GPIO 管脚复用配置
9 H# ^" G3 ?5 `) L+ ]# o* d. {void GPIOBankPinMuxSet();
2 z4 f- m L& x+ G9 R+ x7 @9 D1 d U" S' m# [) D
// UART 初始化) _ R$ q8 L( b4 j3 z
void UARTInit(void);7 M2 s4 {5 ~9 i
// ARM 中断初始化7 ~2 u6 Q" p0 j4 T( F+ p. T1 n* y
void InterruptInit(void);: l5 ?- C3 }# E" D# S; }. V
// UART 中断初始化
' V: ]' w0 e. ^& _' }. z0 t! V) evoid UARTInterruptInit();, u5 U% D) d( c- w! a
// UART 中断服务函数- s. }/ O- F! }( h, G8 A: C, i
void UARTIsr(void);6 \4 `6 \6 `. r7 n% q
% q4 V7 R$ j4 V9 r- `- L
/****************************************************************************/
! o4 X- Z& u. S% ~ T* V0 O/* */
7 Y# d+ L: i0 h/ l- ^$ p/* 主函数 */
! a4 F" d7 X% {/* */9 L9 D9 I( W' X
/****************************************************************************/
8 o! M0 W* Z1 r: }int main(void)' `- o3 v. S, r1 o- c8 R- `1 M- I- H
{
" o2 t7 a) Z# d Y0 J; ] // 外设使能配置3 Q* c( S$ K* V7 U, g
PSCInit();
$ I: w* _ q# M6 l' q & y! q. O$ G# l% _) `4 O2 [- w8 u& p
// GPIO 管脚复用配置
; R5 n y4 V+ S GPIOBankPinMuxSet();
$ u! V! l, o2 Y( _: N& z$ g/ m! y! ^0 |$ q' M$ A& Y; s% F
// ARM 中断初始化
5 q5 {0 [5 q1 o0 @8 a$ u9 }- R' Y# L InterruptInit();. w1 ]$ S" t, C) p9 E9 @6 |6 v
* o1 ^# ^1 }7 c8 W/ [6 w
// UART 初始化& V3 U. F/ L# n& q6 E" P; ]
UARTInit();, w! |7 G& O' B% V4 [
7 P; e. `5 ]6 m // UART 中断初始化( P" U* A0 S6 f& ?) B: r
UARTInterruptInit();
4 L9 w4 z4 S) |: Y9 [: o/ U) `2 @ F% z: n
// 主循环& D! C. _. g$ x# [ H& {0 K& ~
for(;;)4 c) H2 z8 n$ J9 V' Z7 O
{& H4 B1 A/ v/ X
- [' N; F! v/ N& W" ~0 X) x5 o }4 J# E$ S$ y& u- G) i9 V
}, e7 s1 Z8 X- C+ B) K) g
; E: g- C, L# ]1 S$ V5 @0 f
/****************************************************************************/. f& ?$ _- e" q1 h
/* */
8 m) o& D' W! \/ ~7 @- H+ ?/* PSC 初始化 */
G& ] g2 y- g5 s+ O, R5 e/* */
) s+ _9 }% V' g5 R5 e) } Z/****************************************************************************/
. i: {5 v6 t3 I4 I. c% svoid PSCInit(void)
7 \' Y$ a2 ?# W{& ?. w6 G3 I( q j# K( s( }+ p
// 对相应外设模块的使能也可以在 BootLoader 中完成
# P$ M I6 e3 }2 c0 G8 }- A6 c' A // 使能 UART2 模块0 j& O+ l3 |! f
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);- q1 w' h8 g. ?! _: O! ]& _) e1 T( e
}
2 }0 h5 a. ]" [; e; a. b6 W Q1 [" i3 m' X
/****************************************************************************/. i$ T& I& b' J
/* */
4 N* s1 U G$ G& j/* GPIO 管脚复用配置 */& T0 E* `$ t. f+ @! w
/* */- A* M* b* [# u9 K" K1 @
/****************************************************************************/9 \, ]& d4 m6 G- Z% Z5 g B7 T
void GPIOBankPinMuxSet(void)
5 N' K/ w& K5 f* N- i" q{
5 L, c, x; }) m2 X' D // UART2 禁用流控
* x+ b- V1 F0 A! W$ T0 i UARTPinMuxSetup(2, FALSE);6 g* }/ b, h. X3 A
}
4 t$ P, @7 n% ]5 Y) y
5 }3 b3 c: x9 h& w/****************************************************************************/
/ v9 J" h# D, i4 D/* */
2 N/ q9 l/ C; F% }/* ARM 中断初始化 */
1 N2 V, T! p g; U/* */
/ v8 [7 i: W" n0 ~% M! O/****************************************************************************/" U( n) U+ I# M' ? n
void InterruptInit(void)
B0 W! L+ _- o C) `3 J' `. G- @{
% \7 G) e9 J3 b // 初始化 ARM 中断控制器
& H( m" Y* | C+ [. B. W% \ IntAINTCInit();
% ~0 d" N( q. f- e
6 r( u, I) i/ J5 d* i; |; U // 使能 IRQ(CPSR)' S' F+ S3 q& P
IntMasterIRQEnable();( V! I1 p, n1 R- T
! s) e0 Q( \1 H- r* e0 R // 使能中断(AINTC GER)
- f$ O/ T/ u( {1 A) @4 S! I2 q IntGlobalEnable();
& G: v8 |. C% a/ K/ D" L
7 q0 {! L' X: ~ // 使能中断(AINTC HIER)
0 N+ B: B, c( P" E# W' u% k IntIRQEnable();
# A: t% S4 W( e- N8 Y. [; J}1 h% B, S, E) K8 m% q8 a
7 [& Y+ D6 r. J4 c2 B5 a
/****************************************************************************/
/ ~2 T, h! m, d7 x/* */
! H2 {& h( @; N& @$ X" k: N3 r/* UART 初始化 */
4 q/ N1 w$ A! Y# `/* */+ w$ x+ m. R5 K
/****************************************************************************/
# v, T& `2 O: Gvoid UARTInit(void); t0 o8 N' ~3 x% J6 l- L. I
{2 ~" C2 `5 c% t
// 配置 UART2 参数+ M. t+ o' H S6 P! @/ l' s
// 波特率 115200 数据位 8 停止位 1 无校验位. K ^% R) L. L: W& x4 x! l8 F
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
/ K8 a: k. ^8 m& t UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
6 m' u6 _1 t6 h& D1 G" V# _ // 使能 UART2
! P9 w8 W0 M* w) X' o# U, \ UARTEnable(SOC_UART_2_REGS);
' y4 `5 \+ |9 y4 d3 s4 X0 q- |. l9 z5 B" t, u x
// 使能接收 / 发送 FIFO! S1 m$ z4 M Q5 \. i3 M, C" B9 i. Q/ ~
UARTFIFOEnable(SOC_UART_2_REGS);' ~7 L- Y/ K- ~0 @* [8 z6 h' B
: @5 i8 G, j" ^# G: K) } // 设置 FIFO 级别
+ i" V: ?# v0 ~8 [$ o8 J. e UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
$ \1 l, e, Z" Z5 [}% M* S: [, a8 p7 ~1 \7 r A Y
' o6 o# t7 `$ h& Y
/****************************************************************************/
" i0 ^# J9 X3 p! {/* */( F. Y8 \1 D, i Q
/* UART 中断初始化 */
# z7 @' \: [8 S/ N7 r9 n# N/* */
; L) X* n# c' d9 F( a0 q: h/****************************************************************************/: _& P+ g0 K' x5 f; {# Q% z H
void UARTInterruptInit(void)' ]5 Y% W% T; `9 l0 k7 M$ [
{( x5 r/ p' ^+ M% A$ H8 U
IntRegister(SYS_INT_UARTINT2, UARTIsr);8 p/ o2 g6 C9 C3 l0 D
IntChannelSet(SYS_INT_UARTINT2, 2);
) M' Q- X! H! }* s* u IntSystemEnable(SYS_INT_UARTINT2);1 c J- [! Q) ^
o' h& ^+ {3 l: C; d9 \$ @6 h! w
// 使能中断
% I, N) R$ M/ U6 [8 x; i* k" z! D& w% u unsigned int intFlags = 0;* g2 W" p7 ^/ e" v' b F+ c
intFlags |= (UART_INT_LINE_STAT | \
6 n- ~1 E) ~! i* M, v( y UART_INT_TX_EMPTY | \
! E+ Q7 y* u5 L4 P1 X6 e8 s UART_INT_RXDATA_CTI);' T l1 S+ i$ H0 v, [- r
UARTIntEnable(SOC_UART_2_REGS, intFlags);
5 J$ I+ B% u _) E' ^: R}4 j$ x1 v% O2 J- s
" X' f- h+ \$ @; J; { y' w7 A/****************************************************************************/. A4 W) \5 \# G s
/* */
# `3 s2 F9 E3 h u/* UART 中断服务函数 */
$ M6 n5 y9 Z; j7 L7 g0 {* e/* */' u2 F1 ]6 J$ X0 }5 G- o
/****************************************************************************/. p; `. ^ k$ p2 P, _
void UARTIsr()3 \, c$ m* ~: P8 w _
{+ M& T. D) M5 d4 g; i1 o
static unsigned int length = sizeof(txArray);
5 A! x6 P% f! {1 q. Y+ ^# {4 L static unsigned int count = 0;# H& C2 [0 {5 l- p/ C- c; S
unsigned char rxData = 0;; l) m" q. Z! o+ q
unsigned int int_id = 0;5 y* f8 G3 O+ ]/ y- U9 H' T, x
" j! y! c8 {. W/ h" D // 确定中断源: @1 `* s9 K, F9 D6 m
int_id = UARTIntStatus(SOC_UART_2_REGS);
4 }% E6 `8 z2 F0 g! \6 R8 n2 [ m9 Y
7 ]; y# d L" A$ k0 x // 清除 UART2 系统中断/ y8 r" L' v7 m
IntSystemStatusClear(SYS_INT_UARTINT2);
8 D. }1 Z+ b2 j0 a/ f3 E* M! k8 Y9 @
7 V6 ]: C& S8 r: E1 p+ p" g/ X- K( Y // 发送中断
" Z; B2 t3 N, I% k9 ?) j& B if(UART_INTID_TX_EMPTY == int_id)4 r6 k- ^% } a5 N( ^$ P
{. s1 F/ g- Y) s7 C7 W
if(0 < length)8 p- T. A/ s. H# B, P* s
{
4 R) S# G+ g- b. Z- W // 写一个字节到 THR% A2 S3 t8 U* ^1 P6 V+ u
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);6 Z! y/ k2 T+ p# l& C
length--;
. G6 H# [1 [$ W, [. N! Q count++;4 C3 I! H; U' X2 k. a
}
0 a( k7 X1 _, q! Z% R: a w4 P if(0 == length)
8 t4 `# K5 l/ i4 C/ P" v6 V {
, k+ T4 p: ~9 B& M$ e( L // 禁用发送中断. _) X; p) L4 @: o5 `; l% V
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
5 ]" p; {# _% X: v7 D }
) @7 X4 O4 c( F' i# G* g }
3 V- ~: |8 z6 M+ b h% \3 o( G7 o5 n5 f% Q: g
// 接收中断
( x7 H X& {" ^: s% t' W' @ if(UART_INTID_RX_DATA == int_id)
& G$ t5 G! z! P, u' n {
! e3 H" X6 ~. @: s. M& j; ~ rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);0 A9 H1 w. G3 I6 Y" d0 G) I3 i& p
! c j9 ~: }( ]- ^- Z3 F) J
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
' V; S+ j6 e% g9 p0 {; c- E9 w }
8 X2 f# b9 O0 K$ r( I8 v+ {- y3 D6 O/ n# i. l6 C
// 接收错误2 X# P5 Z5 R$ r5 V
if(UART_INTID_RX_LINE_STAT == int_id)! M" u/ G' x2 l
{
& j* T0 r9 m( M5 M% a; d while(UARTRxErrorGet(SOC_UART_2_REGS))
& k9 G; i/ L, ~% ^ {
/ E; V$ B: {* f+ f. Q5 [& [ // 从 RBR 读一个字节; [9 S, A" U1 c# d
UARTCharGetNonBlocking(SOC_UART_2_REGS);
+ _5 k1 Q, e3 U0 `( Q+ K5 c }$ f8 y9 S7 a) I" ^' K
}7 ?, C" ]/ a0 D/ m: }; s
8 a; R( j5 e3 d0 u
return;
0 v3 g: Y' \7 O0 o# t B; w! S}
6 T. C+ l, ~7 z5 p( F, M0 A |
|