|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。 L" v3 V7 P: n: w. c% p: e" K- y
8 ^ N8 A0 U/ t5 D& r- M) [" b#include "TL138.h" // 创龙 TL138 开发板相关声明
& s" O1 i) _" {7 |! K3 U5 s* g+ b5 Y$ [# i9 H4 D1 |
#include "hw_types.h" // 宏命令+ X* \ V( N& q5 \* ?3 n g1 P! A f# I
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
9 j1 W) s( I- ] z& w8 U" I1 Q! i D#include "soc_OMAPL138.h" // OMAPL138 外设寄存器' Q* W! t+ j" j9 R
! `( C' H+ m) ~0 ]) z. K
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
( K/ R6 e7 C( M" N2 H2 e#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
) |, M1 t( _5 G0 J. ]#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
3 b' q4 I, m9 a1 X' |#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义2 |3 W- I" D1 d9 p' R9 O5 |0 a
' I, c- }$ L* U) X5 h& ~/****************************************************************************/
' b5 b4 u5 ~- l2 a. [/* */
8 [$ y; i$ w. U9 C8 C6 S/* 宏定义 */ M$ A1 w5 m% u, i
/* */
: W, M6 ~! ?) \ m/ y1 B/****************************************************************************/) k2 z6 {) }/ s2 z7 n
// 时钟0 k4 j( ?7 A" C( a! B" `; }
#define SYSCLK_1_FREQ (456000000)
" d" d$ e+ A& p% r- [( V#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
; w1 y1 C" e+ V! d2 A#define UART_2_FREQ (SYSCLK_2_FREQ)! G4 j4 b8 h" K1 F5 q8 g+ ?0 j
! P: Z9 S3 x: r/ X* p+ E) J/****************************************************************************/
/ T% K( @- I& B& g) S2 h/* */
7 Z( i$ c C# Q/* 全局变量 */
% ^. ]3 z A& [, I( I, ?( B/* */& B8 y0 {! o9 f( O0 ]6 q6 ? w
/****************************************************************************/
0 {, y0 Y4 W8 x- i2 \7 V& Jchar txArray[] = "Tronlong UART2 Application......\n\r";; D; D! n5 f" V( G# U. J
# P3 R- g- ?- I) \5 g( K* r/****************************************************************************/7 z0 s3 w0 C* l, a* h* o4 x
/* */ ]$ V0 K7 P! y! n0 l# j4 f5 @4 D
/* 函数声明 */
! O5 B2 l1 S) Q7 ~/* */# x; ?9 p" T* l5 X9 O
/****************************************************************************/$ S* f2 d3 ]& W; m
// 外设使能配置
; N/ w6 j; E$ v' `. a7 s8 J* Rvoid PSCInit(void);
6 d5 A+ r! G1 N7 Y) K4 i" v4 V
. z# k7 `5 r0 w* [0 Y/ ?// GPIO 管脚复用配置/ x' n* q# G8 g8 Z Y" q& Q8 r
void GPIOBankPinMuxSet();
4 X, ~: E) m* s- S
* x, B/ M1 n0 h" u( @1 I! H// UART 初始化1 E/ a3 D J) _0 Z" A) g3 q
void UARTInit(void);- X( c. w; a+ y( B
// ARM 中断初始化
- \! B, ~: W5 K" x0 Bvoid InterruptInit(void);( N* h9 a& Z3 p2 W- _( \" S8 R
// UART 中断初始化
* b! q* ^/ j0 ~/ O# g+ i gvoid UARTInterruptInit(); [/ z: I! W- Z7 K" ?
// UART 中断服务函数9 E& o) h/ ]" J
void UARTIsr(void);' F9 `' [6 C& P9 [
! ]! P. U; Z1 n
/****************************************************************************/
( ]0 P0 w- e/ e9 F9 n/* */. P; k' o! o2 y7 J
/* 主函数 */. I) n* }7 B6 x0 c1 V6 @
/* *// ]6 K8 S9 G; U4 f# U
/****************************************************************************/7 t1 T! i% c [9 n! ]8 I
int main(void)
' B& v( s. U' N" E7 W! Z4 d{
% j: U6 c9 h5 |3 ? // 外设使能配置# h! E: s! k. v8 V# W7 g% m
PSCInit();
% Y- P: ^; h) p5 \
! r' }- v/ b% I) K" N! P // GPIO 管脚复用配置2 }& G' _( d* \& z; W
GPIOBankPinMuxSet();
* C, z& y1 i4 @3 Q. D* f0 S- u5 H
9 b0 @5 n# M, t // ARM 中断初始化: p5 c$ W; w8 N0 z$ B# S
InterruptInit();
" k" E6 S8 V9 ~$ \8 t3 o9 k8 M) I
; @8 @, v* k; h! v0 S6 a // UART 初始化% u9 T4 v9 B7 ^! h4 f$ i: ^
UARTInit();
- e- B* a& D, j1 Q Q+ M+ N: _2 O6 l2 y5 J7 L7 F- N
// UART 中断初始化
3 G% L+ W$ p" P- k& T UARTInterruptInit();: j4 k- d+ G; Y* J5 b8 [
( Q% p7 } O) \: V% {4 l7 K // 主循环" Z- l0 x$ p: e& M" R, x: _3 g/ f# _
for(;;)
) {2 Z+ y6 {* F% A% H/ m* p2 z {
$ W7 W9 |) c; O9 N; Q g/ s) u) H5 W( |
}' C- Z; s2 \6 N" X
}5 W9 Z4 y* r" e$ t
, m. ]+ W2 |. ^: N
/****************************************************************************/( W9 @ D+ x( `8 |
/* *// r8 F Q S" o
/* PSC 初始化 */0 W1 w# |. F8 X' j$ e [ G
/* */' v p( j' w" H2 v( g/ w
/****************************************************************************/
2 m7 @: g7 q8 {$ |9 E2 [" V: _void PSCInit(void)
; B; w+ s0 ?& P1 F& {3 h8 `5 _8 \{
6 h. E. Z) i( ` O# `7 M w // 对相应外设模块的使能也可以在 BootLoader 中完成
0 O% R9 Q* Q. a$ ~ // 使能 UART2 模块4 q$ t& V6 E/ p' c+ E% y1 C1 Z
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE); Z+ R$ E; ^/ k1 H% s* |2 H! R
}2 D: {4 U, Q/ G( g7 v5 Z5 F
/ \+ j) n! C% v; z( P" H/ Q7 G# N/****************************************************************************/
8 o. f, V7 ~% C. u1 Y" U6 w) u/* */; Q. l! W: ^3 Z3 U5 ~# a
/* GPIO 管脚复用配置 *// c# y) ? s) q$ O" f, \$ q' C
/* */: [, W7 S' T- x% K( r6 x' P
/****************************************************************************/, X3 \$ {# H5 Q
void GPIOBankPinMuxSet(void)( r) q& I% E4 V
{
. R% M% `+ E: s+ z2 D t! U // UART2 禁用流控% b! ?% ~- I/ z
UARTPinMuxSetup(2, FALSE);
8 W F4 S3 U5 B1 x- L9 o% S7 H}
6 c: e: L6 c; H9 a$ S5 {
' ?1 N& g# s- v# {# U" u* W/****************************************************************************/, T4 y* G$ S/ ~3 O* M% H
/* */
1 ^: _) O V3 V: C/* ARM 中断初始化 */8 O# O' @/ r% h( N
/* */
' Q. {" _. a8 x5 ~: a/****************************************************************************/
: B4 o2 p) c7 u) R8 G S' {void InterruptInit(void). _' x( T* u# ^# C
{) e! F- U. A" N0 ?8 h0 h
// 初始化 ARM 中断控制器- {$ G+ s% o; `
IntAINTCInit();1 ?0 d5 E Z* x; F
! c8 s4 J0 W S2 b: |
// 使能 IRQ(CPSR)8 L3 L# c$ S$ R
IntMasterIRQEnable();; h2 w6 \2 v5 j& q* }: l# s
; O9 s* `* T" S2 j
// 使能中断(AINTC GER)$ g5 `7 ^; c1 R& O4 R5 S+ O
IntGlobalEnable();: g4 @+ @" D5 F' L& B
7 h" V8 M% w5 H // 使能中断(AINTC HIER)
. ~$ E0 U$ r- i0 f) t0 c IntIRQEnable();/ u# j# K; Q+ J7 r7 R$ D& c8 M
}/ V) z* Y; Y8 Q" R! K. e! f% _
6 Y0 ^* [$ P% q/ c6 q W/****************************************************************************/. w' Z, s1 P4 P8 l; O
/* */$ x* t+ W& P/ y7 s2 z7 Y I; d
/* UART 初始化 */
& _. G. O8 Q0 m8 x/* */' q4 C" T3 N/ V* I/ p& |0 g n: h
/****************************************************************************// l) A3 r: Z; k: I: d
void UARTInit(void); Q) e4 B/ v1 P
{" |; w& ^- X" y7 R8 B: K
// 配置 UART2 参数0 c) w2 x# F" b+ v- a/ o9 x; v' w
// 波特率 115200 数据位 8 停止位 1 无校验位
. h" r: E! B3 i, @6 J* M UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,/ p. E0 d; F" w2 L& a, U+ g3 f# g4 K, h
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);. ^) T$ h2 ?, c
// 使能 UART2) }: @2 U) `( }* E$ d
UARTEnable(SOC_UART_2_REGS);8 ^; J" [- y1 ^" |) f6 F
# H; @' c/ r) o; [ // 使能接收 / 发送 FIFO
5 ?1 ^* u' G9 v4 ?5 v! K) B UARTFIFOEnable(SOC_UART_2_REGS);$ v) l( y$ K9 [* D* B2 H
% x9 ?3 A+ ~4 [
// 设置 FIFO 级别: _+ R E' Q7 ]$ B
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
9 V/ d' f' V% a+ T}
) e6 I. c1 S u# ^+ v& M) w. U5 y. v8 i" g* v( t$ z9 P. B' M- i
/****************************************************************************/+ ]9 d, B1 ]' x1 n
/* */
8 W$ Y( s. h2 s: q) I/* UART 中断初始化 */
* z1 K1 ?6 j2 k4 ]0 Q4 ]7 H$ O/* */. K1 U% j5 `8 p) W. _
/****************************************************************************/
4 ?1 _3 ~! D" }3 ]void UARTInterruptInit(void)5 {9 \6 }0 Q; M! D! m2 ~2 j w( U
{# y0 j' \9 v* N. a- r' {
IntRegister(SYS_INT_UARTINT2, UARTIsr);
! P* t+ f1 m4 i& s- Z% p IntChannelSet(SYS_INT_UARTINT2, 2);
, v b# r! p% c0 D1 ~2 J IntSystemEnable(SYS_INT_UARTINT2);! ` s) g+ u' b0 y; `! F3 j" L
- e$ f7 g9 C' B2 J1 Y
// 使能中断 E2 S- E! H' Q8 B
unsigned int intFlags = 0;6 X+ G. I9 o- d- g' ]9 Q6 G" l& e( e
intFlags |= (UART_INT_LINE_STAT | \( A/ S; h9 p m; z, P9 s' k0 Z
UART_INT_TX_EMPTY | \
$ @ `. b0 N" q, [8 s6 D! z UART_INT_RXDATA_CTI);' }; }; @( v' H/ C, `$ Y
UARTIntEnable(SOC_UART_2_REGS, intFlags);
& ~6 b* A( ^" p2 d2 g}6 m, F$ y- |8 c0 t5 }+ g$ Q$ e
. P" P! N7 b# K. G2 J9 V
/****************************************************************************/5 F3 y8 F6 c9 ]& H
/* */# h j/ C1 G, W% t
/* UART 中断服务函数 */
6 p7 ^, U% Y( F; J+ d1 X/* */
: P6 [3 i! o0 {+ Y: f; H% c* a/****************************************************************************/
' n( _5 [1 k9 |void UARTIsr()' G- s- ^3 H+ Z. R' N# J0 W
{
9 R/ b. C' p5 r+ D static unsigned int length = sizeof(txArray);, a2 \ W( k L5 O9 u; W, ^
static unsigned int count = 0;
# y# Q7 l- l/ O unsigned char rxData = 0;4 ?2 R1 w. m' U" `
unsigned int int_id = 0;, u/ U) O" }2 }, ?% G2 {; L
# `6 T, Q& |2 S
// 确定中断源
0 H$ T3 e8 w3 E& i# @ int_id = UARTIntStatus(SOC_UART_2_REGS);
/ e: N1 h8 N- s* z
3 |- ?0 p4 ^7 b6 y G7 | // 清除 UART2 系统中断 q! E$ z/ @6 P; d: k: |! B) {
IntSystemStatusClear(SYS_INT_UARTINT2);
' i- ]" J3 [: w3 F5 f; Z
% _1 J& R; e& S! Y // 发送中断
/ a( [) z; N' V6 c1 q6 D+ b) x: v5 Q if(UART_INTID_TX_EMPTY == int_id)
, W7 z/ h3 a& ?' p) K3 @1 g7 S: k L {' D) R( w* Y, `% `# ]' {- I
if(0 < length)
, O0 e' K' ]& [, p6 N {! h7 |4 Q6 \$ O, l" n
// 写一个字节到 THR( M* Z8 H9 B) U. F" }6 o
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
4 p0 B, A! ^, U2 [ length--;
7 E4 W/ @! R9 T) h8 M# b( i2 x0 x count++;
6 F" | ~- N* O, A: ? }8 B+ B: e$ R ?9 P u0 I
if(0 == length)9 g- ^9 t9 N; N. x
{( }: k M$ H/ V/ v
// 禁用发送中断 m ?) `( l. k' O1 a# U2 W; {
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
0 E! G+ h6 Q g8 V) R8 V" H }
! W5 z1 S: \# }. o2 L% C/ I/ ]9 J }" M' @1 y6 E! q6 c
2 {- }! O6 D y5 Y( f. K2 D
// 接收中断& ~) }1 g7 E. q* ]( [* D6 H4 S
if(UART_INTID_RX_DATA == int_id)
, c5 Q6 r; ?. { {4 N1 _7 z [: G/ _" J; d' r
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);+ Q/ ~7 z' k( E' \% e5 P& Y
7 B, a' F; d4 {) o1 _ UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);, r, |: w/ \; A% Z3 }& P7 N
}% v: C0 K& r# l' Y( Y
2 m9 \& O; x$ q6 m. u& ] // 接收错误% T1 u; L" x7 e# i2 U# M |" G2 ?
if(UART_INTID_RX_LINE_STAT == int_id)
2 ~( i- _) }+ g4 k& B/ A( ? {& `- x& D5 `$ l
while(UARTRxErrorGet(SOC_UART_2_REGS))/ E3 q( K- q3 p
{1 I4 ]- ~% [! ~5 G* G# _
// 从 RBR 读一个字节. a4 A' `' [- ?! ]
UARTCharGetNonBlocking(SOC_UART_2_REGS);4 d4 ^) R; Q6 q: A9 |2 _
}& v6 N; s x- T: q3 z4 i7 B: W
}
5 ]7 ?: r7 Q% p3 T$ U
, }$ Q$ |8 @1 v& N3 C* s/ W+ S return;
! ?4 Z7 l6 {7 D+ w7 g}' j0 K& ^ x1 K" s- Y" _1 U( e
|
|