|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。4 l+ o7 u( }2 y4 S( X
$ {! W1 T" a1 C4 Z6 I
#include "TL138.h" // 创龙 TL138 开发板相关声明, k2 F* S8 y. ^+ L
9 x) _$ K$ x4 W" e k
#include "hw_types.h" // 宏命令* y4 f* `4 E: Q1 O/ \0 c1 P
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
3 T' W5 `' F+ ^#include "soc_OMAPL138.h" // OMAPL138 外设寄存器; R Q5 |. W- E
3 J+ ` f* ^: Y n6 j' z
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
/ l6 P8 P+ j5 R1 \5 H2 Q7 m#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
3 g4 O6 E5 Y( W; B# P#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
8 O- U- ~! o' ]4 g' }6 w3 r1 Z7 p#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
8 x- P9 b8 e1 C1 o) N: j9 i# q E7 V$ {! f, m! `9 d6 M
/****************************************************************************/! a2 p/ N: c1 O; w: u. a
/* */' \9 y1 u9 Y9 ?/ [0 D$ w
/* 宏定义 */" J1 C9 S7 F4 w4 O9 P
/* */; i) I# H3 b o5 l7 F6 K3 H' i
/****************************************************************************/, m: J$ f E& i; h. o9 [
// 时钟5 W! S* F- l4 C s/ f B' R
#define SYSCLK_1_FREQ (456000000)2 B4 O& B( Q* L/ s S9 A
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
2 Y6 z/ h5 K \" v+ `) b; B#define UART_2_FREQ (SYSCLK_2_FREQ)
6 y% y/ Z& r q8 F4 s! }% o4 B M+ q1 v7 y
/****************************************************************************/
4 b7 M6 l5 Y( R7 p, ~% K8 ^/* */
% T8 ~! C' O* o) V0 \+ j8 F& E/* 全局变量 */' {- s1 S9 s! e3 L
/* */
. O# d9 X- h; G# G7 N/****************************************************************************/
$ T6 L: U. [: h- f# P r. l1 A4 ^char txArray[] = "Tronlong UART2 Application......\n\r";( h' n" @$ `6 t) ~. _- }" C4 i+ T
/ C H5 u8 I% {( O/****************************************************************************/
: m I; o4 o7 W5 |% o4 u: N a! [! O/* */+ }1 t* p+ {" R o l, B! M; x
/* 函数声明 */
0 h6 R$ |" y `" }/* */3 H3 Z7 q' w- }" |- g! Y, T0 ?
/****************************************************************************/
4 p; ~+ s! {4 U- d" _5 R! P% E// 外设使能配置
9 P+ P7 \- G e, E7 \void PSCInit(void);$ S$ Q' ]% z; |$ C T( k' [
6 Y+ G- Y! o3 z; \
// GPIO 管脚复用配置+ Q& {, F8 ?/ O8 _) C
void GPIOBankPinMuxSet();
$ M U! e, ?/ g. e+ D7 Y
& r$ s5 d( q9 ?3 z$ g) A// UART 初始化; F% n: [+ b# u, [/ z2 s
void UARTInit(void);
3 y0 u; M/ }" Z// ARM 中断初始化
$ Q' A) F+ o$ H) N1 dvoid InterruptInit(void);1 |. ^: t1 i$ w- ~
// UART 中断初始化. X: e- S7 O O! g, ^. F4 k; q
void UARTInterruptInit();
4 `( r0 z( _) j d// UART 中断服务函数% D4 z* ^, V* c+ o
void UARTIsr(void);+ P1 I- i9 B2 J
3 o/ P* w4 D( z/ C! {5 V
/****************************************************************************/
- k7 x' U k4 m1 h( @/* */) ^5 [6 I9 t8 [/ t7 m
/* 主函数 */" `) r5 x, C6 |7 d8 C+ W
/* */ W8 x; ~9 d4 a+ m' G
/****************************************************************************/
' n0 ~* M4 S: B% @( Uint main(void)8 [ w/ }9 d" ]0 ~4 E2 M
{" e# e. T0 D1 n- V( n/ ]
// 外设使能配置
; I* U8 W6 m- e% C- |; }0 [) C PSCInit();3 k' i* c& w: |
5 U8 C# \; }8 ]5 X9 q/ R
// GPIO 管脚复用配置
$ r" P/ H I/ t+ Y* B+ \ GPIOBankPinMuxSet();/ r/ R, [/ O9 Z% }5 |/ q# F* p: I
- s5 P4 l& q2 x1 L: m& G& Y& U& V( A
// ARM 中断初始化5 [- A$ P. l& U3 \( Y
InterruptInit();. [5 r$ ^! ?- r* c! b( r4 O
) o6 Z3 [$ o$ I: X7 d // UART 初始化
6 c" q' ]. h( L7 j3 M UARTInit();
' |2 T! w a3 E! E9 e+ o( C0 o7 S5 @
/ `* I$ V0 |) g // UART 中断初始化
8 |6 l% I( O# u8 s7 `' | n N- b UARTInterruptInit(); R% d. M" r6 q* z I) d
$ ]' y. o: M( G3 ^+ g3 u% R- S; m* O9 N
// 主循环
# B0 B; M! z3 h5 z: r( m for(;;)% w: O/ q3 \) q# ]8 M
{" o& I) a( }4 \1 T; D8 n' j: I
i7 q. K4 Z' D3 s/ O" n8 O
} u, B4 l, O' P0 i& J4 d# ]
}6 l! ^3 ?+ `8 Z6 w
3 u- }1 I [2 w
/****************************************************************************/
# Y% D5 v7 C+ k+ m/* */
6 J' q) V; _: _- x0 l: G/* PSC 初始化 */
5 i, E" _6 p0 q) \# z* R3 a/* */
& Y; w# `/ t: p: i; S B# W/****************************************************************************/, g5 p5 n' I* i2 F) N4 k4 X
void PSCInit(void)' A r1 |0 O, ^$ |
{
, o' {& p X' y+ Y // 对相应外设模块的使能也可以在 BootLoader 中完成, ]9 }8 p2 Y4 R1 `1 T
// 使能 UART2 模块
$ d, ~1 X8 X" [" p- }' [ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);3 C2 e5 B1 v7 K
}* d& f1 M) V: k8 e
: G9 H* p5 g; `* l/ x# a! j1 ?9 {
/****************************************************************************/
) x6 i$ K3 \7 D/* */ U" I! @" i/ m& {' q
/* GPIO 管脚复用配置 */ F/ Y2 |; ~2 U. Z( f. n1 ~
/* */2 Y# o0 d+ n ^" L5 T
/****************************************************************************/; S& D9 M3 D2 `
void GPIOBankPinMuxSet(void)
. M' f0 x+ A7 O{2 y- d$ a- s4 V! t8 [6 F2 i- v8 Z
// UART2 禁用流控
( \; r- s& y! _$ b6 }; e4 {7 ~9 r UARTPinMuxSetup(2, FALSE);# `9 }1 N! h( c' @; T% R6 ]
}
/ p1 z7 G4 m- c0 B6 Q; {% V$ _8 k/ G; y) M$ P$ P% z
/****************************************************************************/
5 d8 \3 Z/ J3 F5 `/* *// |" M6 x; ~% t9 c7 U2 }
/* ARM 中断初始化 */9 p1 g% R# S' g2 ^+ w9 y( m
/* */7 a" h3 p# q- O
/****************************************************************************/
4 ~* V4 N: U6 c/ ]6 jvoid InterruptInit(void)
1 [1 V; y; i3 o6 N{! O3 Z1 x; J7 z" K1 M- t' l! I
// 初始化 ARM 中断控制器2 s) D/ q6 b1 g" G
IntAINTCInit();
6 }/ Q- p' _" s" ]* H* ?
, t' l7 y. t8 I# }9 G7 D // 使能 IRQ(CPSR)+ X" c! p; K0 ~3 A
IntMasterIRQEnable();: ]% s& S; [/ }2 s1 A. N
1 V4 l- F* l) f7 i8 q0 ] // 使能中断(AINTC GER)
4 U8 g' k$ f( s3 i; F, F+ D& b- r IntGlobalEnable();4 h$ O# u1 k, s2 R4 e
3 O: W6 z3 z4 T // 使能中断(AINTC HIER)
% ` A( z& i( P5 M, m% b IntIRQEnable();
% | E) {! x- y}- ?9 o3 P/ U) _ m9 Y1 k% z
5 v; a0 ?. Y; s$ x1 R* M+ z- w3 c
/****************************************************************************/
8 _) r# v5 L2 R3 f/* */
8 _8 s- T4 p' V; F' W. O/* UART 初始化 */4 t* b. n# i0 I3 t5 F
/* */
6 D2 \9 x# G. q1 v! U$ h6 c, ?: B/****************************************************************************/+ a" Z1 h( I' N$ |1 C) B
void UARTInit(void)
& C3 U: W/ O1 _8 k/ `) T& U{
3 U( p5 y1 F% F3 V // 配置 UART2 参数) R& x+ z: @; P5 D! T
// 波特率 115200 数据位 8 停止位 1 无校验位8 S1 ~5 o+ H* S' i; |, _1 h9 @
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
5 w7 }7 S' r4 N8 Q5 D0 j UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
% M1 V4 m, I8 X: n( }% k // 使能 UART2
- {" h, u$ W$ u* O9 h- ? UARTEnable(SOC_UART_2_REGS);
0 @: f6 w' I0 Z; _/ ~" g) ]9 f) B# Z6 ~- N/ b6 w
// 使能接收 / 发送 FIFO
, ]* B* g; ~" \ UARTFIFOEnable(SOC_UART_2_REGS);
3 C8 x; _, {# }$ n1 n* W- D+ h( r0 k9 i' {
// 设置 FIFO 级别 c' r" ~; j6 }9 R: `! [
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
4 L) W8 n( l$ c. J* k0 d5 v, |* Y$ x}
! J* o. v" N1 h/ _. [$ h2 ~7 y0 O. }" v
/****************************************************************************/ x: ]5 ~! O4 M8 F" M
/* */
8 }' ~1 K3 ]1 ?- I$ G0 ]6 D9 {; d/* UART 中断初始化 *// I2 S, d5 j. }- @, k$ q0 I; V' Y+ f
/* */
9 E! f( ?6 k) j4 v* ?5 \/****************************************************************************/+ }# x. {3 p, |; @2 I7 Z
void UARTInterruptInit(void)
4 x5 w# u) ]+ Q& k2 I' X{
6 y# A' h* D; C/ e) O# {) K IntRegister(SYS_INT_UARTINT2, UARTIsr);4 X3 o1 v# z! `, l* t T' X8 N
IntChannelSet(SYS_INT_UARTINT2, 2);1 g1 m& R0 j' K0 m, l- i! c0 p! D
IntSystemEnable(SYS_INT_UARTINT2);5 l5 g3 H2 \8 N! N
! Y8 i1 }* f6 {6 `
// 使能中断
9 f$ V$ X$ b: k7 d unsigned int intFlags = 0;
. c, j4 d3 [9 U intFlags |= (UART_INT_LINE_STAT | \4 z3 }: C U! C. Y% M% w5 I
UART_INT_TX_EMPTY | \5 B! \' y' t, P/ f. S, k/ R; z
UART_INT_RXDATA_CTI);. P% i1 w' N5 y4 a# M( j, i
UARTIntEnable(SOC_UART_2_REGS, intFlags);- {8 f' E7 s8 `: A+ ]4 a
}: ]( l) \# S) a8 o
3 f9 a- ^/ K# D% g/ j/ a" M2 X/****************************************************************************/
4 R) b: _# ]) E2 i/* */" J8 v: ~ L6 x" [! C. ]9 C& P
/* UART 中断服务函数 */
; i8 y+ t& Q1 G: |& o3 K8 N) |/* */8 w' i/ r6 s3 r5 a
/****************************************************************************/
0 b' z \, n) p r) Vvoid UARTIsr()
. b+ u' N$ v- V# H{
* `$ ~6 y8 ]1 E. B6 S static unsigned int length = sizeof(txArray);8 d' Q& x8 O4 m
static unsigned int count = 0;
2 ]6 X1 x9 p+ N, \* A unsigned char rxData = 0;3 r# w, p! k% u& R
unsigned int int_id = 0;) |2 R& S* k8 _4 a
* j' @ A4 ~* Y7 \; y# C- q
// 确定中断源' ]- z. `2 [4 M4 m6 x
int_id = UARTIntStatus(SOC_UART_2_REGS);4 s/ G o" b' m$ E' J3 a# `$ P# e
8 G7 c2 y+ x0 A" d( s! [2 { // 清除 UART2 系统中断
. r, z; F% D+ ^5 c0 W* |$ } IntSystemStatusClear(SYS_INT_UARTINT2);# ~; B0 M3 j9 m
6 t! L& f' x: I: g* v! l) }" n // 发送中断
5 L% N* R/ ?/ J: K/ U" h7 A if(UART_INTID_TX_EMPTY == int_id)- Y. o8 F9 p& A) [# d
{
7 s6 K: e6 \. P4 U" f if(0 < length)& f" l% }6 s' o8 O* L
{7 V7 ]2 Y1 {( t8 J6 N& A, b c; c
// 写一个字节到 THR
. B1 u3 ?% {* d UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);, B {* z( X, M) ]
length--;
: j- F. D5 H& N4 k$ C( A count++;
9 s) f4 o7 R0 |/ s$ E }, M5 Y% Z2 ]9 |( J/ R6 P
if(0 == length)+ I' d5 W. l$ ?8 B
{" g1 X& g, ?4 y' j; _1 s
// 禁用发送中断
6 ~# P9 v; A& F/ _( I$ D UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
- E6 Q: |4 B0 [0 [! @. \ }( `: n/ H* Y- O: u
}
! d4 [+ F0 G% v1 s5 }
, a' V* ]3 G7 O6 L7 p' W2 J // 接收中断
. L* H* h) G! l if(UART_INTID_RX_DATA == int_id)
; H0 G; X% Y0 B. ? {) @4 M/ }5 O' J/ F' Q6 u+ a: T7 T2 m& ?
rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS); O/ k4 z4 [& L4 J' e; `: D
& q2 Q# g6 R3 V# q: o UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);! m( S! [# @5 i! M; @, v- \7 V2 Y
}7 c9 t$ O+ W b$ L) x2 \
6 s4 O3 e7 K( A0 J b( W* l // 接收错误7 H" Z: Q c- @) S% q
if(UART_INTID_RX_LINE_STAT == int_id)4 _5 p8 X! I, c0 A! |7 o- u. E
{
& H# P4 F1 D2 z" w# L' d9 t4 C while(UARTRxErrorGet(SOC_UART_2_REGS))
: P1 \5 H1 {/ c. L2 p f5 P V {
) _/ M L% G3 n' B // 从 RBR 读一个字节
! x% m5 C3 s f r# P UARTCharGetNonBlocking(SOC_UART_2_REGS);
& l7 w+ a- e' \7 P# n }
|, t" ?7 P+ u4 C' r7 e( L2 w }4 L, X+ {* E$ G, w" Y2 a2 A
) S0 U. F. Q8 ]1 f: L% V return;! J( ~2 r' m! b
}
: K& P' Y6 `5 A3 w! n |
|