|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。) ]7 t# p$ x& q2 G7 D
" Q; r) j5 O" i: G#include "TL138.h" // 创龙 TL138 开发板相关声明
2 S5 P: I$ g% {, A( b
3 T. p8 q+ S; E7 a9 M# W, b#include "hw_types.h" // 宏命令! h& v+ S0 k3 s0 ]- t( T
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
9 D+ M* N- M2 m! Y#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
5 Y% S$ x4 `4 ~- e! p h
6 A* W2 S+ @) ^+ k3 Q5 `8 s#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明$ H \$ i& b# ^0 l3 r0 @8 U
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
% |) E) F" Y, b3 v' {1 J#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
. [) |/ Z! s7 x: x+ E) {#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义( [1 X* L. \( ]
" ^4 ]2 s( P3 i, Y+ e) @
/****************************************************************************/
$ `( h; g9 ~ o/* */% ^, V: f& I9 l; ^- ?6 ]( i8 f
/* 宏定义 */
1 @7 j+ R; r. g, n4 t% M/* */
3 G8 C& V) Q+ A! v" d" \- b2 W/****************************************************************************/
% S! Q3 `, p C0 H7 J# P* b// 时钟
2 R8 T" H1 d1 E9 f$ S# J5 e! R+ G#define SYSCLK_1_FREQ (456000000)5 H0 ^' m8 X" K6 d% I8 I- o
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
& v( j2 {8 w6 K# p5 E8 x0 G#define UART_2_FREQ (SYSCLK_2_FREQ)
* [/ u: B6 Z- Q9 z
2 q" R5 O# N+ z6 w9 ]/ ^6 b+ I, t/****************************************************************************/9 V& s9 C- x6 h! s4 n) O
/* */3 |0 I5 q5 Q6 q4 c! M* b3 k
/* 全局变量 */( F! E/ h: a& s4 y$ T" _
/* */
6 S( A9 k7 h9 n) @* t/****************************************************************************/4 G+ u5 l. r, f5 ~
char txArray[] = "Tronlong UART2 Application......\n\r";0 a3 j( s4 @0 p0 E, d
; Y% \) f4 B1 X; Z+ I" b( X
/****************************************************************************/
. d) g5 Z1 x; z4 y3 S2 L( f/ E; P/* */7 n1 p0 }# b/ j2 F8 S) u( N
/* 函数声明 */# a' L: `6 \$ r/ x' g
/* */& A# `7 }' @. p2 l8 a
/****************************************************************************/
, V2 F' b2 I* G0 c7 k// 外设使能配置
3 V1 n, m, W4 e) v/ p4 o) z6 N5 d4 N- cvoid PSCInit(void);
v3 R2 f+ ]8 h
9 k2 L! N1 ]- K$ }- {0 T2 F// GPIO 管脚复用配置3 F! D5 [, w& F2 E$ R5 A* ^
void GPIOBankPinMuxSet();
- ]8 v) u. _! ]4 _$ }; x! `$ `
+ D# C5 `( y M3 k// UART 初始化
- B& n- V8 f6 ~" L8 ^void UARTInit(void);% ]6 c6 M- `5 Y2 U" m9 L4 o" R
// ARM 中断初始化
& _% V' J* ^4 [* A4 ^6 E, Mvoid InterruptInit(void);
( X+ z' H; @4 M2 J0 A( K8 n// UART 中断初始化* W# T5 n: }. b4 @( n& k
void UARTInterruptInit();8 \; H# }9 X6 h( ]+ S
// UART 中断服务函数
4 X0 W C& P% |$ R+ d6 Hvoid UARTIsr(void);
- f3 d. h/ j' |4 Y3 } ]) m
$ ]/ j& h! i; a" F! J7 P/****************************************************************************/ J6 p" C+ |+ R3 Z) ?1 M
/* */" n0 R2 @ V; q0 k
/* 主函数 */: l7 B0 m( G! s) h, r! {2 |
/* */
" \% m$ |! Q" T- o, U0 x- t" v6 v/****************************************************************************/
6 V0 l# |! Q+ Q, Aint main(void)9 r! E# J. r+ S! m/ `8 D
{9 ?4 X5 t. \ a
// 外设使能配置, v# j) x" c! P2 T% Y4 t. g! v
PSCInit();
: k- n$ w6 P3 m$ A) u' q * n* @1 O( x' N
// GPIO 管脚复用配置$ z: x7 |7 x2 B6 F
GPIOBankPinMuxSet();
, X! N2 W; k3 T9 V W9 K& S: [ H. p( _* G; C4 E/ |, o
// ARM 中断初始化$ k* r/ p7 @8 L* W! ?
InterruptInit();
- d S* [( C8 M) N8 F. @6 g0 @, ?3 |
// UART 初始化( T8 ?, A9 D2 l S, q3 b4 N- h
UARTInit();- W4 C; Y2 `6 H6 I
. o/ Z* e) L8 N% k // UART 中断初始化
' w4 H- X* F5 c8 e+ g8 ?9 ` UARTInterruptInit();8 X: H$ f! d/ y1 Z; R
, z* t) Z' P/ v8 v: K# e A // 主循环2 D" q1 O9 C( \' J5 }
for(;;)( _: S: X/ P3 b3 R* {
{2 R+ I$ p8 t# g: x- I/ ?
5 M( W/ o, o& O8 p }
) Q1 ]0 ~: W+ ~( a! z}3 N+ ? P' c! Y' n$ f; I5 I; {/ X
% ?- X! q6 N( l+ i" Z5 D2 W5 b
/****************************************************************************/
) I, e$ R; l( P3 r0 V& b# q/* */
3 p" ?, u4 t. r4 C/* PSC 初始化 */
' e; \# |. y( T- B& y/* */
4 X7 K: G) D. e7 T% Q1 f/****************************************************************************/( ^3 B5 k8 ]% u6 b0 v
void PSCInit(void)
, x- G( R8 p+ C, t{
( j' ^# g8 {5 L7 V7 Z. V2 { // 对相应外设模块的使能也可以在 BootLoader 中完成
3 h$ U, z' T# S // 使能 UART2 模块5 j4 C% k7 G; V6 p( l. O7 T
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);1 Z/ f/ o) S R3 b. _
}; W0 q5 L7 M- a' ~! p+ H& J
" U: |, U& P4 L/****************************************************************************// a. C0 H) V ~% {& Q
/* */9 m9 g1 D6 z* s4 N) h- x3 @8 G- F) m
/* GPIO 管脚复用配置 */3 i& w: c/ o* e7 ]# |
/* */
- o9 h/ B/ ?. j! t" E/****************************************************************************/
; B& I8 f' ?7 ^) ^# @1 D1 [6 {void GPIOBankPinMuxSet(void)
1 v: r! r- j$ k4 P9 ^{
% Y: O7 g, K8 t7 V' r4 l // UART2 禁用流控9 o( S, B8 W0 B, p6 I
UARTPinMuxSetup(2, FALSE);
# b- c2 g9 m0 \& i}+ _9 V8 E3 q5 |2 q: K
, {# t) ^. | ~# O( g% g
/****************************************************************************/2 q, z! T$ |: Q7 U7 H
/* */3 @5 {- E2 O) V0 E6 m) R
/* ARM 中断初始化 */
3 \9 @+ i# f5 S) C6 _6 @/* */
2 M+ [! k8 H7 F& `1 `# m: \' ?/****************************************************************************/
- A( X9 D5 B& u: e( @2 [void InterruptInit(void)+ l9 T0 }* }& s# K/ R4 g
{
: g$ y( H" N+ p! R) ] // 初始化 ARM 中断控制器
" B* R4 E* }0 M/ ?) i0 m IntAINTCInit();( N" g& T S( f/ n; H/ w
* }# ~7 v6 T7 E A
// 使能 IRQ(CPSR)# `4 k5 G" ?9 }3 e. \' E6 Q' _7 G7 F
IntMasterIRQEnable();
5 r, x$ K% q! v5 H: g* F2 M
( `8 u" B# [; P7 J$ F! C! K5 P& X // 使能中断(AINTC GER)
3 o" S2 | S1 b. O- a4 U IntGlobalEnable();
9 c9 A0 f; g" G
7 C' t' c1 @1 m+ c1 o: r // 使能中断(AINTC HIER)) s% Z# v! @8 u8 A: G1 ^
IntIRQEnable();/ r C6 m. b7 A% t
}
9 h1 n$ _! U8 Z# p! m. {7 _6 u& c4 O7 f* I1 I( s% ]6 ]
/****************************************************************************/* u) I) c* S5 D4 y
/* */
* w4 r! f" f. ~8 h. A6 B4 Z/* UART 初始化 */. G. K. g: y: _. z9 l4 g' _: ]
/* */
5 Y) y8 ~ F) V: D+ u. {" i/****************************************************************************/
5 B6 n: x; ^, f6 {void UARTInit(void)
2 O8 w* b# n3 h" \ C{8 O7 S8 Z* L) X$ x' M
// 配置 UART2 参数
" R+ c, J" K0 X" j // 波特率 115200 数据位 8 停止位 1 无校验位4 F2 f# X0 y; A+ S% Z% w* L
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
+ k# [' s$ n. M# o7 I+ c; H# R UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
- T: n6 @6 j2 x f1 b1 l // 使能 UART2 W" e3 k% w: M# R/ f! k8 E, Q
UARTEnable(SOC_UART_2_REGS);' u' Y/ f |- M- `
1 E# u M0 N1 o" Z
// 使能接收 / 发送 FIFO
0 W( b I! d0 A7 y UARTFIFOEnable(SOC_UART_2_REGS); A$ J4 Z3 R$ p+ p# g8 `7 C5 p
; l7 S& @% g& q/ _$ L0 ]
// 设置 FIFO 级别- h ?) p n- p' q
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);5 z# C( e1 Z* A' T1 |
}
$ v E4 d; v3 j3 @2 Z8 }; R4 i' Z, c, V2 H
/****************************************************************************/
) Q! V9 l/ x& P6 l* ^: U8 r/* */+ q) g; E' K% t3 E. Y1 N+ p7 a3 ^
/* UART 中断初始化 */. J1 p! |$ o X1 D/ s! k8 m
/* */( J! H: v- D U
/****************************************************************************/7 U+ _$ d! Q7 k6 h! C
void UARTInterruptInit(void)- E b P) F2 B1 B3 o1 p) X
{
! `) z5 i) e' y2 \ IntRegister(SYS_INT_UARTINT2, UARTIsr);6 k4 e' P6 v0 P# E1 M5 J
IntChannelSet(SYS_INT_UARTINT2, 2);7 S6 [: T! @$ L
IntSystemEnable(SYS_INT_UARTINT2);
7 V9 S5 ?/ \# }: o: @- s2 [9 m# E8 _" k( V+ I5 q+ g; ]
// 使能中断
- s7 w1 a) }& t1 E' [, G! Q& R unsigned int intFlags = 0;$ v F+ U% a2 C3 C
intFlags |= (UART_INT_LINE_STAT | \9 h) c/ G& M8 V5 ~ I0 \- C" e
UART_INT_TX_EMPTY | \; p. s* j/ t1 s( `8 F8 A- J( y- f
UART_INT_RXDATA_CTI);
p+ y D6 V0 S+ N7 Q% L5 h1 ?# Z UARTIntEnable(SOC_UART_2_REGS, intFlags);
, A Z9 N9 R, A) G: }) q}7 {* O" Z [6 M
8 q* ^3 O% @4 L6 _
/****************************************************************************/& M" a) ~, R& t/ |5 _3 B T y% R
/* */ @) n z, r) c9 {/ Z: C" p
/* UART 中断服务函数 */
! Y1 }$ u$ H0 F" a1 v4 \% f2 W. Z7 z/* */: g2 h' h! n# e9 v2 c V
/****************************************************************************/+ `# p( L) b5 C0 E& j1 } c
void UARTIsr()! P* L* q6 i+ G, Z4 ` f( k V) I
{ N; V3 x- A- O9 K% G, R8 O0 M
static unsigned int length = sizeof(txArray);
^# e4 ?0 R! A% |2 p static unsigned int count = 0;
( l4 [3 K$ b5 P% P, _/ m unsigned char rxData = 0;( o# r& G8 n, U2 k, W @
unsigned int int_id = 0;
$ X6 ]! _$ T$ |
: L' H; [0 r% ~" T7 l/ @1 C/ I // 确定中断源3 _2 u( O4 q* u
int_id = UARTIntStatus(SOC_UART_2_REGS);5 J* t5 q; S/ |: F; ~' |
! G* B/ h. `: e
// 清除 UART2 系统中断
9 O- B, Q+ A' S; V: g1 u IntSystemStatusClear(SYS_INT_UARTINT2);! ?# c- N5 j! ?! ?8 ]# j
/ j3 d# c, {, t
// 发送中断% |- l0 K# q# x c6 f
if(UART_INTID_TX_EMPTY == int_id)& |4 i) w( t- @/ H& X/ g3 t5 a; W, `! w
{
+ L0 X$ f0 J5 k s0 u! ]) g" d D if(0 < length)* Z$ a6 u8 r7 z$ E
{
0 j( j, Z4 J: p: o7 d, f4 O // 写一个字节到 THR
2 l* T7 V; m* K; j+ A UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);9 D- v% F0 r8 R8 x3 t% c3 ]
length--;
. `$ Y1 P0 M: r! `7 b, X+ k/ k count++;
" e7 H/ a& m2 Y, I0 ?3 L }* D/ Y) z+ T+ X& L& G+ f
if(0 == length)
) R8 B, }1 u1 d; K$ b {+ I4 J% i$ E) O! D& m9 z& K
// 禁用发送中断
W1 l Y2 b: R# {- C" d UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);) P$ [& _: {% L& i! |! a0 b
}$ W3 R1 W/ l( v1 N) t3 U
}* f- V! t& i ~& H
: q& h7 S5 D" Y9 U! U; c$ c# [. c // 接收中断/ m7 }* [# z0 `; ]
if(UART_INTID_RX_DATA == int_id)
( l& ~) m* t0 Z# G. }8 t( r {* A% c9 v8 L% e2 [5 U3 P
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
: v) G/ H+ k' C* C& V2 }/ ]; T0 I2 W* P
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);- z% C5 o# W: f! a! K: E
}
2 Y, A" p2 L9 c; s2 l) P! b6 S+ x# r+ m# w
// 接收错误
: i/ H$ j* H- g if(UART_INTID_RX_LINE_STAT == int_id)
1 _, N3 p3 I( f; w {0 m4 L! x; S: y s" {8 Z
while(UARTRxErrorGet(SOC_UART_2_REGS))
4 M! |4 s) H5 E$ X1 {6 y% W {, a5 V! E @$ J( [3 _
// 从 RBR 读一个字节
- ~( S0 L* D. j4 y UARTCharGetNonBlocking(SOC_UART_2_REGS);2 x5 U4 E3 n- b4 ~1 O
} z$ f* X3 z7 V% Z% I
}$ u d v3 e: Q
5 k& |6 Y. @9 I& r1 g4 B/ @
return;2 V" Y. L/ Y) T$ D. c
}
2 Y, I7 o5 c$ g: W/ i) A: A |
|