|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。% D# M1 l$ |2 b# e4 r
+ V- M/ M* M8 o% s% v+ W; w
#include "TL138.h" // 创龙 TL138 开发板相关声明5 j, r4 v3 E* c) R9 z6 t% \
6 |4 p/ j7 H, b' L
#include "hw_types.h" // 宏命令
$ R/ H3 ]+ C) D E#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器% e! ~! ~3 \- K; @* A( O5 f
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器0 r0 |% J1 `' f0 i" \, f* ~, [* Z
7 x* D+ I' i, _* j9 Z9 h& ]
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明( w( X: ^( f/ t* ~; U! y# A
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
3 E" H: B6 Z6 v#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
2 ?0 p/ A t `$ p#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义/ S7 X* O" p( |) J3 O- x: `6 i
1 m, h0 C2 F+ R% t. V
/****************************************************************************/, q6 J; f5 o u2 @* j' f
/* */6 H+ S' [( k6 ]
/* 宏定义 */
% g0 b* v* q' b+ S" X/* */
& ~6 n- H( M6 g6 j$ ~) P" i A" f5 ~/****************************************************************************/
& X" n+ f' |3 p1 l3 r! Y// 时钟
% W9 z; L; v' Z" D+ h7 g#define SYSCLK_1_FREQ (456000000)
& u3 z- }" N4 \; `8 l9 }#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)! `% H0 h9 K/ W A, c( p! G
#define UART_2_FREQ (SYSCLK_2_FREQ)0 n- t4 e7 C3 h- L J
' y e ~+ E% e8 [+ Z; x# J/****************************************************************************/( {/ \7 I( [- Z" l! V
/* */( u w+ @6 J- y( |
/* 全局变量 */- w2 Y/ ^# f! K7 F& x. q; I
/* */8 j; e5 x K7 P- J
/****************************************************************************/
' P( z! r5 d5 R1 }char txArray[] = "Tronlong UART2 Application......\n\r";# y- N5 k# a* N( O, i' q
9 k* V6 [$ O0 x* m& j: T
/****************************************************************************/
+ ~9 i) E- b7 L' S7 m7 H; N/* */5 Q S$ q0 }/ H; Y2 ?. x& e
/* 函数声明 */
! e# r+ W9 z- ` j/* */% ~, `- l' n0 u' P8 Q. R
/****************************************************************************/: ~* S) l$ I8 y4 ?3 {7 X) I3 Z
// 外设使能配置
+ B5 h+ v$ T' z; o8 n' Qvoid PSCInit(void);' w0 w# `6 z' ^, F
3 n8 L4 V2 v) K0 t9 G& T// GPIO 管脚复用配置
, m. s8 `9 H) uvoid GPIOBankPinMuxSet();7 ]( B c' r3 ]- ~5 y
. L1 t: e7 o9 J6 Q6 X% D- I, T
// UART 初始化
4 g6 N! b. F0 Y+ q4 ]7 }void UARTInit(void);
; [, O4 v8 j+ S( I8 Q// ARM 中断初始化) L$ u H9 j) t0 S
void InterruptInit(void);% O5 t3 C! t0 G5 w9 w" R$ G; N
// UART 中断初始化
/ J2 h* \4 _5 l. kvoid UARTInterruptInit();1 a5 _: O/ a7 W# S3 O) L1 H
// UART 中断服务函数" L7 r+ t* J) w! k4 D
void UARTIsr(void);% S2 w1 k- k# ~
% l3 j5 e1 h5 ]! y7 [
/****************************************************************************/
+ M+ G; x" F$ L7 e2 O6 y8 q6 w3 f9 C5 ]/* */
, D* v; B$ {) }) A) t+ p% y/* 主函数 */% H* ~3 D9 [# i D; H9 @
/* */
; z0 Q7 L* h- C0 [- e/****************************************************************************/
, G7 n, g- {+ n! c/ A G- P0 dint main(void)' h7 \+ L/ Z( Q4 i# S! \" w: z
{
: ?- f; p/ Q; B* d' y t/ I // 外设使能配置; P" ^$ c3 L) K1 M5 K5 J2 ]
PSCInit();
- \% C* g8 B4 c! z: o ! P) r- ~+ M) W" J* I7 P9 D) Y
// GPIO 管脚复用配置
2 R: S t" A% S' }" A& V GPIOBankPinMuxSet();% Q9 S5 w. |& F. k2 D3 U
3 h& V3 F, g( k$ P1 X5 @ x& _
// ARM 中断初始化
2 Z w B# ?9 G0 \. V InterruptInit();4 x. Z* I% Q; O
4 u! g, z! ~8 V& i3 I0 B- @
// UART 初始化2 b$ v" A6 E2 R4 T2 k
UARTInit();
$ a8 u7 W% y2 m5 A6 w& k8 T5 d+ L+ i' m M' a
// UART 中断初始化8 A; u5 q0 e9 v4 }
UARTInterruptInit();) M- }- l) y. i$ C
- l& q1 ]# i5 H3 m% ]5 f4 d* n1 v, X; w // 主循环7 R+ S) _$ a3 l7 t1 l. u
for(;;)
0 H4 G. e% _1 t X- n' x: O/ t5 d {
8 h1 K" p% U( Y6 _+ X1 f5 o: n& t
0 k8 L1 a/ d6 E# z1 _8 v: q }
8 B; d3 O! `* w5 ?: j}* x M0 Y) h: y! M+ h
+ C# G) N8 Y7 y1 Z" u) K1 G. G& p/****************************************************************************/1 F" {& m/ ]8 l* P3 Y' C* f
/* */
' H' c, [/ \0 X9 e3 I/* PSC 初始化 */. ?! o2 B& W1 k" u
/* */3 X8 K; A2 Q- D
/****************************************************************************/. p4 @: t' ]- i2 S, T8 k. p
void PSCInit(void)3 R V7 }, a+ F0 X" Z7 x
{
+ E% D r: k, ^+ Z* c& F // 对相应外设模块的使能也可以在 BootLoader 中完成
% K |/ q( j& p // 使能 UART2 模块
8 K0 l% t' i" {) I8 b PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);; u, e% i- O2 M2 x9 }
} G6 N+ N e3 V9 r2 [9 d5 d! c
2 p$ u1 p# m* f/****************************************************************************/
0 R4 l+ U$ f( ^0 s/* */
; J( `! `. y/ @5 T! P/* GPIO 管脚复用配置 */
/ c1 r Q# s1 q5 G% I/* */
+ q' @1 S. ?# I. n, n, P8 ^/****************************************************************************/) D7 q, V. n1 }7 b, ~; E5 C- A. h
void GPIOBankPinMuxSet(void)# u) H* [9 \. `8 B( ~
{
, I% m, o: O5 a // UART2 禁用流控
5 a, q2 A! ~ n1 x5 B, y( a UARTPinMuxSetup(2, FALSE);( U8 G+ @, T7 S" c$ ` r
}
1 X8 p$ D8 v! c
. j7 z/ Q' H* O1 H9 a" S/****************************************************************************/
0 X- q/ N {/ O& h$ L4 e e/* */
( C% I2 u; G8 [7 C/* ARM 中断初始化 */
+ K+ U7 s3 B9 o1 ?3 L$ ]/* */
, d& D% w7 g' O' p# r# R/****************************************************************************/
- E6 a* M/ h5 p( ivoid InterruptInit(void)
# q3 y9 [6 g. W5 }9 x{3 _1 Y* z2 h5 j! T+ G0 a7 y& }8 u
// 初始化 ARM 中断控制器
$ I. @! D; w& }3 _6 R IntAINTCInit();
1 `/ j7 t7 w! z. X- n: Q( E
h' _8 s! f5 y$ [8 {: [ // 使能 IRQ(CPSR)" T+ y% Q y5 t1 Z4 T0 F- z x
IntMasterIRQEnable();
# W! g/ } b) K6 N
5 {: v4 r5 o" L( \( Y- E7 N2 j1 s // 使能中断(AINTC GER)
# j+ I3 n7 J2 I2 N" ]2 [% R IntGlobalEnable();& ~5 t9 i7 A G* A$ N4 b$ M
8 _& u1 l+ @2 p: g! ^4 {
// 使能中断(AINTC HIER)
5 Z: K3 [! Q+ M. E- L IntIRQEnable();- |& X7 e9 n- M3 C
}- y6 ]$ [* o* Q
1 k4 T- X: J0 _( l. W0 a
/****************************************************************************/
2 ?$ U" H. W3 t) g/* */
+ l6 o+ L8 {$ w# r& y1 ]$ ~9 ?/* UART 初始化 */# r/ d0 p8 B/ x' _" ~
/* */
Z$ n- a# Z9 y/****************************************************************************/& y# k5 s, W7 d# }
void UARTInit(void)! n* P$ u+ ?6 F& b Z
{' N- j+ I- s. G9 e2 s- U
// 配置 UART2 参数
8 k- T1 r- n. U7 [" w // 波特率 115200 数据位 8 停止位 1 无校验位6 X, a4 U! \: k0 F
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,# j" I! x9 t' _6 b4 Q' N+ `+ q. e6 U) t
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);+ o. \- H9 ?1 M) ?# O0 Q& G
// 使能 UART2
; D2 e7 r$ h4 O4 L0 J3 e3 b; ` UARTEnable(SOC_UART_2_REGS);/ M% ^- t+ h% h% ]" m
! x5 t1 K9 ~9 Z" j; H/ u // 使能接收 / 发送 FIFO
9 ]& f7 C" U2 h UARTFIFOEnable(SOC_UART_2_REGS);8 U: c3 ]3 j% F$ w
; i- O; D: @# t% G: N- t$ t% } // 设置 FIFO 级别1 E7 G! o4 e1 ?% Z+ K
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
% ~( {* Z" ]' T) q7 L}, O/ r( c7 i6 Q0 {, h
9 t$ i! |6 h) x
/****************************************************************************/) N/ ^( Y9 v3 C" W+ o+ c. `
/* */
" k% u" [, V7 e) L4 Y. y {* I/* UART 中断初始化 */3 v; Q# O! L- x8 z
/* */0 ?: G9 W5 ~7 g6 o
/****************************************************************************/
! c" J+ ]& r5 ?void UARTInterruptInit(void)
- r& U& a2 Y5 |1 ~/ I0 ~7 l{* h$ q! f6 I/ y. |9 U( O
IntRegister(SYS_INT_UARTINT2, UARTIsr);& b O+ M$ z$ k1 D! N. [$ G
IntChannelSet(SYS_INT_UARTINT2, 2);* t a! N' T% E3 Q5 a9 }4 W
IntSystemEnable(SYS_INT_UARTINT2);* N; D, X7 O+ ?
' h8 c0 C4 Y6 d1 | M" I1 X
// 使能中断! p& k0 Q7 |. X3 F/ H, F& _
unsigned int intFlags = 0;9 G* B0 R1 T6 \ U$ x4 a
intFlags |= (UART_INT_LINE_STAT | \" y) l4 o6 R2 \- y
UART_INT_TX_EMPTY | \
. e* y8 ^ c0 ~; d UART_INT_RXDATA_CTI);0 b( @: [: d, F% I/ D
UARTIntEnable(SOC_UART_2_REGS, intFlags);
1 o7 G2 N. Y7 {0 A {$ S}" F9 n( l, }( J* i- A; ]* H
3 ~: B4 E& N% Z6 P. i" `' m
/****************************************************************************/
0 i+ z# V: K5 C7 I7 V. H" z L( s/* */
. ]# f. _. \0 O' l6 {% q7 N( Y3 H0 Q6 u/* UART 中断服务函数 */
, E9 v6 m+ Y- X! c/ }+ t9 U/* */
5 F W' B# z" `6 w7 U1 K. F/****************************************************************************/
# U4 b0 _3 L, w& E5 }- n5 Zvoid UARTIsr()! b8 T8 D4 b" I& L3 @3 S
{
- t' f( Q7 `2 g2 ] static unsigned int length = sizeof(txArray);
8 A) M- [- K: u( ~6 u static unsigned int count = 0;
: i4 b5 s# f" \1 F; U' x unsigned char rxData = 0;
, M- x Q4 h* M- D2 T& y" m) N unsigned int int_id = 0;9 D. w/ e( L# v- a3 z8 p
1 `5 Q9 l1 j8 ~- {8 }6 p // 确定中断源
2 n$ a; N& o5 F int_id = UARTIntStatus(SOC_UART_2_REGS);
" u2 C' p1 z1 I; [" ~/ s S( C: ~# Z: b* t9 a
// 清除 UART2 系统中断2 |9 g, u% N. {$ }2 ~% x5 M& `
IntSystemStatusClear(SYS_INT_UARTINT2);" e8 `1 a2 u8 k2 {
/ O/ b* B) h; R( u- s6 b // 发送中断; ^% E2 h; h# e: t7 `9 E
if(UART_INTID_TX_EMPTY == int_id)9 ]% a' _& v; L3 m2 [7 u% V
{
; g! P. M3 Z/ G& R9 h T3 d if(0 < length)
0 o6 |6 \5 H6 X6 Z% t1 _ {
( f' T6 [! f) ?) k // 写一个字节到 THR2 E4 u8 p4 i& h
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
@* i4 k. V0 L0 o; D length--;
- E+ {% r0 h2 h5 B# M7 N% J count++;) }) I( l4 o7 L8 Y! }
}- P3 u& f$ z9 s/ g" k; s# x
if(0 == length)
( F/ i' O! X K$ t2 V {
2 A' L) i( Z+ P! F" Z y // 禁用发送中断
7 p# A0 F8 O2 i% d UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
6 Y) {2 n( [% g8 q0 [ }
" L/ w& v, i$ q+ E! R& @8 C$ F }0 L! L& ?6 b, q
1 N# g2 B' t4 q- }7 {
// 接收中断1 `8 c/ u' U$ Z. s
if(UART_INTID_RX_DATA == int_id)
5 ~: C Z& d! |! N {
P: n5 U' h$ b% Q3 x b. }% { rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);& i2 U2 r1 Y# a
. v `: V5 T3 y$ }# i
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
* _4 N9 j' Z( X8 ^+ C J8 l }
3 C' ?$ |0 e% V) s y! q
' v' [/ f3 e! h3 H* r; I // 接收错误! H, y, ]( J3 u
if(UART_INTID_RX_LINE_STAT == int_id)7 ?3 P b5 x& d9 {6 L! g& V7 G0 @1 e
{/ M& _9 w) k* `7 Y
while(UARTRxErrorGet(SOC_UART_2_REGS))8 x) }0 Y7 \" @; i+ a3 g" a
{% S4 j L$ _, }& }0 @( ^# d
// 从 RBR 读一个字节" Q9 d% Y. ` q; Z' ]
UARTCharGetNonBlocking(SOC_UART_2_REGS);
; Q3 p, ?/ N3 u }" R* y9 I2 t) s8 r2 S% x/ p
}9 V. M$ B! C: w' F! y$ l$ i7 G8 s3 o
% Z5 h) V V4 C; {6 _ return;
) \) _+ U+ Z9 |3 Q0 U }* L}) _. y0 r, j3 Z6 O6 w5 o0 Z9 F
|
|