|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。3 [& ?$ n% ~/ Q
: {1 R1 f" h* W, D3 m
#include "TL138.h" // 创龙 TL138 开发板相关声明! S& g' p$ p% L( U$ z* K
5 A9 t0 @+ B0 x) R; ^9 I/ B O1 K#include "hw_types.h" // 宏命令7 C/ I/ u x7 {( D$ j. i" \
#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器, g, ?4 n/ F) U& [( W# |
#include "soc_OMAPL138.h" // OMAPL138 外设寄存器3 n/ A) J' f4 `9 n( x/ r' @. t
# ^1 L+ {! k4 s7 o+ H+ n#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
2 L( u1 j- m' E: p! a% a#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
7 n6 P. Z: I) s+ F#include "uart.h" // 通用异步串口宏及设备抽象层函数声明2 L3 s0 b; U3 ?
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义
) Z2 Z% m: F- ?/ Q1 O l5 g
$ ?2 _7 g# ~9 a; Z/****************************************************************************/
( F0 ?! B$ l2 r" J' m( k" M/* */
+ K$ U0 P% ?3 z/* 宏定义 */: z3 D7 ^3 B' M* i
/* */+ c! Y1 K( ?% @9 e
/****************************************************************************/
P! E2 B' n0 q: ]' _1 d5 T// 时钟
3 E3 M, s2 Y' U7 c( j! T#define SYSCLK_1_FREQ (456000000)
7 o, c* Q1 w) i" r#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
% p( E; \( j1 l- j6 ^: X% |#define UART_2_FREQ (SYSCLK_2_FREQ): Y* I6 a$ d+ G5 o
3 I1 G8 J0 j/ m* m/****************************************************************************/6 u/ [3 ]) x% B4 _% g0 u
/* */
0 l6 ^; k! S; J5 N4 z# ^7 V' G1 h/* 全局变量 */3 Y7 {+ {1 w5 S' w u( d: l: W6 G
/* */
1 u5 ?# H8 ]0 H. v2 q# m& X: k/****************************************************************************/4 A. j, z/ C0 m% n/ Y
char txArray[] = "Tronlong UART2 Application......\n\r";. O0 a+ x- p5 }! e
/ H8 v4 w, j' O; ~
/****************************************************************************/
6 A9 L) T6 ~# t1 r, t( N1 f& ^/ B6 q/* */# M9 r& d0 o. r( b: {
/* 函数声明 */9 V8 O# R X# S& {0 B& j/ \
/* */8 Z' l* T1 i/ {: z5 I6 x& _; @9 U* \) V
/****************************************************************************/! B1 @+ s1 |. ]. u1 k
// 外设使能配置
2 p3 B0 f' K$ |% l& ?void PSCInit(void);
5 a) f2 M. H6 s0 \3 T2 e& h$ l# O& q) P; `) v% w+ g
// GPIO 管脚复用配置
' j( E( B: [' i+ l4 V" S' xvoid GPIOBankPinMuxSet();6 O! B) y5 r2 D# w
0 K/ G% ^0 e4 @ W- H// UART 初始化6 Q! a* H( M4 y% y
void UARTInit(void);4 ~7 l4 |- j$ [! l0 e
// ARM 中断初始化0 D5 n, l4 g& B/ `" M) |$ G; d
void InterruptInit(void);4 W& ?* f; a' Q- J2 P+ N( W. ]2 A& H2 o o
// UART 中断初始化# o; j" O0 y" ]+ O3 l
void UARTInterruptInit();
' M' u1 N5 G) `+ ~* x( s& Q; u// UART 中断服务函数
6 p# e3 O# d( c: ~" J$ vvoid UARTIsr(void);9 H: R( b0 {& Y; f, c$ _3 s/ Q
- m7 {! n6 [: T" s: T/****************************************************************************/; V6 k! ~8 N4 e) `" z
/* */3 M( F$ |! w2 g8 L
/* 主函数 */
5 V. Q: q* l/ D& P2 Z7 I$ ]/* */' z( Q9 f2 P' R/ K/ \( b1 c* j
/****************************************************************************/' l5 c9 [: ?2 \2 y& I
int main(void)& M0 Z- O8 P% }- I! Y& u- x
{- f, i4 c$ m" m4 @, U% c2 X
// 外设使能配置' p$ ^" ^9 Q- n" o0 q& T! g
PSCInit();
: c+ r7 L8 M m$ @ ! G3 m7 W5 d8 ?& {9 z6 B( B
// GPIO 管脚复用配置$ x9 ^$ U% J7 u' g1 e/ j7 v
GPIOBankPinMuxSet();) {3 v/ e$ |9 r- _" k6 O9 F
6 A, ^9 E6 z) H, l; C8 V* l
// ARM 中断初始化
: ]% o) p# g& ~3 U( n( I0 E' @# R InterruptInit();
/ o. K8 i, H7 b0 O+ ? ?- o- S: X" h2 l- K% i1 s$ a5 c5 L3 D
// UART 初始化4 }3 \+ G6 P8 B+ w
UARTInit();
! U r" {. g4 j% u; I) E/ e# W1 k( ^: u h2 q
// UART 中断初始化8 ^6 t1 B3 P# D
UARTInterruptInit();7 d) h7 l+ @, c: L
5 p* a0 l5 U% I8 W3 u. k/ o' r. G
// 主循环
6 \5 {! U" z+ J# { for(;;)
2 x3 `" l _2 L: a {% \- k$ M& z( P4 N2 U) A* G+ j( ^
; D+ M( e6 l; c8 a1 L }
! ]) Y- {5 Y+ e# R# [% X5 b}
% Y% ]9 P2 t- H/ P1 c0 Z+ z/ D# J' W% Z% ~7 e# W- i# S! P
/****************************************************************************/' a0 [2 f) x% W
/* */, V, o E3 D# i; R0 k8 p# v9 f
/* PSC 初始化 */
8 ~1 O# V+ O3 j- @* p- A/* */
- ^9 |+ r7 w1 M5 O/****************************************************************************/7 m, q4 ], A* l0 k" q
void PSCInit(void)8 z K1 a4 Y! S4 {+ _4 ]
{
8 K/ ]) Z+ j" L% M // 对相应外设模块的使能也可以在 BootLoader 中完成0 Y# v& I3 z' Q7 r% k
// 使能 UART2 模块 K8 v7 j$ a6 f, O3 I
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);! y2 z9 v7 W+ A$ y( K* E6 U
}2 ?' g X9 d$ R: e
X' T- u6 m/ Y b. o% F' S/****************************************************************************/ T t7 _- ]2 f6 h
/* */$ w! ]# v. I" A1 n) C( g
/* GPIO 管脚复用配置 */
# X: }) V( G5 p+ o0 D$ V/* */) l+ ^' n) D9 G6 m, S& ^
/****************************************************************************/
9 r, A. q0 W+ {9 F/ Tvoid GPIOBankPinMuxSet(void)
& N+ t3 u/ |0 ^{
& o; E: c) T) l1 X) Z // UART2 禁用流控
$ Y! ?% O/ Z5 |4 W% c3 X UARTPinMuxSetup(2, FALSE);9 h1 u( [, Q2 Z) f
}
7 }4 C' U: D3 y$ }1 ?# t5 g4 k( B
/****************************************************************************/ e D' _* Q/ p W
/* */) Q1 G7 S: x( X; v* l7 Y0 Z
/* ARM 中断初始化 */2 |/ ~ \% |* f& L5 `! d8 ^+ d; N
/* */
2 k m9 r& u/ f' Z/****************************************************************************/
: R: c0 {0 Q+ F; V# r; q; K6 hvoid InterruptInit(void). F4 {. A X& ?# W+ |8 v' Z* Y4 J7 _
{
- ^- A; N2 @ I# k) B // 初始化 ARM 中断控制器
$ X! W2 I, R' c$ D! \; n IntAINTCInit();
8 D5 Q7 o! m1 |7 n$ @, j% J0 n
1 E1 f, h9 g" L% v) \' N // 使能 IRQ(CPSR)
6 Y3 ?' X% ]6 ^; M$ Z+ w- `0 \ IntMasterIRQEnable();, H! v2 f' G( h" N" Q' ~6 `6 T
3 [5 b- R" |( R0 R8 [/ X
// 使能中断(AINTC GER)
1 }9 q$ P8 G. Z! \/ `$ r" S IntGlobalEnable();" j. H; k8 \8 B" R# `
5 ^8 r4 L& @" m! V6 s6 l1 g( f // 使能中断(AINTC HIER)
: t7 k2 L; ~4 M IntIRQEnable();( }! b- R& S6 e. N3 k6 Z
}
3 h' ?( V" X- } v3 c3 x! m' e$ U7 ^4 T: p9 C
/****************************************************************************/
; X+ H O0 H; o* Q; @( S& \/* */
2 j: D$ \0 ?' Z6 @4 c& o) i/* UART 初始化 */
9 Q; g$ e$ u% R3 ]1 @! j9 |/* */7 ^$ [1 |8 H* Y7 X
/****************************************************************************/
6 C! ^/ S" B1 A N$ g9 nvoid UARTInit(void)1 j* P( S& b) X h
{; f: N: B; i% {4 o5 C% K
// 配置 UART2 参数
7 J7 B* X1 u2 g i; R( R) u; u" ?4 d // 波特率 115200 数据位 8 停止位 1 无校验位
( X, \+ A* ^( D' F UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
) l; N9 W; ^5 ]# r: Y( D5 [ UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
, j' X* ~# \3 P9 |+ J // 使能 UART28 D5 h/ I1 U/ K% j
UARTEnable(SOC_UART_2_REGS);
H& `' f5 ^9 X$ L5 L7 W6 l" N' B$ }" |8 \) t7 ~0 s
// 使能接收 / 发送 FIFO
& F5 d, }1 ?8 X" g. L# x3 o/ Q UARTFIFOEnable(SOC_UART_2_REGS);4 r7 f5 @" }5 Q- ~0 K+ ` B/ K
7 n2 Z+ o8 a9 a // 设置 FIFO 级别
) w8 J6 m; P6 m( X& S UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
+ S: p* h2 n( w& e8 F0 O- {}
& F* g% i5 n3 X2 U+ h
& E) `: r7 g& C# W- w/****************************************************************************/
5 Z A: V! Y5 S/* */: ^3 b; M4 m+ k5 J& B) t e7 P! b
/* UART 中断初始化 */
$ y% u. ^$ v& u! t4 _$ j' z: E6 P% p3 s/* */
' \! o C4 x; b& Y) A( C5 P/****************************************************************************/
% u, u ?: R! a7 g( I0 m3 Jvoid UARTInterruptInit(void)
) N/ k0 |2 l7 U% C. C; j' Q4 D{
% i. e% M- i1 j* g% O7 T' H/ j) d1 P IntRegister(SYS_INT_UARTINT2, UARTIsr);3 H( v6 c; E8 x$ l
IntChannelSet(SYS_INT_UARTINT2, 2);+ B) o7 O7 U; Y+ P) l' j" v9 @4 J
IntSystemEnable(SYS_INT_UARTINT2);. w* D1 N! ]# b8 e- c
3 I1 p% v2 a* z
// 使能中断8 R6 K. F; @4 w
unsigned int intFlags = 0;
+ E" X' e$ |; b intFlags |= (UART_INT_LINE_STAT | \
& m0 f+ M: n- f- D C UART_INT_TX_EMPTY | \& m4 O6 E( F& { O( \# f+ f
UART_INT_RXDATA_CTI);7 _" r* p& X8 l! E* V. u* g
UARTIntEnable(SOC_UART_2_REGS, intFlags);4 z# i( ^, t, H* G% P. s
}2 W, G2 {& O; O, n
* |( u0 ?4 D( V) B q; f. s( _% t% k/****************************************************************************/
/ ^4 u$ Q' v1 k) D, K* m4 u2 D: P/* */6 x2 H- ~- d! T: F4 h: b
/* UART 中断服务函数 */
2 @% C& B" ?, @. q0 G1 _/* */" I+ V" {: ]$ s/ {2 P7 N6 L
/****************************************************************************/, U4 K+ k. c" y- b! Z1 C7 N# l
void UARTIsr()
3 i3 R# T5 D1 J6 N1 Y8 t) J{" o* Q0 v. ? r( I: u1 {' q2 C
static unsigned int length = sizeof(txArray);
$ [1 Y. B: n5 O. {; e static unsigned int count = 0;4 h" K. y- [0 S5 A5 |0 p7 K
unsigned char rxData = 0;
8 H$ R. F6 {" T) B: ~ unsigned int int_id = 0;; h# l8 i" V8 z; @; p& t* {' p
& q$ r1 \" M9 A! H6 j8 |
// 确定中断源" s3 x. x0 v4 k* Y' Z9 J
int_id = UARTIntStatus(SOC_UART_2_REGS);" ? D8 D3 |1 O! @
# E) @" g, b, {- |( z' B4 W // 清除 UART2 系统中断
' D9 K, N0 R b0 J3 }( y8 I IntSystemStatusClear(SYS_INT_UARTINT2); e; w0 C2 O% t' C3 R
% ~9 b& d& F/ x* y
// 发送中断2 s3 f8 n; u& x
if(UART_INTID_TX_EMPTY == int_id)
$ h+ l! j p$ Z0 A/ u+ n# b {1 k9 k6 N# ^6 u5 `7 x! L
if(0 < length)4 `+ n0 v, o; d; x2 A4 ]
{$ `8 t5 L. |; M$ s
// 写一个字节到 THR
% Y* u7 f3 q: R) I1 m9 z UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);/ T) Z) V( b. e! w
length--;$ J7 {. j/ O- p8 E
count++;2 e. S }5 q% J( ~, H7 m: i) P
}# u6 [( M- `2 n9 d A4 K; L5 {
if(0 == length)
6 l9 f, P# Y) i, O {% `0 d* _1 g$ h
// 禁用发送中断
! s5 o1 `1 i* ]. X( h, ?6 C UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
* N- t: ~! Y' Q9 B0 n }; c. U: \4 Q8 G9 K, w/ S* p
}
4 X7 ^, e ^( t/ h3 _! u) U
! m, g9 |% d( h4 i2 i& B, X5 G // 接收中断# k; @) [, q/ ^* N7 z O7 W
if(UART_INTID_RX_DATA == int_id)8 Q! A% }: G% K* Y' a. ~
{
3 t, K! \, ?2 C- n rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
( T' F1 P* X# m( \
: f1 T2 @# n1 D8 o UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);4 V+ f( o+ K% a- y: g1 j3 T; L
}" s# H$ \/ U$ k# K* M7 L
( W2 t$ x5 H3 R // 接收错误* S5 ?5 J% j6 b
if(UART_INTID_RX_LINE_STAT == int_id)0 l" v, Q: M# H1 S( B1 y( b
{
/ I& Z) c K/ _% {# _" E/ W8 w while(UARTRxErrorGet(SOC_UART_2_REGS))2 D" y) N+ A# j' d
{8 `4 E5 V% S% [
// 从 RBR 读一个字节
( R6 q! b5 w8 |) d% R9 W7 U! Z% }: M UARTCharGetNonBlocking(SOC_UART_2_REGS);9 v% P; ]! h9 e! W
}8 `/ U4 o! q; Z
}# h& r- s- J5 X7 }4 a; s" s9 s) _
* C. v6 H' H. C4 I) r return;
: A+ q" x8 j0 K7 f0 L4 b" x}
1 ?$ M5 _. V1 R! O3 R |
|