|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。2 p5 ^2 Y$ I$ {0 J
. U+ X: t/ q# L, y4 i#include "TL138.h" // 创龙 TL138 开发板相关声明
, l8 ~: U: _2 F$ b6 B$ R
( s) i+ [% [2 x" q2 }, o#include "hw_types.h" // 宏命令1 S4 i( l& o- n
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器+ n j! V8 U( o1 I+ \
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器; m& ~( p7 Q6 R7 L, d7 c* S J
/ h8 ]: Q. ~- Y# T
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
7 o9 \* y$ {5 e! u#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明7 l e( x0 J0 @ r' ]3 d+ I$ U
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明+ l ?. G# e& b$ x
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
1 L* k1 y- N# G+ _
" q% J/ |3 a& F. z) `; `/****************************************************************************/
, I% v- V" Y M6 o; x- i. m2 n/* */
, [" O/ s! F) L( I& b/* 宏定义 */, n4 t9 U2 `+ Z5 B6 X$ A
/* */
. H& G# }+ K* w- c/ q- \- I/****************************************************************************/
9 ^. U: ]- W7 O. V// 时钟+ s+ R$ j) q& O4 ^
#define SYSCLK_1_FREQ (456000000)2 d+ T0 D5 M4 L( a( o
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2); e( x$ L2 W7 J4 {/ K6 L( L! K% }# n
#define UART_2_FREQ (SYSCLK_2_FREQ)1 u& h/ k: n7 F- o/ D. r2 u1 _
( L1 U7 b/ c0 Y2 K" ~" E) d
/****************************************************************************/
4 H: L- n' Z. p" q/* */) i% L9 r0 W5 X6 O4 E6 r" E7 z
/* 全局变量 */$ A8 L5 S3 I$ p+ ]" L
/* */$ _3 E) X- ~3 G4 j) p5 K/ `
/****************************************************************************/) {- s8 z: i4 C( S1 W& p0 k
char txArray[] = "Tronlong UART2 Application......\n\r";. O+ S$ }* l! F9 J0 U% x
1 i9 V Z! O$ M- ]5 j8 e5 H* [7 b
/****************************************************************************// N% Y' _" t, V, o. _( I: v) E" G
/* */2 C3 | p L) o6 S0 `5 Y1 @
/* 函数声明 */4 p5 ~2 b( h& @* U* X
/* */
4 V0 {% O3 w8 ^) X8 Q, j* n/****************************************************************************/1 m# k; b. h( H3 O8 B- w( B# A
// 外设使能配置
' ]2 u8 o$ C9 D" y! |6 r( ^# M& Xvoid PSCInit(void);
- t6 W* ^3 V4 H0 u ~( r0 ]: {
; Z) P% `5 e5 b// GPIO 管脚复用配置2 t |7 }( C7 Y6 {% O+ u
void GPIOBankPinMuxSet();
% V5 S5 e# O, f- B& J) a4 b6 P* R7 w
// UART 初始化6 j: ]6 [# ^: ?6 n
void UARTInit(void);, n8 o" J3 a' x& y! L
// ARM 中断初始化2 w) y5 X( \. l# Q( ^
void InterruptInit(void);' \; H2 ]2 [) B8 |8 [) I* [
// UART 中断初始化
. R1 I6 G* T9 V0 }void UARTInterruptInit();
: R' q7 w( Z* }5 E8 A// UART 中断服务函数
) C" C: F ] U* B$ mvoid UARTIsr(void);6 Z- |8 P' i6 i; k# t
8 F2 c7 q9 o5 c! [( Y1 C0 x
/****************************************************************************/
: ~# l, z: v7 d" w; w& N/* */
5 T/ ]# { z( F. B4 e! k4 P' I4 z/* 主函数 */
T# M; V ^5 Y6 ^- V/* */* ]5 a" j2 d5 |
/****************************************************************************/5 k5 Z% F! s4 r
int main(void)1 m4 o. A- l5 X. x1 t. z3 h( P, f: [
{! K8 d" E( ? x# u% Y- R
// 外设使能配置$ a" @2 f4 M* l& d
PSCInit();
" n+ ^0 i$ `( m. U" _& l Q" O 9 r8 P% K! f& F
// GPIO 管脚复用配置
4 q* n+ `. x* \1 l% `; M$ V6 n2 W GPIOBankPinMuxSet();$ C" E8 A% b" m/ V& m4 {
3 Q% g; r$ S" A+ z( Y7 k
// ARM 中断初始化# U( K. J. v# `7 f
InterruptInit();2 |" t3 L/ ]7 o% `& e: s
4 j. D" n; T6 K // UART 初始化
' ^+ s2 R, n6 o: ^% _3 S/ }# u: m UARTInit();
/ R* O5 }7 g5 d- T
3 u1 L3 l; m4 ~+ w& @# b3 M0 K // UART 中断初始化8 T* F! {8 o _5 C- M, u( {- s( ~
UARTInterruptInit();5 T K+ z0 k* e* {) \4 G
2 N9 v5 B7 q3 t
// 主循环
/ ?% d& C8 @/ b" I" c* R for(;;)
/ k4 ]4 P- d2 n {
1 d% u9 U) C; `* ` f, k' }: y" h/ i8 @9 P) ?, T6 f
}6 G" [( g( p o
}
, y' c9 v& Z; x9 r6 e! J) q+ T
6 }4 d# s5 ~1 P5 g8 K/****************************************************************************/% {. Q/ Z$ x! b, G+ ^ G2 ]6 ~
/* */9 B* Z8 n& I8 y/ _- E
/* PSC 初始化 */: P4 K" n5 q8 R( j8 X4 l
/* */, }. n+ {9 w4 _) h1 F
/****************************************************************************/
& q+ ]0 s& k) e+ a( `; F4 {: Nvoid PSCInit(void)+ t! i8 n9 D k0 x, g3 n' r% O" { H; o
{
6 q3 L) d6 T$ j* a // 对相应外设模块的使能也可以在 BootLoader 中完成) j# c$ z1 e7 n, N: }( u# G
// 使能 UART2 模块3 c @: F1 }9 _5 Y4 U- I
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
% z8 @) }- ?2 [& [; J. _}
% J! P+ a# r m \; G( f
. i. i, V( s7 |# o# P; `3 \# }" \/****************************************************************************/
' w# E/ K* R; S* f$ A/* */- U) J' `' E' g. d
/* GPIO 管脚复用配置 */
0 L6 p' v% F- X+ K7 C" ]/* */+ Y1 D- {+ H m5 `" d3 O3 L' |) e
/****************************************************************************/
4 d1 v6 i( T# ]+ U1 Pvoid GPIOBankPinMuxSet(void)
' P0 I" q& B1 N8 j( p{
+ e/ p) |$ }) j& G! w // UART2 禁用流控2 ?# s8 T0 y, G6 m
UARTPinMuxSetup(2, FALSE);
: B/ N% E T) d" ~- J}8 g, N/ \! G- }. r% z/ D
5 q: ~0 n( Z+ {& h6 T/****************************************************************************/
' g- h% W6 [' H9 H( p4 k# q/* */7 }0 L& _6 y2 E" }; N
/* ARM 中断初始化 */
9 c' U2 _5 ~8 F/ D/ t) e2 F3 j9 s4 U h1 N/* */8 e+ R: y- j4 y2 M4 {
/****************************************************************************/' r* P& u* ^+ R3 s% Z% y& @$ \
void InterruptInit(void)5 M& R, v% n" |) M* T
{! c/ n" L3 p6 r$ I1 l3 p
// 初始化 ARM 中断控制器* @! w8 j* N$ c
IntAINTCInit();4 K2 l! R' R# V# q
( Z7 n3 T; O( T W% r( s% \ // 使能 IRQ(CPSR)) ~& [! W1 O. S2 m, F. |9 G7 p1 Z
IntMasterIRQEnable();: E) R" a/ z) Y! L5 Y" X1 \7 G1 a
! x) }$ P& y+ z" T // 使能中断(AINTC GER)" T1 {0 D/ x0 d% v# x& l7 B
IntGlobalEnable();& c" _! a3 I) h7 J: G: Q
% U7 N9 G$ ]7 R2 Q/ |2 { d // 使能中断(AINTC HIER)7 G5 `9 a' u. Q; }: b
IntIRQEnable();' X5 g) a- P; {* s1 L
}
* L2 w( {+ t6 P; [/ L2 ?5 y& ]& D0 Z
& O& O9 h+ S! R e/****************************************************************************/9 A' @, C' x- U4 a% i
/* */5 j1 Q; c$ O, i& w, D9 Y
/* UART 初始化 */0 v B' z s' C( K
/* */ M6 a, q% }& i: |& D7 S
/****************************************************************************/6 f" t4 y6 ?, S! w+ f
void UARTInit(void)
8 K) j% q) V# E% n/ s+ N{
( A7 N p: W8 e, j! O. w // 配置 UART2 参数 S2 q: Z- J6 u; a
// 波特率 115200 数据位 8 停止位 1 无校验位% d L9 |2 ], @2 v3 Z; q
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
( F" U- _+ ]2 } S5 K+ H UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
+ x+ i; t" J- j ]& b+ f // 使能 UART22 z: O- c0 n; }9 _. j
UARTEnable(SOC_UART_2_REGS);4 q' f- @: `7 }
( Q8 \; x7 h7 [( b2 W1 s
// 使能接收 / 发送 FIFO: e6 {. P. C( W
UARTFIFOEnable(SOC_UART_2_REGS);
8 S. V' m }/ b' U# i, [! x. D" `; m) @9 ~! W
// 设置 FIFO 级别
# ?# p- ~- `6 D$ c' U b/ E# q UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);/ V! Y0 ^ d5 X: s: K; d' R h2 F
}% ~$ [/ Y2 }$ S. F
4 ?9 V5 L7 y) j- ?/****************************************************************************/
8 D# @/ b: L$ Q0 L' l* _/* *// y+ k$ u0 S8 d4 f2 U4 z
/* UART 中断初始化 */- a7 i- F, m3 [) N0 K: J
/* */: @1 i% U. W1 j' l9 n8 V; O
/****************************************************************************/
6 @( j/ O7 T, z: I( @: {1 Ovoid UARTInterruptInit(void)
8 A: A: z7 V6 M4 U: r' c{
0 V8 |! u% x8 G, C+ \. E IntRegister(SYS_INT_UARTINT2, UARTIsr);
* Z& [$ y+ y- ~7 s1 k IntChannelSet(SYS_INT_UARTINT2, 2);
2 h4 |3 z' _0 M; \; H4 e: \, u( ] IntSystemEnable(SYS_INT_UARTINT2);* v, _( q* n8 i
/ m! B$ f6 Q; [! X4 h! b+ X
// 使能中断
. M0 N. l7 h7 L+ C unsigned int intFlags = 0;/ |, a3 K* z+ o) d# Z. ~9 f
intFlags |= (UART_INT_LINE_STAT | \+ B$ } r( O+ h0 z* Y1 O H/ t
UART_INT_TX_EMPTY | \
" D* w7 q$ ]& s6 M! e/ y. @, p" k" @ UART_INT_RXDATA_CTI);
7 e1 ?) Q. `- @; A UARTIntEnable(SOC_UART_2_REGS, intFlags);2 U( T7 S& J3 n' n
}. w3 o3 N& }3 G# _. v0 J! F8 Q) ?) C
- Y/ V1 W& R5 K8 E q p
/****************************************************************************/+ T) c0 ?* \, p2 V
/* */: X& R* I, Z; J! v1 @" x' P' l
/* UART 中断服务函数 */0 z- x8 T6 Q/ q) k6 \
/* */
/ Q" i1 h7 S- ^4 x: z/****************************************************************************/
; s u/ Y6 M% H# p8 O% xvoid UARTIsr()$ l' `2 O9 F) k; p( n
{) I2 \0 n0 Q0 n, j" G% k2 m; C
static unsigned int length = sizeof(txArray);- b. i6 [8 Z, C4 x. c( ] C7 r/ S
static unsigned int count = 0;
3 x) t1 `8 L3 H) T. M$ Y6 J unsigned char rxData = 0;
/ s* g- C+ }) C3 h! W8 X- ^ unsigned int int_id = 0;
1 V1 d+ S3 J# f- Z/ Q" O
$ Q# P/ |0 q$ ^; w5 R5 V+ } // 确定中断源3 L% {2 p% ^; V; q D
int_id = UARTIntStatus(SOC_UART_2_REGS);
& Z% ^# o# \* @+ ]* O7 E( }9 n% X, q2 {- m' E! K
// 清除 UART2 系统中断
- k3 W) R, e2 O IntSystemStatusClear(SYS_INT_UARTINT2);
: T8 r9 H+ w: g/ a) A( ]
7 Z/ \' S$ {5 K, f9 r/ l! k // 发送中断5 u$ f3 {2 _* Q) _' o" c+ t* G
if(UART_INTID_TX_EMPTY == int_id)8 l0 h! F' U4 m0 l+ M4 C; m1 n/ z
{7 E, I ]- V$ [, u* z$ F+ C
if(0 < length)
8 C) H6 Q) n9 h5 r) V- Q. t( m9 L {
' V0 @7 X% W; V5 W! \0 d0 ? // 写一个字节到 THR
! `- O0 T* Q/ h% h6 S% x! m, K9 } UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);4 B" E2 m' u% I8 S' d' O: _
length--;9 f; c W$ p( F
count++;
( H( c" `; S7 ?) `1 I6 ^$ A }/ g2 G) u- m+ q% w
if(0 == length): U3 c! u' L( @
{* Z" u4 c0 p& t: @
// 禁用发送中断 C" x7 a$ p% W. d/ T( V
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);2 @% i! P( s6 }; f! p) D3 {( w0 H
}) Y7 g4 o; j/ }6 a5 u: j
}; Y- k9 m. L+ h; C# u
% c8 P2 K, ^1 P9 y# k6 n // 接收中断& R. x0 J* u2 s# v0 w' O
if(UART_INTID_RX_DATA == int_id)$ n+ x. J: C7 ~& N7 \
{
0 a" h- m8 I: F rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
) B3 q( R5 W* @; b0 C; `! v8 L" G: P% G4 o7 L
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
9 B1 S# D z. r' a5 H }1 e1 ~$ t7 `7 _5 e K) q) r
. o2 v B. A0 d: ]+ F8 e
// 接收错误
/ s( y+ j0 Z: @ if(UART_INTID_RX_LINE_STAT == int_id) y( D) Q. Z- G
{/ W5 `) b8 d/ f e
while(UARTRxErrorGet(SOC_UART_2_REGS))
8 ~/ }! }, o. \/ p# c$ G) ~ X {/ J, ?7 d% R6 E( n0 J
// 从 RBR 读一个字节- X3 Q+ q1 y, K# Z( E; v
UARTCharGetNonBlocking(SOC_UART_2_REGS);% P2 M2 ~: w h( K
}
$ S& s2 E3 K! Y4 X: M1 R2 q }3 X9 b0 s+ r( @/ k4 w
, d2 i2 {" F( m; r return;
- h- v- q s" m! y8 Q}
3 V C( J6 b- _4 H& t+ { |
|