|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。
n/ |. a% B0 j0 y; e* z* ^) H3 E' K/ d4 v8 G. m0 y
#include "TL138.h" // 创龙 TL138 开发板相关声明0 `8 U: d5 X2 P- q1 q. C, v; L1 O1 E
; M( \9 o5 t. O {/ [/ W
#include "hw_types.h" // 宏命令
4 Q0 ?! x2 E/ M8 L; r#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器, y6 R& }% Y% |+ O
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器+ K5 \$ x' ?7 k
! y) s* e; }1 X
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
2 }2 q |& r ~8 l#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明# n. v/ R; w) i1 T1 z
#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
! P9 K- d7 M3 P) M2 z% F3 s2 A#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义( t' y& M3 w3 G2 F
! E& K2 x0 i2 T
/****************************************************************************/: y6 S, _; |+ s! C' n
/* */0 _" ~3 B; _! A: J5 t7 C
/* 宏定义 */
6 Y9 w2 b8 T* D( _+ @& p/* */
1 E3 {2 q# e! E/ y: _* A7 r/****************************************************************************/3 ?6 R# R, e9 q Z! A0 j5 [! E5 d
// 时钟6 p" x0 q# w) y- X+ Z$ s- R
#define SYSCLK_1_FREQ (456000000)
9 T/ \# y( \# N# t% F ~#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
! h( y# W0 m+ X1 c#define UART_2_FREQ (SYSCLK_2_FREQ)
4 n: c& Z3 [8 e% W: j9 U8 z( U
6 `+ ~/ o2 v6 q1 L% \$ G( T/****************************************************************************/
& J Q) d9 w1 j/* */
& f3 l) ]0 D( e* r- D/* 全局变量 */
; i+ z0 {, @4 b3 X8 f X/* */' Y. b# E6 I3 H& P: x& N" ~
/****************************************************************************/
4 @9 R6 G2 k5 o: z7 I) q, lchar txArray[] = "Tronlong UART2 Application......\n\r";( v# R% w( h5 _; z4 n! y3 B
+ |$ ^% v3 [: Y1 }5 f# r
/****************************************************************************/1 }: | j! I! O
/* */7 d; O3 ]) E8 }
/* 函数声明 */0 [7 H; ~: s3 |+ H. {3 x9 u
/* */
7 [* y& X) d; J4 N+ G& Y/****************************************************************************/
0 T: B/ A' O& t+ T5 {// 外设使能配置
7 r, g- f7 `% E; x, F4 g4 J2 |; `' ]void PSCInit(void);
2 j% V/ y, H0 r1 f/ ?( k/ m+ x1 m) {
/ ]' Y& Z0 F* B4 p. r' M// GPIO 管脚复用配置
6 ]& P% v" q' R* k6 X, P$ [void GPIOBankPinMuxSet();
* W, s7 a5 ?5 e8 S$ b1 _! G
( F+ m1 u2 _7 i! A// UART 初始化
, x* A' [* @- ^/ K5 x' svoid UARTInit(void);
5 I" ~' s" K% F7 w// ARM 中断初始化
8 M) ?1 u9 E! X) M) t2 N* r# v6 Ovoid InterruptInit(void);' L3 S7 C" o$ S ^6 R0 W6 e
// UART 中断初始化2 Q) k9 W5 z( c: t4 Y1 y8 m% U* e
void UARTInterruptInit();1 a: I6 u* f' T. x- e
// UART 中断服务函数
/ A- D2 j" t2 G. U( d0 s3 Uvoid UARTIsr(void);
1 }: R# n. L6 H! h$ d: u
) V( i# B# U# B8 I% G9 I# p/****************************************************************************/
0 k" K3 _) W. E" \& Y/* */& Q" Q( _3 W0 a+ p2 Z! k% Y
/* 主函数 */; S# U7 x& ~ |( ~
/* */
3 r& c' ^. x# f( P* C& l- j% B/****************************************************************************/+ r# t/ F5 q c
int main(void)# o) Z0 @0 N. s4 r5 k
{
( K3 W* z8 s' @ // 外设使能配置
5 R" V( u. Q% F$ F PSCInit();
1 l: o6 g$ b& Z: J
% J& D3 T( ?! j3 m. h. Z. f // GPIO 管脚复用配置/ c. j! ^) W1 Y+ ^! q9 W2 y
GPIOBankPinMuxSet();
) F8 p9 d1 d" |3 n- W& j4 m% }9 t
// ARM 中断初始化
; P/ [$ W) ?, i: h7 ~ InterruptInit();
: f/ Z. Y0 ]* f5 ]
6 N @) _! @* S5 z. Y$ j! m$ K V // UART 初始化, L" W7 W/ ?* u
UARTInit();
3 Q% l" z' W, a) ?! t3 A. t! E8 \6 R9 f4 L. r" o
// UART 中断初始化' U8 r6 a) m1 g& I
UARTInterruptInit();
/ D( x% V. m/ S+ b2 q3 j( X2 G9 {8 m
// 主循环" f8 `& q" g b# E, X" U
for(;;)5 n( J4 t: R) D W) m! H. Q
{8 {( U" [# m) ~4 j9 d
6 a% V3 y1 o* ^2 n$ u }
5 V& T9 c2 c0 E( v8 o$ Z3 ^}! B& J) B. \6 o2 `. r4 O9 ^: k
* r; S _% i* S1 Y
/****************************************************************************/
$ o% J9 w+ C- F4 f9 ~' J6 a4 O; x/* */, s- e9 ?" M- X
/* PSC 初始化 */
: \' w5 E9 Y! _3 m; g6 R/* */
0 Y4 }( y' Y5 M, a/ h z9 x. E( D3 z/****************************************************************************/
9 j) M6 C" F7 gvoid PSCInit(void), k7 Z q- y, u
{
% G1 E) A- }1 F // 对相应外设模块的使能也可以在 BootLoader 中完成* `7 g' D1 C' U/ _: m G% P/ b
// 使能 UART2 模块
- k! a! x8 E* s" v, e/ f" [ M PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);6 {4 O9 I& y2 a1 Y' Y
}
- \* x' k. H! X2 c) ~
# g% F" F) _0 C! S3 q I) r# Z6 i0 l/****************************************************************************/
4 ?* f- I3 |! g6 C1 k& H. b/* */( H7 Q8 w8 Q! v9 D) [( l
/* GPIO 管脚复用配置 */
+ N( w5 Y0 j0 {# u% M& K+ m/* */
% ^3 w: v U4 U6 t: h9 s4 g/ K/****************************************************************************/
1 H' B3 k$ @& `9 F1 {; Q. u) V5 Lvoid GPIOBankPinMuxSet(void)# \8 m- z% n5 I; b- D/ F1 i3 Q
{
) W" {; Z1 k2 V! i // UART2 禁用流控
2 l9 A7 s8 w" T+ `- Y8 c8 d UARTPinMuxSetup(2, FALSE);
; h, Z/ `- I+ Y, R6 [}
+ g' W, l' S' C7 K/ v$ X3 `0 j2 Z/ J7 O) E6 P1 {
/****************************************************************************/5 k# o0 \3 F8 X3 d
/* */
3 ]) Y( @6 e! U. C/* ARM 中断初始化 */6 F% R6 o* Z% V9 ^ Z P3 ~/ i
/* */
- B" t# n6 }1 l/****************************************************************************/
9 X/ u r- C$ F: c% Hvoid InterruptInit(void)
) ?# h7 l* n0 I. I! u" X E7 ~{' O0 ^! K/ g/ q2 K$ n# ? P$ F
// 初始化 ARM 中断控制器
" m: P7 |2 g6 I3 s3 v: n IntAINTCInit();# s) i8 Q {$ ]" A8 @8 {
' v7 I% {: c9 q9 u; k# O$ W
// 使能 IRQ(CPSR), q% a" a! m, S& y+ J C8 p
IntMasterIRQEnable();0 O2 e8 d' L$ z6 f
3 Z, U' c- u/ G9 c8 m- z
// 使能中断(AINTC GER)
; w! @9 L/ C0 R4 z1 q) e& ` IntGlobalEnable();
D; _8 | i8 j
, ^7 v) C( E, z1 p' D: ^: N // 使能中断(AINTC HIER)2 c, Z" p% V8 B+ ~. ~
IntIRQEnable();! v/ v% ^) e, {9 X
}( N' y [; |2 l' A- D
# ~& }- d& U; d% g- A5 N7 T' n
/****************************************************************************/
) R* ^* K; N. Z% i+ p/ {! W/* */
6 O; u6 Y5 D7 O3 \* M! @; I/* UART 初始化 */
& S0 N/ s k+ L$ P/* */6 Y! Z% U+ t6 c) e3 o) Q4 B
/****************************************************************************/( ^& n T1 ?" W$ U8 n2 P4 a
void UARTInit(void)( L6 P" ?; y+ u5 m# }2 ~2 `5 L
{5 F# l; x* Z" Y1 \' [" l
// 配置 UART2 参数# z" d8 F/ c( G% O! a! q
// 波特率 115200 数据位 8 停止位 1 无校验位
& ~# w A. d# {/ e8 L UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
; H; u( k1 k0 w7 d) k9 w4 @ UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
9 I2 J7 W' e8 a( {1 \ // 使能 UART23 {$ W- S' y I( w+ h- X
UARTEnable(SOC_UART_2_REGS);' q k/ t* C% Z
* H; ]3 {& k2 T E# f
// 使能接收 / 发送 FIFO
6 ?2 ]- i1 g0 ?, d8 [ UARTFIFOEnable(SOC_UART_2_REGS);
. L) q2 O, a7 e' P$ @
, s' X. @$ [) H4 j) W // 设置 FIFO 级别
; P( Q/ G6 H9 |' h9 ^ UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
1 N) ]3 @. ^% ^& Q}, l' y; f$ O8 C% m* g. I2 Y
; e4 j' k- P0 R0 m, b/****************************************************************************/
* x8 v/ J" ?; c3 l1 G% q/* */
' R; x& X5 }- _7 B, D" [& R" j/* UART 中断初始化 */
' a! R5 b# H' W/* */% _+ a3 o) x* `+ j
/****************************************************************************/3 F& i: A3 n: i2 l1 \
void UARTInterruptInit(void)# N; p5 @" g4 W. j' [; p( e1 f5 t- e
{
4 F6 n/ l* d" E, ~6 I IntRegister(SYS_INT_UARTINT2, UARTIsr);& U1 c2 ?/ U9 P0 p
IntChannelSet(SYS_INT_UARTINT2, 2);7 d* H& b+ t5 z/ m; G
IntSystemEnable(SYS_INT_UARTINT2);
# U1 t; J! Q* A5 `4 W) _+ {6 s0 @+ f) L# P) e$ N$ x# E
// 使能中断
% S4 X' Z P! Z N. Q unsigned int intFlags = 0;
: V; l, Q- e* T9 t intFlags |= (UART_INT_LINE_STAT | \
4 X' f! p8 z/ P UART_INT_TX_EMPTY | \
5 v+ E1 Z3 [% @+ h$ B UART_INT_RXDATA_CTI);
0 ?+ E4 |0 U& y3 p c3 ^ UARTIntEnable(SOC_UART_2_REGS, intFlags);
0 W' i2 H% h+ v5 x }% u}
. }& c& _/ j" j8 K
" g( w& q+ u5 V: ]: v: `* e/****************************************************************************/
0 b. g9 z% S. T8 q# s9 \. o! A/* */$ M( y$ Z) E/ Z/ s! @- z5 ?
/* UART 中断服务函数 */
( G2 T0 J5 @* K& V$ |/* */
8 Y1 u/ @1 ^9 F5 L- C/****************************************************************************/
" E& y/ S) x: E5 x3 w! @. O c- {& tvoid UARTIsr()3 c9 H- H0 w, y) N6 X# h
{
* @0 i2 [$ v. ^* u static unsigned int length = sizeof(txArray);
3 A! R3 X2 Q! A( G" C* B static unsigned int count = 0;4 J4 G! N: f$ {: W
unsigned char rxData = 0;
a! u( g1 h$ n2 e2 Z unsigned int int_id = 0;, {6 [, ]# `9 {0 _+ S) l" d
# s1 K; S) p* v8 {& s
// 确定中断源8 k9 r+ Q& Q& A4 W0 I( j
int_id = UARTIntStatus(SOC_UART_2_REGS);
* B( n# ^$ R' E2 a- H; J# ?/ H6 s( I3 c
// 清除 UART2 系统中断$ B! c8 |1 ^) k4 U5 H9 r' H, {% r
IntSystemStatusClear(SYS_INT_UARTINT2);
# t( @: P" ]* _2 [: J- `" j5 N# U Z s4 ^/ p
// 发送中断
; W( F$ u! d5 B* e+ P if(UART_INTID_TX_EMPTY == int_id)
/ T E; @. G" E. E X5 T, c {( F" T$ O, H" D
if(0 < length)' Z7 b3 T# [& S
{
$ B' H" y% V( ?$ ? // 写一个字节到 THR
# _* J' m! t) q! _8 e UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
, }. b% i. i' ~! c4 E x length--;$ ?, g- y G Z9 m$ I7 G5 J. d2 \
count++;
3 L: g- [% q4 t$ O! M+ I }+ p! @5 ]4 q, F( ~ `
if(0 == length): a4 |+ J( D: F% p; d9 d! [5 v
{3 Q4 U% t/ F8 w" Y8 t5 a
// 禁用发送中断
" B6 z2 x0 c% C" M' S- ` UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);. [5 P( O9 V' a j% S" k
}
( f H* a2 M6 k5 z }
8 j" B' j- H( o5 z+ k" ^5 I" c4 f5 y" Y
// 接收中断
2 P) G% u. G" I& T if(UART_INTID_RX_DATA == int_id)6 s1 s1 Y: [6 v9 H' R
{
; q, o2 i& l, C$ S* l8 n rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
! R2 V# W7 i/ a/ e9 B% |) W6 h+ S
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);; y; k- m# z7 m5 \
}
; F$ {; `0 l3 j$ E- B
+ u( H) K. O5 x, |* s4 u // 接收错误
9 V! N. F) X5 _3 `8 e if(UART_INTID_RX_LINE_STAT == int_id)
' j% r- Z5 W' N( @% L H. h- { {! @( K* V5 ^/ E- a- Y/ S# C
while(UARTRxErrorGet(SOC_UART_2_REGS))- Y6 g3 F, k4 m* G: Z q/ f
{
1 J; m q- k! ~" o) d, Z9 S // 从 RBR 读一个字节, }* q1 M( j# T
UARTCharGetNonBlocking(SOC_UART_2_REGS);* [+ U7 W; C/ i+ ^
}( k& D2 o2 c( ?; v7 s9 x
}- Z5 Y* J" F' @( ? b' k
9 W- b. J3 w( R5 J5 P' |# I return;* H, c% k7 v4 @: X+ u2 S& p
}
1 {8 B R7 ^! C |
|