|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
: w4 e4 o) {- {7 o- N& _, B, N7 A* K+ L, I
#include "TL138.h" // 创龙 TL138 开发板相关声明' A% h5 v, A* V0 @& l
+ X& M" b* w* @# k. v7 R#include "hw_types.h" // 宏命令2 I2 s* \# s- ~9 g+ ^
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
9 _# [, U- C* T5 O#include "soc_OMAPL138.h" // OMAPL138 外设寄存器0 l: Z" j$ s, X2 {9 a+ O
7 n2 o/ j4 ?5 ^8 K" w* b
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明5 G0 `0 \) l6 g: l% [3 @, V% ?
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明4 S& `' B$ |! D; J. {3 ~. p
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明7 Y) K6 Z Q" I$ {
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义 b; e9 _# l* E* O# E$ | o
+ v% I& R0 p' L1 k/****************************************************************************/
* ?- i2 c- v& U/* */. j3 u' v8 h. i; a8 _
/* 宏定义 */
3 q$ c) b2 d/ G4 g& f; S$ o# d s/* */
7 ?1 T$ ^1 v, K1 ]6 h: O' I# [/****************************************************************************/
5 ~8 E! v8 G% g+ A2 ?// 时钟% ?" |' W5 w, F; \5 b
#define SYSCLK_1_FREQ (456000000)
1 o$ {& e' \9 J4 {/ B G! a#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2), M- G- v1 z- Z' e
#define UART_2_FREQ (SYSCLK_2_FREQ)
% Z2 Z2 N: C6 c# N; B2 o4 w" J8 @$ I: J% s4 }* N0 s
/****************************************************************************/9 Z& R( ~; T* G
/* */
$ K! w% w5 R! L+ G/* 全局变量 */
D! {. S" c& C \2 z: K" @0 n0 h/* */
% G; w4 ~8 r( d. M6 U$ k( Z/****************************************************************************/
! O. J9 q$ M- _# D2 h3 |char txArray[] = "Tronlong UART2 Application......\n\r";
5 D: b6 p8 p/ G2 M! j3 k# p+ x% z
/****************************************************************************/
) t' Q( }9 I2 M/* */# p# C( ]' n1 A7 W6 H
/* 函数声明 */# t$ Q% ~" b( c; f' g5 U) W
/* */ A3 n2 t% q0 K; `9 L( L& Y$ M+ L
/****************************************************************************/7 J+ m- t" c6 r {, e) u* P" }# T
// 外设使能配置
8 d2 s$ V' J5 s8 [" Svoid PSCInit(void);& e) s* } d0 k* g
' `4 y7 n- n1 ?6 L4 M// GPIO 管脚复用配置
% B3 N% l3 ~; e' A! q: X Yvoid GPIOBankPinMuxSet();
* X" K5 h5 V5 } T. y# a; x! @4 j# b6 c
// UART 初始化. ^/ U8 M" \' j& C
void UARTInit(void);
- L. R% W# d2 E2 [// ARM 中断初始化3 O& X8 x1 m; d0 k- S7 ^) m* Z. H" g7 n( {
void InterruptInit(void);) v+ d/ ?1 \8 V2 i6 K
// UART 中断初始化. O5 A3 l' V, q/ j7 y0 l$ n7 ?( g
void UARTInterruptInit();" Z7 w- E7 ~! I1 R) k8 v
// UART 中断服务函数
1 H/ Y9 B# S" z! L. ]9 ]void UARTIsr(void);% Q. g, b0 p" T; S
7 a) L2 `4 i( A6 t# E: J0 z2 A2 q$ b ^/****************************************************************************/
+ I* n+ t/ e- R5 ~ z/* */9 G2 A+ m7 s; I8 d
/* 主函数 */
& p4 `! I* k; Z. R, I8 w+ I& B/* */5 X3 s( [$ \' \8 G0 ]: G- n! {
/****************************************************************************/* }! E! E, B7 w- x2 D' J
int main(void)9 M7 y) O8 P* N
{% J9 u( u% @- r+ k
// 外设使能配置
( X7 t0 M8 g8 V, R PSCInit(); {1 w; f# i& f, L# d
2 U% z4 @: G0 t& O6 Y8 _ // GPIO 管脚复用配置2 Q, N- D h% A
GPIOBankPinMuxSet();
/ ]3 S6 _2 P4 F/ m+ K' Z4 R @6 W' a' C4 y
// ARM 中断初始化. S1 d* ~, d) z4 B
InterruptInit();
% a4 j3 R" O. y9 J7 e0 L6 B( F- V" e. B8 v2 J/ U
// UART 初始化
$ [0 U" A. e+ K UARTInit();, m/ Q7 Z1 c$ m# N- f! V! W0 y* i
9 }5 M" Q& J0 s! K5 u4 f, L2 a8 U* V
// UART 中断初始化
; U! f$ ^3 j% y" o" V. L" b UARTInterruptInit();* a4 x5 \2 s8 W* w# Y
' {: z; N1 }. w5 h2 A) z7 C. T1 X8 ]
// 主循环$ m/ A& u1 O6 E; E4 o6 h
for(;;)( H! i* t' I, }- B1 W: H& u0 e
{& N& x e: \5 o$ E
! m' i" J6 O% U2 L- } ` }
. B' y$ @ D M ^& K/ g; E}
- m& F! U1 K- m. N9 E& G: |$ r" J1 N z& H4 }; h$ B* v) B
/****************************************************************************/
8 b+ S/ P' D0 V- B- M! A* H/* */' e3 G6 C$ V+ p) K, V! y. d$ R# L% Q
/* PSC 初始化 */0 R5 h3 B* d3 v) N$ }
/* */
4 F/ n" F* Q# P/****************************************************************************/8 j0 p0 H8 L; I: u
void PSCInit(void)
, _( y6 n4 D# S& @2 K6 L+ p{ C" N! j" q/ u5 @
// 对相应外设模块的使能也可以在 BootLoader 中完成/ u5 ?. {- @& g# D
// 使能 UART2 模块' P1 b1 s( Z( n
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);5 o; Y- H( t& m! {
}% g% E0 F! h2 N
$ F' K( J: g8 j! b/****************************************************************************/) I7 D, q3 k* V0 O" ^8 R" E7 R' T
/* */
: `4 }: g$ t: X) }/* GPIO 管脚复用配置 */
7 t0 w) P7 }. e% I! d3 ?* Q/* */
1 z; H$ J4 p8 ^; j' ~" R- }3 W/****************************************************************************/5 ~: f* p9 x( p' d7 n$ U: Y
void GPIOBankPinMuxSet(void)
/ R: H2 ]. Q' N9 W' f* c& _{
4 r2 E2 F" J9 s0 J8 U) Z( N! S // UART2 禁用流控
+ z7 k/ I3 e* z h/ { UARTPinMuxSetup(2, FALSE);* g5 A) |* d, ^! M$ o
}) S4 U7 ~ g7 d2 Y$ |
( l- ], B: l6 J6 W$ n/****************************************************************************/9 e# f' [, Y- a4 E( |
/* */" Q& U- U6 T' T1 G
/* ARM 中断初始化 */
5 L- p0 q5 v7 x1 K) e e. q/* */$ J z4 J6 I8 v$ ]" }: k( a2 @
/****************************************************************************/
! W' u/ D3 g, E( Uvoid InterruptInit(void)
7 p8 m* m6 m: _, B4 z+ w- ~: v# R{; n: |; g+ J+ O6 m/ \# A! E
// 初始化 ARM 中断控制器/ o2 r0 [, T" W+ ~' J" e" I9 ~! a; h
IntAINTCInit();
+ J! |4 \/ L4 ?% w5 A! M
. l+ [, ]$ q5 S // 使能 IRQ(CPSR)
. n2 C+ W, u+ e, [( E) A* H IntMasterIRQEnable();
$ C: i1 @5 n% M9 K" x, M9 x G. g( o& y. F; S0 P2 k. p
// 使能中断(AINTC GER)' E" P" i7 P- h. x7 Z6 Y7 |
IntGlobalEnable();
& M L1 s2 }' u4 V5 N) v1 n
& P- p/ b4 _' ]- Q9 ~9 |, W- }1 U; Y // 使能中断(AINTC HIER)
6 \* l8 `% E( W% v IntIRQEnable(); c: |8 p; [5 K, ~9 ^+ ~
}
# Z$ W5 [0 k1 q3 f
|* e0 d. m6 u+ L$ X# Y8 M9 B/****************************************************************************/
% n R6 |4 c! o& q/* */
9 [4 m) ]) z) `$ x$ L9 V/* UART 初始化 */
, `* b6 e0 g7 n* S0 ~7 s/* */- y+ K( E* m- Y1 s6 s& b+ x6 p
/****************************************************************************/
8 }* x3 O( [. |4 K) N1 v5 z7 tvoid UARTInit(void)
0 |' K! L1 X4 U* V8 I7 n+ r/ E: v8 R) o3 z{% {7 W4 H( w4 f" [/ |# A" d/ E: s! G
// 配置 UART2 参数# @9 |9 w+ f% T0 b+ M2 a
// 波特率 115200 数据位 8 停止位 1 无校验位- m5 c4 A1 R$ L4 @% d3 n& N
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,( e1 B: n, g/ ~% u
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);% q* M% z* ^( c' W
// 使能 UART2+ S- W6 v' E) _ |3 I5 U3 q
UARTEnable(SOC_UART_2_REGS);( o$ }% U+ }+ F0 f$ D/ l
4 {" r9 K+ L5 Z8 w Z% o // 使能接收 / 发送 FIFO
% v. q2 l( f4 E) z UARTFIFOEnable(SOC_UART_2_REGS);
; e$ A2 ~" F& a" T. `( m
1 P7 j: i! y/ P. @ // 设置 FIFO 级别; b1 q$ X" R" e' @- A
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
; W( l6 m$ E' v( V}
" o. e p# p6 W1 j4 ~
, g( P2 i( o" _/ Z9 B/****************************************************************************/
p) j7 K; z3 Y: m' U1 J. J: q l. N/* */ a) W* J0 x& }1 o' K
/* UART 中断初始化 */
5 H; }& X: ^( p3 v% s/* */
- }# L4 j( A! S1 }/****************************************************************************/- d _, }) v% s
void UARTInterruptInit(void)/ R/ A! @1 _! Z# z- H/ H. T6 A
{/ P4 @0 E$ m! j: ^9 j% Z- E3 N
IntRegister(SYS_INT_UARTINT2, UARTIsr);% d* C {1 D$ _6 p; ]8 i
IntChannelSet(SYS_INT_UARTINT2, 2);
3 {0 X) n4 A0 ?- d& k1 U IntSystemEnable(SYS_INT_UARTINT2);9 [; H( T& |# g+ F' [8 c
) F9 A( ^" u! s) ~ // 使能中断, t( B& o; X8 g* o% z; W) R& ?8 o
unsigned int intFlags = 0;
T; N) X0 J/ r intFlags |= (UART_INT_LINE_STAT | \
; O: R' x9 X$ x" c UART_INT_TX_EMPTY | \
: b6 V% k d8 I0 z UART_INT_RXDATA_CTI);
2 w' G2 M# k& T3 ?9 a UARTIntEnable(SOC_UART_2_REGS, intFlags);
' X5 L( f4 }' b% C}9 d9 F6 ]* q" t
5 Z/ j* `- { P7 Z8 O i( Y
/****************************************************************************/
5 u7 A* ^3 v5 H* L' E, s/* */
4 X5 k/ u' P8 v0 \& }) P9 ?- _" }/* UART 中断服务函数 */
7 v+ R: m6 y0 D& [/* */
/ Z6 f. g; z. b' V/ V/****************************************************************************/( i6 b3 g2 p8 s4 k
void UARTIsr()* P. o4 F7 E+ e* ~, E: j' N& V
{8 J- J( `) N& i6 S3 Y b5 W
static unsigned int length = sizeof(txArray);
) ]. t4 ?" a1 g) t static unsigned int count = 0;- P. @3 ~- x6 s4 T. E6 u
unsigned char rxData = 0;
) B5 q4 y ]! C; [ unsigned int int_id = 0;
g1 W) \7 m3 ?; R3 H1 I- N5 T: n/ O* `! T
// 确定中断源
$ z' T( v* q2 e5 x4 _* o int_id = UARTIntStatus(SOC_UART_2_REGS);
7 C$ h2 c; X0 j9 |% k9 R* T6 `9 F& u" s8 ]1 b
// 清除 UART2 系统中断/ C: R% o4 w. Q% G9 L- Z
IntSystemStatusClear(SYS_INT_UARTINT2);; |/ y. z, Z! @1 e% P3 p
& V1 `/ {, i' Q( C/ t
// 发送中断
# s$ D# b$ a& G! v( |6 c* e if(UART_INTID_TX_EMPTY == int_id)
. U0 \" W0 c8 Y6 ~+ H o {+ o, }$ a& n0 D/ Z
if(0 < length)
8 F# |+ Z5 A6 t G- D2 ]' @# v {
' c7 Z' Q$ O5 M [$ j // 写一个字节到 THR
* T, X3 x7 h" G" O. ]+ c- { UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);; d/ K- P' n, T, ~: d' L
length--;
, t% s) r: J0 ]# ], ~ count++;
( t- l- j* {/ ^" B8 h }
1 s2 m- D/ g0 g/ d; Z0 R: i if(0 == length)
3 y9 @: `- [9 C' i2 p2 `% ] {
/ H" E6 K$ Z; k6 ]: m // 禁用发送中断
) e8 x l: v! W* q+ ^: v UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);3 o6 |& t" _# K1 J* v
}* L+ |+ n6 m- E$ U
}
6 \2 G& V8 @8 s# q/ I; e) @9 H- }1 P
// 接收中断
2 r! h( |5 \4 g+ l; v/ j( y if(UART_INTID_RX_DATA == int_id)6 A8 [4 `0 {" U; g; h" s
{' B1 o+ Z7 @2 l& g
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);6 b6 S7 L7 U" G m/ d, i" w7 O
5 P( r& C; G5 e UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);1 I- Q" s8 I8 X2 \- N# n) p
}: d- z% _9 @9 @: _
4 d l7 f6 T( R) } `- p. l% c // 接收错误2 j9 ~4 C$ h. a0 n6 t( @" b" `! G4 \
if(UART_INTID_RX_LINE_STAT == int_id)
/ g/ J9 e7 |4 W, Q ]( X {4 R# ]/ u% |2 N& Z! t. j+ O& [
while(UARTRxErrorGet(SOC_UART_2_REGS))
; F; m5 j/ \; d2 j/ h+ t* M/ _ {
$ I' e; M" I, u" P% x6 } // 从 RBR 读一个字节
* N$ x6 i9 N- v- l UARTCharGetNonBlocking(SOC_UART_2_REGS);4 B% [* N- p( t
}
7 r) ?. O3 N' f! s" B) i }
; }0 R4 S3 j; K" Y$ s; E4 A & Z& E: n% p" F3 a
return;
; |. x- L, I; L}
# t3 D4 Y+ O1 R6 J( d |
|