|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
. }+ b/ W8 q6 }4 [- h! d
& Y( T( _) Y0 w6 \7 e0 E#include "TL138.h" // 创龙 TL138 开发板相关声明
, F- _! t% Z8 R( x; i8 t
# t( a% G! m% _6 ?: t#include "hw_types.h" // 宏命令
, T' G5 Z2 d5 n! d! w#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器8 `7 o; w9 X4 e; ?) x7 s
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
3 k: E3 h; I9 H8 f* Q u+ b
- U" I S+ Q, @8 p& B0 s$ {#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
0 c* s& o0 g1 u#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明7 N7 I0 ~* k5 y: Z3 ?9 ~
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明: d. y% V9 h9 w3 Q" g6 Y# C& r
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义- a2 i( i! {5 p- S1 w7 z8 R
; w( R6 J( M) ]: ?6 Z. n @
/****************************************************************************/0 q/ w6 g% p+ X+ u& c
/* */+ |( `2 L( G9 Y m, E( R
/* 宏定义 */
2 v* Z& o) c1 f6 J6 j/* */
2 P6 B ?4 R' o+ F- y9 w2 _( m/****************************************************************************/
9 T, X. |) X' D+ F9 z+ c. y// 时钟
! x. a# \: d2 b$ M; f; E4 W#define SYSCLK_1_FREQ (456000000)9 u0 J1 A( E; V& f
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)! d( J- a; E6 K7 K! o* K$ x
#define UART_2_FREQ (SYSCLK_2_FREQ)
* o$ y& N% j( U7 b* Q: Y0 C2 e% K% O# x. B/ P, Y9 P
/****************************************************************************/
/ `5 p+ f+ w% n7 c& A6 n% Z* f/* */
2 Z) L# _9 j N$ X6 J' {/* 全局变量 */7 P8 P. ~7 g8 B' l; s
/* */4 Y. w& j% @. Q# l% D: e
/****************************************************************************/ A4 w( e O, V- x/ r$ Z9 I
char txArray[] = "Tronlong UART2 Application......\n\r";
6 k* s1 E, Z2 I& v2 t- z# A
/ f, o! F9 o& x/ T3 N/ T, h/****************************************************************************/
/ r$ Q0 H9 z# m/ o$ t/* */
8 F4 f/ f0 L/ C6 R% o( `/* 函数声明 */% K% e3 y4 M6 q0 Q
/* */
( w9 A) {3 C/ b ?9 c2 q; N/****************************************************************************/) l7 X5 s7 g9 x3 p& n# u- _+ M
// 外设使能配置2 Q! f" J9 w4 m6 q* m4 \
void PSCInit(void);8 k& a L7 B8 a# O1 z
4 R. W/ J5 n" q n4 J9 @
// GPIO 管脚复用配置
; B/ l7 E j3 L: l: r7 d' [" W/ Mvoid GPIOBankPinMuxSet();
- v( a. X+ ]: X7 J& A# Q% [
M6 j% t. }5 I% p// UART 初始化
4 {; z x1 ^5 Y0 P, Z! Gvoid UARTInit(void);
1 w* B) s! X- i$ t/ V// ARM 中断初始化
$ @# u7 R3 s. K3 L, \$ {) ?3 Wvoid InterruptInit(void);) J; Q% J w# h; `: r- Q$ p+ }
// UART 中断初始化9 ^4 d: P( Y0 e% K: H2 }7 g
void UARTInterruptInit();' [0 K4 y! i2 m, m! _
// UART 中断服务函数
4 Y! r, ^! N) ]* Mvoid UARTIsr(void);* M3 `! E8 Q$ x
6 j# X$ X) z# u( l I8 T# _* o; J/****************************************************************************/
) O% X* q1 Q6 F/ \7 U/* */# P/ T7 Z7 a( Z* _1 c# {
/* 主函数 */
* G& E9 e, z+ q( I. _9 Q' a5 K/* */' d3 b$ n i7 p
/****************************************************************************/
! {9 a [! J( z7 T" w1 uint main(void)
( s3 R7 W8 s6 _5 ?" e3 D/ V" E{
j! d, a* ]+ J7 Z // 外设使能配置
" Y! r% K1 r2 S PSCInit();
3 |9 d* l8 A, w - @% Y3 p3 W! ]) k0 r) H
// GPIO 管脚复用配置 Q5 N5 W' n% E: I
GPIOBankPinMuxSet();
+ _! F" }9 c" q! D" H3 q ~7 p. g# \9 |; j: W" ?
// ARM 中断初始化
* `/ \1 w9 }3 j% n$ l InterruptInit();
: M3 n, ^8 Y, N {$ [7 @8 A, b1 T# r7 [/ H: o( j
// UART 初始化
3 I& C- x8 _, `5 H UARTInit();
( ?9 Q" k7 ?( B; t n# G0 A; k0 A6 m
* X- _% [. N% h. w7 i+ O6 C7 b // UART 中断初始化
( u9 w% t0 k+ C& g, G, C2 _6 V UARTInterruptInit(); U: R+ t, x$ ~& f4 ?4 k
7 e9 b2 o7 h+ \ J2 o: o q' f // 主循环
3 ?" [: f# L' L# S [ for(;;), k) u3 ]0 M7 A( k4 O$ y
{
! d# \/ Q% a0 \, W0 h3 c8 y6 ]* f m W$ f/ i; a
}4 I, \4 a- S5 R: R/ f
}& g2 o9 s8 n2 Y" V) E; d; X
; j' i e Y1 O
/****************************************************************************/6 Y) u& R! \- k$ j# L. q5 h
/* */( ~9 F! X) @7 C( \$ Q. \
/* PSC 初始化 */# Z7 w2 T, Y, e9 H! e
/* */
) n. g2 c& k- g/****************************************************************************/
2 t9 ?4 J3 f9 _8 r, Mvoid PSCInit(void)* Q; F0 m) t6 |
{
( k* w# p1 R5 ~' } // 对相应外设模块的使能也可以在 BootLoader 中完成
6 R6 z& H, i/ Y3 C/ v) f7 Y // 使能 UART2 模块: F" I+ W8 o/ X. o" b7 k6 S
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE); |! F7 _2 o C9 q# {+ J
} t1 r+ O2 ~, S. ?
) B$ A7 Q) Q( ~1 p( ~2 V, {
/****************************************************************************/
! d/ {6 R& x5 |! T f8 H/* */" I3 O6 {- N$ t
/* GPIO 管脚复用配置 */7 q$ V- r" L" o+ s1 A6 n
/* */
# Q2 w7 I. U& t/ e/ V8 ^/****************************************************************************/
+ d" k5 N; t2 }6 ~8 S+ ^void GPIOBankPinMuxSet(void)7 |" H) r" D: _4 T
{$ v' q' r$ d3 l/ l* t; S& d' Y$ y
// UART2 禁用流控
' {4 t/ V" B C" O# ~# r UARTPinMuxSetup(2, FALSE);
$ m* f3 A+ J. w! V" L}" ]' S7 k' I7 w4 i# u" f
: i0 N; g; t, L( v- A2 Q/****************************************************************************/, r% W4 w/ @: m7 b5 @6 X
/* */2 D3 y- E- M, `1 G! Z, f
/* ARM 中断初始化 */
: I3 ?0 `# M e1 }+ l& U/* */
$ M6 e7 d& t$ C" r; q9 C7 B) F/****************************************************************************/: L& t3 r3 T/ f( ^# ]$ x. _) h# w- l
void InterruptInit(void)
& b& W+ l5 E5 {% ^6 w{4 j$ n. n; m+ s; u
// 初始化 ARM 中断控制器. ~' U G3 }4 U9 P2 |' w# R' m
IntAINTCInit();5 @, k( V' I0 n x* b
# n0 V) _' o; w/ [5 ]% }* b
// 使能 IRQ(CPSR)
" V- W5 ]; W( c5 q1 A IntMasterIRQEnable();$ J* D3 a! O! M, M( t# n0 n7 g
. f) y K/ F0 l. v& }! |
// 使能中断(AINTC GER)
1 J9 [4 U$ k w IntGlobalEnable();
/ f4 a8 s5 Y0 {$ N4 Z& Z. P3 h5 C/ c
// 使能中断(AINTC HIER)8 q4 c1 M5 J' L8 R
IntIRQEnable();" w( a, U9 ?) S0 ]
}( J' M( ~. o9 O3 J% {
5 ^2 C! ~. x0 V F2 E8 _; [/ r/****************************************************************************/% c/ L3 s7 E6 Z! m
/* */& @% z# }$ A( M7 C7 k
/* UART 初始化 */: n" |% v% \: c0 d* X2 u8 P/ h% R6 T
/* */
; {( {: j7 R" R/****************************************************************************/$ {( J7 O! \! W/ t* ?( _ f+ v) u0 N& a0 x
void UARTInit(void)
& M# k M' [) Y, [' C/ e7 K7 T' { w{" F& J" j; ~# b2 r. d
// 配置 UART2 参数$ N# W* C: X y3 S
// 波特率 115200 数据位 8 停止位 1 无校验位( p" [) @7 P6 m4 `! e4 U8 Y
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
: r# q, B) I; @% g2 }( q UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
2 ^. j( l3 W% P2 N // 使能 UART2: x; E) V2 h# p0 p( h: z
UARTEnable(SOC_UART_2_REGS);
6 F. ?7 T$ h' \2 L! k, e, Y
3 C8 E" {0 `- k {+ Q // 使能接收 / 发送 FIFO
* m& O! |, z ~: Y: h5 M E" U; J UARTFIFOEnable(SOC_UART_2_REGS);
) m' W5 t- `9 g9 ~! P& ]2 t, ]
$ e7 f: s) M1 K // 设置 FIFO 级别. f( N$ H; x" U! _6 E
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
$ K, \% Q5 b! r- o4 p; i" M- S* w+ c}
7 j1 L0 k U# _! D% j
& j% S; m2 A1 ?/ c! H/****************************************************************************// f( n! g; m" a9 P
/* */
2 Q) ?# Z0 @# m5 y$ }- O/* UART 中断初始化 */
& w0 J* l( c( P/ {! e/* */& |5 b4 j6 y& I, I- Z! d
/****************************************************************************/
+ G- L8 e3 c7 j# S7 }$ J8 wvoid UARTInterruptInit(void)
! p- S) ]% m8 B' ?% r9 {, w{
5 D. u% i* S4 h' I; O4 t1 i IntRegister(SYS_INT_UARTINT2, UARTIsr);
4 G2 r' G* r* G' q0 ^1 X IntChannelSet(SYS_INT_UARTINT2, 2);
$ v r, X4 @: m, R- S2 C! N IntSystemEnable(SYS_INT_UARTINT2);- h3 ]5 z$ c( n; u1 l
6 U4 L# _: f! K! E. t6 P: D // 使能中断
! A; n/ O! w- A, V unsigned int intFlags = 0;
% o: t# x q4 B5 ]% p M intFlags |= (UART_INT_LINE_STAT | \( o _% B% W) r" K' h
UART_INT_TX_EMPTY | \% O2 I# x; ~6 t8 Z N. H" I
UART_INT_RXDATA_CTI);
4 @# I0 T& A% {, b, d" [0 y) E, a0 V UARTIntEnable(SOC_UART_2_REGS, intFlags);
( {+ F4 I, s. @) I0 G}7 H6 w* L4 w! \( m d
6 Z/ ]5 @. w4 k/ U, m1 k- K/****************************************************************************/; j) h W& N* D. M8 _( ^
/* */
- K, `% F6 ^ e; Q9 W" B4 |6 d/* UART 中断服务函数 */
- k2 }( q) y8 x2 f; N4 b6 \/* */' D6 X- ~$ @6 z; `9 I0 ^
/****************************************************************************/
5 b: H- B8 Z9 Wvoid UARTIsr()' H0 }: I/ p% V$ L/ ^3 L H* m
{
4 y" ]) ?& W) o( i$ {! h2 W2 A0 D static unsigned int length = sizeof(txArray);
* B: ^: @! `( [. N static unsigned int count = 0;( ?& P2 t) M6 ~3 [' y6 M$ [$ S
unsigned char rxData = 0;0 A4 L0 _5 G3 Q& {( j
unsigned int int_id = 0;
, _7 O) d5 a6 E' R4 l
5 h% G& `, u& c* d; K // 确定中断源/ E, {+ g7 |* G; C% B8 T' z
int_id = UARTIntStatus(SOC_UART_2_REGS);
( m$ j# b7 ]- z7 v1 v& k
. t( {8 y! s3 I' K" P% j/ y. a4 c // 清除 UART2 系统中断6 D0 R) Y( Q' ?& k' M
IntSystemStatusClear(SYS_INT_UARTINT2);7 ^) `, x, D7 M* Y+ j! m
; P% [! M) P6 f$ x2 E4 s9 o // 发送中断
8 r4 Y# }$ r$ t* y9 B) l if(UART_INTID_TX_EMPTY == int_id)$ _% H. `8 X w0 r+ B2 @
{
- v. u5 y+ G' _ U' [ if(0 < length)
/ W7 a2 F& n) \; b W: S# `1 h {
4 n7 G6 p: x" }+ b/ P* v3 s/ E // 写一个字节到 THR
! x# T( r; m' m$ U) D0 ?: U UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);( n8 D# r( n3 K- S! f3 p" E: k
length--;* }2 T& x% A: m0 N) J, r- }3 s( P
count++;
; S+ A8 L9 k6 G1 c% |7 `8 {2 A; K }8 R! f6 _& o" z T4 o) b# Z& m+ y
if(0 == length)
, {9 R# \1 D4 U3 c* t {
" O, h; P. U3 }8 u7 ^) M // 禁用发送中断
% E3 `6 ? g2 t( ^: o. x+ }% q UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
) J0 u$ R- l: f! c }
J# _# ?: ?+ Q& f4 j }
( Q5 a5 `0 R1 U: S$ t' c0 O1 i. v8 u+ B0 t# z6 P% l
// 接收中断' y* k, S7 ~/ Y4 M
if(UART_INTID_RX_DATA == int_id)
: C, E, t" x4 T' r4 M' i0 y/ H {
+ p; \; k: e5 d/ A* H1 E5 }) D y7 | j rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);$ { G+ w! Z' u* l3 P
$ | k+ L5 ]- j R+ j n$ [ UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
/ X" v$ D& B8 j# s1 k }
: c' \9 L+ K, h* `. z8 N, i7 o0 P1 B
// 接收错误- j5 u, v9 V# b! g3 Z2 l, u# R
if(UART_INTID_RX_LINE_STAT == int_id)
( T! B2 E" x4 L* |1 I h* u- r {
3 F: f' F. ~5 r2 v" r8 z2 E while(UARTRxErrorGet(SOC_UART_2_REGS))! t _& O }- B- s0 u2 c. f |
{
- V$ q% C- b. {1 n. @: ^; B // 从 RBR 读一个字节
- Q0 I0 z! e# I UARTCharGetNonBlocking(SOC_UART_2_REGS);' f/ f6 V ]" q
}4 S9 \! g' U( ~! |0 ~* w
}% b3 w/ P }' o( P: E# Y
/ h# u& E1 @, G5 v return;
: r( b! I1 y' x- w/ |5 n}
7 p. ^ c& h; Z |
|