|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。/ ]2 E/ C5 H3 |
. u3 Z# z' B2 a- C4 |1 \
#include "TL138.h" // 创龙 TL138 开发板相关声明# L: m! Q: ~; A: e4 W( a' p
" L" n6 i7 `8 D* y0 D+ P4 T* F( m
#include "hw_types.h" // 宏命令! B* _( W. w( A
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器6 r, F! g) p; C6 X7 x U1 b& L
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器. P! x' a9 Y0 Y. t: `; q4 \
1 Z* g' J' X* k ~" N7 T( u2 T7 {
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
4 t4 @) p% d; w- \#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明5 p G% R- O; K
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明, B0 o' N, }6 g" F5 a1 r
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义2 n+ K1 r9 G& W8 H/ s$ A6 y$ c2 [3 R
5 U( x' h! X8 { K7 W( l& [; ~
/****************************************************************************/! J. m9 R" V% q; Z0 ^/ a
/* */
) z3 c7 B2 P' e/* 宏定义 */3 k. b! r( C j: l/ n1 J) V
/* */2 ~& r# ~5 ~# N, {) n6 _
/****************************************************************************/4 i/ }) h$ ]) c* I: j/ T
// 时钟! W* B/ v, S2 O
#define SYSCLK_1_FREQ (456000000)
4 O( ?) H4 _; P( ]" n8 D* p0 E) h6 F#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)- e: I0 v% H' l4 S
#define UART_2_FREQ (SYSCLK_2_FREQ)! R. O1 c, r- K
' o2 G* J2 `# G& e5 f) }
/****************************************************************************// v9 V ^9 c9 _# ]$ d' |6 h
/* */
. I# j2 m! h% K9 W/ U' u/* 全局变量 */9 G! n" p3 s: }' o
/* */) o: K: p% s4 v3 w/ k" r0 m
/****************************************************************************/
[" E+ X) h2 o2 }1 D$ F0 vchar txArray[] = "Tronlong UART2 Application......\n\r";8 _9 g; c$ P- p c( o- P7 l
' s8 V! |9 b+ y
/****************************************************************************/; |: L3 N! O j* z* @2 c* c: l
/* */: F5 e+ t5 Y$ Q7 {2 w
/* 函数声明 */) E+ i: p$ V# L; U' |
/* */
" ?& v4 h P! S$ T% @* ?5 p/****************************************************************************/ U+ }8 m, b! l y& E6 R$ O9 b
// 外设使能配置) p" a |* k: `' x. O$ t% k
void PSCInit(void);
6 g- N& p( } \
3 X" q1 Y5 S, d/ m// GPIO 管脚复用配置
; y1 b6 [4 _9 ^void GPIOBankPinMuxSet();5 \2 ?; q8 g1 N
: T. _ I: E( V2 p& X+ f
// UART 初始化
2 B# R9 l' W2 b, B: Y5 D" X: Jvoid UARTInit(void);+ x) ~8 m5 {. C! L r
// ARM 中断初始化
2 k+ N* H5 W% I2 ~void InterruptInit(void);* S& S6 B: W2 ~2 Y! ]% c! }
// UART 中断初始化- N6 n; I$ e& }# n2 z; [
void UARTInterruptInit();
& N' u- B2 Y2 ^// UART 中断服务函数
" h0 g5 ?6 [9 A: Y8 qvoid UARTIsr(void);
2 k% Z6 w, J) m7 v6 @9 s/ U% M$ H2 K, G
/****************************************************************************/' F" ^: g5 D! t- L& I, Z
/* */
; j4 d. Z4 {8 s: q8 u6 f/* 主函数 */" ?- g$ g R6 g; z$ v. M
/* */8 R. C/ q$ f; n. O
/****************************************************************************/1 W" Q# F! n$ b
int main(void)
6 X) _0 L! l6 r y! J/ g{+ o3 k4 z4 ]6 r% A; g
// 外设使能配置) P1 w. E; O6 \
PSCInit();2 A4 |% l; f0 M) |. M' k n( S
/ y% U& u: X/ R6 R9 L% S7 Z // GPIO 管脚复用配置
9 T; }" s+ }3 U# f5 d" T4 d GPIOBankPinMuxSet();
) f! T8 |2 x6 q$ I. [
0 D* J9 d) x, a) I // ARM 中断初始化- L+ X5 m+ {& X i
InterruptInit();1 a! G$ T) X" }6 K
3 \0 B! e5 L, @& P) L // UART 初始化
! N; O. u6 z* Z9 v8 j! D UARTInit();# i9 k* N/ M6 `& Y
9 k+ S2 {* _: _3 V' [# ?. x
// UART 中断初始化 }& b, i. Y8 R2 { n5 g
UARTInterruptInit();9 a9 K" ?* {1 P5 x$ {7 s* Q
; s1 p5 x: n! N
// 主循环# Y# @% |& i, J0 L3 c. r/ ]1 B
for(;;)
' N6 @; l3 E, } k& e: v {
* g' e5 a2 ] K6 h. O* G& k7 G
! M1 @! B; n- W5 k4 x6 N }, ~4 q. P- Z# y* t4 L
}' a- U' w* T1 |' z; s/ M
8 s& t p" g4 j2 F3 t; E$ S4 f
/****************************************************************************/4 N. ?4 g# }; Z! e5 y
/* */
' |$ H# s' b% z3 S7 V/* PSC 初始化 */
/ \" B5 Q: D" U9 d/* */
7 w6 l% A! j1 o% C- d, `/ j& E/****************************************************************************/+ t3 J; m5 `; D, @' u8 Y
void PSCInit(void)
$ N: `- C# D+ k# P; e7 u- K' b l{
9 x3 b" w' R- |5 j // 对相应外设模块的使能也可以在 BootLoader 中完成6 K% r; F9 p& s$ N
// 使能 UART2 模块
1 R: \" @# P# j) h; ] PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);' S. f8 G; B$ |
}2 P5 r9 w* q8 r( {0 c
3 s I [8 u2 m" a; r+ t/****************************************************************************/, p( o" D( | K& d: O- O$ E1 r
/* */: S) k7 b5 s5 h1 V- Y; q
/* GPIO 管脚复用配置 */
% X% r- w# w" h5 |6 W/* */7 Z0 }9 W3 h7 _8 R& `
/****************************************************************************/
, a9 U* [( j7 g# @) dvoid GPIOBankPinMuxSet(void)3 s, L+ c1 j* x O% t
{
3 s' s; Y# I) c* G // UART2 禁用流控
2 R% F( e% W: }" P UARTPinMuxSetup(2, FALSE);4 I) E, ?' y% }1 ^
}& c/ y. O: ^& v2 n
7 b; {, B' H) b2 e! X/****************************************************************************/
5 R+ ?( p0 b j1 m/* *// M" c4 e- a/ Z; }2 a& m( x1 F
/* ARM 中断初始化 */
9 d* U$ p7 U# F. G. S/* */+ }+ c) f2 f; s; W: Q
/****************************************************************************/
) ^! D/ K7 W- v6 m& Rvoid InterruptInit(void)
4 | c5 a( x1 n/ t{4 W0 B/ j+ n- ^" e7 B
// 初始化 ARM 中断控制器- G1 ?' D% @; H) R0 x( |" g
IntAINTCInit();
' \# r+ u k# t, ]& b+ {5 O9 j. X' d. r2 J' B' N
// 使能 IRQ(CPSR)% P+ ] ~$ D4 A4 ?" b
IntMasterIRQEnable();6 a& K2 N" J# ?( t8 Y% l* j0 ?' W
9 c y4 R, k/ ?( W$ l
// 使能中断(AINTC GER)
1 y9 N/ }8 A* y H% I IntGlobalEnable();
6 D. F1 a0 x3 H3 @5 P" {3 G; v8 Q6 h; H% g+ s# z
// 使能中断(AINTC HIER)' u0 l2 Z# w3 S* {" ^$ u: I
IntIRQEnable();
' B# m: s8 ^$ R} _0 Q' z! d$ c2 r
1 ^! `3 @ m9 V# c+ K
/****************************************************************************/
8 `7 Q' E/ s! _/ y/* */8 L" \. M' Q) i1 j
/* UART 初始化 */
6 i* I- i, U7 W, g$ d: I( p/* */ L+ v! U7 {9 O& y
/****************************************************************************/
8 R. U$ M/ ~/ t1 \$ g) |1 `void UARTInit(void)
' L/ i6 Y7 [6 S& p- E9 `$ w{
3 z" W6 f3 O3 R0 U! E0 h // 配置 UART2 参数
Z# Y5 G* B. w- G0 ^6 [ // 波特率 115200 数据位 8 停止位 1 无校验位
( F- E% _+ P* x) N5 k9 T UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,, b# w8 K6 u3 V! O, B8 d
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);4 t) e: y, Z- d* M
// 使能 UART2) f) q* d% q8 X) [# S
UARTEnable(SOC_UART_2_REGS);( A8 L' ?: c+ S: a" I8 M/ t- `* s
# g2 a1 I0 M* s- q* Y; i
// 使能接收 / 发送 FIFO4 G6 F+ k# Y3 D* V1 v# w
UARTFIFOEnable(SOC_UART_2_REGS);
; C7 a1 \' z( u0 Q( [( @9 w/ n: E5 E; G
// 设置 FIFO 级别
6 ~/ _$ _& y& Q1 H' [$ N) s UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
7 {5 w- D7 M6 O( q* V3 y5 C}' ~ [6 @3 W" ^# u0 a
7 ]) ~0 ]9 `% c& C" R% q7 l/****************************************************************************/1 O# P$ w' A* k* @6 t1 o+ Y
/* */
% J; O f. g% Q0 L: v ~/* UART 中断初始化 */
8 H3 F6 g* J8 C7 S& H9 D/* */
! @& M4 y% T" G B) J' q* I0 K2 b/****************************************************************************/& w- |6 ]) f; ~' R
void UARTInterruptInit(void)3 A8 E. U. I; G6 B
{% [6 d+ s9 R! l0 ^/ T
IntRegister(SYS_INT_UARTINT2, UARTIsr);5 i. \ c7 L! O3 c
IntChannelSet(SYS_INT_UARTINT2, 2);* h* E7 C P8 m" U
IntSystemEnable(SYS_INT_UARTINT2);
5 r3 m2 y1 @% _7 N, s) Q+ @% y/ K! l j7 K+ Z! q
// 使能中断3 p5 N5 q: h& }+ I9 J: o8 Q1 |
unsigned int intFlags = 0;) A4 F H; ?6 i
intFlags |= (UART_INT_LINE_STAT | \
u& Z; l6 W. B1 m UART_INT_TX_EMPTY | \- b6 X. \5 c8 d8 L4 L2 }
UART_INT_RXDATA_CTI);
; i5 F; X" \2 n: M) }( ?2 I' ` UARTIntEnable(SOC_UART_2_REGS, intFlags);1 q$ l( K2 V1 N! ]7 L8 r1 C U
}
$ G6 W/ j( w! E7 m9 {/ u/ v/ K$ ?0 n) T! r' ^4 @
/****************************************************************************/
) Q2 r1 ^5 }+ c/* */+ _: b+ U* ]% I( }) W X
/* UART 中断服务函数 */
) \ F; B3 k7 K: e/* */0 t4 f8 v7 {# W7 b1 B0 q6 L u
/****************************************************************************/
9 N* p( B" R/ gvoid UARTIsr()6 p. b1 K+ D/ \: K+ U0 ]# S3 R! |
{7 h k6 y7 \0 g* Z! e' p5 z
static unsigned int length = sizeof(txArray);
$ H& x3 T& V, l( {8 h8 h static unsigned int count = 0;
" c$ Q( i. ]0 u6 E7 v unsigned char rxData = 0;
) V) K& w) o7 q0 S unsigned int int_id = 0;5 ?: w9 h+ M3 ]: I
7 G3 U, h1 ~( }! P c* q! S // 确定中断源
1 q. w! ?, }$ Q int_id = UARTIntStatus(SOC_UART_2_REGS);
, P/ C+ @; ~/ B& R
5 m. o3 ^3 g: B+ A: n8 v: X8 q X // 清除 UART2 系统中断
2 L6 n1 P4 O* \7 S/ x& @ IntSystemStatusClear(SYS_INT_UARTINT2);
: V0 W$ ^$ d2 `0 w5 G& k- u8 K: h7 G: w" m3 y
// 发送中断* S9 { F& o5 Z9 ^
if(UART_INTID_TX_EMPTY == int_id)7 D. W& U" x- z: i
{0 ^1 g6 _1 S) R
if(0 < length)6 _/ ~9 ?# e6 C) ]: e2 D$ s
{3 Q$ q: D( M9 I5 ]' I/ B
// 写一个字节到 THR
5 \+ g, {; r# l- I$ ] UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);- Q6 h ^ k. j& Q
length--;2 n' B' O. o2 p: B
count++;9 t$ |1 D& h* y% M7 h, E9 W$ {. j
}, l5 H# e, q4 X' V$ X# h( A5 L
if(0 == length)' j* h* b; _% p9 G' ?
{
# D1 e- U9 K6 k6 @8 k5 ?1 r // 禁用发送中断5 ?& f% s5 T# H v/ A$ f. G* l% k1 n9 f
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);( p" d5 f; N3 D6 ]
}
1 B- @, k! P4 z4 D7 I# r5 J }8 D1 u, Q. B! B
3 S3 P1 K. h3 V0 Y // 接收中断; x0 _2 _" O; O: ?; m
if(UART_INTID_RX_DATA == int_id)
. {. e3 ^; O8 R {( h3 k; W7 u- v5 [! a
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);$ b6 k t, w% z1 ~1 N' W* Y# ?
& E5 h$ H' d: ?+ }3 P
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);5 |2 d; t" o, x1 O3 ^0 z
}% X" u- [5 E7 {6 h& d9 z$ [
0 N7 |% }4 U) ]. r. c6 @6 } // 接收错误
$ t/ T4 ~( ?8 Q* n& P if(UART_INTID_RX_LINE_STAT == int_id)
* e7 X: h6 N! B {
9 Q1 V! k- q. ?& i while(UARTRxErrorGet(SOC_UART_2_REGS))
1 F0 r; Z' e5 l6 i6 f {4 ?' S4 O1 Z* _! Q) V
// 从 RBR 读一个字节
c8 e& g. `$ X8 @( f UARTCharGetNonBlocking(SOC_UART_2_REGS);
+ K0 ^4 V/ m' r; Y* m5 c' J }) s/ C) {* ?. [6 x& N
}$ t1 D( X6 s% `4 |
# ]) p) z, V4 f$ e3 G5 e" ?- A
return;2 l, `# R7 ]% m8 D
}7 x1 F1 i; l$ Z+ V3 R7 e& |- G
|
|