|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。$ f5 Q9 @, N9 x6 J; O
; k4 f1 [) z- A1 Q2 c
#include "TL138.h" // 创龙 TL138 开发板相关声明
' ?1 n9 h: |& G5 f* Z) B# P3 x' l% Q7 I! U; [- L
#include "hw_types.h" // 宏命令
6 a- h* D; W) M' [3 j2 |#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
, M% \' k6 E* Z: ~#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
( N4 {; ]& V& Q# Z8 R) H0 c8 ]. ~- @3 e8 e0 P, v- j+ c
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明# o% u0 a" d- X: R3 a
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
4 R: z. Y$ U3 U0 p' M% r8 J+ o#include "uart.h" // 通用异步串口宏及设备抽象层函数声明5 e* U- T9 ~- E! }6 i0 A4 D* o
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义* O8 @7 H. }9 ]! V. M) t
! r, [0 e! w5 P) B8 T9 K/****************************************************************************/
- ~- A6 p) i& s' `) {/ ^6 U2 [/* */
1 w; c& K+ {/ x6 r4 ?& W+ b# w& o% p6 t/* 宏定义 */
8 H1 O/ z' F/ q3 x3 q8 Q: G0 M; }6 Z/* */6 R2 l. g/ R; _3 |4 H& j' \( z; l
/****************************************************************************/' b8 S# Z- M Y9 c; P& P
// 时钟
. @3 z$ V" d7 T' G3 C! C#define SYSCLK_1_FREQ (456000000)
* z1 E8 p# \8 L) ]# C0 S, O( i4 h#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)1 N' V+ j& ^# S' V
#define UART_2_FREQ (SYSCLK_2_FREQ)6 y# S- D% w' o/ G- N4 j
6 q, \4 T* O6 z' q; W% n( Y
/****************************************************************************/0 S* u0 K. i8 v
/* */. e' @& f# W' |& E
/* 全局变量 */
$ N' C ^- I' W5 m/* */
- `0 w$ G" P2 c) Q) U! G4 ]5 |/****************************************************************************/" {+ E' q+ `( l' H4 e1 Q# i
char txArray[] = "Tronlong UART2 Application......\n\r";& O% n' T' X, L2 D
" |4 T* U& @9 T5 |9 J; W, [. a/****************************************************************************/
# ]! F1 d: P/ h3 W, w) P" w) X/* */
( M* V- d' z6 `, L/* 函数声明 */
5 U! G2 t3 C/ A/* */
: K% s. O- r$ L; |6 x3 M/****************************************************************************/
% W$ H# M b! _% z$ i// 外设使能配置: N' w+ U3 _" Z6 [" c i
void PSCInit(void);& D& \$ E# e4 v T
# |$ E+ H, ^$ f9 k( X7 _: }// GPIO 管脚复用配置) J' j8 H* L; u
void GPIOBankPinMuxSet();* F* ?- R8 c4 s
. p: B3 D; p# u V$ X% k
// UART 初始化( X; v, E" Z5 N- M
void UARTInit(void);
# l' z: C8 r" d3 K- m( X' G% I8 F// ARM 中断初始化
9 n. o( v2 X0 S8 v0 v3 B/ V$ ^void InterruptInit(void);
# |# E v0 l2 y: z// UART 中断初始化
+ t) J/ A5 s* o7 mvoid UARTInterruptInit();- x: P4 w# r* G. p" J
// UART 中断服务函数
$ p3 c$ A8 A% z( B3 M$ mvoid UARTIsr(void);
3 U9 h! [/ Y9 e6 b* G1 f: D: s
7 w' m+ U# R. ?1 f. Y/****************************************************************************/
& E7 N' [' W; j+ b/* */% J o- r; R6 K8 J- g. t& ]7 Q3 Q# P
/* 主函数 */
" f: r. T6 ]% B3 {* J/* */# i1 b `" M: z5 C. X5 G4 t/ z
/****************************************************************************/
. Q l8 F( e' r; _int main(void)
/ W' c/ o/ J) ~2 C/ X( l{
* Z. f. E# ]1 w& n // 外设使能配置
0 ^) I6 f! {" ?! w2 P PSCInit(); {! I+ i6 F4 |0 w. s
8 z$ i8 w( C% h( O
// GPIO 管脚复用配置
0 w8 `9 Q6 R3 J! \6 A; k$ j6 m GPIOBankPinMuxSet();
7 S3 H4 i J2 F+ b$ f0 p0 g, \( t& q3 U w0 P
// ARM 中断初始化
6 B* _3 U4 u4 E5 F InterruptInit();0 y8 @! `) S% }2 Q5 q
) i0 R$ Y! \* p. q1 t
// UART 初始化
% F7 j8 U- B. A9 f% @ }) M) U UARTInit();
. h0 f( t) B2 s. H8 ?; G4 Q& S" A* K% U5 O6 ], G
// UART 中断初始化
! w: o) Y6 S# C4 Q$ b UARTInterruptInit();1 ]8 C& d" U$ t; w0 E
2 t1 S& C$ h5 i$ h [ // 主循环; N- \ w. b& _/ y6 V5 V5 Y
for(;;)/ A0 a, F8 K7 w. @% f
{
) O% q- m" t4 Z+ v" R2 w: E
# [# ~1 k& t5 \% M6 l \8 F }
# d! [9 w. t1 \! O0 w}
8 Z) Q2 Q* n4 K# c: o$ j. k1 q- C% L
/****************************************************************************/
e: `, C, i* A* K/* */' U1 a& O f/ ~+ |
/* PSC 初始化 */% Q9 E- Y- S4 r0 v
/* */& V0 R- L7 b6 I( H' G- q- e
/****************************************************************************/
# p1 d0 ]' m% f7 C1 A& bvoid PSCInit(void)
: A+ m$ N6 ~$ z) |- I{
% X% H3 z9 K' q% f2 Z, k" v3 P // 对相应外设模块的使能也可以在 BootLoader 中完成
' ]+ U1 M+ N6 U) b // 使能 UART2 模块; n9 i9 R p5 d6 m( a# [/ g' n
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);- m3 ?, u9 b' f1 r D, `
}- b# W9 i9 i4 F0 B8 F
6 |2 |2 O+ B% C# g' G! p/****************************************************************************/* ?0 X& a: _$ X/ P/ R- I
/* */
- ^2 R, s# x0 I m$ `/* GPIO 管脚复用配置 */
. r1 O4 y9 B9 C, y$ `$ y/* */. T& M* ?7 z5 U2 K4 z
/****************************************************************************/
* E) `- ?6 d4 J9 k) O1 ]void GPIOBankPinMuxSet(void)7 W- e& M+ ]9 m# u! ?1 i
{
8 R3 S. x% m% J7 i9 ]: F0 X // UART2 禁用流控. Q( n5 E2 z- { o/ J
UARTPinMuxSetup(2, FALSE);1 \$ A& t" V: w" Y
}* a# w" c* V& I: u7 x8 o
7 ~3 | P) y( _( D# F$ z4 U
/****************************************************************************/
( l5 S, O* I# b. q$ N3 ~8 V/* */- {# h. L. g6 I; x* Y1 w0 _+ }
/* ARM 中断初始化 */
1 q4 `4 x; H% l6 T! A/ x {) \7 J/* */# k& B& i# ]" I( |$ k
/****************************************************************************/
6 v+ S3 ?: @- ?: A% ?void InterruptInit(void)
4 n7 W* R# x# w% [2 R4 N% Z" z{: ]6 [: ]( f3 E; _4 ?
// 初始化 ARM 中断控制器% _) i: v7 [$ k4 ]! G
IntAINTCInit();
3 c# u: s% E; d7 u/ ^) u2 b j [: V3 w7 G
// 使能 IRQ(CPSR)
! C5 F3 P5 V7 g& R IntMasterIRQEnable();9 J2 [1 _* \8 B' d. j) [
j3 {$ M, w# x, w) r // 使能中断(AINTC GER)
3 H% V" L- e n7 P IntGlobalEnable();
9 b8 ]1 v" |' h
3 ^! q* K5 H c }/ W3 Y9 {. [ // 使能中断(AINTC HIER)
$ g0 U5 U" k- M6 B/ z IntIRQEnable();3 b7 i# S% D, B W& y7 t
}
2 U4 y* t X0 T' Y- b$ h: c
7 _; S* v- I% u6 j0 J1 t- P/****************************************************************************/
( L, w5 k0 u# o# p) H7 ]/ t/* */
9 f$ C# M0 p: c& d7 p/* UART 初始化 */
4 C0 Z. p4 t, }% Y2 y+ @) C: O$ Q/* */( t) S, a8 d. J* x8 u3 t% T u
/****************************************************************************/6 y% R7 [! _. E; D6 V/ n
void UARTInit(void)
0 a7 ?% W8 x) n# q{
. c4 L' C+ J3 }* F' K2 O* _ // 配置 UART2 参数
3 t. A1 X e* t, I* b // 波特率 115200 数据位 8 停止位 1 无校验位, F- s/ }9 P1 y! ~1 y% C) W. ~
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
- R5 w3 n& e ]* @ UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
4 }: U2 C8 [ _0 L$ f // 使能 UART2
, R/ S( l3 T, N5 h" }2 \ UARTEnable(SOC_UART_2_REGS);
0 ^4 i; |7 B2 x* p7 H- R. Z4 g2 ~
v: F1 q0 ^- g' A" |1 |. ]6 G // 使能接收 / 发送 FIFO
; _" G Q0 b" [, x5 U UARTFIFOEnable(SOC_UART_2_REGS);/ {0 |+ j Q- x
$ r& t4 Z' |% x8 z& D, L6 v
// 设置 FIFO 级别, ~9 c# C7 H- z
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
8 k4 {6 |- r x) O}0 z" c* r$ l7 P* e+ D& V8 m
0 j2 F d' a* C5 @0 g8 [/****************************************************************************/, Q& C C3 t; y( A/ r
/* */
4 K$ m+ |) u5 l/* UART 中断初始化 */% s2 P5 V/ c! J
/* */) E. S7 n9 U2 X6 Z; d2 f( F
/****************************************************************************/
2 T4 C6 i! _# x Lvoid UARTInterruptInit(void)
4 E# h2 c- g) x: R" {; j# n{/ R( \5 |# W4 j4 j. E3 g
IntRegister(SYS_INT_UARTINT2, UARTIsr);% i! S+ |* M: f
IntChannelSet(SYS_INT_UARTINT2, 2);# N7 I- o: T C5 E: E
IntSystemEnable(SYS_INT_UARTINT2);; C- c& \, `5 w! ?& g v
( T! `( _& b2 ~8 V // 使能中断% f* h' u; l% j
unsigned int intFlags = 0;
* A, l! T2 R0 ~/ ^ intFlags |= (UART_INT_LINE_STAT | \* u' ^: a# h8 v+ x, n
UART_INT_TX_EMPTY | \
2 W7 D- n6 }' p9 G% K8 `. T; Y; Y) } UART_INT_RXDATA_CTI);' g" u* P) x# f( K5 V/ w, H, G
UARTIntEnable(SOC_UART_2_REGS, intFlags);! D; n. f# u* W4 g; e
}
; m9 U9 ?2 k7 I% E9 O) f, U. ^: ?* y, p" M" B' ]% @
/****************************************************************************/0 n5 ]0 ], ]+ W1 P. V6 Y
/* */8 V* B) _/ h! ~5 Y5 h' o" w( E: l
/* UART 中断服务函数 */! ?+ p! j# s4 }$ K; a
/* */
; s9 g) M& C) N6 A6 \! g/****************************************************************************/
( C5 m2 ?$ g) g7 `void UARTIsr()
! H" L" a5 t/ `3 M{! }) I6 _# T/ Q5 n6 m
static unsigned int length = sizeof(txArray);
3 T4 _" P2 p: b6 A5 g. ^* K static unsigned int count = 0;
: g" d6 r! K. e5 M/ y& D unsigned char rxData = 0;5 L$ w, L; K1 w F7 X) c" I: M
unsigned int int_id = 0;
' `0 u( O# {* J0 @" ?# X) U, i' r# Y# C# O
// 确定中断源3 r. M6 C* s! w% g: K% |. C
int_id = UARTIntStatus(SOC_UART_2_REGS);# {* h# R5 t! G& N0 A
" m, c0 J3 m8 F' c( P0 L; _7 l // 清除 UART2 系统中断
' k9 B: }" D* ^% f9 y IntSystemStatusClear(SYS_INT_UARTINT2);
! d& R" y( J/ n/ q3 K. P* c
B* Z) Y$ O2 Y! _1 X // 发送中断& F3 v/ X% F- G g3 \8 k8 v
if(UART_INTID_TX_EMPTY == int_id)9 v' w3 H7 p0 ~8 w( m- g$ q) P) }9 R9 q
{4 K# T9 m& w& L0 i+ T
if(0 < length)2 O' P1 D4 a; f8 `3 D& O; s" B2 X. v
{
5 v. G* N/ _& M; T" e8 K" B$ ] // 写一个字节到 THR; _# q% _$ q2 e
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);( n% F5 P9 e5 D
length--;7 L3 D+ E; {# H3 R
count++;1 b' K) U- V7 B$ P4 E8 f* L
}. O+ I! e8 g7 h2 i {' Y# R/ Q
if(0 == length)& ~- i, S2 n( l& l, s
{3 i4 g5 O: U5 Q9 ~4 b3 T
// 禁用发送中断& I5 K* t% H3 E. f" O6 F/ _/ J7 s
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);) h+ y$ i( b$ ?
}
: F6 ^7 \- E3 r( [, D }
5 o% G, A& p' z M) Z; p$ `8 j/ G0 M& W7 X, F2 Z- h: h& t
// 接收中断
2 f Q3 C3 i# x! b# X! t* ?) P if(UART_INTID_RX_DATA == int_id)
, E( ~2 \! t% c/ @' b: @ {
! |, h) l+ V/ l" f6 \: M rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);7 ]# s; E) T) C8 K6 A
" ` r2 U' k1 j. a$ Y
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
; Z) J# L" B) R9 `6 t" c }
! b r" k; Q$ E4 t5 Z8 K- e! q/ E( r" O4 E( Z, f, d4 w* F
// 接收错误5 K) V0 H1 ~# m% D$ C5 U
if(UART_INTID_RX_LINE_STAT == int_id)" E, u5 e, u9 M' }: {9 _7 h& q
{0 \' i; P8 R: V3 R; [$ R
while(UARTRxErrorGet(SOC_UART_2_REGS))6 X9 E4 D4 e% T3 E5 `
{
" G" l7 B$ z. R9 A$ M, I4 k // 从 RBR 读一个字节/ [% s) A1 |. F; [" t# R
UARTCharGetNonBlocking(SOC_UART_2_REGS);
3 j8 f+ f4 A1 X( g1 y0 V }' i; K0 j" w4 G$ }% ]4 P
}
- J7 C6 A0 D! o) X; m; z n
) K/ s& k8 V" O return;; @; `% |7 `' ^! B6 X# K0 D: X
}* A5 m j0 }3 Y: \! X+ T. [/ ^ V& p; O
|
|