|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
* t n* Z! R- l9 o# _6 G
( @. t7 X0 `& d+ l S: _4 t#include "TL138.h" // 创龙 TL138 开发板相关声明
1 i, C' b5 j: Q9 w
7 R( u) }' Z) N7 x7 H, P& f#include "hw_types.h" // 宏命令
4 V/ Z' M: F7 K+ N- r* j" \#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
; Z V+ [+ B/ y5 F* r#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
7 W0 r9 p" ^3 Q. c3 V! W0 K- \ G# E% n o* j0 g/ b9 a' c
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
, O* h. Q3 Z+ s4 G! o8 @& o#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
* d+ J$ q, ^* y2 H/ i#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
R$ C& t) k+ ]7 \$ y% |#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义1 a5 S9 |; j. v0 k7 A% k
) d/ [& P+ C8 P& j# {5 S/****************************************************************************/ c6 \# h$ E% ^+ t0 t
/* */
% B' y* `) _$ |( {" V/* 宏定义 */
( I' I3 V' i2 `/ l: u" S/* */1 Q c, ~7 u5 {0 D4 T" W7 _6 E; n
/****************************************************************************/2 B, P, S5 C$ a: S( }# [3 ?1 `
// 时钟$ b7 p; ?% K0 n" o/ ]
#define SYSCLK_1_FREQ (456000000)
( ]! ?2 K6 |3 `! e. y5 H#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
1 K' f$ u+ u5 h! d5 e#define UART_2_FREQ (SYSCLK_2_FREQ)
' | k9 a: L8 Q0 g& k- l
9 ?5 z0 A' r/ z% @5 [8 q/****************************************************************************/2 a% E- ]. I1 U( h, i4 G
/* */; h+ V* F1 v& F5 r5 M6 \4 g Q; \' k4 C
/* 全局变量 */; U- x9 X0 x) n
/* */; A3 f; @4 d( ~4 l/ x
/****************************************************************************/
. x: ]9 v& I3 echar txArray[] = "Tronlong UART2 Application......\n\r";
$ o1 C6 p2 i* P3 T. y5 ?& N7 H& S6 k& {& ~
/****************************************************************************/
- J ]8 R; J, D6 H; v3 \" Q! M# a- L/* */
! _- J {5 Y% L4 W8 N* r/* 函数声明 */
' g+ Z+ ]0 I' y/* */
' J5 W* ]# }1 B! X6 e: S/****************************************************************************/
* j" d- Q/ Z9 d& o$ @0 t& K2 N// 外设使能配置
4 z( R7 g# A T6 Wvoid PSCInit(void);8 r8 O# A! B2 H8 T
( X! A+ n6 X# ^6 G! ~& K
// GPIO 管脚复用配置
- i* I9 a) o: p9 C# rvoid GPIOBankPinMuxSet();
* e# D# m! X/ ]' Y
]- O6 q8 P( _6 g" s0 @// UART 初始化1 p7 t( y6 V9 U2 `
void UARTInit(void);; Q. ~ a( Z O
// ARM 中断初始化5 s# O/ i3 r( Y
void InterruptInit(void);
z: |$ H) c ~// UART 中断初始化0 F% U4 _6 l. z1 y& B
void UARTInterruptInit();2 B$ q* C a6 U- C e4 w" g
// UART 中断服务函数! T. N& i# L+ Y7 ]4 e( V( ~9 g! G
void UARTIsr(void);2 O) g0 l( a) n
9 `& h/ u+ w% h2 T
/****************************************************************************/# p6 E% W* M. X0 R/ R9 P6 `
/* */5 p# M7 R6 J' ]
/* 主函数 */
! Y1 f' A5 R0 F( F. ?% c/* */; R5 q- F5 m0 y7 x
/****************************************************************************/
7 t5 O; c9 q: ^" l) ~+ mint main(void)
5 O; c) d" g, W7 z, r4 c, b{
: i1 [" c* r4 E" g // 外设使能配置& ? q! }8 A Y; B2 H
PSCInit();
/ F. M$ k# Q" n' F/ \5 ] $ F2 q9 K, k; u; f: v
// GPIO 管脚复用配置) n/ I2 p9 m1 |6 ^. l* o
GPIOBankPinMuxSet();% j- g1 m, ^/ B; N: D) H8 w3 a
' I( _% _/ l& S5 k8 H6 y
// ARM 中断初始化
: n' `' u! |- [3 v; I: q& Y0 y) [ InterruptInit();
$ q7 `* M* |' |1 q; r0 n' N- Y, A
, L8 E7 q$ s' y- V* C1 B' r* t // UART 初始化3 _7 z3 U' D" b
UARTInit();( x" P, u; B# @4 a5 R
, V. C! w& I! r2 V, W r2 P' y
// UART 中断初始化
0 C* l) F4 K% q! b) w UARTInterruptInit();, |7 a" h3 w" M; y9 I; s
! C- C8 \( x5 M( a9 g
// 主循环; d ?/ m u9 U% s8 j$ `+ r
for(;;)
, B C4 |% t$ J( d1 g {6 c% Y! Q: d% ]. g
0 r' Q7 e* J+ A
}$ @! ~9 P9 r) Q
}
. A; A! q( Z5 l
! g; h3 Y, Z! [- e# g4 m4 F' M/****************************************************************************/
, f- V5 x% ]- f4 g& j1 {- c/* */) Z$ H8 U" T8 k% H5 e+ D
/* PSC 初始化 */+ n3 C3 o( P r8 z* p1 Y; D
/* */. D9 L7 B' U& i4 @2 {# P
/****************************************************************************/ N8 g9 q9 z: Z+ C+ O8 ~
void PSCInit(void)# ~) g% \4 g0 D7 n
{7 [9 ^" |: h$ m1 n% C9 p
// 对相应外设模块的使能也可以在 BootLoader 中完成# y0 q7 i. Z. z. l, ?5 p/ p
// 使能 UART2 模块7 {4 j0 z2 {$ u
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);: c" u5 J1 O, O e/ }( S) y
}
3 Y, w5 Y0 ?" f& r- \/ D8 Q: a1 a4 A' ^# w
/****************************************************************************/: [# o; @+ O8 v- c3 C7 \
/* */" c* q3 ?% ~( z
/* GPIO 管脚复用配置 */: F+ l {" k. C- i
/* */6 M% b; H( z& i3 ?* D
/****************************************************************************/
& T6 `& b. |" D, Vvoid GPIOBankPinMuxSet(void)
9 G8 I l- e, l1 G{0 Z, C# [. k# ?8 b- j2 a! B& c9 b
// UART2 禁用流控& k/ Q$ a l; ?
UARTPinMuxSetup(2, FALSE); Q7 c2 U, f6 r" Z: D4 c/ j* e! d& S
}
, G" l1 i# q' F. K8 F/ F# ]( [* z/ `- @( i# a. L, K* q: Y- S1 I
/****************************************************************************/& _+ [( K5 ~3 f5 T4 V) s) M% g
/* */
3 B4 A* O6 T" e# q/* ARM 中断初始化 */
: P9 J. _( _! W! {/* */
, u% N4 w0 W( d0 ?/****************************************************************************/
5 _4 x1 M' u2 {) Lvoid InterruptInit(void); y. a$ P: g0 f# c w. q
{
$ D. V' z) E3 ]# W) H$ w( ^ // 初始化 ARM 中断控制器
! g8 U, \; t0 ]7 v IntAINTCInit();, j0 d) ~$ e. v6 E+ ]
! B! ]) g0 p$ U i8 @
// 使能 IRQ(CPSR)4 v p& \9 ~% ^+ x3 m% U' _' X) g
IntMasterIRQEnable();
! ] H+ `4 Z6 I& S% G
, r) e: E$ [& b3 Q: U' Z // 使能中断(AINTC GER)7 G$ i: d# K2 M: @# q0 t
IntGlobalEnable();
, p& v% p$ L& N7 C
& N5 S( V) t/ P9 C7 j4 [4 v4 z+ A // 使能中断(AINTC HIER)) @# X9 u2 L+ i& t) u& q4 j* N1 J
IntIRQEnable();
3 ]2 A( s5 I, |}% q' w8 N% |' W: L
3 P: K: @0 Y, ]% S. J2 k9 K" z/****************************************************************************/
4 i1 y$ Q3 _* s) u5 O2 O% {0 `' C/* */& H+ { V3 o0 z3 x
/* UART 初始化 */! E# `: \* W: C2 \
/* */
& _; N+ _' {& s/****************************************************************************/
4 P- U9 O- Y2 L* Pvoid UARTInit(void), G0 z! o! b$ {& p/ {& \: p7 L
{
X' A, G% k, P4 w // 配置 UART2 参数
9 I: `$ b- E% _, z' V. @9 t // 波特率 115200 数据位 8 停止位 1 无校验位
6 R2 u0 G1 s. L; f5 U5 B# F9 a UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
2 ^" W6 U3 d! r" t1 { UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
+ a. s7 [& X7 d) J% X // 使能 UART2
& o0 U0 `' w& R8 @5 } UARTEnable(SOC_UART_2_REGS);
z- m7 G/ X- d6 |$ Y( @
) ~% {! ]4 m0 I0 \; F( z // 使能接收 / 发送 FIFO
! W/ X. H" T4 f4 i* u0 \ UARTFIFOEnable(SOC_UART_2_REGS);
* T$ N" \5 k" u
' e9 k4 L3 _1 |8 G6 J0 R8 a7 d // 设置 FIFO 级别5 |# P4 @: E8 n3 {" {& m
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);0 z: n1 D2 h( s! I
}( d% h3 Q: k. |' Z1 O
9 _0 k2 p1 q, L1 S/ c b1 |0 n! ^" `/****************************************************************************/
; z( J' ~+ L/ O7 p8 ]1 @2 a; x5 _/* */: C6 r z5 ]' q+ P
/* UART 中断初始化 */
$ c8 ?: {) M% X/* */; Z1 R$ ~: ^$ ~# S
/****************************************************************************/
6 `2 f* z5 g* @' J. N! Vvoid UARTInterruptInit(void)
$ a3 A4 S8 b) {2 M7 i{
H) `( S8 K+ W% T IntRegister(SYS_INT_UARTINT2, UARTIsr);
, u: B! {) B4 h/ i" Y IntChannelSet(SYS_INT_UARTINT2, 2);. `/ G1 b9 z1 @5 d" G7 u: p
IntSystemEnable(SYS_INT_UARTINT2);* B- V6 Y" Y" J" a; s
% R! l3 C) X' n; Y- x) m" p! O // 使能中断
7 u: v( s+ q& G! P! i6 D unsigned int intFlags = 0;7 L F6 l: Z* a. j m
intFlags |= (UART_INT_LINE_STAT | \
1 c; Q- _) C1 `8 j UART_INT_TX_EMPTY | \2 y9 M! q+ d' v; F9 n N* {
UART_INT_RXDATA_CTI);
: z5 y4 {9 A9 S9 f UARTIntEnable(SOC_UART_2_REGS, intFlags);' D+ R3 G4 h; R) P: \" W) C& B
}
: n* K% ]& S- Y( F, d6 A. u& |8 s2 s% w5 u) `9 L2 A; a
/****************************************************************************/
0 { d! h/ ^$ r9 h) w5 V; U# c" T% Z/* */
8 a; l- O+ X" k5 x' ~/* UART 中断服务函数 */
d" T6 i: q2 Y# B9 B/* */
. j3 {0 d6 M9 j F* |2 r( N6 y/****************************************************************************/" D: @' R0 Y* `3 D* M' q! O
void UARTIsr(); u7 Q- F1 q- T& B, Y, \6 j
{
' v: s6 G# I9 [/ s static unsigned int length = sizeof(txArray);
/ j- T2 i: e" u1 | static unsigned int count = 0;( U) h5 w- V0 ]9 B
unsigned char rxData = 0;
$ w; B6 U. s. e) ]9 C2 U- l unsigned int int_id = 0;
7 ^7 M! t6 A! L; |7 U
. s9 c2 y* p4 H // 确定中断源
* } s( B1 p3 F# J int_id = UARTIntStatus(SOC_UART_2_REGS);
5 Z$ |( l; a5 F5 y, k7 A3 o( w/ g6 e, p1 v0 L6 S
// 清除 UART2 系统中断0 D/ D' c. @: ~8 x+ A! n
IntSystemStatusClear(SYS_INT_UARTINT2);
' Z, l! Q( ~5 [! Z0 g
1 T1 Q! Q' O0 N0 x // 发送中断6 r/ |$ W2 k F8 s8 m1 A& U1 s
if(UART_INTID_TX_EMPTY == int_id)0 Y, X# j( W2 ]3 Y5 C) t
{# k! @, c- q8 o, [5 S% J+ i4 x
if(0 < length)
( h5 ^( A. s2 V {5 }2 n0 U6 l. N' f& Y$ ?) J$ | R
// 写一个字节到 THR7 F) W4 k) E3 X3 C5 R6 y
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);* ~$ y% U# r* A6 b- a
length--;+ {. f3 ~5 w( _+ \4 T
count++;! e: @ }' v$ i( H, b, J/ A
}# k1 X7 q- Y7 I i8 u
if(0 == length)6 ^/ ^$ s- K/ h. W, [! n
{
- i! L5 A! f) j, h // 禁用发送中断( M6 k7 J1 U% v' x
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);# p) I, @, l# l8 b
}
1 m( g5 v X L7 M) ~ }) O' _, S" A! y- G, o, e
! v' d0 d9 b/ n* B
// 接收中断/ g5 u! K! ?! l9 I5 D0 S
if(UART_INTID_RX_DATA == int_id)
' g/ \" Q7 x% [$ s, y& v* ` {4 H3 R2 Y6 ~& g3 x5 i2 l
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
" k# P9 s/ Z- n' [& S* p8 U! S3 l5 O w1 u, A0 Z
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
! d1 ?6 R* I8 x- b0 J }
2 y1 J% [7 B" \/ C D* F2 u7 n4 \! J8 L- c% Z" m& q
// 接收错误
9 k+ n/ r6 r% p6 d! w, U0 Y if(UART_INTID_RX_LINE_STAT == int_id)
$ p8 Z1 ]9 q( n8 B {
, @: r! u9 A4 K( D5 c7 K } while(UARTRxErrorGet(SOC_UART_2_REGS)): R: {; y. t6 q+ q& j4 `6 `4 }
{4 {, }- N1 ^% z2 O& k2 |- c: G0 a
// 从 RBR 读一个字节
: i# P- h9 u. B' O UARTCharGetNonBlocking(SOC_UART_2_REGS);
- }0 @& z- v1 @- I }
7 J4 E' [. p) S4 q, t }
% l. s' d4 g! i8 I" _1 x
# }/ `$ d* ?/ P# [6 |9 O9 ]' e9 J# p return;3 g8 w6 T+ D& k/ G6 j+ R& _
}- _% @& P0 j, y: F4 {6 Y8 I9 h" V
|
|