|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
5 S7 Z& Z; L5 L9 w$ H7 E8 |$ |" r' f5 U7 f
#include "TL138.h" // 创龙 TL138 开发板相关声明
8 H% ^# O. I7 a2 R' p/ @ F ]0 z4 e3 d! L9 o* y
#include "hw_types.h" // 宏命令
" R" W l/ V* z1 S: T" d#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
4 h& p) |0 n. e0 P! F#include "soc_OMAPL138.h" // OMAPL138 外设寄存器' S9 K1 q2 ^" R/ o! D* x9 c, i
! u7 f# _8 H' J3 Q
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明- b3 n, i$ M7 k4 k; R
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明: i( Y" @& G5 x2 l) I6 \5 f& s, {
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明" C) e- T0 Y$ E
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义! A H6 _9 z5 H1 j
; I- Y% N8 b( G, N/****************************************************************************/3 W F3 x4 c2 ?4 T. W
/* */2 ~4 _$ @2 X4 d; s2 Y
/* 宏定义 */2 z' q7 g; o$ l% W! b4 } D" y
/* */) b; h& Z/ ^# Y
/****************************************************************************/
8 Q. b6 H2 U+ t% e, p! H// 时钟
4 y: O4 u+ W; A- f$ y' W* S8 z#define SYSCLK_1_FREQ (456000000)
( ]+ E! X2 ~, W, F6 v; C#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
( A2 q+ [/ x1 w( D; d#define UART_2_FREQ (SYSCLK_2_FREQ)
0 J7 N3 P" K6 v$ m- _7 b0 L3 d: b/ {. n( c7 L8 B( l& h; U# \
/****************************************************************************/
+ Y$ v. Q5 j/ A' Z2 G# `/* */+ V/ o; V- g* x) T( ?( i
/* 全局变量 */
$ F' c z6 g t/* */; ~" ^ \0 s7 f
/****************************************************************************/
" s& f; X3 a6 B R$ J( H+ Achar txArray[] = "Tronlong UART2 Application......\n\r";
3 P A$ x4 K8 J) @" k+ P" L$ J9 q: P. s0 [
/****************************************************************************/
/ U; L! O9 Q8 K( V- a' b; f4 a$ |/* */
+ j3 x6 x m, b/* 函数声明 */
( [ r5 E+ C- ~$ u/* */2 u2 }' G& b$ L9 n5 t5 u
/****************************************************************************/
* p; X& `% j5 n$ Q g+ E6 x// 外设使能配置
, u( D: Y' E. \; Ovoid PSCInit(void);; f: l5 p2 k, b
4 d/ r6 S: O; m// GPIO 管脚复用配置4 Y1 G: [$ G+ p9 j7 [: i* E2 z
void GPIOBankPinMuxSet();8 B; j1 d1 ~) ^$ H" [
# U9 v k' L5 G' ?, D% k// UART 初始化
7 c+ P' u/ n: t/ x3 D5 qvoid UARTInit(void);
* d2 o3 @% |: l' U+ e7 X// ARM 中断初始化* q* }1 ^" b, u6 K9 |* W1 D
void InterruptInit(void);
3 [+ b9 d7 {" u" n" m* I// UART 中断初始化
4 c i' e/ ~8 Ivoid UARTInterruptInit();! \ ]+ g- [! [
// UART 中断服务函数* \+ ~8 o/ s% W% I) ~- Q5 T
void UARTIsr(void);
* V$ k9 b# W+ B+ j6 C* [2 r1 c' o! i0 U' i
/****************************************************************************/; f' {7 k' u P* T
/* */6 R5 t: f6 ? p% Z+ I, n3 I
/* 主函数 */3 `. M3 z" o2 F1 S
/* */
3 {& w3 `! c* | p, h2 Q( M' X/****************************************************************************/
5 {. B7 [5 c7 @* k5 Eint main(void)
1 K+ B" d8 X- i% {: q{# X, D) H2 m8 M3 K5 j
// 外设使能配置 k [! Z4 I6 g q
PSCInit();3 S; c: A; F' A: e+ y+ R
- \5 L0 `2 O3 S& g // GPIO 管脚复用配置) [8 Q( i0 z1 }
GPIOBankPinMuxSet();
) t/ Z$ W0 j/ v8 w; k; V' Z4 y r* U# n% ]+ w" \
// ARM 中断初始化) L" F# I: |, m5 i( i
InterruptInit();' y$ d! h a, R
3 P5 k, t( J' X1 n @ // UART 初始化5 N3 k5 r' f1 U0 L: o
UARTInit();4 I- s0 e$ {+ {9 M
" F$ [; m! E& |" U
// UART 中断初始化
& l. B1 y$ e0 w) F* ] UARTInterruptInit();
; f9 e; Z) t5 v' A, Q: A2 o7 k$ L# t% G- K
// 主循环) j. g' M$ K5 G9 g5 }
for(;;)
: e+ b& @( s) ]! Z+ Q6 G5 ~- X {! J* z7 B+ L5 \; `% y# s
6 J4 ^$ V, O0 b9 U$ |
}
& ^3 X( O! r# K8 V% Z9 E}8 L0 w$ U* j1 a! z: Q! {) P7 C
$ c( l' T2 g1 P; y4 I e/ n: ^
/****************************************************************************/! p. T! u9 P( [1 X, I2 h
/* */ x' O7 ]# n. e' V* ^
/* PSC 初始化 */3 a d* v0 K, S) d1 j- f& P, N
/* */3 [8 a0 c& j9 T9 i R
/****************************************************************************/
- @6 e( v* V+ Hvoid PSCInit(void)
5 Y& k. [2 M4 E1 R. C# S# Z( Q" Y{
5 W% j2 R, d5 e1 Z* z* R7 a // 对相应外设模块的使能也可以在 BootLoader 中完成3 A" w3 V5 N$ @$ E8 r9 J
// 使能 UART2 模块' \* U% a1 k# V
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);7 b! y/ O" `$ r7 a0 T& F
}
8 H0 ?2 ^8 |% U3 B4 }7 m9 q. A g% T' T) [
/****************************************************************************/# u% a: D9 h0 `1 M: ~3 q) S8 `
/* */
6 B: y! ^: X4 B( k* E+ b& S% t, z/* GPIO 管脚复用配置 */8 V5 n! ` l1 N. H( J" x
/* */+ k; l( y* u7 ~% j: U
/****************************************************************************/
) `) L; J, [6 h" W! [; qvoid GPIOBankPinMuxSet(void)( r {: m- o1 F, N$ c
{" [6 ~3 z) W. `1 }8 f3 r
// UART2 禁用流控; e* G4 |: b% I
UARTPinMuxSetup(2, FALSE);
# T1 s, w& P U1 \0 M}
' [ @& v& S+ O- E0 m
9 n! R" ~' t. f5 }# ^ c/****************************************************************************/
. E; X( _5 A, e6 r8 I4 G/* */* o C* B9 B+ a. B1 e5 R1 s
/* ARM 中断初始化 */9 R K9 x+ P. i
/* */* G( B! k. M9 p4 T7 h) e1 k. V
/****************************************************************************/
2 X8 @5 f. p/ v4 ^' T' yvoid InterruptInit(void)! l5 o3 y- X1 J: w; d% F: K
{
, v- q3 A! o- T- ^0 H7 d // 初始化 ARM 中断控制器
( x6 m S" N6 T6 e+ m. w+ n IntAINTCInit();2 A5 q7 R. Z1 y' j
; I! d7 H8 Z# L: {/ P& e: X; M& x // 使能 IRQ(CPSR)0 |; Z F3 V7 I
IntMasterIRQEnable();6 H D% i0 r5 b) b( P2 V( p3 a, o
. O. k0 p2 o" _% x0 q7 R
// 使能中断(AINTC GER)
! _, T, S( Y) m: T9 ?$ ` IntGlobalEnable();( P; ~) p6 i0 h5 r- [
4 h! J6 I! l8 F8 B: d // 使能中断(AINTC HIER)9 [& M- x* }/ K, G, w I3 l
IntIRQEnable();" m& x" U+ M0 ?3 I, M1 b# N, H0 t
}- [' Z* I% D" h( U! K& u1 P! _
8 h% G' V; q( f: B. y% R8 O
/****************************************************************************/
9 |4 w. g' \3 N0 {$ M: ?' ]/* */
" i8 y9 P& [9 O2 z$ u/* UART 初始化 */7 E. }1 C, o6 w# Y( B- v, {
/* */8 X! Z2 T$ {3 B( w9 h" _
/****************************************************************************/
& y& ]$ E% E' M2 j. n& Evoid UARTInit(void)
' O6 v" ?# q4 ]/ X3 i l{& U6 A5 I1 L- ~' |8 B; H- U' p
// 配置 UART2 参数0 T/ j7 h8 |+ u
// 波特率 115200 数据位 8 停止位 1 无校验位
6 `: Q) F+ N7 T$ ^* v. M" o/ L UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
3 V7 b0 ?5 y2 k7 w; T5 f( k+ ~: z4 c UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);3 U4 B: p, C6 x9 g) h
// 使能 UART2
; n9 k8 H& N( `: C/ j! H UARTEnable(SOC_UART_2_REGS);
% h! h* y* z2 t5 k% N6 X+ ~
+ s7 I9 a9 G" O9 \& I // 使能接收 / 发送 FIFO- ]$ J+ u8 s9 T l6 H7 k
UARTFIFOEnable(SOC_UART_2_REGS);
3 T- m; o: p& Y [& G8 G D* @
! y$ H0 w; X/ k& @! T/ `5 i // 设置 FIFO 级别
S1 d' E( p" M UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
3 [6 Q$ ^* X! Z+ P6 A6 P1 Y; b/ F}
. m% [: v5 I$ K5 X0 u/ S" x N4 j4 ^0 F5 ^
/****************************************************************************/
) p; H0 }) |6 C4 `" @% q) p/* */
v9 b- J% a8 e8 K( r' X3 m( W# d/* UART 中断初始化 */
+ i9 y/ M' g# L9 A. N; N* R' V4 }- W/* */
6 x' H7 K. m6 a' b# C# ^/****************************************************************************/2 v' W1 h' N! d- r9 C8 l) d8 F+ O
void UARTInterruptInit(void)
k! Y+ ?$ [' N{6 I2 k& }' [) p/ P k0 @
IntRegister(SYS_INT_UARTINT2, UARTIsr);
- B( U. e& g8 W4 [; c6 V IntChannelSet(SYS_INT_UARTINT2, 2);! W+ l0 y: x' L" P( y; E5 K
IntSystemEnable(SYS_INT_UARTINT2);' E% H) j- A* b3 X0 {& X4 y
( ?" A% g) V# `
// 使能中断- {8 M2 ~0 }* Y; w+ b
unsigned int intFlags = 0;
2 y o6 i3 y# }0 F0 E intFlags |= (UART_INT_LINE_STAT | \
& V' |& @: n& g. |* ^. | UART_INT_TX_EMPTY | \
( n, b4 p9 L7 D! [$ K UART_INT_RXDATA_CTI);
/ Z* l6 J1 q* S2 P, j; u UARTIntEnable(SOC_UART_2_REGS, intFlags);
+ ?+ [) q6 V- [9 z( G, V9 R- ]8 n}
8 m: R% ]! p0 h& l+ T' L+ z1 S2 X. ~& A
/****************************************************************************/
4 {! C& f% T7 I" O" W8 l, K/* */6 F' \+ @0 E" q: _- C- r
/* UART 中断服务函数 */5 e4 x, N# d3 c. Q1 d; B. g# [$ M
/* */ M5 D8 z$ B2 t
/****************************************************************************/( [8 V2 U7 }% U' \
void UARTIsr(), @$ d! B1 B @2 C# A$ D. }% q" H8 M
{
7 c5 i8 e2 ^+ h" x" x+ `4 \2 `2 w( m static unsigned int length = sizeof(txArray);; @, T0 f' Q3 t: C N7 [+ c
static unsigned int count = 0;1 X4 n* Y/ j4 v6 o7 C% W
unsigned char rxData = 0;
& a o$ Z0 n5 R8 u5 V, I' d/ { unsigned int int_id = 0;! V ^6 c" e% c6 d! W
$ z* R- b4 k, ~ // 确定中断源, ^2 V& s8 T2 l0 L: v
int_id = UARTIntStatus(SOC_UART_2_REGS);1 z$ H3 @$ _4 S8 [9 K6 c8 W8 R: g
/ U! V3 C1 y% T3 q: c7 p // 清除 UART2 系统中断
- Q! i+ x; C( N% @! C IntSystemStatusClear(SYS_INT_UARTINT2);
3 f" l3 p$ ~) }& l! w
: S2 V H U- ~ // 发送中断
. F9 ^0 y: B7 H5 k5 f if(UART_INTID_TX_EMPTY == int_id)
! E* R$ b: B C0 q- @& D1 ]# `& _. Z {( r: a5 H/ G" ^/ L/ c% T% f
if(0 < length)
' r: c0 B1 n# y' C3 B; N {& i6 O0 l5 l' t9 d6 `- x! {
// 写一个字节到 THR
1 v% m& s {8 g. F; m; h" _5 N UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
1 l6 S0 F7 n: E) G, h- H length--;
+ x" {* `% i+ ]6 j2 k count++;
* ?8 N0 @- v/ u# H) ?* a( z }" N# @6 v0 l" C; t- }
if(0 == length)
3 q; w7 O, V* h" R {- B( B/ Q# W& v
// 禁用发送中断8 H1 L; W, x5 i/ X" S
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);2 U& \& W6 J5 {0 R; Z
}
2 H5 `5 l2 {. g! L1 y% ^ }
' L9 _0 e$ z7 j% ]5 w, F
- f4 U7 R% `" U" g! C% w // 接收中断& P( C$ | w; D, v$ K; i' V! q0 [
if(UART_INTID_RX_DATA == int_id)
' ~" f+ C* Q# V+ h2 e {
' j: h+ w( X6 ?$ }) [ rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
# c. L' D8 t4 n$ P$ ]$ f
* T' G0 l9 D2 V! k UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
( `& h9 B9 h. Z" ?. F }( O q* h+ {8 j* U1 I/ l6 y
# M. r3 W. O/ b( o6 i7 ] c // 接收错误
( }6 U7 Q7 R, j' n$ c if(UART_INTID_RX_LINE_STAT == int_id)! C; G2 K4 {0 M: J) z1 \
{- d: v3 v. {" O0 S
while(UARTRxErrorGet(SOC_UART_2_REGS))9 T$ l, `2 Z; v
{
1 S" X! K: N: H1 a* O: H( Q // 从 RBR 读一个字节
! L) e1 t9 Q) P) u UARTCharGetNonBlocking(SOC_UART_2_REGS);
1 k# D: O- t$ W) c) ~( J5 C9 x }+ \3 m& N: f/ [% f; h2 S( p
}
& w9 t5 }0 J) @ V( _2 | - E) p! R: P9 t
return;
9 n: n2 j" s% D! P}
0 k8 f3 `: c2 b, G' Z, i" U |
|