|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
$ C$ q! o' f3 [7 m8 w# F* z( c7 h4 c% x; B
#include "TL138.h" // 创龙 TL138 开发板相关声明
% E! I9 z: t9 a- L% d# V8 }# `( @2 H$ j) y; e3 W
#include "hw_types.h" // 宏命令
4 A3 c1 A- [- E0 ? R#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器$ I5 i9 H2 Z2 t4 g5 R
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器9 [$ q8 _# r/ s7 I, Q
3 \2 I5 \ _% N, ^
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
8 J# @ K; h& |% I/ o#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明0 j2 M2 I( ~4 d: T- z/ v. R
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
9 F7 o' J1 F2 ?7 A. U#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义, Z# h( Q* x/ w2 z4 d; N4 {0 e
. c% r/ H+ C: S6 I5 w
/****************************************************************************/; i+ H. L. y1 S4 i& j4 [
/* */
% l' `9 D5 }% ]( U! V/* 宏定义 */
7 l) s2 y n5 k6 M6 c8 {% ^. z/* */" I" j6 ?$ d/ ?# w
/****************************************************************************/
9 Y( l" ?& p$ s, C// 时钟) r0 c6 ^6 D3 ^0 z/ U
#define SYSCLK_1_FREQ (456000000)
9 U3 k7 G1 k4 X/ x6 l8 d, N#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
& @+ b2 T/ X" ~#define UART_2_FREQ (SYSCLK_2_FREQ)' n/ w; E# c8 u, Q
" _) u+ z2 Z w/ J8 F
/****************************************************************************/
& n6 O7 y6 i$ T0 e/* */6 w6 K8 K5 E# s. U( |. k$ V8 @
/* 全局变量 */" b) x! H0 P4 S# S) O Z ]0 X
/* */
3 f- [; `; `& n% r8 R; Q2 Z/****************************************************************************/: G. W+ h8 p7 b% W4 H- o
char txArray[] = "Tronlong UART2 Application......\n\r";# s5 L, H* b1 s ^0 P; v
( u5 R( m/ p, j
/****************************************************************************/
" m1 g% V! b" `; q, ?, J' _/* */
# }; c$ @8 H' l/* 函数声明 */
. F0 L: p9 _' k* r/* */
3 D7 f+ G; N% J% ?9 ^/****************************************************************************/8 r. V7 l+ K# c* K2 ?
// 外设使能配置! X6 U9 E6 o1 V4 a" N0 g
void PSCInit(void);
+ r) |0 J4 u' s
! n' {3 X) Z6 ~. _0 n. d, o// GPIO 管脚复用配置
# x1 P- M& h- A& {% pvoid GPIOBankPinMuxSet();! X+ c, @' H5 L; e2 A# C5 D$ i
- M3 c, _$ ?6 E9 K9 v
// UART 初始化8 G$ i4 A$ n4 l9 l8 H! f. q4 U+ o) w
void UARTInit(void);
) a' \& h8 _% F. G d6 K// ARM 中断初始化
, ?- E; `2 A. bvoid InterruptInit(void);
5 T' h0 g2 N1 {2 F( q" x8 V: W// UART 中断初始化
9 \6 f% p" W: Xvoid UARTInterruptInit();
( ?. o H& ^) t e" C* L// UART 中断服务函数2 Y- B3 k/ `) u: J8 Y
void UARTIsr(void);
' I% ~- r, @2 A9 t, s$ ?( }' W9 x$ E g/ q8 V
/****************************************************************************/
+ h2 a a" ^7 o+ q* v$ m/* */3 G) w7 N& H/ c* L! P( z u* b$ [
/* 主函数 */: N0 K, x: e: R2 ^3 k' [
/* */3 H8 {$ y$ j9 p! B6 a
/****************************************************************************/& P9 r3 c$ j( p% {! U" Z1 t
int main(void)6 R. c4 ~4 s- v0 z
{ V0 F& O8 R8 x, t: U
// 外设使能配置' ?7 V7 W/ ~$ X9 K* @
PSCInit();+ x0 y. z1 B; O3 [$ g
4 [; L$ Q7 x- I2 H* W
// GPIO 管脚复用配置
; [- q4 B) D% w. o% }5 x$ X GPIOBankPinMuxSet();4 a( _9 ?- b% c7 A( d$ i2 }
4 c5 }( @$ ?/ e) x$ n // ARM 中断初始化0 W3 t( R* w4 S4 Z7 B$ d
InterruptInit();
$ R% ~# f! C5 E" W* F" a
' T- w5 m' ~) ^9 H$ p+ y4 ] // UART 初始化
: n, ~2 O2 J' k4 e L/ Y, R$ { UARTInit();
, F* q0 v9 C' \) x* W( Z; i$ U* t }7 C8 O, \1 r2 R% [
// UART 中断初始化
; l0 q1 ^3 `$ y" o UARTInterruptInit();/ T: d# u# Y# { m+ u
, l U. W @/ h, x! o5 i& D4 V // 主循环* E$ Y0 ?: d# d6 g/ H5 u% {! [7 b
for(;;)
) e4 o* J3 w) W, p! t6 z {* m- M( i3 m4 v u
+ w3 {/ X. O- W }
8 O' x A- L0 @5 s}
- l) | T' }9 ]/ N: P7 ?) f) x# X: T8 X$ {: M
/****************************************************************************/9 Z! C! ^5 m7 }
/* */0 Q9 w: ?/ H/ u9 V
/* PSC 初始化 */
1 ~1 G ?8 R" Q/ e/* */) Q6 B& a. z Z+ D
/****************************************************************************/, v8 K. o" \* T
void PSCInit(void)9 q! \1 L5 n- d: y' N! t5 X0 z
{
6 C9 k, D$ S3 @& r // 对相应外设模块的使能也可以在 BootLoader 中完成
4 x/ d1 t1 o* _$ E; Z- o, g // 使能 UART2 模块4 N$ b& l7 W' Q3 ?! W; [) E
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
$ {- a J# ~7 _ _/ `}
( k, F% l% D3 u" H3 m
% ]& k/ o# I6 n L; p) L. F/****************************************************************************/ [/ `9 Y+ y4 `+ E
/* */( N$ s- x, U& [
/* GPIO 管脚复用配置 */
9 [. }3 Y1 W0 q' @8 Z/* */
% j- G/ z% D6 f( K' H7 g/****************************************************************************/. B: l6 h) P+ v$ U5 h/ N8 @
void GPIOBankPinMuxSet(void)
) t" H* B: M# N/ i: A{8 m6 I+ j( ~, f# G( p5 i: g
// UART2 禁用流控6 b6 R F' i9 S( P2 o
UARTPinMuxSetup(2, FALSE);/ ]. W9 Z: I: b" v5 H
}6 \+ w' M D* F" p9 Q" n
) c' Q3 w0 \9 t% R: P/****************************************************************************/
. S! {6 B+ p) X. ?# p3 L4 I/* */
9 M4 o, v% j3 R7 {% L9 O; Z8 [5 c/* ARM 中断初始化 */
9 O7 m) o f$ t3 n3 l+ {/* */& Q* z5 v4 a7 K) [' i9 V+ D u
/****************************************************************************/3 Q5 y! z4 r2 t1 C, \7 H# F
void InterruptInit(void)
* a# T0 {4 _' y& ?# l7 |3 ^" V" a: G{
' ~6 @+ d8 Q! s: `0 K0 |/ @ // 初始化 ARM 中断控制器
: j- [' G, H' r) z; T$ ~ IntAINTCInit();
4 N; A" e5 g2 h1 a1 d: ?9 q% f- k2 m1 m
// 使能 IRQ(CPSR)
$ L* k7 e; ?; w" K IntMasterIRQEnable();0 _# c3 A+ A: ~9 e1 y
( }! K7 h Q! q& e, {
// 使能中断(AINTC GER)! _4 H$ v) f3 ]. n
IntGlobalEnable();
2 e; F) i6 K: A, N1 b
: d5 X# ^0 p7 k9 j5 N6 @. `, @ // 使能中断(AINTC HIER)$ a( a9 Q2 I+ s/ j2 K2 _
IntIRQEnable();
! F1 @: T* _: O; O' R: {% r}
; [5 {% ?$ W w0 W
9 N5 x) T3 U& b6 `( ^5 i/****************************************************************************/
. d! p- y) T. @" R/* */
! C2 x4 E! W% h# g& R, `; B/* UART 初始化 */1 X& J w: `( Z; ^0 |# q
/* */4 z/ A6 K$ C. z% z- \2 N
/****************************************************************************/: J% q: i/ p& ~3 [# c w. r
void UARTInit(void)8 ^( S1 O3 t# W+ C+ ]2 S
{
" p3 e. k1 }; _ // 配置 UART2 参数
0 f3 i( \; Q" X* F& U // 波特率 115200 数据位 8 停止位 1 无校验位
0 O9 R' O5 w3 n! Y UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200, H4 a; q' V U% w
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);' p% J% K! Z( X* ^8 d4 d4 O
// 使能 UART2- H* @% Z4 O3 x* q
UARTEnable(SOC_UART_2_REGS);
1 P! \6 z# N: M$ T
/ Y6 o2 c# w: s. Q0 Z1 L$ z M // 使能接收 / 发送 FIFO
4 b# u1 b: y' G- L" h UARTFIFOEnable(SOC_UART_2_REGS);
4 |( f: g |6 D) ^' [! v+ G4 L# Z+ b5 Y j- a
// 设置 FIFO 级别
) R. T6 Z/ b8 i2 j4 X: c7 L UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1); p0 c' P3 ?% h" Y [, [* S
}0 g& {. r5 h( S
# S' [, C) k2 i" H% x' F* \2 t
/****************************************************************************/
7 Q- G; }8 M; ]/* */
Z; r, _9 F9 o3 c7 x( n3 n/* UART 中断初始化 */$ P' v/ {7 V' M8 W# j3 g
/* */$ a* t. }. p* X5 e6 f
/****************************************************************************/
: x# |0 M C7 m2 R+ {8 V) ]. jvoid UARTInterruptInit(void)# p6 x h- k) Q+ s
{
7 |! X' w5 J' j1 Z# I5 d IntRegister(SYS_INT_UARTINT2, UARTIsr);
. A/ U* r1 F6 Q; g( z IntChannelSet(SYS_INT_UARTINT2, 2);# |8 x1 W( p; t u
IntSystemEnable(SYS_INT_UARTINT2);$ U" ?! ~4 a( N2 g3 R+ m
% g' X. U2 H7 \7 I
// 使能中断' ^ O! e0 R6 H$ p# {
unsigned int intFlags = 0;" H# G; P, u, C+ `0 N% A" |! e5 V6 e
intFlags |= (UART_INT_LINE_STAT | \
! K+ G3 B1 [; N& ~2 v$ ]/ ]$ \ UART_INT_TX_EMPTY | \
! e' }: p% ] E UART_INT_RXDATA_CTI);
1 c$ m# ?8 c F. N! }5 Z7 F UARTIntEnable(SOC_UART_2_REGS, intFlags);" f" N% w% z* E/ b- d4 z
}4 J$ c# s. m' g+ h1 Y6 S2 G6 }' I
" g. n" d1 A8 F7 {2 G/****************************************************************************/
, o+ S" z! N4 Q, {7 O2 }# h/* */
0 p) I. B- H7 g6 v% @. K/* UART 中断服务函数 */) K- A# d& ?* w1 ^; E
/* */$ N$ h% y" \0 H1 K5 F; S
/****************************************************************************/; C0 h% l8 F# q- G. a
void UARTIsr()! `3 Q ^$ S! J: w; L& n
{7 K, g) f% R8 u0 w6 o
static unsigned int length = sizeof(txArray);% x' ~' E+ Q& y H4 E {
static unsigned int count = 0;
& T$ a$ {$ N$ P" [7 f' a6 z- e! N unsigned char rxData = 0;
- k, k p; l& K! N. b7 u unsigned int int_id = 0;2 [4 H4 v: G3 S: o* O
) Z3 a4 @7 e4 l$ [ // 确定中断源
% b6 L3 q' ^" F) [ int_id = UARTIntStatus(SOC_UART_2_REGS);, T$ j9 u6 p% I* U1 e( m# x
) ], r" \4 u5 ~. P. k // 清除 UART2 系统中断
& _) @+ Y+ E: p6 j IntSystemStatusClear(SYS_INT_UARTINT2);
4 c6 }) ?4 p8 x1 Y8 X, `, o
$ B Y/ y2 o3 ]& r // 发送中断
: K/ ]! r# w' K% ~6 _# ] if(UART_INTID_TX_EMPTY == int_id)
% V% U/ @# L" b- J* h& k% V {6 e) C8 j6 ?# L! B$ N4 T
if(0 < length)
* k/ x' [8 r* Y6 ^; m3 R {0 ], w0 ~( m! _: ~* l
// 写一个字节到 THR
+ v% k; D# e) r e5 M UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);+ B4 X1 X+ |0 o, j0 B; S
length--;
1 Q8 q; A3 Z6 U3 V count++;
; f/ K8 \0 p- m+ _& T }0 s1 f' [3 [# J1 }5 R6 z% _
if(0 == length)
2 L7 U3 _2 Y& o( `1 Z, t {
& d7 j! \9 A7 O+ h& |. ] // 禁用发送中断$ ~3 H( h' _0 r& c& x$ W
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
' Q, i0 q- \# ~1 X }
1 C% @* s; d0 X' C" M4 Y2 y8 n }6 B" n. f1 V3 i: ]
# T3 g/ J5 F8 N" W3 j$ _- } // 接收中断
6 Z; d6 |( W8 z0 l- Z+ ?$ T if(UART_INTID_RX_DATA == int_id)
2 ?; \" \" a4 a8 M. ^- B& p" q1 R {0 P7 |8 k" @: Z8 K$ }/ c% G# A
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);& a- w2 b4 o' [1 @7 [
; Z1 j( s9 z2 V# A% X
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);7 T2 O# x+ v8 l& V4 R8 V( H
}, {, {( w8 \+ z V( ]# V
8 f9 i9 b. x X: f
// 接收错误/ _! j* `( q# h/ c6 e9 k3 h/ A
if(UART_INTID_RX_LINE_STAT == int_id). m) k1 `' L. V. \
{
3 }9 ?5 o( t( Z while(UARTRxErrorGet(SOC_UART_2_REGS))% J O3 \" v) I( v
{
5 a4 @* L" {$ G2 [" [ // 从 RBR 读一个字节6 B6 L: J, s8 | c
UARTCharGetNonBlocking(SOC_UART_2_REGS);
: v, S, F* N, {' s% j) o% [ }9 w) x4 `& c! a# W6 |( c' x3 d& x
}
$ H- i# q7 I' j1 Z) a
+ k# Z s7 p4 i/ u5 C' K2 G return;
: N9 E; A4 L2 y5 Q# N% H. @}
( ]( U. A- O; V* W* Y |
|