|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。& v- U' V! k1 _
5 D7 H2 |! {' M/ n: y- o5 J#include "TL138.h" // 创龙 TL138 开发板相关声明
5 q" i% T+ O m# F W0 A% K! e; x
% L* Z/ M2 E r#include "hw_types.h" // 宏命令
% v( x& l2 L0 J# j9 ^& [#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器' x7 F+ v6 C. ]( @) x
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
& A% D6 K- e- ?( _( C4 ?
/ X! S! q+ X: [' }* |9 Z9 U5 ~- N#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明4 p5 t2 k+ c& I) X7 K; U
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
% |$ o4 t- Z& l3 D#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
( Q( H8 _" O% R9 U' D#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
1 ~6 c6 c5 _; W6 i7 Q9 r% x6 Q" [( v$ H3 y2 P0 E# z" l
/****************************************************************************/
; P6 h' r* z( U4 l; G/* *// f6 C/ t% @# t; z: t' U5 D
/* 宏定义 */
@+ O8 ]# Y0 M$ O4 i/* */
! |3 e S- B5 _/****************************************************************************/
/ B5 S: S. D5 K; J( {// 时钟# S) v- W6 z2 Z4 o& o$ g9 c
#define SYSCLK_1_FREQ (456000000)
$ o( @3 u0 \. |$ U& M+ h! r#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)3 a4 e. Z+ v4 m9 T" R% A# ?7 ?
#define UART_2_FREQ (SYSCLK_2_FREQ)0 e. S3 j) E! {: k* j
+ H1 n8 b$ ?7 t( a# Y
/****************************************************************************/( h }. T% ^1 m% L. ?
/* */
8 i1 \! ]; a) `9 ^/* 全局变量 */
. ?" F0 k' C9 J" ~/* */5 r2 |5 y2 b* I. U8 b
/****************************************************************************/% x, f. J5 } P8 H3 d0 [
char txArray[] = "Tronlong UART2 Application......\n\r";
! ~/ s$ ~5 R7 C7 d, e# a* Q& X( @( c" u
1 L/ i- {2 }) y# b/****************************************************************************/
1 ?2 {8 E. s9 v/ a. H/* */
5 _% Q+ G5 C3 q/* 函数声明 */
; j7 u" B7 K- ^- \- V/* */# Q: v! a$ ~5 t1 y, k+ B. z
/****************************************************************************/3 P- B7 s* Q4 `% T5 `5 h- i
// 外设使能配置) I9 [9 g8 x% P+ z- F5 R
void PSCInit(void);
) {/ e' \' E& s. k2 n% v6 @
. g1 B; S' f: f" e6 o// GPIO 管脚复用配置; F: g* Y/ P# y, B X
void GPIOBankPinMuxSet();
8 z9 g) f$ G: e% J' B* ^$ {5 y u; |
* _: G$ w4 o, P+ w' [6 V// UART 初始化& O' {1 W+ M. V8 F# X
void UARTInit(void);
) U: O2 p7 k. {7 M) ?5 r, X// ARM 中断初始化
( A9 L- m! x0 ~) xvoid InterruptInit(void);7 j4 r# ^) }& ^8 _1 G
// UART 中断初始化
. x' u9 n. H" P' Cvoid UARTInterruptInit();7 A, d% O+ n' f! c; E, i% x, f
// UART 中断服务函数6 U( I4 m* g( ^7 r5 n' D
void UARTIsr(void);
+ H3 E- g |5 ]/ D/ i. I; ]
7 O, q& C0 t; ]8 A# C/****************************************************************************/
! Q$ ]0 a: I' S8 w/ S' k1 K) m c/* */& ` Y0 N( R2 b3 t
/* 主函数 */- }- _! d4 `7 k( P
/* */
/ U% _# {5 R9 c3 m/****************************************************************************/4 ^; {& K4 m) o. { Q0 k; ~+ [
int main(void)
4 [6 B" p; N( _& S5 H{" b; m" L! Y, y4 I
// 外设使能配置1 [ K7 @$ _: S& J8 _ E! {
PSCInit();
7 D0 R% x: X# `* U2 S# O0 t9 X ( x' T+ C+ W C8 W1 R$ N1 d
// GPIO 管脚复用配置
0 ~5 p: D) N. ] GPIOBankPinMuxSet();' b3 s. M: X* G5 A. r8 t# v# O" G
- k, c2 ^& Y/ _& L
// ARM 中断初始化
4 k/ ~0 B$ t) W4 g+ }7 Q3 P' c6 y9 G InterruptInit();' j; y+ f6 k; j8 V/ C- n0 x
; {8 f) G! e' e( g& u0 d4 r // UART 初始化1 q- Y+ C1 h# \- C
UARTInit();
. C' g6 d; o3 D+ o' R1 A; X
% f: R H/ |4 B1 j6 y* q% y+ b // UART 中断初始化
. Q2 J2 y$ P0 g+ y" Q UARTInterruptInit();9 v- M+ x3 M2 n. [
, s6 p, p. J! A4 {- g1 D
// 主循环% T6 p; ?4 \9 d6 T- Z7 d
for(;;)
7 k. M4 r% R( m {- F1 A6 [. q" P* T2 W. [6 C \+ m1 r
$ L/ a$ Y; h: _0 M+ H7 F }
/ I7 d3 o7 p- N/ R0 C}& S$ Q" I- b' U6 c8 ~8 e% t6 N
6 ~' ~" q5 i" Z0 D& J/****************************************************************************/5 x! {0 x( n+ b( m. F" g2 b) |, \
/* */3 n; j" i) t3 X# x+ a5 U5 f
/* PSC 初始化 */7 A% M+ b4 X( ^+ _- a! o
/* */" n' r- ]: P8 X/ \$ k6 \3 R
/****************************************************************************/9 z6 Q0 j, Z9 { E6 ~1 C3 u
void PSCInit(void)2 l/ K6 d E0 a7 r) {3 s
{& u. N9 t# M, R+ f
// 对相应外设模块的使能也可以在 BootLoader 中完成
# Q" q$ s( L- H7 Z8 f // 使能 UART2 模块
7 H: _; U# Y I) I' F" _ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
0 n. X- |1 K: o, U3 ^}
% _/ ?* V1 t" Z5 A# L$ J
( h6 ?1 A H! Q" \/ Q% T6 G$ w: y1 c9 z/****************************************************************************/6 O- S7 X4 l2 n) R( S ]1 i1 m! n- B
/* */6 j9 ^2 Q- F' k( q- i
/* GPIO 管脚复用配置 */3 o$ ^, r \: Y
/* */
2 W% n+ ]* I) X/ A3 H/****************************************************************************/
" q; R$ ]9 }% Y4 a2 d1 L# uvoid GPIOBankPinMuxSet(void)
) l( m% a! q6 h& Z0 ?$ C0 f{
; w! H/ V& `+ w6 I // UART2 禁用流控/ ~9 l* [) r( K
UARTPinMuxSetup(2, FALSE);
; \% {$ z$ M8 {& H+ B6 J/ p}- N6 n$ Q, {9 g' U7 m; M0 L& i$ O. m: w
7 F; h7 T% z/ {# n
/****************************************************************************/, ?/ [9 I1 N+ `6 x
/* */- B: B! w( G% t, f+ C
/* ARM 中断初始化 */' F; [; n m& b2 L/ {" u( u
/* */) X- q" l3 u) m* ? m. b1 Y
/****************************************************************************/
D1 g1 _' }5 ^8 o; P1 @" Qvoid InterruptInit(void)
9 r* e9 H3 f/ `7 p$ \" F{0 Q" A N2 @8 K7 Q; [" ~' E9 {9 D
// 初始化 ARM 中断控制器
0 @3 `6 ]* }. P. D IntAINTCInit();
: d1 o9 v- s) ]
" y# B/ O4 M' H( { // 使能 IRQ(CPSR)$ g/ w7 I% p6 z _3 A
IntMasterIRQEnable();% r/ t8 n8 R+ Y; U# ~5 x
$ q2 u- y9 z# f" f' q // 使能中断(AINTC GER)
' M1 Y# N! v+ C, L& |/ d7 V IntGlobalEnable();0 h% o0 D9 P: [3 h9 w3 n
1 {) J: l, w$ L/ X5 B& s' f! x
// 使能中断(AINTC HIER)" W/ f2 i+ A% k7 e
IntIRQEnable();
, ?4 `! U. I7 ]$ ~2 U; u}
+ Y! G( H5 \; J" D/ i+ L
U# J6 d$ b }: E w/****************************************************************************/1 c; T" L: p, W8 P( s
/* */2 j! Q. K5 z$ X% S
/* UART 初始化 */- H# x- h' w$ \3 U( Q' }6 o
/* */
: s) a8 i) t4 s6 w8 @7 {* ?/****************************************************************************/
# K; a, v5 I9 W# ~9 j* fvoid UARTInit(void)
# Q* a& b, ^% C, p3 P+ |" M+ a, E3 F{
+ C( J; a# V& Y1 N1 @1 x // 配置 UART2 参数
; D" @2 K% E: y& a9 j I9 x/ W3 X // 波特率 115200 数据位 8 停止位 1 无校验位
; _+ J- t J# q& a( J) X: c1 g UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,$ R/ q9 D( D7 u, }* t$ n
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);/ U6 a) Q* t P d# l2 V2 R8 p
// 使能 UART2& a2 @$ g8 ^$ f9 b8 f) l) _6 z4 B1 Q
UARTEnable(SOC_UART_2_REGS);
. ~, c0 Y) s" F4 H
9 {$ C) i) T+ _% H6 {! i; t9 W // 使能接收 / 发送 FIFO* O+ ~! n! u; O1 L' \" T
UARTFIFOEnable(SOC_UART_2_REGS);, p' R; N) _- ^) ^& P- O5 c% y
+ R- ^% Z7 ? T/ i2 ~/ G // 设置 FIFO 级别
: j. Q3 P2 X$ {7 } UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);: b7 Q8 Z; x! [
}
$ V. O4 `; {" K. H: ] \. d( T* w% J* D% C3 \4 Y6 L
/****************************************************************************/& |7 A- {; m+ Z4 _' {# F. o- D* _/ n
/* */9 X: c7 |* W1 P7 l& v5 r
/* UART 中断初始化 */& Z) X, P# D/ ~4 k- n8 J
/* */
/ ^3 `/ Z! K5 ]" L+ c' p. @' [* B; v/****************************************************************************/5 |& Q5 Y0 O- h& o" }! a
void UARTInterruptInit(void)
: ]+ k i! L$ y{, |0 u& q( G4 C5 z- k+ o
IntRegister(SYS_INT_UARTINT2, UARTIsr);
: E5 |, F% ~& D IntChannelSet(SYS_INT_UARTINT2, 2);
: V J+ X' ^3 T" V! w IntSystemEnable(SYS_INT_UARTINT2);
1 g: f9 ?" o+ H; H
- S# Y2 u$ N- _( S% T/ ^9 L) ] // 使能中断- @, q- ~: r9 `" B3 l7 {
unsigned int intFlags = 0;- Z( o6 W; [8 c; U! m+ X4 W
intFlags |= (UART_INT_LINE_STAT | \
$ g2 Z; B6 O( d% T: v0 S; O1 L UART_INT_TX_EMPTY | \6 ^, z) e! ~' W1 U% \
UART_INT_RXDATA_CTI);& R; W* ~8 L* a( W) s
UARTIntEnable(SOC_UART_2_REGS, intFlags);
1 \# _; s" \5 {; }2 t}
! n6 m7 O5 x% Y% I! p
2 Y b) T0 K. p6 U4 p: y/****************************************************************************/& p0 y5 I( ~9 f! ^" X7 A2 P
/* */
9 w1 L; l" k5 c* }3 c9 \/* UART 中断服务函数 */
1 @$ E' H$ ~) T0 L/* */
. n$ j' \- E9 p( \4 |/****************************************************************************/6 _% {8 m! w+ i6 V; S7 s) R
void UARTIsr()
8 A1 Q4 n- y1 K+ B4 R* b{
& [. t; x9 b8 y! |, P8 e/ q9 a- U static unsigned int length = sizeof(txArray);
/ s8 I* x& g$ b static unsigned int count = 0;
% b# o; e8 ]! }! W unsigned char rxData = 0;
5 r2 U; C G0 \6 d0 T, ] unsigned int int_id = 0;- m" _) C3 }0 a* l% v( K" L9 m
. t" m. G2 ?, B! @$ ]8 z8 H* R // 确定中断源2 S! u, M$ l" U3 m
int_id = UARTIntStatus(SOC_UART_2_REGS);2 S0 ^5 P4 \* Q$ x
' `) k/ f2 r$ J: ?$ I1 r% r. ?- ` // 清除 UART2 系统中断
- x8 z5 Z" v# p: ]2 _# }2 q IntSystemStatusClear(SYS_INT_UARTINT2);" o9 F& p$ [+ ?! S' U3 T) w
0 q4 d5 j, Y, f1 w9 P6 i$ p% U // 发送中断! h: Y( w2 a# z- p4 V; S7 Z1 R
if(UART_INTID_TX_EMPTY == int_id)1 E( H9 b0 s8 R/ `+ F. u$ t
{; F6 `8 y) `1 t6 c/ l
if(0 < length)% O5 l& u$ F% ?1 p
{
! i5 B' F* G, m0 z- d // 写一个字节到 THR
2 X8 B0 F$ w. u UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);6 s2 z5 J6 q9 c
length--;
: Q: ]/ K( x5 j- ~2 m0 X7 B count++;8 W0 b2 Y/ N* A; i, y$ K
}
; F; Q1 T" m) Y' m5 J if(0 == length)
$ F8 L( _( O1 b. Z& ]* i {2 Y! i2 H4 }+ E B G9 t
// 禁用发送中断4 P. Q' T7 n Y/ R( ^4 J$ ^5 |
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);1 _. e* \& c+ y" G9 d
}1 R' F2 C" Q: Y8 ]
}5 g' h P, [5 V' v& F9 g, \
0 Y5 S" h7 _/ ^3 w, J; A* y // 接收中断$ }8 K( O4 J/ N5 P8 u" M% B5 a
if(UART_INTID_RX_DATA == int_id)
; W" K& P) q0 l) M6 |( p0 [5 v0 t {$ o4 l7 F5 L5 K0 f9 H
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
# s) d3 g# t9 m! c4 |4 V2 ~8 A( K' B! I) q# K; b/ a
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);- e- t: X% u0 k: N" `& {! F
}
# p+ ?: ^+ @; Z% |& i6 V. {/ a K, q2 _0 `
// 接收错误
0 t8 [2 x6 k( w2 |+ r" F7 t if(UART_INTID_RX_LINE_STAT == int_id)# D! I+ v2 G0 L
{, P% T$ s3 I$ A3 v5 }& U5 r
while(UARTRxErrorGet(SOC_UART_2_REGS)) Q, S( i) R4 R( `. e% r: l
{
" X, d3 ]; c2 _0 _/ d9 l5 E // 从 RBR 读一个字节
9 ]8 P ?1 z7 f& N0 G5 s. g UARTCharGetNonBlocking(SOC_UART_2_REGS);
2 C5 V; V5 ^2 R2 f }
8 E P% `$ E: ~9 K1 ?* s+ G }
& [+ U$ m5 C) u6 r
1 L9 M. W$ p2 r1 F+ K' J/ ]9 [ return;
~: j( }5 c$ m1 `* g7 o, W}9 E. Z4 K# g9 Q( ?& A! }
|
|