|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
1 q! |! Q+ q- a0 Y) H% s C* Q8 _ ^0 j# l+ Z
#include "TL138.h" // 创龙 TL138 开发板相关声明# z* ~% G. u9 F8 r; u3 _
5 Y, U- @' L b4 z& }#include "hw_types.h" // 宏命令9 B: }9 H7 F/ r0 ~% M
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器' n, ~: W* S$ a! b
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器0 M( E4 Y9 {, u
3 r$ K3 z+ W6 `2 S6 K% X$ U
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明- r) M6 t" j! D' g0 e! s0 Q
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明2 p b( [* r$ w/ |3 J$ M
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
; v6 S/ A6 e: E#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义/ [- q* S6 |6 i% Q& q$ ]) S
' p- T+ M+ k* D# C0 m% B6 @/****************************************************************************/: o9 \2 j9 n7 Z4 ~& b% S
/* */
4 }9 c4 k2 `" |/ ?& E+ `/* 宏定义 */
7 x4 t( J* C( r( s! f/* */
- M4 L( w* r, e/ [% l6 _/****************************************************************************/( m" f9 }+ E( p/ b% |2 c6 `0 I
// 时钟' h( u# D7 n/ G8 B$ G! C! C5 Z
#define SYSCLK_1_FREQ (456000000)
4 R+ T$ E0 m$ ^% K' _( l- c. B# V2 G0 Y#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
) T" P7 F; o$ B4 e d#define UART_2_FREQ (SYSCLK_2_FREQ)
2 ]; l) Q b& ~9 E
' u4 G+ ^6 c6 i1 V4 ~) J1 a/****************************************************************************/( P' \8 V: Q+ Z. Z+ D. Y: W
/* */ P3 U: O6 e1 E# Z
/* 全局变量 */7 [1 m, G; O! y+ c
/* */) ?$ s9 U: \5 n2 D
/****************************************************************************/2 w2 t y9 Z. f5 s% j( I' |8 w0 y
char txArray[] = "Tronlong UART2 Application......\n\r";
5 |2 K+ R/ ]3 w2 S; ?/ V3 s( I+ B% V: u4 j% E7 h
/****************************************************************************/) l5 c9 X# D- \7 Q
/* */. Q4 h, }) @$ d, y! l6 ?: V
/* 函数声明 */1 I8 y4 r5 `( w; d
/* */
, U9 @; @! g5 _0 {7 S/****************************************************************************/
8 M$ ~, D* F+ K// 外设使能配置
$ w# P6 z) y) O0 j: p6 f( nvoid PSCInit(void); H/ H! i: e1 C2 e @; \. e. @/ {
8 q- x2 u% r& X% Y2 I f- ^+ F// GPIO 管脚复用配置' V: b/ z& w, I8 f# W7 ]: T! R w% k/ @6 L
void GPIOBankPinMuxSet();2 z1 ?% P+ R% l" P3 D
0 b* |$ m( `' Y' @9 N; Q// UART 初始化
2 A/ H0 c/ S+ Fvoid UARTInit(void);' d- y6 V1 P4 O+ b* S
// ARM 中断初始化
# R, V) Z% `( v6 n% J0 T J! hvoid InterruptInit(void);: v2 y- |! m# Q) E- X
// UART 中断初始化7 q+ P. L1 q/ g* x, L
void UARTInterruptInit();
" ?9 A5 @! `: f1 ~// UART 中断服务函数
( N# ~9 B* G2 L' nvoid UARTIsr(void);2 y! _6 b. Y0 [7 e3 a
% {5 Z, t7 x5 o8 d/****************************************************************************/
6 H% Q' T0 ^4 C9 D5 l) U/* */
* A3 D7 f w4 ?) X/ w5 e4 N; E/* 主函数 */
% i% \/ X3 l# X" i/* */% j- r2 {7 }0 F* X w) e: M0 K
/****************************************************************************/- T! E, s* ]7 R: Q
int main(void)
) ~" E' U5 ?. ~$ d* {{0 _% h* w3 u( S Y% A& P
// 外设使能配置' K( Z* g# X9 u/ U8 _! `
PSCInit();/ E$ `0 V# b) q( p9 p, D$ b8 ?) w
- e5 W& q n1 c! i3 K+ Z6 ^3 m2 l
// GPIO 管脚复用配置0 t) y4 E; V" v) n N6 _" X0 W& g
GPIOBankPinMuxSet();5 |& X- B9 V& l! v" j" L
# X- w, v! w" A' }1 O
// ARM 中断初始化* S- V# u$ r$ T2 _7 I
InterruptInit();6 Y0 j6 a: F* a$ Z% |. U
. ~& i7 K, z) L5 s0 f' X# O // UART 初始化
, m. n) {$ [0 }8 z! W0 E" u# a UARTInit();* |0 f5 W7 A8 j7 A! S: }
: c9 U- N/ V3 c9 z% a" Y3 t- D
// UART 中断初始化 R0 v6 r) i1 E6 \: q0 k" z3 y
UARTInterruptInit();
& H5 n$ W3 t; h% T
# X3 x8 ]' D4 E. e // 主循环
5 u$ T( L0 r% Z for(;;)
7 O+ x5 `# Z5 b% u {
( n ?: J7 R% a7 k
7 f S1 C4 F8 d2 N3 q }
1 D0 }2 E* p3 F}
& P! v; Q" ?! T1 {! r* C4 \
0 `2 R/ V- y7 N" [( @, ?/****************************************************************************/
! _ O' l' L5 C% s7 W. x8 l: C/ Z/* */
& v o. n$ x! `: `/* PSC 初始化 */; O" L# x, e. p% R8 }
/* */- ?$ v/ Z1 C6 f \. l. g E
/****************************************************************************/
# Y1 M# K( [% _void PSCInit(void)
: s. S& g) P8 v{# o; U: _; Q* B
// 对相应外设模块的使能也可以在 BootLoader 中完成
2 g' i D0 e. Q // 使能 UART2 模块7 t2 ^5 o* {& q/ O5 O
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
7 y" S4 f, G0 U6 H, @6 [9 J}
# y; X' l) N S) {# o z6 D, C8 j2 N4 F" a$ {1 `, [! y) z/ y6 }
/****************************************************************************/
3 M8 U. R( U! u7 M' z/* */' j% S4 E! [$ l" y
/* GPIO 管脚复用配置 */
# h3 D. d8 Y+ l5 R* V- b/* */
$ s- D% x9 X% k. e' y% ?3 |5 j4 W/****************************************************************************/+ G' h( W: F& B0 Q' O1 g3 P" O! H6 e
void GPIOBankPinMuxSet(void); n M1 o; {0 n2 e0 `* |
{+ b3 Y7 _; A& f) a8 O' t8 y
// UART2 禁用流控- f& i: N; c+ h1 a
UARTPinMuxSetup(2, FALSE);
- B+ b+ G( W5 R. A" [. U7 f6 V7 ]}7 d$ h/ E* a/ U, s- [2 ~
: V' J* J1 H/ K2 v; q) ]/****************************************************************************/: c2 X. x; C& V
/* */
1 y O7 s1 p9 m1 M: Q8 E" b: i; B/* ARM 中断初始化 */
# {7 H/ h, j1 t7 ~9 J5 t8 i/* */9 a1 k" ?! S' P. v- |, C n% h
/****************************************************************************/
+ n0 ?1 p" l. [- Uvoid InterruptInit(void): F3 e+ `1 s+ ], N6 \% m
{
; `7 ^. g6 j: X7 M5 l+ p% R7 \ // 初始化 ARM 中断控制器+ g5 j8 a T6 m
IntAINTCInit();
/ [# `9 \5 A F4 R M
6 l7 O. T! A5 W) F // 使能 IRQ(CPSR)
; I: ], B# V4 g" v5 M! P" p2 O IntMasterIRQEnable();
" j2 A3 w) f- C4 B E" O( ~' T( `
/ l+ g1 k# `/ ]0 C5 {) g' A // 使能中断(AINTC GER), E" a2 G. G& ^( Y( W) U3 ]
IntGlobalEnable();& C6 M( k9 ]) ~% K4 o
. E& W; _* X7 y% G7 m5 A$ E0 F
// 使能中断(AINTC HIER)
: s% ]1 h: B0 U! J8 `, S IntIRQEnable();
8 \) {% E4 ~7 q% j}% m3 w- ^6 Z- `7 q
7 @' b4 C7 E5 Q6 {7 N3 X/****************************************************************************/( H3 E5 y+ H6 \- B4 {+ F# G y* m
/* */
" b4 ~! T, H3 S& q( I/* UART 初始化 */1 p6 Q2 s/ z# K* |8 a
/* */; ^" B5 y' I4 }
/****************************************************************************/
0 i& C o- I3 r8 |( dvoid UARTInit(void)
( S2 R4 U& W+ n. q7 @{' k- f7 u* J: J$ k" @1 F
// 配置 UART2 参数& T. U& H. f5 X7 g% ]3 C ?
// 波特率 115200 数据位 8 停止位 1 无校验位
3 r: X I8 H1 e y8 F" q2 m, D8 |8 t) n UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
" H* h0 T- M' }7 O8 U UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
# {$ X* _/ Q: T; r$ F" i# r // 使能 UART2
5 k" r! v( D7 A2 } UARTEnable(SOC_UART_2_REGS);
; b9 I. |/ |( f. C+ Q4 x( z6 m. R9 B/ ~9 K& V3 u3 H
// 使能接收 / 发送 FIFO
% x$ y' y/ L r; ~1 a UARTFIFOEnable(SOC_UART_2_REGS);& O' Q8 l1 S+ ]6 W
( D% }+ k8 {$ J' I# C* m
// 设置 FIFO 级别' a8 \) {1 G& H& O( R7 a% ^' [
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
: T' G9 @4 M5 b/ k# O4 n W}
( P0 j/ H: K# F" z3 f" p+ d5 [! x+ v& m6 f' ]# y+ h
/****************************************************************************/
: n' c& P/ k" S# k4 W" M' f, Y0 p& Z) f/* */
" F& A2 [. p8 b0 \) I/* UART 中断初始化 */" q7 U' X0 n( l- S9 ]7 m; D
/* */
' x1 e# l4 g& O# ~' u- S- X" T+ H$ Z/****************************************************************************/9 }4 b8 i; U0 w8 R/ s/ y6 f. h
void UARTInterruptInit(void)% B$ |. @ T# c" e
{" d0 _0 H- g: }6 V1 q/ D
IntRegister(SYS_INT_UARTINT2, UARTIsr);3 w( l2 |+ ]0 B/ I) f
IntChannelSet(SYS_INT_UARTINT2, 2);
, d) J. H! g! O+ M l, I1 r& w3 q IntSystemEnable(SYS_INT_UARTINT2);- T! d4 e2 {/ U$ g9 o
6 F- ?* @" r" [* m, O* k, q; }7 z // 使能中断1 k* ]* s# u$ Q* I! Y
unsigned int intFlags = 0;
- l" Q+ }0 y/ \) d intFlags |= (UART_INT_LINE_STAT | \3 R: s! m; x; Z* I. v) K
UART_INT_TX_EMPTY | \
. g7 i7 F# T8 l7 Q5 ` H1 o( h UART_INT_RXDATA_CTI);
0 U/ q, _' f+ X0 Q0 f UARTIntEnable(SOC_UART_2_REGS, intFlags);' o( h/ a, v' X
}
# V/ p: ~% t1 n5 n+ ?* i* L0 p5 w4 j- {6 }2 C; {
/****************************************************************************/
6 a* t1 N0 s) A# B+ s" a/* *// |! p6 {2 E; u0 W" N' D
/* UART 中断服务函数 */' |& r2 \4 U6 {; I
/* */
* z$ N, T3 f, |/****************************************************************************/' G- a! A, m2 K; l5 ]+ p
void UARTIsr()
1 |6 \+ b! |& z2 l{/ d6 t& u- Y# C, U2 ?5 ~" @$ e$ t! H# N
static unsigned int length = sizeof(txArray);
9 S2 i7 X/ |8 e5 M- F' w static unsigned int count = 0;
9 J+ P( Q& \; t) y- T9 _7 z unsigned char rxData = 0;
: l( K& p4 n! w. o) j unsigned int int_id = 0;% [2 J6 [% F4 X3 X% N- q7 E
. P/ M0 e0 P t // 确定中断源
- l, p: t- X. g int_id = UARTIntStatus(SOC_UART_2_REGS);4 x7 I9 t: w X! u
+ |1 p3 @ ^# v5 h- [5 o* o2 h
// 清除 UART2 系统中断
$ I& i' l/ O5 L, k' F5 \ IntSystemStatusClear(SYS_INT_UARTINT2);
7 m x6 }) M0 W
- \! k7 V: K* w, m // 发送中断
8 B$ `# d8 z/ q3 | if(UART_INTID_TX_EMPTY == int_id)
2 R- b1 ]/ S" ~2 N; q1 O {
I+ y$ Z% j2 V3 ?; j- h- ?' U if(0 < length)! `8 g; I6 G; z
{* a* o5 S {! G5 G# h# ?
// 写一个字节到 THR
2 C8 ]- \2 v% D O1 | UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);) A3 F* I6 L4 G
length--;
7 `9 g1 b1 m: L6 C4 s3 R7 } count++;; k- G( H7 h$ d9 @- x/ l
}
: k- e n7 ^& d+ j6 S' B7 \( L if(0 == length)1 a1 U5 y" Y- C/ ^' Y; r7 ^ _
{
7 t; ?3 j' ]% p* f* H: o // 禁用发送中断
, k' }' |$ L! z" n) t3 E% Z( G UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
. g8 Z* w# {& `: ~# D }! Q( Y( E) I# G
}
5 C5 a5 J2 [/ i J# U
8 C5 \8 @& B- K. I; U // 接收中断9 U+ ]9 o5 ]. S# @6 x& v* F
if(UART_INTID_RX_DATA == int_id): I9 q1 \! Z" y/ B8 G
{
0 p- ~" `7 I$ c5 T8 A. ~( u rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);* T1 x2 l, l5 A9 ^
! Z+ `: \! i& D- j9 J% l& D
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);2 H+ v9 K" W/ G. H+ L$ p' X
}! i i' W9 M6 o+ g# |. _
4 c' J: [) R" j+ W4 @
// 接收错误
8 _6 a E- x* m7 s N if(UART_INTID_RX_LINE_STAT == int_id)
% Z( J% C8 o. L3 }( Z" _ {
& Q; H7 i: w5 s5 g- { while(UARTRxErrorGet(SOC_UART_2_REGS))
|0 W& }: J8 O0 q' F$ Y- X% v {% D o" [/ f1 A X, t) p
// 从 RBR 读一个字节
4 ^- b/ V, y3 t }% m UARTCharGetNonBlocking(SOC_UART_2_REGS);
* O9 x$ S9 U* G* |% O }3 K& @# d+ m( A0 {1 S% N# E$ ^
}7 o7 S+ Y" [; {7 P* A
5 e; m7 d+ N' ^" c$ _$ d& t
return;! q. T& J$ a0 V* ?
}
Y6 n: ]; ?; Z* @2 N( s& o |
|