|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。: Q$ v/ A* R6 ]" ]9 b9 m6 D) ?
7 T- g+ O$ R U; ^/ z#include "TL138.h" // 创龙 TL138 开发板相关声明
; C8 o8 f: V8 _. h6 }- n
) B. h7 o6 L0 O8 C" A9 k1 g+ Q#include "hw_types.h" // 宏命令
9 f j. B, I W* e/ H7 M7 J& f2 E#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器3 g& m5 H& ^ c0 d1 Q1 w
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器3 Q9 _3 y( o- D$ q" l3 m
U* c- |. O, f n% s; M#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明) e1 _; w/ Q! x7 {7 z( q) R: t
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
1 e* W! b0 w: W! [6 i% F% A#include "uart.h" // 通用异步串口宏及设备抽象层函数声明) z( `8 h& S, {! v0 J/ r
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义- S- A- X5 @( z- q' V% `. E; A
4 b! \" w# O* ?' t8 j
/****************************************************************************/
$ l0 f9 I. M# p3 I h/* */! Z) ~/ O% x$ I" i" V$ e& O9 R' `
/* 宏定义 */
1 r2 e R/ V. @% j. q1 E8 |: ?) G/* */
" ^) w3 v& A( F! J/ n+ L/****************************************************************************/
) h) G7 B- n) h. R- ^8 ^+ N// 时钟
8 _5 c# z+ c; t" V% p#define SYSCLK_1_FREQ (456000000)/ x; s* c1 ?1 x8 }# l, G
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
- ~8 q; {; B" ^2 N+ g: R+ `#define UART_2_FREQ (SYSCLK_2_FREQ)" a/ r; a. `$ L. j* B0 O+ b
1 q# {+ t+ ^6 b. t9 o
/****************************************************************************/9 B/ k2 u- p0 Z! o
/* */
! `" n* b0 z8 \! Y- i. c$ T/* 全局变量 */
3 `5 w' G; f; @, J' c9 x9 Q/* */
5 W1 g! w2 d5 k& j7 ~9 s0 j/****************************************************************************/, s, }5 e, p- N, H% `
char txArray[] = "Tronlong UART2 Application......\n\r";
& ~$ z6 d+ |7 B% r1 T% p$ J. N# z( y3 o/ ^# C/ ]2 n! P, ~1 B
/****************************************************************************/
/ k/ r. f" r0 ?/* */( E4 I5 l2 K) J+ J, ?1 I
/* 函数声明 */
0 Z, ]9 P, I6 L6 v! O! q* ?+ P2 K/* */
6 H, u$ G, F a. n/****************************************************************************/7 \" R" X1 k& Y
// 外设使能配置* C2 a4 \0 Y6 V: k
void PSCInit(void);
& P, A0 b- p/ {) ?5 @! d/ b' R6 E
0 w( }: C+ M, T- L; J// GPIO 管脚复用配置
5 ~. ~3 v, \& q1 Z5 G& l. Rvoid GPIOBankPinMuxSet();
: p* i) `/ K( [% G: Z C' a5 N! d
// UART 初始化$ ~, H* r) A0 g4 W
void UARTInit(void);
" \4 |$ P; u. i! O5 J t& y" P// ARM 中断初始化# u7 |! D1 m2 y' n X& T* Z
void InterruptInit(void);- ?( J6 Q% ?% k6 [7 D, ~2 |8 O
// UART 中断初始化! e+ j6 D) n# \9 t" f5 U
void UARTInterruptInit();
2 X5 O- W: e1 Z- J: S// UART 中断服务函数
5 `; f+ j" f- F) n8 s9 a P3 G8 V/ Tvoid UARTIsr(void);7 {; W" V/ Q: g: Z
" `6 G+ A% m% k+ Y: ?; ?/****************************************************************************/; Q7 T5 V0 C0 h/ b& b
/* */ |9 j# \5 v/ T% _( ?2 e. A; K# Q
/* 主函数 */5 E7 P- @; f: m6 ^! O+ y
/* */
6 @. |/ ]2 E( n/****************************************************************************/
0 m' M' M5 x9 m1 x" w, K. u$ U, Nint main(void)
+ Q( `! a! U* @( n9 M* b( @{
4 M/ ~! X3 v t/ V // 外设使能配置
6 D% C. K% p9 H! ] PSCInit();
$ Q( X; K6 M, D( J; I
' B( V$ h2 S0 }/ X // GPIO 管脚复用配置: T3 E$ J6 p; F
GPIOBankPinMuxSet();
7 K+ g9 k$ p. A, z3 e; z+ j1 U; | f; ^- B' w; l0 [6 F
// ARM 中断初始化# ]5 g, }# _' j, |) P
InterruptInit();
& j! N& E: a3 `% I# [9 X) A \' h& f# J0 s$ f
// UART 初始化6 p6 F+ v) b' Q5 i
UARTInit();3 l# z! Y1 a) U7 J- y* n' ^
9 ?! @) S$ ^' L/ C5 `! S! V" W# b // UART 中断初始化
7 f+ B# x3 Z. f3 r2 x2 v, N0 c UARTInterruptInit();+ Y, `) B; w Q
& ?% X" A) a' p4 O
// 主循环
, V& z B( x8 i9 L7 k for(;;)
; V7 R4 x0 V7 F% O) f {- r1 [( i2 Z2 `. {4 U
( P9 U( f3 @+ _2 J$ r: l }
# ^! V0 ?2 p& T0 P}8 N6 E7 l- J9 M8 H4 B* |
8 \ }- I# R! l6 v, x; ?) ]/****************************************************************************/
" X' J% Y1 w7 R/ L5 o. l/* */
1 f5 F" Y$ }* }( D8 G# t, K) A/* PSC 初始化 */ b7 h1 N2 o0 K6 S, G
/* */
+ e9 W- i/ d1 A1 ?, {/****************************************************************************/7 s) {5 F* O8 A* D' @7 @
void PSCInit(void)
3 K: ]2 Q1 y: M+ p8 R{# O1 j* E& m- z7 k: A
// 对相应外设模块的使能也可以在 BootLoader 中完成
4 `1 g( W, f* h) x$ q, J9 V+ [4 ? // 使能 UART2 模块3 j9 b; D! w# ^# R1 r: f5 z
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);; B. f) U( g8 x( x1 ?) |
}( `5 s" n* ]& y7 t" a8 H
+ }0 ]0 k4 t; W2 I/****************************************************************************/+ m2 |" z8 f6 t6 W `7 i: o
/* */' J9 L! D1 @( V! t" w
/* GPIO 管脚复用配置 */
& _; g( Y6 M- w% X; R2 T4 o/* */
6 k$ j8 {6 F, z8 [3 ~/****************************************************************************/
1 h" m8 @; K$ p( fvoid GPIOBankPinMuxSet(void)* e3 N6 N% W9 N$ k, b
{# K" ^" b: ^1 b( a( d( R' p( B
// UART2 禁用流控
- h6 J7 o- `5 O/ Y* J. V7 H UARTPinMuxSetup(2, FALSE);: ]. {% d9 p! s- O7 P4 J! o, E* g R
}
7 S0 J+ t" N2 t: }
* [4 I+ @) O8 y+ g2 Q) X/****************************************************************************/
- y4 J$ T3 q. ~8 ]/* */
( u9 z! Y5 Q' H/ G9 N, ]' M/* ARM 中断初始化 */
8 J8 a/ Q! c6 u* ]+ L6 V/* */
; o9 L1 d) ~4 Q% w: g( Y/****************************************************************************/+ i7 R. ^& N* p
void InterruptInit(void)
0 g3 N" w% _( b4 C6 z. J6 s{
9 u2 S9 ?& h6 \3 b2 [# n // 初始化 ARM 中断控制器8 E7 @5 K& i, K9 c( H2 k7 Y' o, E* _! H
IntAINTCInit();1 ~7 X; I4 U' B T% B, r& g
* Z; O. g& r: i( r7 q9 M- M // 使能 IRQ(CPSR)
0 ]8 d. m4 i9 D2 ?, ?3 q/ c IntMasterIRQEnable();
) V% E# J4 Y: M! C# e( m1 q" |
$ C# H" F8 e( ^ // 使能中断(AINTC GER)
& m' c' q! n6 T/ P$ F, w4 T" ~ IntGlobalEnable();
{/ i. B. n- B$ ~) b6 y- H+ X* F$ s# Y' H2 I
// 使能中断(AINTC HIER); ]8 w% j! o+ D0 G, d* [4 ]/ g" P
IntIRQEnable();: v, p7 }/ J- v$ s" a5 h
}
5 ]9 @- L3 y6 w: s- ]
* S, i/ l' F: M. }3 n/****************************************************************************/
' U& n0 j( A" Z, g' N/* */" O4 C( B* O5 Z
/* UART 初始化 */* c3 T! t% Y4 v& y1 J3 I
/* */
/ ~. s) O3 f) R+ P. a1 r+ G/****************************************************************************/
1 _/ }! U/ a3 tvoid UARTInit(void)
! ]; C5 j& X% S8 _{- e# v0 ` H4 }+ L) d
// 配置 UART2 参数
* d& ^: V4 N8 @ Q0 ]$ ]& @1 F // 波特率 115200 数据位 8 停止位 1 无校验位1 ~: x% x: ]9 p5 e
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,- F6 z% n# b5 x" X+ b5 m
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
9 x5 ~ F6 T w; X1 T // 使能 UART2
/ W/ ^' W' W! U- r Q UARTEnable(SOC_UART_2_REGS);" D5 g7 J& `) T1 v& v8 K
& o/ v+ x# ~3 [3 n/ A/ p1 e, z
// 使能接收 / 发送 FIFO
( b9 y' t( S ~2 Q8 X/ R UARTFIFOEnable(SOC_UART_2_REGS);: r1 z: X$ ^, V
9 A' {/ X" o+ C5 t7 R9 }0 ~
// 设置 FIFO 级别 F$ t' t- U, B1 A+ f# t+ [
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
* L; z8 Y! ? [}
9 g W- m) H N" H% _) _: c7 _- ]/ I+ |/ @4 v* i( B
/****************************************************************************/
/ A- c( n& U, Q) G" `' U/* */* f2 A' i2 G- J! t
/* UART 中断初始化 */( i6 z+ U' Z& |, f+ x
/* */
6 x# [2 Y) t- B$ ?2 }/****************************************************************************/
0 s a9 m# B7 zvoid UARTInterruptInit(void)
+ M* ?% D8 b. U' n9 ]$ E/ p{
[" Z( a/ l/ f: E/ {. n/ X6 \* B IntRegister(SYS_INT_UARTINT2, UARTIsr);* ~; q' O: `6 J7 v" E
IntChannelSet(SYS_INT_UARTINT2, 2);
2 T% `; g5 O' ~# s: R H IntSystemEnable(SYS_INT_UARTINT2);! ?8 O0 T( ~8 o
# y; f- Y" |# { // 使能中断; [- z9 B7 `5 [4 E, Q
unsigned int intFlags = 0;
?4 `3 I/ R/ c( Q( K/ o& y7 n/ M4 ` intFlags |= (UART_INT_LINE_STAT | \
! {* r5 Q& U$ b1 F UART_INT_TX_EMPTY | \
4 z; b7 o+ _- F% c9 r9 h4 L$ x( { UART_INT_RXDATA_CTI);" ^! W- E$ r* H2 L7 j
UARTIntEnable(SOC_UART_2_REGS, intFlags);
+ p( ^. B1 A$ Q7 ~}
* ]: m2 u0 S% ]8 [$ Z1 x# s' o; k8 k: [" q) K/ q6 F" x+ A
/****************************************************************************/2 s# a$ B4 D& o4 \7 r U
/* */
7 L8 Z6 K# B* {/* UART 中断服务函数 */
1 i( \' J" [! g/* */7 o4 ]) A7 q- N7 h! l m' ]
/****************************************************************************/. N& p8 `+ a" g( s
void UARTIsr()
% z$ g& H/ R+ [2 Q) Z. t{: i, A. T8 k# w; J# a
static unsigned int length = sizeof(txArray);8 b3 J# Z* X( Y
static unsigned int count = 0;
* Z4 D6 `: M9 j8 x1 Q unsigned char rxData = 0;% H: c6 [: W/ S7 s
unsigned int int_id = 0;, a' J$ U, p0 n: Z
- _+ {9 `+ M4 I- D* e$ x
// 确定中断源+ }( M5 u$ @4 {& T
int_id = UARTIntStatus(SOC_UART_2_REGS);
' H) Q. H& D3 J6 R! u; ^6 ]- ]6 Q* r: l
// 清除 UART2 系统中断
- H' m1 l$ {' T IntSystemStatusClear(SYS_INT_UARTINT2);
" L/ _6 T/ u" N) R" T0 R$ s, z$ G" q: l- t( F( y
// 发送中断, _6 P, g3 P& `% d' R* I" G" p4 Q- S
if(UART_INTID_TX_EMPTY == int_id); H2 ~7 V& m# X" S2 o, Q6 |: ~! ?
{
2 g0 n* F7 G# M2 M if(0 < length)/ c6 f9 \2 J+ H1 n% S
{, Q, [# g% R, U% R, j. `# c4 Z$ c
// 写一个字节到 THR0 _: L+ x, N: `' z9 n8 o3 E
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
9 D4 c2 i6 R Y( _ length--;/ B+ i# n$ |! E3 u9 p A
count++;* _% O0 J6 l) R. ], I, W7 n9 |3 p/ Y
}
. P) r. a1 L0 g- V if(0 == length): d7 U* ^- U# ~ n" P. S
{
& G3 s" i1 g% t8 j // 禁用发送中断1 K% Z* a8 J+ r4 p* f ]$ [" f8 G% K
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
. h# G M# {3 T }
5 f* ?/ ~5 @4 U5 g% o0 C$ n }) z1 K. I% |% C5 z! L% S
" M+ ]( U% B m1 j( G3 B
// 接收中断% y0 J0 J" L% y
if(UART_INTID_RX_DATA == int_id)5 }6 H! N. Y) g2 H
{: O- M, h t5 E. F4 d1 V
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);+ M2 `. Y# i U- b# h" Q. f
) b1 a" y) l4 T UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData); r. g* K" B& Y3 y0 l9 z& C
}
' J b5 @; f/ m' p/ {' r6 B+ A( {0 {% K* c* O! |
// 接收错误
: \2 |" q( ~7 Q; L2 } if(UART_INTID_RX_LINE_STAT == int_id)% f) F1 S! e7 P8 Q6 m
{! b+ W" d4 i- t6 E0 u
while(UARTRxErrorGet(SOC_UART_2_REGS))
: i% N5 Y$ L9 Q- ?# {! ]4 f, ^1 a {9 B0 X3 J V$ k7 o
// 从 RBR 读一个字节
3 K0 l! X( K4 M* k0 \6 w% R UARTCharGetNonBlocking(SOC_UART_2_REGS);3 @ m: w7 ?* j
}
5 L) v" q6 E% n5 n p7 c } Q L' z: L% |; Z
/ A" ~1 z* U) [5 @
return;. c( f" }9 c& b6 a3 D1 }' K& x( E6 m
}) _; T1 ?1 P# `
|
|