|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。1 |4 @) ~3 I) A$ O
" b I) F/ H5 C1 E
#include "TL138.h" // 创龙 TL138 开发板相关声明
- B9 x' b) R- Z; S% U" M, c
2 h1 O5 l3 K) h! A( Y7 }7 P#include "hw_types.h" // 宏命令# D, r3 ]) C2 K5 Q6 W9 Z
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
5 N' h- E0 C; _" a& h6 L' U1 C#include "soc_OMAPL138.h" // OMAPL138 外设寄存器$ U& s4 r0 Z* @$ [: M" |4 N4 \
! J4 u% n3 H; P( J9 P' ^#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
) x0 ^/ T* o: x7 q#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
) X7 b9 @( }3 V$ a/ Z) T" i#include "uart.h" // 通用异步串口宏及设备抽象层函数声明2 X& I) L' h/ K; o
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
/ {* W3 p# s/ A5 [& {5 c/ ^# O- g8 t% X$ E" {5 X* a6 S' V* [+ ?
/****************************************************************************/
6 M" ?* x' i5 Z& ^1 |' \/* */
0 Y: d4 R3 q q/* 宏定义 */ f$ C. y3 m9 b
/* */
. @ I. t G6 E/****************************************************************************/. S9 a+ o: ~% z, D' j) ]/ Q4 B
// 时钟- k0 q1 C; j' j/ D& g7 M
#define SYSCLK_1_FREQ (456000000)
- Y6 L" o; |1 Y/ L' k#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
6 g! i% ^# b' F( P#define UART_2_FREQ (SYSCLK_2_FREQ)
4 y+ h# m: J+ G6 x, s) W
9 l8 ~. z# E# z) ^! G/****************************************************************************/; j* b G# C% B; n) j" ^1 V
/* */
' _- @# Q, S1 F5 m/* 全局变量 */ N- a% W# X4 D5 h: g: T
/* */* g! W* G9 g% C6 x! S* k5 R
/****************************************************************************/2 _) [7 e; N5 J5 p
char txArray[] = "Tronlong UART2 Application......\n\r";
; I' M7 U$ _! b9 o9 E
& g* z- }2 f2 Z2 m: U2 {/****************************************************************************/: Z6 v" i5 U7 t' l- P' ^ T3 x) {
/* */, k' c( y0 t8 @) A8 `
/* 函数声明 */, _5 L B3 }' Z6 Z, K; f3 O. f
/* */. n, j8 s5 P/ M% P; ^
/****************************************************************************/
/ l4 p4 }8 J; m6 H// 外设使能配置( u/ n1 g& ?' T# p: C" S' u
void PSCInit(void);
+ t8 R- `6 Y7 _, @! z1 |9 x$ O4 `: d$ b8 d
// GPIO 管脚复用配置9 G1 d8 |8 n8 }- |$ K+ \
void GPIOBankPinMuxSet();& k. u C2 U, a- l M6 S1 ^* d$ [
3 ~& R ?4 w' {" }6 P( P
// UART 初始化9 H6 [3 I$ ?7 w; Y9 @/ L, C r
void UARTInit(void);
1 W4 h, j4 I; k$ L+ y# F2 U// ARM 中断初始化
- T4 r8 l) o- V4 A: f5 ?void InterruptInit(void);
) O c: u- U1 \7 L- Y% B// UART 中断初始化( ~3 U6 S$ h0 U4 {" ]3 D" K i" a
void UARTInterruptInit();, N% p* v' c! M) e5 [2 t& D
// UART 中断服务函数
5 T7 G& Z& h' l/ ]" n8 _ Gvoid UARTIsr(void);
; C+ Y! x$ s" U' K1 c- `3 a+ W( q6 x, \
/****************************************************************************/
7 G8 k$ U, Y2 O% ]) C) o/* */
+ K* t% f/ k( ^! [5 [" e) m/* 主函数 */
1 z q) ?' n( j) ^: C/* */. p, K9 E4 b- D( U' m2 T
/****************************************************************************/
: r* C/ N) v2 a2 [+ T9 E3 D+ [int main(void)
1 U4 m! Y9 e7 Z" F s{: o+ ~$ T/ }" S5 W
// 外设使能配置* L: L8 M! e* o$ Z# {
PSCInit();- {* \) }3 ]3 c1 ]( ^7 e0 ?: r
# c5 g9 @$ X* t3 J: R4 Q& G // GPIO 管脚复用配置
. b0 V2 T( u3 k( ` GPIOBankPinMuxSet();" f% b W( p* w" q6 j
) H4 ]( j6 T8 _; U; z1 p
// ARM 中断初始化
/ r- V/ c8 _6 ^( H5 O InterruptInit();
8 g A$ V% D( B& E) F& g
. j* m$ T- E# t. c // UART 初始化0 _6 O4 Z, V# U
UARTInit();
6 \+ ^) U. ^; o2 K$ b
) N& h7 q6 i, C) ?; @' O // UART 中断初始化
: p) }8 }9 O* H' N. _* x UARTInterruptInit();
+ _* J7 x! ^% @! u* ~1 H. s! R+ r' E& T! v w
// 主循环
' S( T q% b4 x3 q for(;;)
, x D6 F' U0 t$ d! r6 i- t {
/ [( s9 a% W, X
/ c2 g$ I8 P. c5 [8 f }7 k; K' S- V, z% R1 i6 ^
}0 Y& m$ R# C- C
$ B1 u3 w. m4 o# |% K7 L3 I! X7 f/****************************************************************************/
4 W: ^& f# L: `- e0 [2 R# |/* */7 }9 C6 Z8 n9 G4 D% g
/* PSC 初始化 */
; z$ ^: F; U# A r+ `& X/ o) ~+ }/* */ q0 {0 k [ t: p+ o& ~
/****************************************************************************/
+ ?7 N4 v; O. K5 x8 |0 ^3 X" e! E0 ^void PSCInit(void)
* m6 V, v* _' E/ _7 B8 ?% R{
- H# y0 W3 i4 b8 K q9 V( O' V: x* G // 对相应外设模块的使能也可以在 BootLoader 中完成" u+ J* p# O, T5 L" {
// 使能 UART2 模块
6 a( n6 ^7 \. r& q/ ?8 b e PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);! e/ Z4 w, B! p0 w" }" U; i5 o
}
6 t) F- Y6 c& G" ]" n$ y/ R
7 c) ^: c Y1 v- U! S0 U1 `/****************************************************************************/ ~3 d+ k; B; h! R, C1 p, B
/* */
% e+ x1 E0 f6 G4 }2 s4 d, @( w/* GPIO 管脚复用配置 */
6 A" }% M) T8 C1 v* u4 `/* */2 K, [, ?5 E* k8 W. v+ O" c
/****************************************************************************/
& M0 G5 _+ L4 K( Z; Lvoid GPIOBankPinMuxSet(void)
$ y2 f; H4 Y" ^" L* g7 Z4 h2 ?! |{
) Z3 u5 A9 u/ Q! G7 y // UART2 禁用流控
- c8 Y( }; q3 j3 S: G& F UARTPinMuxSetup(2, FALSE);
9 d! Z) e+ u# ~8 _}
9 A; J9 a* Y$ Q4 m
3 i. J: u" ~. w0 }* ?/****************************************************************************/
0 o' j ^" g$ H2 [9 G9 O3 ]+ {/* */% i3 K" b2 g$ {8 J- j- O9 T
/* ARM 中断初始化 */
$ Y" O7 \$ r# d L g/* */
; n" w1 T- Z" C6 t$ V" @4 [2 B/****************************************************************************/& U% J) R, X& i) B5 K" u+ i
void InterruptInit(void)
3 r# k1 Z4 K$ D6 W* H& o1 a{ A: f' ]; z% S- R& M% h+ u) c
// 初始化 ARM 中断控制器
7 w: M4 u- ?* v9 F IntAINTCInit();
8 F0 O/ r- I! \3 \) B6 P8 ^' u6 y8 N: C1 i5 r( n" ]5 p
// 使能 IRQ(CPSR)" W- x, B% t3 r, X& e9 C
IntMasterIRQEnable();$ d; i' j: E. v8 { a6 j
' \' u8 H" r6 d0 F Y // 使能中断(AINTC GER)
9 T$ ~. t1 U% V. D z. g IntGlobalEnable();
' ~( K+ G- A# ^+ h+ ?8 h5 F
: Y" W% H9 O8 G/ D( F: X // 使能中断(AINTC HIER)
4 D! n9 F$ d* `+ }0 L4 R IntIRQEnable();
& z+ }9 L9 P7 _1 ^. j. P}
. [* M8 e8 s! q) Y% L; _: z) j" Z6 k+ T4 [& \! S
/****************************************************************************/
# Y( V8 c3 t% v# G9 F, @. w/* */
' h- c M: a: t4 Y% _1 W/* UART 初始化 */4 q2 J% e% V5 i' m
/* */
$ K0 K! y2 L8 i/****************************************************************************/
4 D: G8 E, P0 J9 x" Avoid UARTInit(void)
* y2 c8 ^, P* y) G{8 y1 g9 v$ B1 r* K. o' [
// 配置 UART2 参数( D2 M" q( S8 _8 i# F0 ?+ m( ^! V
// 波特率 115200 数据位 8 停止位 1 无校验位
# X, [5 A1 q& F4 g( o: T UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
0 p4 c1 }. i3 Z! @0 ^: h UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);1 n4 b" t3 R0 h, Q$ M; X" h8 }* O
// 使能 UART2
3 q" b4 U$ c& Y* m$ ]5 x+ E# Z UARTEnable(SOC_UART_2_REGS);( D3 }" G' e! E2 r& v* m
+ c' ^7 e# K+ ~9 J' \5 g- m // 使能接收 / 发送 FIFO
6 o! j6 K: P5 G* v+ D UARTFIFOEnable(SOC_UART_2_REGS);/ ? z+ V+ f3 Q, V8 X+ d: ]& W
8 k `; X* A: Z9 P0 D6 { // 设置 FIFO 级别) K7 ]& E- ?, J: X
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
8 ^9 d4 y8 O+ `, C6 j# I}
( ~1 x% S: ~- g; n* x: J% ~& H) C. ]! v& c& ]4 R
/****************************************************************************/
. `, \1 N" R, e% f. \* O/* */
7 q: ?+ q! J, z3 R' c3 Z6 X$ A& E- v/* UART 中断初始化 */
3 \1 l) z: v4 O0 F) U! ]7 M/* */6 q) v$ l) Q* f4 l
/****************************************************************************/
; [2 d3 F% |2 P$ Uvoid UARTInterruptInit(void)0 K! r6 @% R- | x$ q# m5 |
{* Q2 M* M6 h" I8 M$ q
IntRegister(SYS_INT_UARTINT2, UARTIsr);
& [: a& C; W1 S! e IntChannelSet(SYS_INT_UARTINT2, 2);* @# [; S$ r5 Z: m
IntSystemEnable(SYS_INT_UARTINT2);; R' i, L* o6 L. G. `
9 W5 L p7 ~' w8 h // 使能中断
7 x+ o1 x6 `# h. u% y+ L& P/ Z$ _3 z unsigned int intFlags = 0;
! Q& y( _4 `% b: s$ ~( @( K2 ~ intFlags |= (UART_INT_LINE_STAT | \, O3 n- s7 Y, ~# M7 ~6 F
UART_INT_TX_EMPTY | \1 y K/ R8 b3 G. e+ [( Z4 ?% X
UART_INT_RXDATA_CTI);
' u, ~; I+ J1 ?8 W V+ j! @5 C UARTIntEnable(SOC_UART_2_REGS, intFlags);: L& A; i5 |. W# a
}& S" y1 ]% Z) Y4 D, Z
/ e$ ^0 e [& o) F3 P% A/****************************************************************************/% z4 B* k; b% F) ^! \
/* */8 K4 }, I* `, D; `; K0 q
/* UART 中断服务函数 */
0 i+ F( |1 r$ e, O& ~/* */) M2 c) E1 E) @; F5 h* R0 Y
/****************************************************************************/
/ Y! A' j) ^- q! D9 ?void UARTIsr()
, ^5 x+ C/ a% x, D- D{( M- ^% J3 d0 @5 {$ c+ y) b/ t; c, T
static unsigned int length = sizeof(txArray);
: M; _2 P5 h2 C+ L* V static unsigned int count = 0;
: |4 O7 |( S6 e2 }( m5 r unsigned char rxData = 0;# j1 s% A/ R# |, X7 g* W
unsigned int int_id = 0;* f* x) v6 L' m G5 \
2 G5 q, K0 A& ]. G. r // 确定中断源* ?+ @( q/ X& s) w. A7 A
int_id = UARTIntStatus(SOC_UART_2_REGS);9 [0 W* t6 _9 b- K1 n- |
. U# J# u4 E% N
// 清除 UART2 系统中断
. ]- [/ c7 c; v- w1 ? IntSystemStatusClear(SYS_INT_UARTINT2);
o- X7 E1 N" F2 z0 \2 D; A2 }# ?3 B& `( _* U' V: @. z8 ?: ^( c4 y
// 发送中断9 e2 F" f# H. B# W) d- [" H8 ?' Z8 r
if(UART_INTID_TX_EMPTY == int_id)! c0 `9 \" n" g( K A! b
{/ k+ x+ h& K5 |# _0 N7 x9 Q* E8 |
if(0 < length)
6 a- Q0 j1 M0 {+ y1 [. k8 o {
0 A. ? ^0 N! u // 写一个字节到 THR1 v9 `7 M! e( `& b" R% [
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
4 H7 T+ C& V. D5 q length--;
9 c3 H5 u" ]) j( `1 q count++;
& D* ^1 _5 { S- i. M }
/ P- v: k9 f$ h: h) e if(0 == length), w$ d: ~; @% f7 I3 |: `' x H
{
% R5 K( I2 F' `( Y6 k' B* q: \ // 禁用发送中断+ [ f! s: k3 |2 {0 j: S
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);7 u* O1 ]% X0 r" ~. w
}
+ J' W; i* d$ b- t5 k }2 e8 v6 y* A1 M' S$ K9 B
, \! q5 b2 W' v. C' |) @9 [
// 接收中断
1 h2 K/ _" ?7 J- s/ z0 b9 `2 O, u# z if(UART_INTID_RX_DATA == int_id)* N9 i" H1 y$ J4 f% z( L
{
& T5 U( l' O3 ^! Q/ ~2 T+ U rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);/ Q7 O* R5 x! O9 l0 }' n
8 r. `$ l) A0 E1 p+ J/ d0 e
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
; i h+ r3 `3 F T0 I }) {: C1 t! x& B4 G
# ]; X' M+ o; l- |
// 接收错误
8 H! j% }7 I7 @3 G if(UART_INTID_RX_LINE_STAT == int_id)
2 w9 D5 D9 e! W {
& m9 W+ P- Y7 S: c- ~6 ~4 x7 T' r while(UARTRxErrorGet(SOC_UART_2_REGS))" K. O7 b- J3 @
{
, Q, Q! G. t% F3 T9 e // 从 RBR 读一个字节
% p5 t5 G3 @+ e8 D UARTCharGetNonBlocking(SOC_UART_2_REGS);- c8 l$ v8 o7 j5 [" p+ E+ M5 |: s
}
' l! |: G, s+ T& c4 N. y }: j# b" H2 t0 d" c( H1 \# F
|+ c" X: J+ q* Y1 e return;
9 @3 s% t1 ]2 Y6 n4 ]. q) U}
0 O# f9 \8 d, ~. @ |
|