|
沙发
楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。; `2 R }2 p1 R! k# D; e8 B6 z& s
: m4 }- a8 J& h5 m+ R# W7 }
#include "TL138.h" // 创龙 TL138 开发板相关声明8 v/ o% I) P8 F7 Q: B
0 B& a# C7 m3 V& ~4 p' I1 s' s: w
#include "hw_types.h" // 宏命令
! H \6 E6 l3 y#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
6 |/ v# F1 S3 }2 d$ v#include "soc_OMAPL138.h" // OMAPL138 外设寄存器* Z3 g' J/ M$ s" S6 T6 A
5 M% L, g9 N$ P5 f* j8 E#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明* A, D8 A& _( H( v/ b
#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
+ J1 t! M* s! X, A#include "uart.h" // 通用异步串口宏及设备抽象层函数声明
% K5 j/ M# H; @- _& J0 P0 V#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义9 m- q. T( i0 ?& x
" {7 U- d; n. {& B* A' j/****************************************************************************/
% V' K2 I% r* g/ s/* */
- t8 @' {6 j3 [6 m6 j' Y" w( R/* 宏定义 */
& V: N2 ?7 ?7 i, x5 m7 Q/* */
" T* }4 S# y) e; c' o* u9 X9 x/****************************************************************************/7 `6 H4 B0 Q& x( G# H6 w' G4 w7 |$ L- x
// 时钟0 x# b2 ?" z* t4 g! k- C( j9 Y
#define SYSCLK_1_FREQ (456000000)
5 @- q4 m2 c1 s3 m- I$ H) e#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
7 c# e5 N m: I5 ~#define UART_2_FREQ (SYSCLK_2_FREQ)
; U! ]+ K' r2 r7 z
6 Z, M1 @0 B& z9 K( s0 c. L: k/****************************************************************************/% n# ]8 W2 H5 u1 J+ ^) J
/* */$ w8 Q/ D. E: ]) o8 b+ ?9 Y
/* 全局变量 */7 R' E4 X6 b$ `( A: V
/* */# C: D+ A: R+ a4 o& B4 \
/****************************************************************************/# e" `% X- v, C1 ]
char txArray[] = "Tronlong UART2 Application......\n\r";7 i2 v- M- m2 A `5 O3 L/ R2 Z
1 f% a3 m1 a6 e8 {. A- l7 ]' g. A
/****************************************************************************/' S$ l' g) I& z" V" A2 H
/* */% Q% T% S7 f5 R6 h1 Q
/* 函数声明 */
) l; i0 H: s# S7 b+ c% q/* */
8 y: Q% ] c+ t/****************************************************************************/
3 K; O+ V3 A* s$ S3 [// 外设使能配置
, O$ c/ Q9 y1 p0 avoid PSCInit(void);5 D7 f9 ]3 K0 F0 a% p1 s( P
" Z8 M- v* `* J- _# r) c% r5 N// GPIO 管脚复用配置
- c: A8 C, j% J, ~void GPIOBankPinMuxSet();
! m4 o) [" s) _5 m Y) a% Z ^( E7 v% e" o/ W
// UART 初始化' r' u+ k U( l+ Q% A
void UARTInit(void);' m L, {4 o* O5 n) Z1 _
// ARM 中断初始化% m! w* X3 n% t. x7 @3 ^
void InterruptInit(void);
$ c1 ]- J6 `2 i( h0 e// UART 中断初始化1 H8 Y& p* D0 Y4 J1 W7 F5 i |
void UARTInterruptInit();* T+ z3 G+ `; T4 T3 o% c
// UART 中断服务函数5 I/ u6 I: {. |/ _0 W" T) c1 s
void UARTIsr(void);( L, l; a8 W" q) ?5 A U+ F" y
, [' |& Y! L. T( H1 R
/****************************************************************************/
- N3 V& |, O* ]* c1 ^1 Z" R/* */+ v3 y& s& C0 ~ d6 Q9 Q
/* 主函数 */
/ X, L' B+ N" f3 J( G/* */
/ m, V: {$ f7 t0 ], Z! ?# w# s/****************************************************************************/8 t' w- U! i- r
int main(void)4 Q6 _: ?' X: _! x. M: F8 j
{* ?& Q, T6 e# g( T. D4 {
// 外设使能配置2 z) l5 h5 K" J: r5 _
PSCInit();
' x0 X9 a/ M# u, n/ P- L $ i G3 c) y- |( V* [* k+ b
// GPIO 管脚复用配置
, `( Q% O4 m; i6 k! P- w GPIOBankPinMuxSet();; u- ~( g+ ~* Z( _2 u# K* `% y0 a
; X% E$ G9 y8 C) k( C' d# v // ARM 中断初始化 x! Y, y7 f8 E5 _5 C4 u
InterruptInit();/ M( Y- L$ U* i1 C
+ ]& h W9 Q$ Z7 W: G
// UART 初始化+ W( y" g% ~4 E1 z
UARTInit();
& X1 h5 p6 ]" Y3 a/ s5 m# e7 @3 q A( d W8 z" q
// UART 中断初始化7 k* `; B6 N8 a, t, \
UARTInterruptInit();5 L+ T. I6 G% \" t D1 s
, A' [4 I3 @+ _ // 主循环" v% ~" s' p2 r+ I. f) e/ X% c, j
for(;;)# M ?# z5 {* t3 V1 v/ a/ n
{
: G4 T9 b4 I! K& U0 A5 w( C8 S$ \( W" Y, D V! C6 J$ M
}" M/ M! |: D: A5 Q' B
}
0 A& L5 _1 H! C8 R6 o3 e2 V1 H# K$ q+ Q' p! ~0 _
/****************************************************************************/0 m+ Z: {1 u# h. c( E$ x/ J
/* */+ I' O3 j+ J0 G, H; `$ X
/* PSC 初始化 */' v, f; v: ~8 Y9 X+ q) w
/* */6 l2 c1 o2 B: d1 @( w
/****************************************************************************/1 x5 `. O+ c8 g3 L
void PSCInit(void)
% q4 h2 O, g4 V: y" y' K{
c; }' O0 o" D // 对相应外设模块的使能也可以在 BootLoader 中完成
7 K, {5 ~& C4 F1 s+ P // 使能 UART2 模块
T$ Z8 i1 q3 H PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);* z4 V2 E9 p! C0 B
}. ~/ m8 a) Q7 Z- N6 V
# a# `5 F) T' s/ p/****************************************************************************/
# X' v( w, A* L+ x6 W/* */# @# ^ c3 r$ s1 \/ Q
/* GPIO 管脚复用配置 */
/ x3 ~! B6 F& ]. ?/* */: l, u5 P5 v/ R1 e6 o
/****************************************************************************/1 O3 S$ q' k) v8 j2 p8 ~
void GPIOBankPinMuxSet(void)
& x: E" S1 E$ \' a$ z* W{; T! f2 C5 X8 a) n+ W
// UART2 禁用流控
$ K2 Q# p2 Z) L/ d/ v UARTPinMuxSetup(2, FALSE);
; o# b* ]" c1 o" Z}
. _2 l8 u& C9 B5 X
! o, s& Q8 P: n: E/****************************************************************************/+ I1 [8 ?$ V7 ^% a* s" L
/* */
) @) Y0 R! l; X, M* m% M4 x# c1 L/* ARM 中断初始化 */! }/ e6 F4 s m3 P# L5 _! k5 p
/* */
/ p) I: p# U4 ^3 F/****************************************************************************/$ u! J: d9 r7 Q; V6 j
void InterruptInit(void)
1 T. B! Z# J3 O9 [2 t6 }{
|/ q0 p# \8 O/ C6 T7 E // 初始化 ARM 中断控制器
" J1 ?8 M$ U8 R IntAINTCInit();
$ f) t1 \( r! T: F9 F: k$ m* s2 A0 E, _( e: W w2 E5 e
// 使能 IRQ(CPSR)
2 b. j0 e7 z$ S" o; L( e3 y; Q7 y IntMasterIRQEnable();7 U. Z$ ^5 I; r x
' x/ e0 n* M2 ~$ _0 U* ~( ?* h // 使能中断(AINTC GER)
2 |1 U8 W7 ^* o4 j+ @6 V; j U8 ~ IntGlobalEnable();( m8 R% m3 M+ i
. {9 t# K7 T# M* v
// 使能中断(AINTC HIER)
6 b6 j/ l O' ~4 g1 W6 C IntIRQEnable();
. M- x, y: i+ Y) E! D& a}& u$ Q ?" Y. ^& ~
9 B0 H9 K% g2 r! V) c' ~ p
/****************************************************************************/
% N: ?+ m. L+ ]$ Y1 L b% W+ `/* */
7 q( b+ [, S! l' W9 F. H8 F/* UART 初始化 */
4 r, e1 q- n& u" t4 Q3 @/* */% ], m5 d2 x2 Z$ w
/****************************************************************************/
! ^' ]0 B, U6 ^# B/ Avoid UARTInit(void)
; n$ ~9 Q. E: l2 K# U2 ^. V' B' C" Q{
; @: y2 ^# ?. X // 配置 UART2 参数
% ]! Q: \# K% u // 波特率 115200 数据位 8 停止位 1 无校验位6 s# Q8 g2 g; i' i! u1 q w, P9 o
UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,5 V, H& u8 H7 k! e( ~" T2 [ j
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
+ N) q/ C9 X+ ^; @ // 使能 UART2/ u3 j. {, s$ j. P: F! ~' y7 [' d
UARTEnable(SOC_UART_2_REGS);$ o8 Q: a) a+ I. R7 P0 i
' R0 W& |8 K2 Z2 K
// 使能接收 / 发送 FIFO
A+ P3 w- f" R! [: _. w, C, x UARTFIFOEnable(SOC_UART_2_REGS);+ h: `5 J% k9 ?4 P5 r( c5 B
1 ^ y% Q7 F3 v( |5 O$ e% n
// 设置 FIFO 级别0 M9 E; A) r2 I; ^: m
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
) ]6 n; ~. c S+ b; k* C}+ D# }; S4 S( S3 F2 _# V& H
/ N* A1 T/ w+ ^3 @) o( Z/****************************************************************************/) g1 ]* \6 X0 S- {9 {3 H9 B4 [
/* */
# o# Q2 f8 ^ j/* UART 中断初始化 */
; u& o7 [, }7 Y: B/* */# }* z+ D. v+ ], L
/****************************************************************************/
; k3 z$ U7 F2 U, W; [' e, vvoid UARTInterruptInit(void): z: ~ d3 z9 \7 |. o# i' S
{, H" n8 t! k& v% T8 S( m
IntRegister(SYS_INT_UARTINT2, UARTIsr);
4 m: W- E/ e3 Z1 ^; O IntChannelSet(SYS_INT_UARTINT2, 2);
, l; i- T7 y! W- g! R IntSystemEnable(SYS_INT_UARTINT2);
3 ]& n0 B/ ^( Q1 c0 ]3 m/ \% x
( U2 E$ T. L/ r0 z* n3 d: _0 s // 使能中断% j! a1 N7 Z! z9 e2 b
unsigned int intFlags = 0;
4 S0 b) q6 ~# i: b intFlags |= (UART_INT_LINE_STAT | \
6 u; X' z0 {/ ~) p# c% l$ _/ N UART_INT_TX_EMPTY | \
* S4 s+ R! }6 T: ^# y5 x9 o6 L UART_INT_RXDATA_CTI);
9 V7 f& n3 s Z; g( a UARTIntEnable(SOC_UART_2_REGS, intFlags);
. R2 d; f6 g4 g. b3 n; i; r}2 N* `; O9 s& H, @( R
2 j3 H( J: V4 {0 P1 }* y& Y7 E& e/****************************************************************************/
7 U" k$ }* x( o/* */* f$ i2 C* u/ e4 c( R) }, A% [
/* UART 中断服务函数 */
2 R1 r) v- h/ `: S- {/ V2 U( ^/* */$ |* H7 Q& U+ v% t0 w% @
/****************************************************************************/) N: c T, X# o: B
void UARTIsr()9 G; m* ?; k- g z- o$ r2 [% d
{
# b5 d. Z8 @* u1 Q4 {, ?. Z& n static unsigned int length = sizeof(txArray);! }! ?4 p$ d; K& S/ E3 s1 F! u& e
static unsigned int count = 0;
4 m# | @2 ~- a* N unsigned char rxData = 0;, A$ W7 G; c& u7 q/ O
unsigned int int_id = 0;3 n0 I. c6 O& k6 O) _
' N% |/ \/ y5 y8 s" a // 确定中断源
/ ~2 A: A, J$ h' Y- h2 ?' k int_id = UARTIntStatus(SOC_UART_2_REGS);
+ l7 U: J, M: ]' z& h5 K, K+ k
' F& r* M2 @0 C5 B8 ?4 f9 K1 Z // 清除 UART2 系统中断
) t7 K. X6 v+ f( u( q IntSystemStatusClear(SYS_INT_UARTINT2);
_* K0 ]0 }, s$ G( Y" D9 h4 _ j6 E' k) D! q
// 发送中断( x; a' X; R7 C0 p/ g; ~
if(UART_INTID_TX_EMPTY == int_id)
$ I- U. k/ u0 C1 b- W, i& O {
; W# f: j8 R! D! L/ E$ A; O if(0 < length)
. M# z' D! G [ {7 f' M; O2 C4 O* J2 ]( j
// 写一个字节到 THR% M% n' m' ^* E& p) g6 O( e
UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
" ~4 F, `9 k& Z+ z, C0 [# R; U length--;7 G# t5 O( t% r. D2 n
count++;
. I% C! `. x$ F4 g9 E }: W5 G- r9 k) }6 T( z) D
if(0 == length)3 D9 i- E$ O& D# g* ^! i
{/ J# c9 S4 A$ B) j4 }; D/ t9 G
// 禁用发送中断
3 I! x& t& p/ ]4 V UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);
& a/ F( E% I: X( C+ x! V/ l }* S% g; s* s% y# H3 ~6 W9 w
}& P! U) `, h6 w
7 e0 e6 t% s, h4 ^
// 接收中断
9 z5 b5 i& J4 w; k$ U if(UART_INTID_RX_DATA == int_id)
5 X" m9 T1 I7 \ {
# q4 N! t+ | Q. | rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
) F9 f1 X0 ~: A* O9 y+ N2 n7 q1 O- f4 l
UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);4 v8 j' b; P2 g ~. P/ ?
}
5 P5 Q, E! J$ i; y3 ^/ J$ r& s( G, J& K. p$ l8 U1 L, D
// 接收错误: g+ i/ E, V7 m, ~- ~: K
if(UART_INTID_RX_LINE_STAT == int_id)
# h" X* X+ ]7 N {9 _' ` t% F r2 ?, @' B' L
while(UARTRxErrorGet(SOC_UART_2_REGS))
+ {. S. S3 j( x- f( N3 r {
) ^, i) b( i( m: `9 z+ l/ A // 从 RBR 读一个字节
1 B$ R& m# y$ A! J, e UARTCharGetNonBlocking(SOC_UART_2_REGS);
' n3 P1 W" S5 \0 q" z% I- a; ~7 x }
+ H6 o* T& j8 V }
6 B* }6 y( J" o
6 r1 \: s4 J! F5 w- d# u5 } return;
. K/ B7 T6 H( K$ N}
! j' d1 f& g b$ ] |
|