|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。" H. @; @$ P0 C! e. y% f
$ x R9 s6 K( J7 m
#include "TL138.h" // 创龙 TL138 开发板相关声明
5 {9 ^0 |" i) r; Z
$ S8 r( u$ u* v3 i2 _5 V#include "hw_types.h" // 宏命令
* k9 j& f8 \5 G! f" _' D& @#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器( h7 u" Z9 [7 E1 C7 i
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器' S; z2 N& A! f1 o: _
( |# V# Y# Y; D* e
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明7 `" I. m9 z2 _* ?) _
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
# \3 r) p. g) d: h# p( x. P s& d#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
! z0 g$ }* t# z4 v" N4 U#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义$ C& l% e# }2 s2 V: P
( B$ \2 @: Q* `* j/****************************************************************************/
: Y5 P) q6 B/ M4 N/ |5 D/* */
( U- q9 k5 A) K8 ^( q1 F$ N2 M% O7 A/* 宏定义 */
3 E8 S* I2 U, l# Z$ N Q7 z/* */6 e0 u8 H' Y5 q$ b6 _, Q% A" `2 h% O
/****************************************************************************/
1 C, C c$ {" b1 F; f3 W) G// 时钟5 I; s& s. b. Y" f
#define SYSCLK_1_FREQ (456000000)
, f8 i- x, k: K2 b# R; m9 Z#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)8 w+ b' N; _- Z' c
#define UART_2_FREQ (SYSCLK_2_FREQ)/ e+ q- s, Z. `* u4 j1 a: n
& v0 p) h: g! R' X* s2 ~# Q
/****************************************************************************/
" b. L. N9 @# M) }- v" U* S5 l/* */$ d# h8 Y% U4 X3 f) l
/* 全局变量 */1 B$ e2 r2 a& I5 [8 Q
/* */
$ a) p4 X( P6 S% t' S6 o4 r/****************************************************************************/
( B8 s6 R7 `! d" @' ichar txArray[] = "Tronlong UART2 Application......\n\r";
+ o) V+ i1 U7 O3 z( x
5 u; |" S i6 Z- ?/****************************************************************************/4 X& _8 a' U7 V. o& J
/* */
; U3 K3 s+ ^# Z/ A: f9 a" M/* 函数声明 */0 N+ Z. t0 Y+ q* ~( o2 `
/* */0 w% M c5 |% E% I( _( O, R
/****************************************************************************/
. M. J4 q7 K8 I1 r/ Z9 T5 R' ^3 F// 外设使能配置
( e1 p" s9 F) j# J. f0 o7 qvoid PSCInit(void); G2 k$ r: N" U* l$ W0 `' t
; w! y$ E2 O7 b* v# [# E" A- n7 [// GPIO 管脚复用配置6 _# _+ \# j+ F. d: Z" `! X3 }
void GPIOBankPinMuxSet();; U7 e4 B3 ?- h+ E
1 _7 t( Q* p; Q6 S5 e4 M7 k9 i. q
// UART 初始化
" ]6 W9 v: j2 V3 K T9 @2 z3 @+ ?void UARTInit(void);
! Q# o& d) j _& H6 ~0 v// ARM 中断初始化5 e* @' b9 E8 T
void InterruptInit(void);
6 s H4 V" k3 f9 y( O8 Y$ J2 E. U// UART 中断初始化
& ?6 H5 s: J9 ?! v0 O5 d( `void UARTInterruptInit();5 S7 C: b) t8 l9 ~
// UART 中断服务函数' ?! K2 S C. M) Q/ F7 p/ [4 N
void UARTIsr(void);$ c4 k' J+ N) i) B
9 P( }" J% ^- K3 t) Y% y1 X/****************************************************************************/" |" h" |" V+ J( T# F6 q
/* */
. W, j \2 ~+ P' K: P+ o/* 主函数 */( F5 `. W0 ?/ @. C% J% g1 d
/* */
7 p" A& j6 [# W) j/****************************************************************************/, u9 u. s" e* j# g2 Y# k: k
int main(void)
# h1 T# c. k) N+ _. B1 }5 L{8 M1 ~" j; G$ Y2 u4 o# d
// 外设使能配置/ ]. g( n( n1 m M. l& \
PSCInit();
5 g+ Z |8 Q# y, N O7 E5 e% b7 _/ J! D* B; |
// GPIO 管脚复用配置+ r; ^/ L o4 p' U. r7 B K. ^4 M2 {4 ]
GPIOBankPinMuxSet();. W1 j _' ]1 }/ C( _: k7 @1 Q
! c) N7 ]0 ` {+ Q" _* j- h // ARM 中断初始化
9 f+ U* w. |" t6 X9 e8 R3 P# M2 n/ j InterruptInit();
+ [, y. ?- D% B! r2 U' Z5 `& ]
$ X0 M% n6 H7 j7 i // UART 初始化
0 F6 f5 N; ^: W% N4 F$ x7 J# a UARTInit();
S# V4 m% m$ J C, g2 D9 C; V9 q0 r2 N" L, f' x
// UART 中断初始化. Y: L9 R2 I/ y: w
UARTInterruptInit();
" R8 \* D6 Y* p8 Z. `
- O5 ^" [4 w6 ~- W) u8 H // 主循环& v6 k# s/ Q+ e D, y
for(;;)/ O0 u/ P" ^- e+ N% b n
{
) I: ?, R* l+ U- d. i( R- O$ l _8 v- @# Z6 a4 R
}2 M8 M! c" S0 P9 P, T
}
. W% {- N" m' i; T5 u% Z. f/ r. g" Z0 E6 k0 F4 q" C* N
/****************************************************************************/) s# q/ s! C: T) R
/* *// m8 ~: Q, u$ v- D( P
/* PSC 初始化 */
; _! |* t3 T- h2 n; m. r' y% w/* */1 E o4 Q4 t+ Q' N" k
/****************************************************************************/
8 N( P( \- { s" j! H% U3 `* Hvoid PSCInit(void)9 S) C! W: i/ R
{) R% _, J- b4 i0 k& r
// 对相应外设模块的使能也可以在 BootLoader 中完成/ n5 V j1 \- P, Z4 B
// 使能 UART2 模块# P& k5 a+ ]! M. ~( o
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
9 _6 }2 o* `" o1 [}
" P/ y8 u4 o1 @/ [: @0 }) f
_6 g* r( m0 X8 h( i/****************************************************************************/
3 f1 m) i- O0 k; g6 N( V" t6 u/* */
# S% U+ Z0 g5 R+ a/* GPIO 管脚复用配置 */
9 a6 T" Z9 u6 {& k7 ~/* *// L* j: x$ L. E9 y
/****************************************************************************/- m4 t1 y2 m4 k1 [
void GPIOBankPinMuxSet(void)( {* Z. K9 q, s' F/ s
{9 U. h# t; E u! W2 ~
// UART2 禁用流控$ I" k+ D S, z# K6 r3 B' o3 w
UARTPinMuxSetup(2, FALSE);
" X+ A$ f3 N I4 Y. |$ `3 P' d0 n}
' C' D* i R/ w- d+ m! p, v0 d" |* H( n$ p' Z/ c
/****************************************************************************/
3 N* i X% h) Z: O/* */, n4 [, T6 ~9 d3 _+ S3 H
/* ARM 中断初始化 */
% c* k) o( S1 Z& o/* */: I; E7 X7 G- Z$ D) x+ q* K
/****************************************************************************// ~& M" R( w$ }6 D9 l$ m
void InterruptInit(void)* R7 |' l$ @# b! |6 L2 M
{8 F! w) [9 O" g
// 初始化 ARM 中断控制器
' O+ A: l2 T, ?" d* ` IntAINTCInit();
( A7 Y/ |8 P* Z1 e0 T- e$ c" N3 k: i) n( z
// 使能 IRQ(CPSR)
5 ]) r; V$ F, K% Z) @% n+ n IntMasterIRQEnable();
% p3 t: {4 ^3 A; A7 a6 Y
) g, @# x: Z$ ` // 使能中断(AINTC GER)
7 ]7 j/ a+ n N' H! E; |; W/ H IntGlobalEnable();# J" ~) e6 k. t( I* ~8 e* e4 q
8 y- {5 r# ^0 ^% n3 c
// 使能中断(AINTC HIER)6 f* k% T( a3 _) B% k6 }# \; z
IntIRQEnable();
, N* ]: a+ A2 C( l1 u}; x2 J* j4 {. b4 X& u! s6 q
7 T) N# o! B8 Y
/****************************************************************************/
; W) R$ z h0 u0 e/* */1 _) m- V- E% ^2 r$ K7 `
/* UART 初始化 */
+ ~% J6 ? L v- y" v/* */
3 m0 _0 Y% ^1 D0 Q$ g) t2 e/****************************************************************************/$ f5 u& y; s4 h
void UARTInit(void)+ y! D* h) Y* X
{9 [/ I$ W$ Z) Q3 P! k/ O
// 配置 UART2 参数
& g1 B* P7 {0 p // 波特率 115200 数据位 8 停止位 1 无校验位
# X) k. o0 S8 B9 q& C( K$ y UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,! f+ `/ V. y4 r% J0 K; x
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);, S; z. U$ b& q c5 R/ `
// 使能 UART2: ~- U1 z6 b3 l) g: m M6 ~
UARTEnable(SOC_UART_2_REGS);
$ w2 \( {- \2 V7 z' k' K9 ]" E+ `7 j) B+ M
// 使能接收 / 发送 FIFO) _! V! E/ X ]" F
UARTFIFOEnable(SOC_UART_2_REGS);
6 D' [( s+ o+ M2 U/ ?
( H3 ]9 U: p" v- \7 a // 设置 FIFO 级别
& D; i* u, Q4 [. s D: @: s! k% S UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);" i/ d" f8 Z* D# R H# p! K
}
( G7 c" y- G! W; g
6 P F/ i+ A: H/ l$ l1 `! O& v/****************************************************************************/7 V9 ^0 L3 P& F4 S F `4 B+ j
/* */
3 K! k$ p( x! H r @, y) p: V/* UART 中断初始化 */
; }2 k: u) r2 h# Q. x/* */, e& G* {5 T0 U9 r7 C M
/****************************************************************************/
* w4 d. e7 I& \1 z/ r) Z% \/ N2 vvoid UARTInterruptInit(void)
' c9 n) l* h% f& c9 S{# N2 E* U5 T2 t. l# i
IntRegister(SYS_INT_UARTINT2, UARTIsr);2 v7 U2 p* x6 M+ |% x
IntChannelSet(SYS_INT_UARTINT2, 2);) q: a& R8 r; h" `
IntSystemEnable(SYS_INT_UARTINT2);
) I& V+ t: ]& t. _7 S& F$ U& B& E7 _
// 使能中断
. d$ U% M8 h6 Z3 l unsigned int intFlags = 0;' r. v, X# t# V# m# H L5 K
intFlags |= (UART_INT_LINE_STAT | \
9 Y$ W/ u/ j% T0 m* P; L4 b. z2 v UART_INT_TX_EMPTY | \$ h, {) k- C) V- k3 ^+ u
UART_INT_RXDATA_CTI);* }. Y. x3 X- I/ B/ S3 X( i: _, a$ F
UARTIntEnable(SOC_UART_2_REGS, intFlags);
T5 A% t9 m* w/ g- C}0 m; z& }1 }9 k2 _
) ^0 G2 |% p3 z' U4 V4 x# G6 Y+ ?
/****************************************************************************/2 L4 s* Z* g& x, @5 H& T
/* */: ^, _! n2 U, v% U r
/* UART 中断服务函数 */9 d, h, R: B; y% w
/* */$ S2 o7 M6 f) ~
/****************************************************************************/
3 U. _& s. A, ~void UARTIsr()
4 p" b: i5 L9 q& ^9 H{
3 J8 _% u; P1 y' F5 G4 G; Q5 m static unsigned int length = sizeof(txArray);
1 i& V. `+ p& W1 \. [ static unsigned int count = 0;0 o; ~8 Z% O4 k% h* I% |' I
unsigned char rxData = 0;6 o3 ~ W/ G {
unsigned int int_id = 0;
7 c( k- ~& K: I9 G! o# m) k* q0 {/ z" k3 b r2 v% L
// 确定中断源
8 n7 j$ \; L2 l$ m1 } int_id = UARTIntStatus(SOC_UART_2_REGS);) ]: Y' D0 R4 d* H% [+ _
2 F$ J7 e \" }
// 清除 UART2 系统中断
1 {; q5 T! ?' n0 r8 q IntSystemStatusClear(SYS_INT_UARTINT2);
+ T7 K; o1 [5 j6 d: L) u5 M3 ~: G7 V, x/ C8 B+ R& q6 U/ L
// 发送中断
$ j5 H& F+ l5 Z* T9 q+ k if(UART_INTID_TX_EMPTY == int_id)
% r) P' p, L& P, Q3 u! A3 Q) J {& @9 ]* L1 S2 ^$ N5 R
if(0 < length)
: i, _& z' d/ ?/ H% Y' t* e {
% |- A4 o! Q; C7 O6 w. U // 写一个字节到 THR
6 Q, p) h4 g7 _' U UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
2 K8 j# D: |% Y+ A length--;0 b3 R: x* H d k; Q6 P( Z( P* d9 p
count++;- U, a0 ^# [3 y4 B
}( ?) J" `- q% s' }
if(0 == length)" ?# L# @0 _$ Y2 _& v
{
6 k! {/ P: B$ Q5 {9 ~8 a3 e // 禁用发送中断" K2 E1 @8 L8 S1 [0 R: o+ [
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
& \; i& r/ X2 \+ C. ] }
2 ` e3 D1 ?+ ]- v& e+ r } P4 |2 W0 c5 |: r# x
( B N6 z# u- M4 O, Z# ]4 z
// 接收中断* J( i. l O6 L2 |
if(UART_INTID_RX_DATA == int_id)3 W, U% Y4 ^2 Y5 T7 [; ~+ b$ b
{9 m6 T* Z) f* g+ T1 P% `
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
, ?) e4 f v! y8 U7 [4 b/ L4 c% F1 R5 L% l3 b
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
# k/ Q& c" s+ R& n }
* p$ t. R- W! ~- V' o
! N! @7 J* ~; ^9 ^. H // 接收错误, q/ x3 N5 m9 V5 l2 j" v
if(UART_INTID_RX_LINE_STAT == int_id)3 y* q& O6 W# f2 O2 H3 t$ a3 R8 G
{
+ l. n% r; z! } while(UARTRxErrorGet(SOC_UART_2_REGS))
2 u' D" y: s5 o5 _3 N' |: A8 E {1 B# X7 ~- u) H& ?# A: N
// 从 RBR 读一个字节3 I; s: g% o% ^; H2 g& o
UARTCharGetNonBlocking(SOC_UART_2_REGS);) b/ y: |* N) x P' d* Q
}& ~4 P& p$ ]6 G8 U; U Y! L$ T
}
. V% T/ z$ Y, h: y, J+ i
2 j: h$ W( R9 c; p! U' Z8 s return;& I# y, Q' ?) p
}
% r/ G/ A! J5 F' P1 o |
|