|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。3 \% ^, a; c3 I8 b
- U+ P9 |) u. V( |6 d. z! ?" Y& {#include "TL138.h" // 创龙 TL138 开发板相关声明
4 ^ E8 H0 x/ q8 Z
1 }* |7 r0 a% _4 K' c- c- K3 l#include "hw_types.h" // 宏命令
( X8 J* U3 j' T& Z/ A#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
5 f& M9 A" F% C#include "soc_OMAPL138.h" // OMAPL138 外设寄存器" T. H! z& I' T4 h* P
( N% g* d7 x( F. G+ [+ X
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明! f% X4 I$ r& s4 a
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明# ^8 L' ]+ G2 O. s3 M
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
' c$ Z8 A( ~ L/ ], c#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
. ~; `$ T5 x" o! g% `
4 Z8 s; |" e5 y7 l/****************************************************************************/
. r0 I4 k1 s0 J6 \/* *// w8 W* q% C+ c4 [) X+ N3 i: V
/* 宏定义 */
. q0 }5 a. R# n, f t% ?; _" s; T. _/* */' v5 |# }& e; R' Y5 k
/****************************************************************************/8 d. |1 Q# D' T8 P/ @$ M t
// 时钟8 j% E" y( ^ Y7 [5 e, p" ~
#define SYSCLK_1_FREQ (456000000)
4 }1 q x1 X" I ~, z" g2 L- U6 V#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2), j9 S$ i9 z8 F) K M
#define UART_2_FREQ (SYSCLK_2_FREQ)+ q3 {0 {5 x9 Z }5 d9 W
. a, S5 C6 M" D9 w
/****************************************************************************/
( K: V4 z, m4 \2 c; I2 U/* */
6 _: ?# Y( u$ p/ q/* 全局变量 */
) A" H" S% f0 g) |, G) A1 G. }/* */0 k; s) w7 B/ q( g/ T5 B. _
/****************************************************************************/. `6 |8 l; n/ G+ p" |& Y) @
char txArray[] = "Tronlong UART2 Application......\n\r";
1 y% N/ i0 L* \$ E" l9 }0 y
3 z) y* a. }' [ o4 `( E& g, x/****************************************************************************/
( R5 \( v% M! j( {, ?; E; [/* */3 k* n: t+ v3 f1 g1 @- t. [( w
/* 函数声明 */
) k4 B# b( h/ F) d5 Z+ D/* */7 P+ x; D8 M; C6 L
/****************************************************************************/& B, E, I; p% t* k6 Y9 C
// 外设使能配置( j- s* l# v+ Q! J5 H, r! y4 f
void PSCInit(void);
3 \) h9 Y1 w7 l( u
1 A. h- H- p V. D! r e' x/ P// GPIO 管脚复用配置
0 b( q4 x! P8 j1 v4 s/ Kvoid GPIOBankPinMuxSet();9 E7 @* B) s, J& n. V0 V F
" F9 E* o! O6 A; t) w% d
// UART 初始化
! l6 p+ i) m/ f" i8 U5 f$ J& tvoid UARTInit(void);
( T" T# i0 C% ]1 g. s* n3 C// ARM 中断初始化& h' W& s; U3 u7 U2 ^+ s; v: v
void InterruptInit(void);
: R, c, Z& a4 U// UART 中断初始化
3 |$ `8 }$ f& S* R: o ?6 P+ d; ^void UARTInterruptInit();1 C+ M' z f$ J/ q+ ~4 A
// UART 中断服务函数
+ e% U: t. X( @3 V2 mvoid UARTIsr(void);& R- b( ]& o) w
?% J, [+ Y& I2 g" S
/****************************************************************************/ I' A* b& q7 Z+ w
/* */4 D" i2 y2 b! @7 d- l3 ]
/* 主函数 */: G1 Q8 K8 ~* U r5 j+ d
/* */
% U3 y9 K& u7 N; V: d% y; A" o/****************************************************************************/7 q* N: k: H3 P H
int main(void)
' H( V5 t t8 A& n Z{
1 U5 u! d6 D% k) c+ n // 外设使能配置
/ l& n4 G) X( C9 H( R PSCInit();- O* j: U$ i, D5 m* ?, v. b3 c# |: k
, o. L( T/ r: ^" ^7 |
// GPIO 管脚复用配置
% Y& @" A' O! N& | GPIOBankPinMuxSet();1 E8 X r1 q' e( y' [
& h. _+ ?2 } R+ [: h) `# p
// ARM 中断初始化. H4 f5 a0 i. I2 Q ?$ T5 s
InterruptInit();0 |0 k4 {7 \: w9 c& p* f( _7 a
% q( r# J( q2 i. R3 `0 K // UART 初始化" A1 L" ?2 Y' b
UARTInit();
! E6 P0 c% \/ U+ @8 j( t9 y2 V: p3 m# B
- Y6 V, c. N( j% p) l) t // UART 中断初始化; V- `- w3 ?7 A3 L" y
UARTInterruptInit();$ U; f2 N& q( o3 v# X' r7 L
# f: m+ } _! x/ z+ b
// 主循环 C8 \ b8 m6 }6 O. G
for(;;)( h9 @+ o7 K" |
{
( T: A, D& k. U2 P: o) Y. i
: @6 F. K" k+ ? }# n/ L3 k+ @9 R* P$ @
}& l; R+ K3 }+ m# T. {* _9 s. B
) r7 W4 E- k3 j9 l5 i; x+ c/****************************************************************************/; k1 `4 h. ~7 z+ a3 W+ d
/* */: C/ a$ N$ `, Y, S
/* PSC 初始化 */8 Q! e8 g5 c4 ]$ _
/* */
$ Z+ M8 k$ `. h d/****************************************************************************/: n* N+ B8 Q& W1 j/ @
void PSCInit(void): R/ p5 H% D: ]# h' u
{
8 b& p. {2 j/ j3 G // 对相应外设模块的使能也可以在 BootLoader 中完成
7 V/ B5 D" [( ^! { // 使能 UART2 模块
% \' i" C* e1 ^/ b1 Z4 }" M PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);, w4 N8 g: q% X9 v
}
( u" M: s6 k& y1 W4 H5 l& ?: J8 ?3 V( U& R' I
/****************************************************************************/# J+ h% t# G5 }! Z& H
/* */
: c; g9 r5 F) K& |) Y- Y/* GPIO 管脚复用配置 */
2 q" r" v. t" t8 _) z/* */+ s2 H6 q5 M! e
/****************************************************************************/9 Q& e9 f) `1 X1 C
void GPIOBankPinMuxSet(void)* W0 X/ ~+ g' |) q5 Y$ i( z
{
2 O+ U8 }; s- O# H( k // UART2 禁用流控
7 k8 ~4 S: | u/ b: Q9 V UARTPinMuxSetup(2, FALSE);
! y8 ]) ~4 _0 X1 |}" j6 W/ D3 D" ]/ D" [1 \! S
4 [6 ~* i) N/ h m/****************************************************************************/
$ p" d0 \* J% Z2 v9 V/* */) t3 c& e P5 h# N1 C5 p9 _
/* ARM 中断初始化 */2 H% K& \0 X: b- ^; c, ^$ S4 A
/* */+ S. G- C3 H* b6 q9 x) U H
/****************************************************************************/
7 }1 F& ?! Z. L! k- o8 ovoid InterruptInit(void)! h4 \" p; w4 w$ R; f7 G" V, M
{9 ?9 z4 H, P9 i- b' R4 o/ u6 n
// 初始化 ARM 中断控制器
7 [( t/ N7 O+ f/ t6 ?$ T/ W+ _- L IntAINTCInit();# r+ C! E: a9 n; G/ {6 ^+ l- q. z
5 i7 Q* O. r% {4 t8 N* d9 J$ U // 使能 IRQ(CPSR)
9 s* @) ~5 r( b$ U IntMasterIRQEnable();
1 j/ x/ H% m7 ^ }: z) q6 b0 N, A* R4 k6 L& F. @
// 使能中断(AINTC GER)
1 t0 o% U( @' Q6 f6 G0 {9 d# {3 r IntGlobalEnable();
8 G- o( i G/ H( g! m$ h5 Z3 s% `" R O" j/ g
// 使能中断(AINTC HIER)
3 e4 I5 U- K6 m5 A# Q9 x IntIRQEnable();# L* u- _1 K5 t5 e7 w7 g# c' Y
}
% n3 D' @/ T- G. p/ c8 F
" ?5 Z g1 P& w. |0 H6 g/****************************************************************************/2 A3 U, n$ K. C/ c+ E
/* */: F/ [- D: w/ I( {+ d: c# s
/* UART 初始化 */
* ^. A, |" v2 o! J, D1 `0 Z/* */
0 b9 g# Z9 R) m$ K7 J6 _/****************************************************************************/
) f5 U1 Q7 t: `- @2 {# Dvoid UARTInit(void): h0 c+ U* y& G6 v9 |* u- U3 M
{
D9 Q. I* z F. r0 t // 配置 UART2 参数. m* |* U& R% y# }
// 波特率 115200 数据位 8 停止位 1 无校验位& W7 r4 @# \' @9 s
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
9 n' f; y# e0 N A UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);7 g [( I; X0 q/ h9 s4 F. K
// 使能 UART2+ s; U7 N) w5 ]" }. a5 ]. G
UARTEnable(SOC_UART_2_REGS);. j" R L6 E2 A+ X$ N
, Z* d% r- W( Z" h; l q5 I9 g
// 使能接收 / 发送 FIFO* P: \8 |% T0 Q
UARTFIFOEnable(SOC_UART_2_REGS);$ n: l, P+ a0 w$ f. I# ^
F% Y; \8 V& h( i7 r3 o0 R // 设置 FIFO 级别! Y7 V6 n* U5 i
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
$ q4 D+ U; c3 [* a}
5 O( N2 Y. M$ [8 T( H, ~$ {! B& Q) v w' M8 H3 x& W( h: S* R
/****************************************************************************/
/ T9 W' c' U" _4 \5 t0 t: ~/* */0 C9 b. z' F- E. q- k: x2 A1 y
/* UART 中断初始化 */
& f. P9 q7 m- i7 X! L( F6 B, K/* */) C& M* v2 V# `$ j% [
/****************************************************************************/
7 v8 D) i4 ~% o1 T) {7 lvoid UARTInterruptInit(void)% ]5 z+ |# i" h0 E' M$ Q. }# ?
{( C9 P, N: b; |9 H. F: y
IntRegister(SYS_INT_UARTINT2, UARTIsr);+ s* `0 U/ H- V1 A( {. f
IntChannelSet(SYS_INT_UARTINT2, 2);$ B: ?5 z! o& Z4 O, Z/ C
IntSystemEnable(SYS_INT_UARTINT2);
8 g2 _, a( N6 s8 a8 H: V6 Z1 B7 O1 p ]6 v
// 使能中断
$ O: |+ M. l$ g9 t! T1 l unsigned int intFlags = 0;& }: J9 s" M: ^
intFlags |= (UART_INT_LINE_STAT | \7 m% _# w& ~* d+ l% v: {6 J
UART_INT_TX_EMPTY | \
% V+ M$ l9 B- h C* }, R UART_INT_RXDATA_CTI);
/ H% F9 i/ x) P, {3 t UARTIntEnable(SOC_UART_2_REGS, intFlags);7 D3 N) @ Z) R
}6 L' ]' }5 c S b+ C
* N) _0 X! G% g' X
/****************************************************************************/& `" |' F$ n* ~9 k, L
/* */" W5 W: _2 ^* E1 S; S
/* UART 中断服务函数 */
0 m' _5 ~+ J1 \1 G5 R) o/* */
% W! Y( n" i+ a: T/****************************************************************************/% ~' p( C) ~' M/ r/ n
void UARTIsr()
& S/ `5 B# `8 H2 Z{
4 n W, N9 G1 n) i& l static unsigned int length = sizeof(txArray);! Y: `: z$ N5 a# Z$ N+ w
static unsigned int count = 0;
# V! T% f% r; Y: x+ ~ unsigned char rxData = 0;, w. a/ q& X0 z- h2 B- d
unsigned int int_id = 0;
0 T# b V) M/ V! L- _' s( `
- _- m: T8 a3 J! }. l' m* T // 确定中断源0 |; H* R: D3 S% [: G
int_id = UARTIntStatus(SOC_UART_2_REGS);
; L2 ?. B* ^) q' T# M% K( A; f, H+ c2 c/ u0 ]7 _
// 清除 UART2 系统中断
. e# N! _$ O: ^$ U IntSystemStatusClear(SYS_INT_UARTINT2);
8 n7 n5 t' B7 p8 q4 ?
$ [9 n/ n1 I/ o0 H7 M0 ] // 发送中断7 {) x, ?) L$ q* O L; f" d! e% F. J
if(UART_INTID_TX_EMPTY == int_id)
h+ G4 f$ G6 {/ @5 l6 U: B {
4 y! R5 F7 p D( g5 F if(0 < length)0 \9 x6 u& K' t: e* {, N2 Q# u/ i
{( H5 i. T |5 K" C* {# R, w
// 写一个字节到 THR4 d9 J1 N- Y5 i8 g" Y) a0 [
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
2 I) [, O/ z. s8 H length--;5 r j' J0 U5 S# E, z2 Z9 D; F" E9 Y) X
count++;
$ o/ I- i" H4 K" a. b3 z* h3 b }
% E3 e4 w9 M1 n+ p) R& u if(0 == length)
: t6 _2 R, _0 ?# M/ S; ^ j# v {( S; N8 y8 i! i+ [3 ^1 }
// 禁用发送中断$ }1 ^( z! [& k7 U1 z2 K3 D% O
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);& |- @0 l. j3 _- d
}
O7 J5 `' X. P5 b0 \ }' c# X2 w) _( S$ z3 o
9 u' n4 K' M! J# {0 ?% ?0 ] // 接收中断
; y* I( M3 R% K if(UART_INTID_RX_DATA == int_id)" C: `, Z% @9 y% t: r4 T; Q+ s
{8 t# _7 G7 L3 q0 g: V V# F
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);3 |) B8 t1 Q+ E- r) Y$ o: \, s
" Z. |: G8 x( o8 F+ ]
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
1 i1 F, ~* a/ {4 @; X7 u6 _* | }
: B5 R. a# X }4 D1 ^7 a& X
& A; u8 [" s8 D" h/ W) l# Z/ { // 接收错误2 `" g- P+ z/ a1 F
if(UART_INTID_RX_LINE_STAT == int_id)1 A) c. A k* E* q$ {5 {
{
: i3 a9 D- M; p# T: i while(UARTRxErrorGet(SOC_UART_2_REGS))
7 S# J4 w# c2 J6 v: h! H {
+ u! L! M1 R9 A- `" [ // 从 RBR 读一个字节
^" i- M& X, P, r! ~0 g7 Y UARTCharGetNonBlocking(SOC_UART_2_REGS);
N; D, C$ P: y$ w }9 H9 O! G2 h8 A, K) b9 D
}
/ Z1 k/ H/ M3 ?; P3 a
& M7 I: ~, ^' K1 a return;
' q9 e5 Z6 g1 s& w) t. K4 H! L* D}
) s" X* d2 W( [+ P0 X/ @) X |
|