|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。) D1 h% G: d3 ]' R, }$ p
0 l) e6 c% R6 C#include "TL138.h" // 创龙 TL138 开发板相关声明4 l" u' E1 v8 m' ^/ Q8 V
1 K" k' M/ s2 K* ?8 v' b#include "hw_types.h" // 宏命令, x Z3 _4 `4 j! D$ R$ e: _
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
. r; P" U/ T3 m( ]# V# K( F#include "soc_OMAPL138.h" // OMAPL138 外设寄存器! H4 S( e6 _- p6 B4 l3 \
4 u! T; c# b: `+ D
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明5 i: B0 ^8 P4 {' a; w4 m
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明/ b; h3 E& v$ Z
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
/ Q' a7 F7 x* Y: L#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义 A7 ~4 f) g( k2 ?* ^( ^# F! ~
: w9 D- E, i% C, h: A0 n" V! N/****************************************************************************/: C9 \. I7 N* i, |
/* */0 s/ W3 [" A! S* o" @
/* 宏定义 */6 f# A. B3 ^1 x( v* o
/* */4 m1 p2 f* ~ A6 P
/****************************************************************************/
0 \3 _/ x) S- E, m/ h8 S// 时钟0 I" H g& y" H: v8 P( ^( c9 ?0 [
#define SYSCLK_1_FREQ (456000000)
! u* F: W8 ]( b3 g8 @#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
6 }1 b! Y% {/ z% m7 M1 d3 {#define UART_2_FREQ (SYSCLK_2_FREQ)
- `* q! D) N' C% f. _/ \
9 z4 y# L: I" I) I" b- p" S/****************************************************************************/
% x0 f% K% V7 g0 |, ^. q |/* */+ c9 j- a6 M- r* a9 E9 m& C, S
/* 全局变量 *// u* I- f: m7 A: |. m! j2 p
/* */
% a2 z/ s4 g# j9 r* u, K# O/****************************************************************************/5 d3 I( N( ?# v
char txArray[] = "Tronlong UART2 Application......\n\r";7 w6 d9 Y8 S! r+ `' F- l
) p4 _- C6 V' y/****************************************************************************/
5 R2 s1 l3 L( ?, u/* *// o1 O! B7 u" Q3 U, z* s
/* 函数声明 */
/ n9 u! H; x- P+ D, ~8 _1 u. ~/* */2 q2 w$ K1 g) L
/****************************************************************************/
- T. y! z ]9 v) g7 E, f// 外设使能配置" h L% m) r: Z& M. W" Y
void PSCInit(void);' t( e' ]! G% t# ]# b% X& U
& x z. I9 x) n( ~" D/ [% l/ _// GPIO 管脚复用配置0 r) S' s) h" |0 \4 ~5 |
void GPIOBankPinMuxSet();: I' l G0 p# ?
( T9 \( g5 z& G2 _+ v; B% v
// UART 初始化2 o2 F, z( S, k3 g+ f
void UARTInit(void);
1 u2 C3 l. i5 e- w1 u# L8 {// ARM 中断初始化% X8 D, ~& K* c/ @( e
void InterruptInit(void);8 m4 R4 V$ F5 M5 G1 ]9 m; H9 H. [
// UART 中断初始化' n9 F7 `- w4 K# _4 ^
void UARTInterruptInit();7 P# K* n2 R. R, ]
// UART 中断服务函数4 _) J J% a. t( y2 g0 Q$ L6 A
void UARTIsr(void);
$ x6 q V% l4 o! U- H. ^6 a! i8 Y& g8 e8 l- Q7 ~+ }/ h
/****************************************************************************/
. s; j& X$ {) v3 O/* */
, ^. N& P- A D6 J' P" E/* 主函数 */6 ~! i; _; a: Z) i
/* */
2 s6 i+ f V: w# ]- L/****************************************************************************/5 E2 A" G0 `% R$ \% W; k
int main(void)
, ?* g- y: j; @: Z& v2 R{$ P7 m" G6 |, N, H7 A" y
// 外设使能配置
) c( }% L ?( m+ G8 Y) f& N" E" Z+ | PSCInit();' y! a* q1 b# `) G" W3 w- M
6 e; b3 t- A, y" t6 L
// GPIO 管脚复用配置4 a: E0 n# G8 r" J$ ` V+ s' N2 I
GPIOBankPinMuxSet();) V8 W+ C& e& }( i& M- _! P+ L/ ?+ M
6 j$ _1 h0 Q7 g // ARM 中断初始化. E) v* p1 F# w1 J- d
InterruptInit();1 j- J; ?3 [; _: w* b/ v2 G0 u+ r1 X! w
: L- `3 r4 P9 I6 x0 {) }
// UART 初始化# x0 Y9 k) h/ M/ V0 V2 G$ @
UARTInit();
& N* m8 i/ A3 K; H4 s3 O: D8 \6 R
// UART 中断初始化
, S1 P8 v: q, [% a" K! u UARTInterruptInit();% }' Y- q) N9 ~! f- D f
) b4 o Z% ?$ |8 n9 y$ I% P0 Y // 主循环3 i. f5 W9 [& i# S. u
for(;;)
i) m2 T! z6 o8 q8 c {. x1 M2 ^/ `0 L2 M, p
: {$ Y: i6 P% N% [; w1 C
}8 L( u7 ^2 K0 a0 S0 m
}3 n% U: r9 l4 k& [% ^- y4 V, o8 l
5 d e; d; Q: P- k6 @' P/****************************************************************************/
2 `: S% f( {- i4 v6 `/* */
9 P8 R. `8 q: r2 @, @3 D/* PSC 初始化 */& d' P5 F- G' _% R" s: `# s+ F
/* */* Y+ G( K2 G6 Z; D i1 B+ |. a
/****************************************************************************/" R" Y8 X6 \/ d
void PSCInit(void)
9 m+ D. C$ S1 p% q{. V0 c( G2 i7 ]- ]3 z$ [
// 对相应外设模块的使能也可以在 BootLoader 中完成8 U9 ^$ Z- ?1 ^& R- z
// 使能 UART2 模块+ [/ J5 n# k2 P' X r) g7 t
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);; ~- J9 f* U( N8 x5 Z1 R
}) S: J6 G7 ]$ @; h/ w" {4 Y
O* X7 h; B$ z$ |1 h$ @- F' Z# }/****************************************************************************/
" o, _0 z* g0 {% F* `+ m7 C/* */
. V' f* v: V r* H; s9 q4 c/* GPIO 管脚复用配置 */0 X0 w* l1 f3 m# T, |5 g. y
/* */3 p$ ]0 C3 `. p" U
/****************************************************************************/1 Q' V# K$ O* @1 k
void GPIOBankPinMuxSet(void)
6 `, J6 [5 N# {$ J( i{" @* m* R9 r2 v6 v; ~
// UART2 禁用流控
5 Q; w, \' n* d& E* ^7 m UARTPinMuxSetup(2, FALSE);
4 d, ?0 l- o, L7 |4 k7 T. g& C {+ `}
/ {9 }; G/ e5 l3 z
' E( L0 l- M* N- f% `/****************************************************************************/
% g0 G: `8 ?8 ?$ j/* */# U+ Z/ ^( |$ x& I5 t( e! j" o) H
/* ARM 中断初始化 */
' g) a: R6 r" Z5 u ^" ?) Q y4 o/* */& V$ n9 d* T5 I8 A
/****************************************************************************/( G1 M |/ F% B' T! d
void InterruptInit(void)' T4 x* ?1 }" P: g1 e. t- N
{3 Z" ~5 B# b! C. B2 {) i
// 初始化 ARM 中断控制器
P% U0 S8 l7 t+ A6 a8 { IntAINTCInit();
# p) G ^9 |$ m0 I* O) g8 E* x4 O6 i2 h4 |$ ]0 N- y
// 使能 IRQ(CPSR)
V8 `+ z' w8 e- v, g IntMasterIRQEnable();( X6 T. X2 q) A2 t3 J- n# [ g1 p
J, }2 y. [: [ b& N3 E$ _ // 使能中断(AINTC GER)
" a2 x- O' u) `8 Z5 y IntGlobalEnable();2 O9 X8 @! b/ { G& U9 c. W X
2 j# X' y% l, l9 d+ I8 D // 使能中断(AINTC HIER)
8 r% ]" {; }* F" j IntIRQEnable();0 L9 U/ N. C: |) H
}/ G8 C: h5 \' R# Y8 [( h/ a
f4 A* J3 ?* A5 I3 X/****************************************************************************/
* |$ T7 o4 g) T+ r/ x$ T: ?$ O/* */$ L" {0 U. p0 v9 q
/* UART 初始化 */: }# l. \7 c+ a
/* */; ^) Y" N! _0 _* \) s. J6 V5 ?
/****************************************************************************/
c' {, A6 ?1 @: u0 ^3 t# zvoid UARTInit(void)
7 q* u& X: z" v5 E3 m) E4 U{
7 C% H1 t0 J$ r* S7 ]) b" q // 配置 UART2 参数
3 C+ m/ b* F) G% I // 波特率 115200 数据位 8 停止位 1 无校验位
3 B9 C9 ^$ q8 N6 V. P* Y UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,# j9 A8 [* h' r/ Z- Z: \; u
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
2 i, L! H9 m: \% |) j- ]: ^ // 使能 UART23 Z" ?" u" q% d, c
UARTEnable(SOC_UART_2_REGS);9 E: z; X0 e1 Q ~0 a
9 [: ~, N" e1 H, z2 h! D2 j
// 使能接收 / 发送 FIFO
& n4 z+ W$ C. D- t- C7 Z UARTFIFOEnable(SOC_UART_2_REGS);! w! M4 y/ A6 Q
* Z2 E8 ?! ~! U. y) {
// 设置 FIFO 级别
7 E- c6 F* u7 l7 H UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
4 B% }- \5 V1 H& P) d% k}+ v* i5 Y. ]+ V! m# j2 E; m
6 p( e% N; R4 o2 W( U/****************************************************************************/) m( w5 g9 Q. t- B1 ^5 u5 K3 y
/* */
$ Y) t& z- d5 H; W7 t2 i/* UART 中断初始化 */3 H+ f0 A$ B/ |! Z; j/ o
/* */
% R) z9 Y: i% \& s' d( K/****************************************************************************/
( _6 w$ }: ~* K7 _& G7 Evoid UARTInterruptInit(void)4 p! D8 X2 V( |) R2 x9 t" _
{ K) Z* m& B. N# i' @2 l, G, O
IntRegister(SYS_INT_UARTINT2, UARTIsr);* I4 O6 }8 u0 D: p& V
IntChannelSet(SYS_INT_UARTINT2, 2);- f5 n' f+ o" }- ~/ @
IntSystemEnable(SYS_INT_UARTINT2);2 r& L; k- S1 O1 a) {7 c
3 ~) D8 o2 y+ m' y! ]: k& I: d3 @
// 使能中断
& q D! r) l& E! f0 [( Z unsigned int intFlags = 0;
: y& t3 ~2 p& T- b" j3 ?8 } intFlags |= (UART_INT_LINE_STAT | \, f2 G' E: o ^$ ?- u7 e; z! P
UART_INT_TX_EMPTY | \8 [7 r5 m" \' N
UART_INT_RXDATA_CTI);+ I; Q& u1 l; L5 }( O# s
UARTIntEnable(SOC_UART_2_REGS, intFlags);: y: S' x1 Q ~6 z& l: i0 m
}
: `) L' _6 f& q( l$ s) b# q) r+ {' O3 a+ _% `" D7 Z
/****************************************************************************/
- Z# V* v0 ]- d$ b _- |/ E/* */
7 i' i9 F# Y& r+ [* [ h: F% T/* UART 中断服务函数 */) Z* N3 _* T6 F% C% k
/* */
# L+ a0 L, J+ O% C. w( I0 |/****************************************************************************/
. t9 E: v7 Z9 A: M/ m6 bvoid UARTIsr()
2 ]+ Q$ `3 H P' ~2 k" T' W% T- e{
0 x4 U: B7 m0 c4 @ static unsigned int length = sizeof(txArray);
/ E+ D$ V6 q2 Q. E0 V8 q" N static unsigned int count = 0;
8 w4 ~4 m) [) t& N0 q- R unsigned char rxData = 0;& l" D5 F* w0 ?- {3 h
unsigned int int_id = 0;$ H u6 V9 D5 F" r6 p, L
! m. w! z7 h, \! c* x$ K // 确定中断源
4 k2 ~0 P# h' C2 w( g/ \: ? int_id = UARTIntStatus(SOC_UART_2_REGS);+ Y* x" b; E2 e+ J# s
; j% t) e) D- z
// 清除 UART2 系统中断
/ k3 C" |4 I# x+ N0 p$ @ IntSystemStatusClear(SYS_INT_UARTINT2);
* V/ I, w9 _$ Q# S3 U) e$ v% |0 E5 m7 Z+ v6 J6 h* l ]
// 发送中断1 l+ z% V. p9 r' I0 b4 a
if(UART_INTID_TX_EMPTY == int_id)/ A4 _4 z# J2 }/ T" _& T& `
{
0 d t% W: B8 F if(0 < length): g! y. i7 l9 Z$ D( S: i
{
2 x a- x( x4 {, K // 写一个字节到 THR
}. P- B# x+ x9 E8 |: y. `( [, X. F% b UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);: ~& E% B5 q& n, r
length--;
" f5 M. D; e# i( j count++;
, @# G; q7 r! G; F# @ }
$ d e' ~& x5 K" `/ \5 h% E if(0 == length)" a" b" u. u+ W8 Q
{: `9 R1 w4 y) V& Q5 w. h( _
// 禁用发送中断
5 c: m' H+ g1 T$ a. o( d UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);+ Q3 \! O* C& Y2 x h. L
}. c% t( k K, A8 f
}; ^) p$ H9 S5 M6 A
* l/ S- Z( {: |6 _5 v
// 接收中断
" r8 J2 s, \2 x/ A9 S, i2 B if(UART_INTID_RX_DATA == int_id)- N; W- v- _% O) f/ e# G7 Y
{
' _2 z0 q1 w( {" z1 e; n4 H: |3 C rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
6 J% _9 e2 x6 w' i7 Q) x0 l* d: l z4 Z
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
9 W/ U" {$ P* F9 o. k' e }
k; ~; M: g9 Z) T. {6 ^. J
% s0 ~+ W. |$ b5 j* P( O* k; v/ t // 接收错误! J; W% h: O v9 r$ C. K5 O2 x
if(UART_INTID_RX_LINE_STAT == int_id). A, U1 u3 i6 n. U, x4 r! a
{
; {3 Y! ?6 s# a) s' ?, d while(UARTRxErrorGet(SOC_UART_2_REGS))
3 C3 C( w8 d2 z% f {
6 ?% X4 U' t/ i9 [6 _ // 从 RBR 读一个字节6 ~: O' [6 U# H: R) Y
UARTCharGetNonBlocking(SOC_UART_2_REGS);8 E5 \- o$ `- F7 Y% b
}# q4 {6 {. ^% U- H! x& v. d
}+ u( M) K P- W, G' x! y I
L: N. X+ K3 K2 }; x5 e return;0 K0 _1 W9 I9 c' B( T
}1 K0 Q$ v8 f; D% l. I* _6 k
|
|