|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
# e% d3 F7 j" j" r) W1 f' h K- n, A% g* l
#include "TL138.h" // 创龙 TL138 开发板相关声明
& K9 H) p' q5 v4 P E$ C, ]. x J6 `7 i7 l0 d
#include "hw_types.h" // 宏命令
- V5 a' V% r5 f2 c$ ^" V2 S2 R#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器1 \+ m% O, K/ B: @! D( l+ ^
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
- G5 L9 O# X" |$ a1 S2 G( g! M$ K! N; m
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
; k* H. i/ n5 P+ _& ?( v0 ?* `#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
5 y2 c5 j- N( g \#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
1 A- Y, u( J5 n$ J( {) O" ?9 H#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
/ E0 M2 o8 @5 m% T& K; `8 X9 q c. L$ T8 D
/****************************************************************************/, l, Y0 y" c. l5 r7 `; n
/* */
! F) B" L% X& S) i! H/* 宏定义 */+ y& v" u; S) W7 ]; c- \
/* */
. X: w4 h, z3 T7 ?5 ?0 ?- s% L3 {1 g/****************************************************************************/ p2 ?* I' \* G# r" ^
// 时钟
0 V$ r! Z. B. ?) \/ z# @#define SYSCLK_1_FREQ (456000000)6 R. N8 c+ s; r) x
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
3 X5 O( _2 |- t3 c/ o#define UART_2_FREQ (SYSCLK_2_FREQ)
+ V1 Q6 K: A/ s' s# J" }$ ^+ Y0 F3 X9 x
/****************************************************************************/
. @& b; I" J( h( G& S- ]! g/* */
7 y* @7 J. N/ g) x9 {( n/* 全局变量 */
% M( g5 N2 W1 a5 u/ A9 L3 u- g& [& Q/* */6 o9 d# N# p4 F- E# W3 [) `2 X
/****************************************************************************/3 i6 y' X2 C9 q- f, G
char txArray[] = "Tronlong UART2 Application......\n\r";
& m! l" x4 p" `" j9 f% d, V1 [, y' ^1 S7 }& T
/****************************************************************************/8 N- g' u1 t2 u& [ h6 z/ [
/* */
- c" ]5 x: N$ C ^8 B/* 函数声明 */
) \' [7 d y9 Q t, J* J/* */; i! C- \) C6 G9 P
/****************************************************************************/
* w; J2 _3 z& B) l# x+ f+ e6 \7 V7 X// 外设使能配置
2 W9 S! ~# o( `- G7 hvoid PSCInit(void);
$ [6 B0 t S! A: B
6 P) H Q+ I4 z// GPIO 管脚复用配置
* k5 I o& g D1 ~void GPIOBankPinMuxSet();
X3 W8 P5 Y) r. D+ r$ _* L- o( w9 k! x0 [; ~' k8 l
// UART 初始化
0 }* v" z( E7 h' Z7 c3 T" [! u2 nvoid UARTInit(void);
4 d) t2 V. Z% C) C' v( H2 {// ARM 中断初始化, N ]3 r& w- ^/ Q% i( v
void InterruptInit(void);
3 `$ l! d4 L6 a& B// UART 中断初始化
3 S: a6 e: e; ]+ ~5 ?. K. uvoid UARTInterruptInit();
" a' ~) `0 N7 ?1 M9 f// UART 中断服务函数# T, Y8 H1 o, t7 H" t* l- U; F) T
void UARTIsr(void);! `5 A; q9 Q6 e+ Q
- z! _& H: `+ _ v
/****************************************************************************/$ a+ _( r* y! ^$ \5 y
/* */
3 z) G5 t1 E. P1 v& H5 a3 _/ \. W& v3 F/* 主函数 */
8 w* S5 _& Z4 W/ E0 S) h/ Z! P1 [/* */% Q2 S: D, W# x
/****************************************************************************/0 W; P5 X+ v0 K3 l y' n
int main(void)1 J& {; D ?3 }* w6 J) H/ X( V3 o9 `
{
# W2 `# a# t0 x5 q B // 外设使能配置0 o7 ?/ T% @, _3 d }! ~- L
PSCInit();- M5 Z7 X x/ b; f# S# i
3 v. k$ C0 m2 L9 E$ v! I9 {
// GPIO 管脚复用配置! ]' z) V9 ^% \, z: S4 L
GPIOBankPinMuxSet();
" C" o6 }- f( t7 I* p* E6 D; A$ R$ O/ Z: _6 q
// ARM 中断初始化
3 c. j0 x8 x& z6 x7 {! s& @. L) J InterruptInit();4 v& c% p3 q# [6 b- P. h
/ m2 l: r6 X/ T) t3 \ // UART 初始化
5 H& [: y8 H) @ UARTInit();' D2 j3 e5 i, K
: U$ N: ~$ ?5 ` // UART 中断初始化
3 N. O& D4 W8 _ UARTInterruptInit();
( r, i( ]2 L3 q' g' c J3 A, k/ G) {. ?. ?7 ]1 m$ l4 B6 e) X
// 主循环
* o' \' }" F3 A5 ]4 ~9 P for(;;)
- a' Q$ f4 m0 q( ~& B9 | {
& D$ n( a$ t% X6 \$ K- j y) B! y' f" K* }8 o: |
}. J8 n/ ]& |# ]5 s, { t1 [
}
- ^% ~7 W- l$ K/ O
& T5 @/ N: h1 u) Z% U/****************************************************************************/" I4 ^3 E+ |! R" s
/* */
5 @0 a+ ]/ {7 |$ u, G/* PSC 初始化 *// H9 T6 g: C* r0 E ?6 _& V
/* */
: E! d6 M' t4 j9 }/****************************************************************************/
9 D) M) k7 Z' x- z- U" P9 k: v5 ?void PSCInit(void)" P/ K+ z9 I. Q, K; B
{
4 x! T. |: |: I W) H* M5 _; `% w2 ~% B4 J // 对相应外设模块的使能也可以在 BootLoader 中完成
9 C4 ~. x& J/ L W0 O/ A // 使能 UART2 模块* A- f8 S+ ^* j B
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
2 k7 O: Z) i# P3 G}; |1 B7 ]# G: S) C% w# i
: @' Y2 s$ }! x, g9 O
/****************************************************************************/- B* G+ T* W8 [0 h" X
/* */2 [0 w+ z6 ]: c. M1 {9 ~
/* GPIO 管脚复用配置 */7 v0 w" J8 X+ M0 I! I8 D
/* */3 `4 a Y6 C5 ]1 ~9 h7 ^
/****************************************************************************/ j! [7 u6 t: k7 ]& N3 @
void GPIOBankPinMuxSet(void)6 S! G; p* y5 Y
{! f' U: o% B; D: A% g9 `
// UART2 禁用流控" r& _/ `, ^+ c5 i# p$ ^* }
UARTPinMuxSetup(2, FALSE);# A/ n: O# D) e0 j- P* b
}+ [" o3 H1 `6 B0 N
* W- b2 @% y- h) F! V% S: v
/****************************************************************************/* M+ ^8 M1 m; @4 F! K$ ^, C/ O
/* */2 t# x) f! z5 g) u' q
/* ARM 中断初始化 */3 _$ L) r+ M7 C. E1 W! b: v2 F
/* */
+ _1 L' v* H* y7 {+ ]% R/****************************************************************************/
- N; j4 N- ]0 ~5 s, s4 ]& r' dvoid InterruptInit(void)9 i% F3 ~$ a! K/ }, ]3 q
{
9 d: z6 f5 E, X" q // 初始化 ARM 中断控制器+ S9 J. S& ~) a6 z" G; ~% u; J
IntAINTCInit();; o3 ?2 B9 B; o5 T ?
6 ^3 R% S! S% G9 v8 E8 D // 使能 IRQ(CPSR)
1 Z# d) G j4 y5 Z+ { IntMasterIRQEnable();1 p9 S6 o! C2 y1 f( T5 U
9 U( ~4 ?1 ?$ Q6 n
// 使能中断(AINTC GER)$ J, @$ g1 H& d' j2 T
IntGlobalEnable();/ w8 }( r6 a3 l9 U
+ C4 X* o' T2 b( T
// 使能中断(AINTC HIER), ?- ?1 G9 W; C& c. `
IntIRQEnable();( l- O U( `4 v
}
8 Z, g# L; [8 }6 Y5 V
, v5 q5 A! l' \! @/****************************************************************************/
8 J, ?% Z' `" S3 p/* */
s( w/ m; j. d8 C/ C/* UART 初始化 */
$ H7 o' M" s% @1 i" A/* */
; {" f9 H+ d3 Z5 Y/ ~+ E# w/****************************************************************************/7 D0 f# ^0 n. l* H2 n) M) M$ H
void UARTInit(void)
& U- ^$ z/ t, t/ l{6 d( } \2 q4 V2 u! p! U) j
// 配置 UART2 参数
8 U7 Z2 \% {- h. \! J# ` // 波特率 115200 数据位 8 停止位 1 无校验位0 L* F0 i9 {: ]+ f
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,% ~* K* S( a1 a+ U0 Z, u/ ?2 E
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);) D3 ?( C- d- E2 b$ y: \
// 使能 UART20 I# b1 C8 G j2 Y
UARTEnable(SOC_UART_2_REGS);
& a2 p) W- s K! x$ i1 e. T' e; K" u9 o1 R" E# k
// 使能接收 / 发送 FIFO
4 w0 ]0 T. t1 |( g UARTFIFOEnable(SOC_UART_2_REGS);
5 y; j0 h1 _5 V/ D1 b: a* d ]. w: K9 I+ S: S, M
// 设置 FIFO 级别4 `2 h. Q/ W9 c) b; z2 X. V
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
. S1 n8 |( z( v}
3 r* L8 V8 j- ?6 W% m
& |: l% `% S3 A1 y, c: d/****************************************************************************/
9 J2 K2 k+ d, K+ j/* */
6 f- M+ p4 Z3 I! @/* UART 中断初始化 */7 u/ m( R& ^& j% L7 K5 |
/* */- C& M+ S' I1 H; n
/****************************************************************************// y! @3 w/ _! T* n# ~# D. g
void UARTInterruptInit(void)/ q& N1 y$ H# A
{, T% ?; d" P4 K5 x9 ^
IntRegister(SYS_INT_UARTINT2, UARTIsr);6 f. f8 B& g. Y8 Q2 J$ c
IntChannelSet(SYS_INT_UARTINT2, 2);! j# s: X7 p) c
IntSystemEnable(SYS_INT_UARTINT2);
2 s" R5 i& ] s+ F1 {) J; q. {$ o% H2 K1 e6 b- J1 I+ _. r
// 使能中断' T/ [' u5 B* _* A! O, j
unsigned int intFlags = 0;
, o4 |5 ?. C; x5 q: s- `1 z* u. n! M intFlags |= (UART_INT_LINE_STAT | \
% W6 \" u+ ^9 c9 U7 Q! t UART_INT_TX_EMPTY | \: P0 X, Y$ D/ C9 V; q4 n( j
UART_INT_RXDATA_CTI);$ X# M- v* [/ p/ y7 X1 {, W. K; B8 Y
UARTIntEnable(SOC_UART_2_REGS, intFlags);# _* }! F' C/ y
}
- D9 ^: \$ e( _$ k7 `6 F3 x& ~! h% U* p, V
/****************************************************************************/
$ c: ^6 @" C5 v& _# ?+ H9 O8 s" P8 X/* */# D5 T! q. S* k( s8 L; e/ z
/* UART 中断服务函数 */) [ w9 |6 I' I, x
/* */
: A# u3 I0 e2 ]% \1 Y/****************************************************************************/5 h+ T/ q, u) ~: j. @, P; H
void UARTIsr()
. D" H; x) z {1 W5 r& k. g{
" R! V& n2 s4 u, O static unsigned int length = sizeof(txArray);
; R* T0 ^# B N) o2 t static unsigned int count = 0;1 {: C8 A( I n# _7 k
unsigned char rxData = 0;
2 f( C$ n1 Y1 ^0 F unsigned int int_id = 0;
( z: L) m. {. f: P2 N9 b
4 i$ u9 \) `3 L6 B: |; _$ ]0 T // 确定中断源
9 S7 `2 E; G. n5 V& d int_id = UARTIntStatus(SOC_UART_2_REGS);; n$ R# R- U2 G' j- T7 N
; o& `! L, z# u) \ ?# Q/ X
// 清除 UART2 系统中断
1 P! U* a' h6 R+ T' B, z IntSystemStatusClear(SYS_INT_UARTINT2);2 F m8 W& U% O* o+ J* c
$ a9 J% G: W3 G$ @% S$ [( u // 发送中断5 |! ?* W% R- o% T& z: P
if(UART_INTID_TX_EMPTY == int_id)
+ q/ Y/ e' o$ @ {
1 P t7 z- Y% W, d if(0 < length)
, [. u' q( g7 s+ G5 S% u. d {7 V& G, \) |! r7 |3 m# {
// 写一个字节到 THR5 X! F% V" f5 j3 G; P
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);- q& o2 Q/ C8 N! F
length--;5 q$ X E. }7 q* v5 C& r- T8 `
count++;
% N5 C4 X) S7 v5 L, i$ G* ~& m }4 ~) O( `2 N; w1 Z
if(0 == length)6 y8 y6 I2 w/ I' e" ]2 I1 R
{
* y. E5 m2 Y8 m, ]* m, w // 禁用发送中断 s2 c- t( B7 Q# C' F
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
4 F# I9 U; l. I; G/ p# b }# o& D) s2 \& |
}
1 V* e# k4 O$ ?5 N- `! c0 {1 G* `( Z/ L. _/ g; e. S. F. i- E
// 接收中断* j; }4 F, g. }; T) N
if(UART_INTID_RX_DATA == int_id)
7 r( |5 Q7 u& I7 O( L6 l& Q: } {! u$ \4 ?3 v0 V" ?. q4 T1 @' v
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);4 F7 ^' e9 Z# \" K5 K
$ E+ Q6 A) F; q
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);) |6 ]3 [# ~7 `1 R
}7 t5 i6 y8 I8 \- R+ d
5 v3 i4 d) q9 M5 d- R% ~
// 接收错误) j; [; k3 g1 `1 C" N# S
if(UART_INTID_RX_LINE_STAT == int_id)% Z8 e) j! E' h* J: ~- F
{
* t) M) X$ K/ o* z5 V while(UARTRxErrorGet(SOC_UART_2_REGS))
[9 j$ | R# I' C. r; q4 M F* T; m3 b {; n/ d3 }, ~$ e9 W
// 从 RBR 读一个字节
! S: m2 X9 f* n+ v3 i4 f C' ? UARTCharGetNonBlocking(SOC_UART_2_REGS);
4 S: v% z4 G; P6 f" j* U }
" ^( x2 l7 F! j6 N2 x# j, S }* h8 @4 d6 x2 i
" n+ x; p' [. W* C1 n) v
return;
) L5 d8 g& t: m9 _}
' G% ^2 q7 {' j! L |
|