|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。# w# C( o3 O9 f; D& ]' [
, O- @) c+ I& \% @
#include "TL138.h" // 创龙 TL138 开发板相关声明0 J( \( f0 o+ r, w9 E
3 y% h" d: F4 r+ t, L#include "hw_types.h" // 宏命令
( [+ }5 ~6 k1 m7 _. `- b#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
3 i$ o: g5 ~: g1 S, m0 S: w; O#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
( Q0 X0 G/ Z8 Q& ^+ Y, q5 W; Z9 o, I- B1 A
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明- c1 b! H Q% x
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明* E# U, V6 _+ C: e
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明1 @5 x2 g- W3 m4 v
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义* ~8 D2 T7 J# {, \/ {
$ H! Y* Y1 t' B! L. h/****************************************************************************/1 A5 V, D6 L* A/ {8 ?
/* */5 m; U4 T ^2 g4 q1 f
/* 宏定义 */
3 p7 `+ Y) e5 m3 v- u. k* x/ P/* */
( K+ E$ h- n0 |- p9 K# _" t4 k+ v; [" ~/****************************************************************************/
2 d( V& K% x* H5 e4 b! R5 m// 时钟
2 c% G8 {: Q- [, G& s/ p |#define SYSCLK_1_FREQ (456000000)
( |/ f. j5 H! ?$ E& T) W) O#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)( n, q1 S; e/ a0 Y9 T. K
#define UART_2_FREQ (SYSCLK_2_FREQ)+ |6 L+ M+ I: a+ P% V: R
, ?# w+ i5 [+ q. ?% Q* [/****************************************************************************/, T+ U6 U$ E7 }9 U5 S g
/* */
/ R1 }8 ^/ V# R0 Z& h& G. c$ W/* 全局变量 */7 _+ B" M$ R1 }0 W0 w; t2 i! ~
/* */
3 v# u. V" O5 r2 |! f/****************************************************************************/ H c) c: {8 V @
char txArray[] = "Tronlong UART2 Application......\n\r";
7 ~% O5 j, V; q$ z: L# K5 o
6 r$ e$ z6 M& d( T' ~/****************************************************************************/) S/ W" d3 [/ J# I; V9 M2 \
/* */+ ?2 O1 Y" j$ M1 {
/* 函数声明 */
8 F4 a4 D/ M0 n& J/* */
9 _8 r8 v. j/ T @4 l$ P, v/****************************************************************************/) L+ {1 G7 D) y: v
// 外设使能配置5 z0 p/ ^4 f0 I+ X" F U0 F
void PSCInit(void);# N# {/ N2 ?9 J* z, \
. `2 J7 m% D" g" ?: X8 ^3 f: I
// GPIO 管脚复用配置( \& P* }/ y+ r- R/ y: u' l
void GPIOBankPinMuxSet();! V# M$ M9 i% M' a$ t8 [6 j9 n
% b1 V& ^9 b6 C% {' N) |' ~/ q- l4 s// UART 初始化% _6 `3 @- [8 M% g; q+ e9 W; K7 y
void UARTInit(void);! `9 I% \( x7 `& z
// ARM 中断初始化
# T: V5 `: [2 Z7 U, J) mvoid InterruptInit(void);
( f* F2 d' l4 p// UART 中断初始化
, n7 R: K% I: x! e5 ^; x% J1 Xvoid UARTInterruptInit();
: e6 w. m0 T# R7 \2 \// UART 中断服务函数+ C1 _! ~! W5 P" ?
void UARTIsr(void); B- u3 p2 ]+ A" Z
h1 H7 P9 B5 C, ?- z |) m
/****************************************************************************/
x* ]% A% o6 o; V2 ?/* */
: x" Q$ ?2 L6 L/* 主函数 */
& J* I4 q4 @# b% w/* */7 Z/ a5 }/ X; P1 y( g7 M
/****************************************************************************/
* Z$ r7 b! `8 Q9 j' ]3 k( fint main(void)
% G1 Q3 Y8 K" ~) @{% ^) w; n E# `
// 外设使能配置2 M9 g% @/ q1 q+ ]) ~
PSCInit();2 n& Z3 Z, a( Q, M( i1 J) n9 o- }
2 E* ]+ D: D! p: g
// GPIO 管脚复用配置 f5 w' E$ z9 o# e6 m! s
GPIOBankPinMuxSet();
, O' v& ?# ?$ ~$ ^3 j! I: f+ x2 k& y+ P8 `+ k0 I2 I
// ARM 中断初始化
& Z: U4 G# b% ], W InterruptInit();$ z# {5 j# h, N- S" F
5 a$ q {$ ]0 q7 t5 X7 D9 w
// UART 初始化; m4 S$ Y" l- [
UARTInit();
9 b# l- P5 r5 V% N3 |" @% U, j
// UART 中断初始化
7 |# ?2 q3 d4 f# @0 _ UARTInterruptInit();% Y. @8 u+ v5 G- F% m
; V5 _/ I8 D! b) j6 J8 ?8 v // 主循环% i5 k( _( z: i0 a5 G. F' V
for(;;)3 s$ X) d F$ Q$ A+ n
{9 C5 y, q: G0 Y/ v
' m# v% `: p4 ~1 o4 x" K; a
}9 Q) u& W9 P6 D3 e* C
}
" p' f' m4 _7 V" q& U& s' z& l) T- \7 l" ?# R
/****************************************************************************/6 G: a" q6 R& y1 Q* p `
/* */) ?. D/ L/ w& ^# p# x( z
/* PSC 初始化 */
3 {4 i, |) Z# T7 G+ ?3 o- |/* */
Y% V8 e) G2 b+ o0 X/****************************************************************************/$ i5 |/ H0 B. f% u5 I
void PSCInit(void)
. [6 i M+ K& a$ o, [+ F{
8 U6 j7 v/ N, V" p, e( A: L* V // 对相应外设模块的使能也可以在 BootLoader 中完成& m% j, S- D2 \7 T
// 使能 UART2 模块- l- I5 R2 U( C, F0 F E. ?" Z
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
$ G' v: N& J" ^8 _% _4 V; k- f}5 v4 i; N$ c& i8 m
) S5 e0 L9 f, @3 J
/****************************************************************************/
* l7 N! l# {( z/* */
; ]) Z% ]' r0 l+ x, J" [8 b/* GPIO 管脚复用配置 */5 |6 y6 n- E8 V- L7 o2 \% M
/* */
9 A9 `, n9 X5 {- R6 g/****************************************************************************/
" \4 n$ c, s' r. [void GPIOBankPinMuxSet(void)
/ O9 _9 S9 D8 b; n: t; M- d8 {{
1 D2 o, X8 L0 l5 K8 I. I' k1 n. w // UART2 禁用流控
- w1 q5 {" L; ~( N1 l* j% t" l UARTPinMuxSetup(2, FALSE);
2 S' V M. L. c/ | B9 X& @}
) C4 M8 }0 \8 t2 q( |0 ~1 X, G/ y! S( o* K" n9 {
/****************************************************************************/2 i9 K( x( u7 v: I. t. D
/* */$ Z- t6 I& q) G+ {6 e( g; Q
/* ARM 中断初始化 */
* d2 z7 G* t7 z5 Q& g/* */
/ R! l* u* ?% J# M+ I/****************************************************************************/- Q3 V+ l/ n( y" g3 Z5 x/ M- B& b
void InterruptInit(void)
+ b( h6 L. T' W0 J. s$ d' }8 t{
6 y) _$ ~& e5 n // 初始化 ARM 中断控制器
$ Q9 U- p$ R7 i Y+ C/ B IntAINTCInit();
5 T0 N7 d: y0 H8 t' m: A* s0 W7 t! }
// 使能 IRQ(CPSR)
/ W. |' M1 D1 b2 e5 J IntMasterIRQEnable();
9 v0 `- e* T. V& @) O4 H4 \
( H) d; \( k+ Z1 J4 ] // 使能中断(AINTC GER)
6 y5 c" `3 |% v5 j: R# f+ P IntGlobalEnable();, C: C" R% L) D7 j, p" t$ s3 ?4 l1 x
; V" V/ m8 x' a+ a: f // 使能中断(AINTC HIER)4 `3 G- F* `. N% n, Z+ I& b0 k# E
IntIRQEnable();
+ w0 t1 v/ `7 Z6 Q$ Q}+ v( M" r* E. G+ h6 C
M1 }9 J$ H) n
/****************************************************************************/
. y* ]: y) i7 Z" p, [+ x/* */6 f3 b5 T8 a4 ?4 H8 n& S
/* UART 初始化 */8 W' R0 q8 g! a0 O
/* */$ g8 ~! T! x3 p H
/****************************************************************************/
8 v' ]- X: ~/ n4 ?; } t' \% @void UARTInit(void)( F+ b0 M2 P- d0 [/ b
{
4 l. K2 b R/ f; V- t // 配置 UART2 参数7 L) _' A1 z6 ^! P& n" c
// 波特率 115200 数据位 8 停止位 1 无校验位# L" Z& U8 y3 n3 K
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
% X: [$ R+ |2 D' p+ p2 d. T UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);8 Q8 e# p. ^, i$ ^, \0 E1 J/ m- V8 C
// 使能 UART2) x8 i4 }1 w/ E2 ]# d
UARTEnable(SOC_UART_2_REGS);+ v+ \) N1 |1 p4 t! i. X
$ v% e4 [# ?$ B
// 使能接收 / 发送 FIFO" A+ V: P8 Y1 x& R( w, ^. w
UARTFIFOEnable(SOC_UART_2_REGS);, _. h" n! K8 Y7 l- ^
; T8 h* ^' H7 D
// 设置 FIFO 级别5 A% T' r# a1 J6 S
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1); K& f) n+ J% p4 J; S. b
}' P; e7 h0 l) M v1 `& U
8 H4 M( A9 _# \
/****************************************************************************/
3 g" B' m# P: @5 s0 R/* */+ h0 `8 L3 W2 g- ?6 m# T+ x4 ?
/* UART 中断初始化 */
9 [- A/ X% q+ B/* */
- t! J9 w& A& \& t* b3 i! k/****************************************************************************/
, i: N+ K! ]# R: p' B$ Fvoid UARTInterruptInit(void)0 \1 t% Z4 F8 m6 D6 T; B
{5 Y+ }2 j4 Q* k9 _- e# a
IntRegister(SYS_INT_UARTINT2, UARTIsr);' ]/ M3 H# K. M3 n* |
IntChannelSet(SYS_INT_UARTINT2, 2);7 }: x2 p" n4 _% }6 g
IntSystemEnable(SYS_INT_UARTINT2);, f$ N! s. r+ z3 `
& @2 c0 v# M4 \ // 使能中断$ m+ b1 V$ i' {9 b4 I
unsigned int intFlags = 0;6 S* l$ j1 y. y
intFlags |= (UART_INT_LINE_STAT | \
& Q& h7 h/ R9 ]& Q" D UART_INT_TX_EMPTY | \6 j: k6 M' F( {- v
UART_INT_RXDATA_CTI);7 V# f: b' u7 v" {' `
UARTIntEnable(SOC_UART_2_REGS, intFlags);, O# l* A4 |3 _7 C) H C7 h h
}
2 h' ~$ _+ _2 N/ e1 h( e3 d9 o
6 h6 P) S! G- J7 @# U+ ]0 r/****************************************************************************/% b( n: Z: F* u6 W1 P J; M, y$ p
/* */
( j% s8 F/ q4 J/ ~/* UART 中断服务函数 *// J1 h$ ]: }# g* o3 }% `. S: X
/* */
- H2 b% ^, l# n* H9 S: e6 q/****************************************************************************/
# [" G6 a+ A) N4 F* Svoid UARTIsr(). g, j# Z X; P3 @: F
{1 C1 ]3 t8 y V1 V, Q- V
static unsigned int length = sizeof(txArray);
J9 [/ t# [0 R& |8 w static unsigned int count = 0;& P4 Z% R' U: j x: q: _: w
unsigned char rxData = 0;
% R; h0 |5 K; s. l" H3 {) l# F; P1 A unsigned int int_id = 0;
/ D& W: K" z! m" q" _
# X' _, e: j% b // 确定中断源
3 v4 ^! t& K2 w8 ^6 J Y int_id = UARTIntStatus(SOC_UART_2_REGS);
! \, ?- h- ^5 t4 E5 ~" ?$ g1 G$ e$ X
; w; w4 n1 P! p3 a/ ]7 A // 清除 UART2 系统中断
3 W* L% w$ h4 ]) [" f3 h IntSystemStatusClear(SYS_INT_UARTINT2);
8 E1 v7 D- X. K; e' p. g2 W6 ]' ]; h! P
// 发送中断
9 Z1 w7 D6 m6 D# Z. o) y6 d% a if(UART_INTID_TX_EMPTY == int_id)( d, O" M# j# \8 S8 i/ I
{
+ m* l+ G3 ] `6 r) v. ] if(0 < length), K' `2 W0 h( D! l& i
{
6 x: d2 n1 S L' F s. q // 写一个字节到 THR' ?8 v+ _- C2 \9 u6 \4 i
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
5 D' m) @. t/ m1 A4 F' @2 Q! | length--;; _( d1 L I" e, c% D
count++;6 J1 F) Q9 }; Y3 C* F
}( @+ K- `+ m% h/ w0 Q" L4 i0 |4 G
if(0 == length)( D7 V" }4 T' ]0 c+ T3 j
{ y o4 t! Q: K5 |
// 禁用发送中断
1 Y V- {9 N* W& [0 H3 u. l UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);4 ^* V1 ^* s3 H( F* H Y
}
c" s! `/ _2 |# i }1 V( z- f5 w% R6 {/ q
`2 ^7 K! e2 a
// 接收中断
* j+ {+ s) ]1 t9 k9 {: u if(UART_INTID_RX_DATA == int_id)
T: o3 ?7 ^! V- v2 h; o% x {
; j1 Z+ a& E' l* d5 e( ^# h/ J rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
6 t; s/ h9 y' n6 m" [% m \5 y+ h7 N) S8 y* Y; x
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);; J9 [2 W/ I+ y4 e+ i2 ?% q! z; w
}; U" u9 K* R R6 C% `$ `
) c- R- e( J$ p2 e9 e/ v
// 接收错误
- c& a. ]1 ?5 p* I9 d% N" ]! d if(UART_INTID_RX_LINE_STAT == int_id)
7 G6 z! H+ ]. V* b. X {
# r& z7 [' V# R0 Q( G while(UARTRxErrorGet(SOC_UART_2_REGS))( ~- g( C# i; p0 ?& B) R
{6 S# P9 {$ \, g V. K& t e9 V3 c, `
// 从 RBR 读一个字节! q& j; D7 p! N% E6 _" x
UARTCharGetNonBlocking(SOC_UART_2_REGS);
2 D7 R. }! }" r5 Z }3 j2 n3 O1 L+ |) k
}
6 x" a3 \8 _# h* Z. |5 Y! Z 4 E1 |; d" {( g# c7 a
return;
& Q" N: _# A' p1 h}
5 d- J5 C8 `6 g: F |
|