|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。1 o$ B: D- s$ E/ \( m
7 a. p7 r C; c* {9 p
#include "TL138.h" // 创龙 TL138 开发板相关声明
3 [6 O; G. l; U/ Y4 E8 T$ z* u# _! Z: W
#include "hw_types.h" // 宏命令
1 J) J1 K- k8 g7 |. \( l4 u4 w* z* y#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器* {" i" B3 J) { l
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
& }, c9 l: O6 w& Y6 _& v9 F
9 n: G1 n/ D/ E) s/ I7 T#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明" Z4 ]9 u4 i: o* f, B3 J$ o* Y; |
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
5 t" G, ]! M( w1 z% f. @#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
# |8 m Q- o/ k; u' z6 J#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
$ A; z8 l4 y: _" H1 w5 e
5 E5 D( M7 A5 l0 a' f/****************************************************************************/
6 A: `" i* v! a$ f3 k. ~/* */
, r3 H; M8 x0 ^% r/* 宏定义 */# B W+ E' t1 C- c5 p7 K) A
/* */
8 ]. U: e- {" G( D' {, Y+ G1 G/****************************************************************************/7 F9 w' s5 j a' C
// 时钟
$ K, T* b* l( Z; B! y5 S#define SYSCLK_1_FREQ (456000000)
9 Y/ F: A2 u6 y& C2 p( a#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
9 q8 J$ n* _$ {+ g#define UART_2_FREQ (SYSCLK_2_FREQ)) r: n1 Z9 a5 g* E# ^
: }8 d" _/ |/ a$ J/ N# Y/****************************************************************************/% m. L ?! L; G- \! w5 U
/* */4 e! F( k! O" F! }) p
/* 全局变量 */
% m# F, _7 ]* e3 ?/* */
; W" \: Z# m: M3 f. _9 N1 N/****************************************************************************/
0 h$ C" u4 X2 s ichar txArray[] = "Tronlong UART2 Application......\n\r";5 f2 d9 P$ p: G0 v9 T) G3 c: Q! ]
; b1 I' z1 d0 I9 X
/****************************************************************************/
( G" \/ t! A/ Y+ J9 i: ?2 z/* */
3 x; R1 q) e6 b" P$ `6 Q/* 函数声明 */
# v i8 h5 b g1 P/ a/* */4 {) r6 m2 s% C$ A7 m) Y
/****************************************************************************/
9 q/ v# R- ?# c3 w/ t1 ]/ f// 外设使能配置, @& x1 J) H, Y. C! D7 W
void PSCInit(void);
: p/ L. \' P" R! n4 I5 S2 d
/ P* k) q) a7 V1 \// GPIO 管脚复用配置, C/ }6 j. L, A/ O3 B! k6 k' U
void GPIOBankPinMuxSet();
. i8 q# L+ p( x* |" R' T+ f
2 R9 e1 G& M9 u. S; X// UART 初始化
- V6 U1 J- f! a. Cvoid UARTInit(void);$ g# }4 A& ?/ N, N
// ARM 中断初始化
}2 s, h/ c* v& q$ nvoid InterruptInit(void);" }# ^9 W$ v. H+ [8 [8 i
// UART 中断初始化
! U1 I/ h+ \7 N* s) t. V* r8 Avoid UARTInterruptInit();# v6 \; ^ a M4 H. i
// UART 中断服务函数 |0 [6 D9 q7 X+ C/ [- d( H9 ]$ T
void UARTIsr(void);
* |+ |: B- h$ l
' y# b) V, i; j! p" X; h$ b6 _/****************************************************************************/
7 g8 ^) k( }$ [% _) X/* */
: V* g# Q! J4 A y1 k0 r5 i# D3 v4 g/* 主函数 */" c( q* I. F/ @/ h V2 c% ?
/* */3 Z4 W+ m" e: Z
/****************************************************************************/
& Y: Z+ @6 L- L& dint main(void)- N+ ?* o0 q% R
{% e5 s0 V) k$ k1 S: y+ k
// 外设使能配置5 l: O* N4 k8 c3 t0 c$ B
PSCInit();
/ g$ Z; C$ j0 { / F9 B! C6 w" w9 x# N( B
// GPIO 管脚复用配置
) o2 R7 f# r( Z, Z4 S$ V# ^ GPIOBankPinMuxSet();
" X6 |# n1 x" q! G/ \5 e% T: n: [( g% I: I, |, c: p" w8 V
// ARM 中断初始化
4 I8 V* {0 K4 J* a- x, a9 Z$ w InterruptInit();; n4 k \" w7 |& w2 F
3 U: Y+ s! B, G. w2 l // UART 初始化
g+ Z6 Q: @4 w4 @# ] UARTInit();0 N9 G3 S& [) h1 r1 e; d
) B0 C; W- Q4 y! J: T( V9 P/ }$ m // UART 中断初始化' u, N! F0 {! k, z, b; y: \- w
UARTInterruptInit();# }- v6 o$ t v/ z: `3 Z N
4 r9 L, Y( O" p$ Y% R- l // 主循环, b) ]- b6 t* N: P' D
for(;;)5 C# @$ w% Q3 h3 Z# t
{ t& J5 a9 D. K/ O5 S! [
" E1 q' {6 m9 h3 j: I }; _" ~9 W5 b+ v- U6 N! Z
} _( x$ |9 q0 t. l: n) S* x
% N$ u/ Z4 T2 J. |. A/****************************************************************************/
0 L# P( K) A% A0 d/* */
% ~ H, Q4 S1 r/ ` Z/* PSC 初始化 */5 ^3 @* C0 |4 A7 A+ J1 s: V
/* */
+ h2 w0 D% l3 B! g/****************************************************************************/: k: J& f" }2 n6 ]
void PSCInit(void)
' o0 r! u# A8 A( q* D3 n& D{
0 ]9 ~! A4 S+ e // 对相应外设模块的使能也可以在 BootLoader 中完成
; [. G8 J W2 k0 z // 使能 UART2 模块: U) ~) c, a$ [0 o, y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);0 M7 `8 e- a- i8 }5 h% s
}
( F: K7 F! Q) t3 W: T8 K, D4 |2 T" s7 z5 {6 R
/****************************************************************************/" G8 q$ a( V+ G3 x" O
/* */9 s" U; L& X% i1 r; w; W
/* GPIO 管脚复用配置 */
- I3 Z* I9 f! Y: U( ` h& I/* */
5 I$ A8 K1 |% U/****************************************************************************/
7 h9 g& `3 q2 c w1 T3 Hvoid GPIOBankPinMuxSet(void)1 Y- B( E# w, D+ l2 E
{
5 O) M' t, @- I9 }7 q // UART2 禁用流控) @- f/ g1 O$ K2 R
UARTPinMuxSetup(2, FALSE);
8 X3 w3 R i, R# D}
# V4 T! J* I8 n F+ ] y g8 y+ r4 {2 @4 h. ~- `: {
/****************************************************************************/
+ K+ |& C( F; x1 a1 h/* */5 N5 N) I1 K) ]5 T O$ ~% G# p7 x0 V
/* ARM 中断初始化 */
, A% ~3 h4 z' c$ n0 z8 K+ m+ R/* */9 E1 O/ v* b5 m( j9 |8 e4 }$ Q! q) p
/****************************************************************************/% c2 w' Q% v7 i
void InterruptInit(void)7 `0 O% _4 `6 Z0 S5 F3 j3 S
{
7 r3 B _6 w7 o' v o, \+ r, u; v // 初始化 ARM 中断控制器
) D3 z& x9 u5 ^* D* b, \ IntAINTCInit();
- p" i% o8 @) k* k' G; _; S% j9 m0 ^3 k! p
// 使能 IRQ(CPSR)3 e/ \8 Q/ G" B ?) t# y( Y* ~* T
IntMasterIRQEnable();
) Y- U: H- j2 Z
. E% e4 i( ~ P3 c, i% \$ h8 G( D // 使能中断(AINTC GER)
/ B. v- B7 W) X, R1 @9 \0 M) \2 P IntGlobalEnable();# n4 C! ]9 l* [4 B' L
9 @8 z; ~" x$ W6 V% v2 I9 L // 使能中断(AINTC HIER)$ b% w6 R6 n4 t8 p T3 n* y' B
IntIRQEnable();" g7 l" W, a5 {/ j% Y1 v- U$ H+ |
}0 N. }% P- b1 H
- p+ W8 G9 r9 C; D
/****************************************************************************/
1 h8 y" b& i8 u/* */4 g) z5 {# w% @7 f$ B% J
/* UART 初始化 */* P4 o j7 y. b9 _- N) @
/* */
# C4 @' X" I4 S2 V9 V! |' V/****************************************************************************/
3 k, E6 _1 N3 q1 p4 U) f" ^void UARTInit(void)7 B* _2 j- U( T# z( G6 e! Z
{
% b8 H( J2 {9 F# c0 a$ T8 } // 配置 UART2 参数
7 f0 F$ B" D- J! E // 波特率 115200 数据位 8 停止位 1 无校验位
; e( h! F. y5 c7 ? m# G4 s) Q UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
8 X" ]/ ~; }& @# {8 I) H1 I. D, A UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);7 I1 w9 w, _ L! E
// 使能 UART2
8 r j: ?* E/ Z/ @' ~, M! d% N UARTEnable(SOC_UART_2_REGS);
: l* D( E/ h/ K" [5 o5 F
, Q, {4 u/ d x( D& Z. t; l // 使能接收 / 发送 FIFO
, `1 H7 b; ^/ `4 } UARTFIFOEnable(SOC_UART_2_REGS);1 @0 R# B# n( c: V; G9 r
: C; G( Z: M* }& \ // 设置 FIFO 级别
* q, e6 M9 F- g. V5 Z( `3 ] UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);' N9 y' J4 }& H3 P3 m7 Q3 `* U
}
2 A$ r" H/ g' x& a2 f, i3 T, ?
/****************************************************************************/
2 T" Y7 S9 P0 S0 z6 y/ J; r6 l/* */
# h8 e& o% S# N) R6 L1 N. h6 Y/* UART 中断初始化 */
' R. U. s, M( E; y( Y6 ~. k/* */
7 p F" o0 R7 B2 z; V1 h! a/****************************************************************************/$ }. G$ b& M* v. |4 r
void UARTInterruptInit(void)( R) t; ]# `( u9 N# E
{
6 s& F) B2 v7 y" V5 Q IntRegister(SYS_INT_UARTINT2, UARTIsr);% t% [# M; b- B o1 }8 E" J
IntChannelSet(SYS_INT_UARTINT2, 2);4 X: d' }; T6 I1 f3 k/ f5 k, p9 Z8 c
IntSystemEnable(SYS_INT_UARTINT2);, A E, G' M/ Q+ d
7 l! R3 S( z+ {7 W$ ? // 使能中断
/ K& d( v" k( |/ {5 B6 L8 C unsigned int intFlags = 0;
) j6 Q/ U5 b* u9 g& U intFlags |= (UART_INT_LINE_STAT | \' _- E6 x6 o* _/ P% c
UART_INT_TX_EMPTY | \9 w) k9 Q! X1 j+ A4 B1 j. q
UART_INT_RXDATA_CTI);
2 r; i2 n7 @) a* h/ w& A UARTIntEnable(SOC_UART_2_REGS, intFlags);
! ~2 ^4 X. G* k+ J# S* o}2 V) S) T- d/ J& W& R- a! g
5 \. @" h6 ^8 k& D& y6 H( z
/****************************************************************************/
; ]& E$ ~$ Z1 b) _7 p3 V* D/* */
" [0 D( ?0 k0 r$ t/* UART 中断服务函数 */' G1 }: w7 Q Y$ W7 J
/* */
; U( O( u4 a2 j- ?7 J$ B/****************************************************************************/
0 o7 V: y L3 m; d5 g; {+ s6 `void UARTIsr()7 T; ]. q4 x8 W9 ~8 z8 @ V! g
{
6 ?0 L# p% J- K) {0 ?# y D static unsigned int length = sizeof(txArray);
( G" i/ n$ A( I4 `! Z8 U M+ g static unsigned int count = 0;" z4 B8 I1 Y3 ^) ^2 h; i" i) m4 h
unsigned char rxData = 0;
5 U) j2 `; ` @) z$ e& r5 | unsigned int int_id = 0;
. ?! h4 i- h4 B9 o) x! D" O
- M% {, Y$ J0 d6 y/ C: J+ z+ a // 确定中断源
@6 N+ `# l8 N: B0 P3 F* a0 K2 a int_id = UARTIntStatus(SOC_UART_2_REGS);1 R U3 B7 x. t* x3 i [
/ X" h/ {: M5 \8 d0 H( Q // 清除 UART2 系统中断& p! j5 J$ Q; e
IntSystemStatusClear(SYS_INT_UARTINT2);
- a7 r) K1 x# N d2 R- o2 B4 X: {0 c& F" T# |
// 发送中断% k$ \2 M) n% z7 O( g
if(UART_INTID_TX_EMPTY == int_id)8 O4 P) G; y3 N. t
{, \# w# V" t* F, s
if(0 < length)
/ s2 J/ a0 w8 Q, A {
/ u. \" e- v4 O- G& I, Z$ X1 L. d, D // 写一个字节到 THR
' E& Q' @& T# Q' p UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);; Y# w$ J9 U5 W7 G/ C0 y
length--;2 \: b: c! }; ~* w4 L- |
count++;
$ i& M, q; A, b B- R2 n# G }4 X5 u% f- R* Z# J% \+ N$ k
if(0 == length)# W4 V- q3 k/ S4 ]
{
# u. M @0 x2 D% ]+ s: p // 禁用发送中断9 G3 G1 w/ E8 T A; n/ m' `, A
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);: X* S5 k& {8 I' h( B' y5 r$ E
}
3 @( D- `7 `' W) Q' n0 m9 F }
1 R1 m9 {! P. V2 W* \
8 |. g2 R7 R0 C* ^ // 接收中断
& q. `2 O6 y/ s/ i if(UART_INTID_RX_DATA == int_id)+ ^, v% @0 ^5 G2 L
{
5 h( h, S; L7 { rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);1 h' t k* L' M/ E
2 \) B( n) T B4 m. h# T UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);5 f2 X2 S! p% A% M7 D
}
. P2 L8 G, V7 S$ @3 q: {) [! @* _6 M5 g, R/ b, }3 g& ?
// 接收错误; l) e9 L; y) y4 C, p
if(UART_INTID_RX_LINE_STAT == int_id)
2 c3 U' Q, J& f; h% y; w; |5 Z- v {
9 \. i1 L7 {' \# \ x1 U while(UARTRxErrorGet(SOC_UART_2_REGS))
' ]$ m" j9 L; Y1 r; ^" v {
* V5 G! E* X$ o. v, n9 F& R& c // 从 RBR 读一个字节* R }- v4 @( |8 ?/ e2 O2 u
UARTCharGetNonBlocking(SOC_UART_2_REGS);
* h [ T3 y! q# c; g% l }& X& d1 ^& z; E6 S, k! g
}
, ` `* f+ h/ {2 A 3 l: p( S+ R; M. a
return;8 t" _" { z3 t* D
}
+ P2 g: J$ v4 j; _. j |
|