|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
+ R T& w# r; l0 m/ Y7 k# [( g Z& E `! K! [- C0 P- t
#include "TL138.h" // 创龙 TL138 开发板相关声明
) p. n, d6 s/ W. N
, J+ p Q' a1 m- w6 u#include "hw_types.h" // 宏命令
/ n& R1 g6 ~9 h#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
, B& W: @# O# r0 |$ ]- j! e/ ^#include "soc_OMAPL138.h" // OMAPL138 外设寄存器! m: V6 M+ C# H& R
+ c% r% W, A8 W1 X, {#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
2 b! f: [6 M5 d {. Z#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明0 j! v& y$ k: D$ r/ z3 @5 R0 o; W4 f
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
, v" m5 m' U. n4 C! I#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
( I2 A# F9 Z( L. l- {% C' p8 g. _# X6 \! e, I" ~! F E
/****************************************************************************/
" I: Y' K3 e7 P6 R2 O# C/* */! _( r+ l g0 Q1 m7 h8 U" P
/* 宏定义 */
$ v0 C5 R$ E: ^( J# {: g# Z/* */7 E" t& _, y! t+ ^. T5 ?* _
/****************************************************************************/8 s! y: n6 A) x
// 时钟- L4 e, _! @. Y$ H* M. L
#define SYSCLK_1_FREQ (456000000)
0 d O/ i' N* |9 O+ L/ r0 C8 ?#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
2 k8 O0 T; }) D3 j$ S#define UART_2_FREQ (SYSCLK_2_FREQ)8 t2 Q$ R5 \$ @6 l! b) m
* f1 J, p2 f% G; s
/****************************************************************************/2 g7 w9 g0 c6 u) O
/* */+ K7 w9 \0 Q) W# c. k4 \
/* 全局变量 */
0 U# {7 ?# q1 Y0 ~/* */1 w' s7 ~) V2 K2 T2 G$ E& b, a4 X: u
/****************************************************************************/4 V4 o3 ^0 |' j- Z
char txArray[] = "Tronlong UART2 Application......\n\r";
; {* |. ^- P6 T" f, X$ e/ o
: K# z# ]7 o2 C. f) k/****************************************************************************/
8 s$ j# f `( X4 _' a/* */
2 B* a! U2 L) e! P/* 函数声明 */# v' j8 e3 O9 s2 {
/* */
- e$ j- C1 w. i1 @" |! T9 Z/****************************************************************************/
0 X0 d/ K4 o* c5 b9 z ~% @6 F, U// 外设使能配置
! }/ ?) _3 Z4 e. Xvoid PSCInit(void);
4 s; V' B# J, r* }$ ^9 b% g0 {/ m& ^" X% D0 {9 Q
// GPIO 管脚复用配置
( i N/ m I! R% ~void GPIOBankPinMuxSet();
- z2 i- @& b K0 _7 I9 T) G/ H' z
2 @% ?) `6 \, `$ k, f. ^# ^# t// UART 初始化
$ f. w6 P; L9 W; W5 K5 uvoid UARTInit(void);
0 M. L7 `9 R4 F4 v// ARM 中断初始化
' v1 j5 D& T: [1 zvoid InterruptInit(void);
- o& N) D1 Z G! K* ]" E// UART 中断初始化* J& c* N5 I: B
void UARTInterruptInit();( ^8 v7 ~2 \2 r1 v
// UART 中断服务函数7 F+ D4 y$ h% Z. b
void UARTIsr(void);* X# l# r3 @6 i# S* V
( {# K0 J. d( s% T4 v6 @3 N/****************************************************************************/! e: ]5 j5 t5 a" Q9 q2 I9 b
/* */0 A8 q+ S0 f. Q7 F& c
/* 主函数 */
! X1 j, {3 P5 r8 ~- B8 \/* */
) m+ I( ?0 `' N3 Z# d/****************************************************************************/+ D, y6 d& V4 _+ b
int main(void)
, V. \6 a6 b% V$ [{
1 g. f' Z1 w$ q3 O! S7 w0 | // 外设使能配置) V2 @2 r5 J- U$ A
PSCInit();
# Q# ?5 b) z; U( _, K* b# O
" B0 G! b4 h4 @& P1 { // GPIO 管脚复用配置
; ], ^) b6 h9 V( b GPIOBankPinMuxSet();
* b0 J9 L# f$ S
! R% E2 F4 v' R# H& k // ARM 中断初始化
; D9 O# L# v5 K: x, P! n InterruptInit();( A0 x. f- ^. U1 {
6 {( z7 G5 I B% E# F7 K // UART 初始化
% I# I: l. O% f- e' Y6 ] UARTInit();3 p( ^% f& n8 e0 u. v1 d
/ G) Z% I- {% `8 B) M4 l // UART 中断初始化
F! X- F) ~) N9 T UARTInterruptInit();
1 l. l6 i& {/ f+ n" m% z# F, c# r
3 V3 I9 i: B# ?' p3 I/ s2 M! y0 U6 O2 H // 主循环 K' T D* k% G9 \2 @
for(;;)
5 G, N4 `) p3 k3 k' u( g {
% J' S7 X% q* q4 |# N5 D6 E' ^5 z9 Q
}
0 r% k+ e0 c; Y, b* ?: h' `}' W& G# d, C! r8 t- F
6 Y% C0 s: m) O) D/****************************************************************************/
+ ]5 c9 N4 \" g- ]' R/ L# d5 A/* */, G# a! x$ `. ~2 |% ~6 h
/* PSC 初始化 */
" S9 E0 t9 K+ x/* */
/ d0 R) E) D2 }3 t; N \* D6 W/****************************************************************************/
9 x6 d0 a: ?" n( y' h% V) Tvoid PSCInit(void)6 |8 [& a4 w% C( x/ {1 \! G
{, G% i5 R. U! @* G6 [; V; a
// 对相应外设模块的使能也可以在 BootLoader 中完成/ G+ N3 y9 ~+ M" H! y
// 使能 UART2 模块$ D, y% E2 H) y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);3 F) e# U5 X) f
}
u; k6 K# }0 H+ _6 q2 e2 V/ f# T0 y) C6 e
/****************************************************************************/
" t5 ?; V! K7 h% y5 I/* */3 P/ r4 @: m! J- G
/* GPIO 管脚复用配置 */: e: J; D- Z x& A! B. v
/* */2 I N7 Y+ k& F6 Y6 _
/****************************************************************************/7 G q8 o6 c$ U4 u$ R; |
void GPIOBankPinMuxSet(void)3 ~" r3 J4 m- F4 V7 {0 \1 o
{
Z3 l5 r8 [8 B3 h2 W$ C# X // UART2 禁用流控
4 o. C8 r$ `. Q+ G# w+ K/ H UARTPinMuxSetup(2, FALSE);
6 W" g5 G) F4 G: m) O0 T! A}
7 S" F, }) O' a0 d/ A& |
9 Y1 o( H" }3 D2 R0 b6 b/****************************************************************************/
5 Z, `) u: a; W) m6 d$ F/* */; v; G/ t- h9 d0 E9 u
/* ARM 中断初始化 */8 u& F4 ~# f& L0 X+ s$ b
/* */
' ?2 A' q5 X( B/ l4 `9 H/ p" K) I/****************************************************************************/' `. s0 y3 Q. y3 X" Y! m' y
void InterruptInit(void)6 U. ~( K7 m8 w/ l1 d+ y( V
{
7 y5 ?" h7 @' p4 j, [4 {. p+ q9 ]3 x% t // 初始化 ARM 中断控制器; V V* c* s9 t
IntAINTCInit();
. [6 A6 a5 O1 {* k4 U1 w2 f" j+ c& { C( a; A* f" V
// 使能 IRQ(CPSR)0 R7 u/ k+ N- t/ a4 N+ }* l
IntMasterIRQEnable();* m3 W+ @2 [0 l
) P. i0 n) b: B9 c4 `7 |. V
// 使能中断(AINTC GER)7 @ V! h, ]6 ~8 S8 Z2 v/ j4 r
IntGlobalEnable();
; B+ l& R* n2 R3 V, T; r. ~" _) J1 h
// 使能中断(AINTC HIER) i: L# m) v m, {* W# @
IntIRQEnable();& x& f/ h) U- ^, g# z" L. l
}' U) O- P# E J9 c1 Q- P
: b! Q; x; c* d" ^/****************************************************************************/
2 @" F% I( k2 @/* */. ?* X. X( _) l" n8 y8 z' [/ m
/* UART 初始化 */% X6 ]& |1 P6 \
/* */
: ]) J; c( l ~4 p# Q3 @: Z9 G/****************************************************************************/
4 m, x+ {; p& r9 Z/ P4 xvoid UARTInit(void)
2 }4 @$ W! b! K/ V* K% A9 g5 O{
; }% @) l. p! p // 配置 UART2 参数
2 d5 b: z. y. g // 波特率 115200 数据位 8 停止位 1 无校验位
" n+ Z/ Z8 r, V; J' V' a UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
( h7 J% N- v' n# O/ N UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
* Q) }% O# G/ K% t7 c3 ?' c% d // 使能 UART2
F5 k M. L0 o' c$ C UARTEnable(SOC_UART_2_REGS);
* x1 F5 a0 Y% K! ?1 B( f
3 O2 i- N1 V4 d' w- r // 使能接收 / 发送 FIFO h6 y$ q( n5 e% ^' a. b
UARTFIFOEnable(SOC_UART_2_REGS);4 O& @: L3 n0 @! O3 x2 a
9 P$ I r. R! S2 }! b* n+ N
// 设置 FIFO 级别
* h/ n9 f6 C8 Y& i% S9 y4 x( O' _ UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
6 w/ s- e0 o# t}) n6 P8 Z' ^" Y
: J# C. z4 r, l! |- `7 l3 Z/****************************************************************************/
' _' p: @ u- l/* */" y. A, f) {4 W* y, y9 W$ C
/* UART 中断初始化 */
, k! s, D/ V5 k9 e7 A; Z& N/* */
% E- ^9 U. q5 n8 ~& G6 D: a/****************************************************************************/1 V3 z: r* U6 u0 W C! F2 q
void UARTInterruptInit(void)' J" b6 w1 H- G5 G& B2 C& |. \2 R9 e
{) M! {$ V! G" ]1 ^' r5 `% N
IntRegister(SYS_INT_UARTINT2, UARTIsr);
# n6 Q0 }: O/ X) ~ IntChannelSet(SYS_INT_UARTINT2, 2);# p- S9 ~$ n" y( m, i8 [- W
IntSystemEnable(SYS_INT_UARTINT2);
8 ~' q! i1 r% _( ]( c2 n w1 U$ W2 F3 r$ C
// 使能中断% o* T. q; J% s# M
unsigned int intFlags = 0;
+ p4 O5 N8 m0 r( o intFlags |= (UART_INT_LINE_STAT | \7 y) `: n$ c+ D E
UART_INT_TX_EMPTY | \
0 a+ b# x6 ~: W- B- h- z3 W UART_INT_RXDATA_CTI);
2 U. q+ ~& e9 n& S UARTIntEnable(SOC_UART_2_REGS, intFlags);
- Q* E+ ~% o# U4 |}/ Q6 m- R C* D8 r
" O7 g! Y) T o% ^0 U2 i8 b
/****************************************************************************/6 ]) G% t" W# w/ E! g
/* */5 j& i: [ {" O
/* UART 中断服务函数 */
- \% I" s ^9 Y/* */
; q Q1 S1 I. a' j4 X4 Z/****************************************************************************/4 |) Y; v3 x8 V" c! Y0 i
void UARTIsr()
z( b' F& }/ s/ G, c$ a2 s{
# \$ B# P' {/ d6 W" E4 r static unsigned int length = sizeof(txArray);
9 h* n Q! u1 M+ l) w6 f static unsigned int count = 0;9 ^. `" }4 J' M9 }
unsigned char rxData = 0;; m1 ?* A3 O3 D& R v' z8 y/ ?' o8 l
unsigned int int_id = 0;( n3 q4 I0 C1 p( Z O& ~( H; N8 Q! v/ n
6 S1 A9 r; m" \. S% H3 H' T0 T% [4 S // 确定中断源9 ]+ r$ S" K" F S* N
int_id = UARTIntStatus(SOC_UART_2_REGS);
( t, a3 A1 n. R1 T
/ V" t1 R |$ [ // 清除 UART2 系统中断
' E) u$ h" B0 M4 f$ p3 ]1 z# Y IntSystemStatusClear(SYS_INT_UARTINT2);: H& T( r3 |) P- t
) [$ f7 z3 f/ T: |
// 发送中断3 f1 n0 ~" o3 `: d! ?$ V. f8 m# Z" @/ M
if(UART_INTID_TX_EMPTY == int_id)) } q9 o$ g' r% x0 z
{6 ?; @3 r, }) N0 G
if(0 < length)* `6 i* `" ~; `1 M7 W$ Y' K
{
9 R( c& C F+ u* l! b // 写一个字节到 THR
+ C0 J3 c4 r, F; t UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
$ @# J* u1 z' `, i! x length--;
6 v) y: S0 |4 d count++;
6 A3 g) P0 Q+ h }
' i4 n' s7 I0 z! Y' `# z2 q7 U if(0 == length)
) r8 k# }1 |& V {7 g, P+ H. |8 z
// 禁用发送中断
8 n) {7 d( f9 |$ K# o3 x UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
: S( V- }6 k+ v5 m8 O7 @$ ` }
( K1 ]# r% C6 C }
% E5 H, ~& u) y% V6 d6 d. Q! t' x" Z( Y. y# ]# U
// 接收中断
* b: I* |& x, P% _ if(UART_INTID_RX_DATA == int_id)1 c0 g& X$ w2 A6 m3 k
{
9 e% z* n k U1 b, Z% V rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);' ~. m1 R. s. o* q( h E7 e
g/ V/ U! h1 ~ v: B
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);& t* a) q" X- E2 B6 Z
} F Q. F$ X9 V& [1 \3 S
. I M J. ]4 _& ^5 t* p
// 接收错误
3 p6 U' R' K/ E, T7 M6 c7 O1 y( h H if(UART_INTID_RX_LINE_STAT == int_id)
9 }, l0 ^7 r& M) Q9 x; p$ h {$ n4 h& ?3 R/ ^1 T8 [' h
while(UARTRxErrorGet(SOC_UART_2_REGS))
: O0 r( m. H# X# G3 b) ^ {
, I6 ^( d- l0 o9 l4 s. M( | // 从 RBR 读一个字节
$ ~6 ]6 n+ L; D L6 M- V* a UARTCharGetNonBlocking(SOC_UART_2_REGS);
! ^7 U" L7 m4 S$ t8 p }
* j6 x& Q& N$ m$ `' `" K* D }
. Y9 k! E& ]( R5 U* X, T" I# L8 Q # c) X# y5 r0 u, ]# g' a7 o
return;
8 P/ P8 B2 Z z J* r" U}$ U7 a2 [9 M: z) J, [
|
|