|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
# L! } z/ g. N) I9 I, K3 B$ \
( O# O0 |+ j* e+ b- t& D- \#include "TL138.h" // 创龙 TL138 开发板相关声明* z! F5 c7 ^2 J' U9 `3 C3 ~
/ u G& a# @: y4 B. g, k! j" d, M#include "hw_types.h" // 宏命令
8 ~7 K. R: Y/ c" R. c, N; Y. n#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
/ ~1 e% N9 W: q$ w" c; |#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
+ ]2 t: E/ m% E3 {
$ ^9 d- ~* q; ~, L+ d8 h#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明) T3 _: [ d9 u4 {' j# h8 ^! m
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明: h" p* f `- O
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
7 A4 O* A4 Z8 O# W' ?#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
- a) _: J* |4 O4 M5 g2 R- Q) m; V/ a- l0 \& n( m" ~% o
/****************************************************************************/ U! n0 k, ?& A) G1 }
/* */0 n* ~- W/ Z( v6 Z" W
/* 宏定义 */1 F& t, y" d7 Q) y
/* */
4 ~4 b1 g9 F A0 ?7 [/ I" b9 ^/****************************************************************************/
; n. T* C {% K; S) k6 U5 V// 时钟
! w/ s- z1 z( u8 h. I; Y, B, n, z#define SYSCLK_1_FREQ (456000000)
. x0 j( s: U! H#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)7 p& {( F3 \+ T$ y
#define UART_2_FREQ (SYSCLK_2_FREQ)
" U( L2 K% l; Y7 E: m8 |+ P4 ^% c. C! V a3 w! y6 ]* y- Y- {! U6 g
/****************************************************************************/
k4 R9 n" U- }0 O1 J* k/* *// y0 p0 c- V4 e u; I6 `$ T9 p
/* 全局变量 */
- Y" _& V) ^0 d" m3 p6 S! j/* */7 M+ k) X& p$ ~1 D0 l
/****************************************************************************/! V1 v: Q+ i( }5 k" P) @
char txArray[] = "Tronlong UART2 Application......\n\r";
2 ]( K: P5 M0 Y# s$ l* W
, x. P6 O* w: A6 q/****************************************************************************/
% f0 T( p8 F7 ]/* */
$ h1 O5 w3 }) _4 M/ \; J2 j! Q# O- [/* 函数声明 */( Q& @9 Q8 n+ t8 k$ K$ S, X+ n6 o
/* */" ?! W) Y) P) p$ g, G2 D" b9 }4 F, O6 Q
/****************************************************************************/1 Y: j- Q, z: w) Z) f0 s
// 外设使能配置! @2 G6 m6 M8 q5 P* K
void PSCInit(void);
2 O* E& ~! W( v' o' l7 `3 v: U* N) t9 e0 i1 F% ?, \% X4 |
// GPIO 管脚复用配置
" x' v/ A- p& ` M) `7 B8 Kvoid GPIOBankPinMuxSet();
! ? P- [) @( X6 t/ }
! X$ R& o3 f6 |0 k// UART 初始化
6 a8 i: M; ~) L- Qvoid UARTInit(void);
8 B5 Y- T# l$ p9 R( p% W* |8 Q// ARM 中断初始化# W1 `2 C3 D" f: S4 L
void InterruptInit(void);, s5 J5 O1 F& Z% t! r
// UART 中断初始化4 K- ^2 _: k7 M j3 w5 L
void UARTInterruptInit();9 ^# o% H5 G( r. F
// UART 中断服务函数; _* E9 g# t' L; y& Y: i1 E
void UARTIsr(void);
) q* X0 a4 } B: [$ j
0 N9 a0 \. B1 |7 S" I; Z/****************************************************************************/4 N% W6 P: R; k* V: B
/* */
) M3 f3 l, D5 k) O/* 主函数 */9 [! @& n k# `2 X @: {& H7 ~
/* */- {( b* e3 q4 K6 M( D
/****************************************************************************/6 ~' r% ^' }" U# P$ t& `5 }4 v
int main(void)* T! Y0 B# f5 c0 F% V
{
( z7 }1 h) F* Y: `0 {/ v // 外设使能配置3 f( U: A" {1 g) E( S, m
PSCInit();
# I$ w) C, [" M8 M% T5 a
: e) e1 F4 V! C/ F& {! b% O // GPIO 管脚复用配置- B$ m: \3 e4 z% [
GPIOBankPinMuxSet();, {& b9 @4 o$ w/ |0 I
( F0 y$ E8 K4 S. m // ARM 中断初始化
/ Z6 `- } H' } InterruptInit();$ c2 Z7 c! a% B; F7 [
: s3 _; `" d+ T) y0 x. E // UART 初始化
# _3 B; B4 y5 K2 N, I- M# I UARTInit(); p, Z$ v" Q' j4 j$ f$ Z1 ]
( \+ J$ B) N6 r7 F+ C" s // UART 中断初始化2 ?+ d; J/ W# {/ ^
UARTInterruptInit();
, T7 S. i8 A( M' c: ?7 T' a/ c, f# Q* ~5 E! F: y2 ]8 u- E
// 主循环; Q: L) g" V' m6 N9 u* ^* w3 f
for(;;)
K$ p. S: B% d {
* z2 i1 q8 i0 P8 c* G' ~! _( Y0 A+ r6 @& T. L' D9 E
}3 g- G3 N+ {. A
}
& q0 v% |: R7 B: m/ ^4 S3 D; N* i5 c8 G
/****************************************************************************/. M( |# v. W6 D, U2 V, p
/* */! q8 S9 i( E# O; n) O; h s
/* PSC 初始化 */
1 r7 H, ]4 x1 `% | |1 D- i$ c# j/* */6 }* f J5 Y, ^
/****************************************************************************/. O: f+ y1 q- h8 P( c8 U) \. S6 r
void PSCInit(void)- R6 b* v; M7 R& k3 R1 w1 S
{
! N% U# _( |* P; L& \ // 对相应外设模块的使能也可以在 BootLoader 中完成! Q8 I* ]' e' u" ~& |7 R5 m H# g
// 使能 UART2 模块
4 T% _3 L% N4 {3 k M# w0 U PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
" t2 o& M4 B, [}
4 ]8 |3 N8 B" L; H( X' U4 B: q# S- T* S a' m- S( Y
/****************************************************************************/8 X0 B$ e4 _4 g# L! N
/* */% H0 i: l, d2 n$ C2 Q1 E
/* GPIO 管脚复用配置 */
/ V. ?0 y0 i: e, L/* */5 b* h- @+ c) Q* @% m( p7 i) z3 s& V# C
/****************************************************************************/, V: V r* A' ?6 R% q
void GPIOBankPinMuxSet(void)
2 b" X7 A; ~4 D2 L) f0 `{
d) C% x2 A1 e/ | // UART2 禁用流控0 ^! t ~; j& a, J( ]
UARTPinMuxSetup(2, FALSE);/ M/ |: J# \- I$ F! W& \2 `% \
}$ ~/ I- ~7 f9 E
, @4 d' {" k, O8 M+ R/ n
/****************************************************************************/
. Q0 O3 J4 [+ F! F/* */2 Q$ W' U9 K0 W# V1 m
/* ARM 中断初始化 */, V2 `% f. u0 d% U5 z( _/ j- |. b
/* */3 h+ j* ?+ Q# t4 n; D3 |
/****************************************************************************/' j/ I) A7 s) d/ b- g/ J
void InterruptInit(void). { T# x) S3 Q6 J5 Q1 L
{( P3 `2 J. ^( D& J# T) \
// 初始化 ARM 中断控制器
: Q% W; [# i" v IntAINTCInit();# t& n) a6 ~. [) J/ E0 g
+ e; ?* X: v: {1 K" i c3 |5 l
// 使能 IRQ(CPSR)
3 g3 r4 k- `! {0 R6 F x6 _ e8 ]6 Z IntMasterIRQEnable();
: a t- K" e$ n% I9 A p# w$ s! a: Y' T; N! C7 b+ F
// 使能中断(AINTC GER)
/ L6 X. R$ Z3 S IntGlobalEnable();& u8 {9 W# M: c% f; I
) ^" u. { M0 f0 W% k/ E% Y" Q // 使能中断(AINTC HIER); N" @; S% N" T2 {6 \0 b
IntIRQEnable();
+ U# T6 B# b6 f}
$ W6 P. F' L/ p# U& L
+ l; q: R/ j' W* m/****************************************************************************/' W$ `1 k, C) i$ P
/* */
$ [& W8 E2 `8 z8 ?/* UART 初始化 */3 {( M5 ^3 m& w& Z/ d
/* */% x; S! e6 U" v- u p8 v
/****************************************************************************/
+ _3 S8 l Y# k5 u# Z7 O" Yvoid UARTInit(void)
8 b H. d, ^' A- l7 N{8 h+ i, Q$ h; ]0 H$ C7 G
// 配置 UART2 参数
/ I/ N) `$ x$ n' k2 v // 波特率 115200 数据位 8 停止位 1 无校验位
6 n1 z w9 p: | UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,6 B$ ~$ ]3 ^% U' b: J& ]
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);. B1 Y% M" o9 j0 K7 M
// 使能 UART2, v$ T" @% n; P, i: M5 P! \8 _, X
UARTEnable(SOC_UART_2_REGS);
7 U; B+ B- R2 ^
5 x& e1 B( a/ G) G, l // 使能接收 / 发送 FIFO. z" Y8 g9 C& U$ h0 R, _- u
UARTFIFOEnable(SOC_UART_2_REGS);. F) \; Y4 a5 ?- |9 p' O
. j3 f: \9 z" v8 B# n# e // 设置 FIFO 级别8 q$ b7 T: D7 l0 _- Q; L+ m; `
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
3 i! ~; O- d& M$ v9 e6 r}* q- t& {. t- y' Y
@' v3 B! H% R
/****************************************************************************// G X$ {/ n! b9 b- ` W% L
/* */
0 R2 f8 B- K" }8 s% k' v/* UART 中断初始化 */% g8 A) F: U8 B3 W9 h+ T z1 c
/* */1 K5 M2 O. v3 n
/****************************************************************************/
4 `5 P. o* ^2 k$ c/ @- b% kvoid UARTInterruptInit(void)
. h! g: H3 E; ?7 Y2 q2 y{
: e0 l7 F0 f8 ]. D) d+ n IntRegister(SYS_INT_UARTINT2, UARTIsr);
' x1 D. ?: |% ~* M0 }3 d IntChannelSet(SYS_INT_UARTINT2, 2);* F4 h& V# ]: g( t: [# p) {6 w' W: _
IntSystemEnable(SYS_INT_UARTINT2);
% O% \7 W6 D f: x2 ]9 b4 O$ J" ? _2 r
// 使能中断
1 Y* X) s1 c4 ^' `& }" Q' D) c unsigned int intFlags = 0; z! }: j* w! {, Q! v
intFlags |= (UART_INT_LINE_STAT | \
' ]' c6 F( [/ l' ~5 p UART_INT_TX_EMPTY | \
4 J) Z8 J0 l0 i# o4 ~7 |- W# v UART_INT_RXDATA_CTI);( ]3 s" m4 C3 Y% O3 T- N, L
UARTIntEnable(SOC_UART_2_REGS, intFlags);
9 ~. B! @/ l( {. Q}( M/ p. A7 y- B8 E8 R
) c) p1 H1 m3 n- X$ n- z+ W/****************************************************************************/
0 }& ~4 l+ E& t& J$ v/* */
6 h! Z$ [/ a# ?, [- X& U8 V% Z/* UART 中断服务函数 */
5 Y+ X) u/ o2 N/* */9 y1 `7 _+ w0 v3 i4 [7 G
/****************************************************************************/" S* o6 w1 e% L/ D+ ^) q
void UARTIsr()
) v4 D: _. ~; K, e1 H/ ~$ x5 L{
* v( A( t/ ^% z. { d* y8 d; { static unsigned int length = sizeof(txArray);6 {" j& M. Y, l
static unsigned int count = 0;
9 \" i, f% q4 |5 D unsigned char rxData = 0;
p" g9 O& d2 \! l5 e0 | unsigned int int_id = 0;
# L5 v! _; L4 E J# _' ?* ^' z& R2 x1 O+ I q" q1 Y
// 确定中断源* F/ I' g9 S* X G2 C/ h
int_id = UARTIntStatus(SOC_UART_2_REGS);
) w4 ^ E0 i: r5 D8 R1 f3 O9 T; f
// 清除 UART2 系统中断
) r( W8 W3 W- w IntSystemStatusClear(SYS_INT_UARTINT2);
( p- b" Y1 u; a9 |% u1 }2 a
6 O0 J2 ]0 T' g4 }5 t // 发送中断
- K, \* p5 S. x4 g5 y. q- U if(UART_INTID_TX_EMPTY == int_id)
; L. M3 \; S1 J6 V- W {# a/ P" v! m0 i
if(0 < length) P: x0 w: U$ u, ^5 h# A- d
{
; m8 c, Q9 I( v // 写一个字节到 THR# T9 `0 }1 o% |& R
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);3 [6 q4 j: ]* y( f! K& n
length--;6 O1 W S4 [8 q3 S' e# f
count++;
0 O. G0 N. q4 T/ b( v8 R }. L1 w" l3 G0 b1 R; o O5 v0 o
if(0 == length)
/ P [' y4 d, _' p3 T; D {
j9 y4 u3 A, ]! v& S // 禁用发送中断8 T1 z5 O( z: U6 W1 V F
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
4 f( M4 @4 K* l- |3 \ }
& {. S( |6 l( K- f$ x }
: ~" Q, v* \. Q7 |1 |
" u6 A l6 M; m, r l( n // 接收中断
, i% _- G0 j: c if(UART_INTID_RX_DATA == int_id)* o2 D# F2 A( J' J6 N4 E
{
# q {! M- _5 ?) d0 G0 ^& n: s rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
; x- R) P2 S# y1 Q7 a( I9 I
* B" ], M# W* v. F4 M# j" i$ j' h UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
) Q+ z# F" Z: Q5 ~/ c: b }$ ~- Q% e' n8 {: B0 o0 w: l( u( P
d; Y, J; L6 q9 y( ~/ p' B // 接收错误
$ d/ L& |, P) c2 D% y8 x3 @ if(UART_INTID_RX_LINE_STAT == int_id)- X1 i0 K- d, X8 C u
{
+ v/ R% L4 I: s' J) e6 `2 j while(UARTRxErrorGet(SOC_UART_2_REGS))
; T' R! ?$ u& j5 P" a+ F {
1 }: {4 @, F& \/ F7 W // 从 RBR 读一个字节# `7 d- l6 j% D9 p& n/ H ]' U" g) f
UARTCharGetNonBlocking(SOC_UART_2_REGS);+ }4 i5 u8 P1 n4 @+ S
}$ a: g: U" o/ p% R1 y8 Z
}5 T. B# a# _2 f0 q' w
2 q7 V! t$ X& |+ F4 e( z F return;) r) l9 k: e! G6 Q
}
2 | A# ?& V7 W: d8 x! o/ m+ T9 z |
|