|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/. F7 b- P0 ~3 I- l4 C
/* */& y2 n0 E$ F$ L0 s
/* 宏定义 */
* D ^, f! }/ G/* */
& ~( n+ @' ?: E- [* k3 _/****************************************************************************/: f% X, S% l7 l, [( P
// 软件断点
: W! T. e% ~2 Y5 _0 Y% L7 Y#define SW_BREAKPOINT asm(" SWBP 0 ");6 L8 G- b1 x0 z) J0 A i4 R
/ X+ q1 `8 {1 C n7 }0 A
// 时钟分频' w. Z+ y; a' W* s, \9 x
#define CLOCK_DIV_VAL 228! \' A5 o7 b, M$ B G6 Q' i
g# s, M7 t; h0 ^" a
/****************************************************************************/7 b( {2 O# S! F! @
/* */1 X# {' P+ `' E% y6 G& T- N$ b. B
/* 全局变量 */) N- E( t+ Z9 Y3 z0 ], @' l y- I% P
/* */
& T% u3 z1 O, j4 e/****************************************************************************/
3 N! a% ?4 c7 a2 ?$ q0 s7 nECAPCONTEXT ECAPResult;
" q+ p* F: S& J" @) @9 M4 O; |) A* ]6 O/ K+ Z
/****************************************************************************/
. p8 {. e+ ~: i" |. U4 b7 {6 a( h/* */1 v1 s' m- ^9 B' |! m
/* 函数声明 */
- x3 q: J G% ^( ]' Z/* */* m. P! ~8 _$ D2 l: D6 f- g* u/ u
/****************************************************************************/' u4 f# @+ C# p0 I
// 外设使能配置
0 l/ j0 c( ]7 avoid PSCInit(void);% j4 h5 i) O$ p1 u
+ `6 y) U7 u# U
// GPIO 管脚复用配置4 a6 Y9 l0 f. o$ @; h6 K" Q
void GPIOBankPinMuxSet();( E2 c! t! Z: {6 w" _0 L
6 {7 {; \8 ^0 y5 N" z// 产生波形
( h) ^3 R, L% K# f, x3 C% rvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
6 f. o* u3 m; m& d) g; ]' Lvoid ChopperWaveform(void);" B4 D! t% j' y. |8 J+ i
1 u. y( R5 Q' f; F
// ECAP初始化和读函数
' _# V5 A N8 j1 ?2 M- W# Kvoid ECAPInit(void);
; g" }) N% k" N+ t% Z& Xunsigned int ECAPRead(void);* b4 \0 k. b: z! l3 `7 s
' K; ^4 S$ k2 [' X3 S. I; M2 @//ARM 中断初始化
* X2 M6 h; l; \% D$ }void InterruptInit(void);5 p5 H0 D7 f! A
+ T/ d: P( n. \" A ]0 z8 S// PWM 中断初始化
U# Z C# _' y+ s. lvoid PWMInterruptInit(void);
3 _: M% W) d) Z4 F6 B9 L1 R// 中断服务函数3 K. E9 b' c5 |0 Y6 l6 n4 v. b: [
// PWM 事件
$ ?4 @7 m7 ~( ]4 H/ r/ M$ E5 x& Bvoid PWMEventIsr(void);( \0 G8 F5 j5 H* a
// PWM 错误控制事件, f. l9 p* F9 H) j! c' J. f
void PWMTZIsr(void);
; u0 K, f. D$ @8 x1 @. j; G2 F7 n! J
/****************************************************************************/
8 |2 f$ D$ Q% A1 z) S4 Q' D/* */
2 ?+ L. y( Q p* P( Y/* 主函数 */# m0 i( h: R- Y) e
/* */5 X" U3 ~) F4 n) y' K4 X
/****************************************************************************/
/ U1 w% T8 ]# T/ @+ vint main(void)& H# c! G0 `" J$ q
{$ s9 w2 {/ Q" {# j* t3 x+ Q
// 外设使能配置3 m" C. _# A6 {0 Y+ M" @% X
PSCInit();
5 a, O9 f' e- V+ P/ ]; L$ j, A0 I' ` d8 L4 C, B* k1 _6 z
// 初始化串口终端 使用串口2
6 T) U, N$ ^8 ~( j1 @$ U; g UARTStdioInit();
* G( F( u) D. T! N9 p# r * M1 J' g8 B( g% x1 a; T9 O0 g
// GPIO 管脚复用配置$ y' N: c0 M9 Q* A+ z: ]' O: V# ^ W
GPIOBankPinMuxSet();# }9 Y4 T7 X7 Q- w
: h% Q. n% `; C8 H; @ r. q: S G
// ARM 中断初始化
3 D8 f" Z3 @# N InterruptInit();
) k# x& F8 d$ k% }% L$ Z) G" C4 c D, A6 ^ Y& h$ B$ v2 P
// PWM 中断初始化/ X+ x- W, p3 J$ A8 }1 G! x- ^
PWMInterruptInit();
4 B7 Y; W5 W3 p" W" O
2 O- j7 M3 l t0 ^3 g unsigned char i;
$ ^7 E+ ~" H% H- [0 @+ H unsigned int j;
( X% Y' T% a* w2 D- q: V1 D$ p3 G+ N- D6 p! @2 n
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);! N' Q9 m( @4 w% L
UARTPuts("------------------------------------------------------------\r\n", -1);. ~9 O3 P' A2 q4 ~7 z
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
! w% {" `! \% H- ~3 H+ A // 产生波形+ a/ v& E# ]' V8 c
PWM1ABasic(25000,50);
; W R; A. b& P- S, R, D. |2 _9 x3 r7 ?% E p; X
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
( P9 S! d# c( Z1 C) [" Q6 ^ UARTPuts("------------------------------------------------------------\r\n", -1);
0 |" D, ^ O G. A" A" i/ j/ i2 n
) c- B* q; I! _- p$ |# y
8 e2 V6 v. A+ x- @( q# `8 @5 X/ F, r; e. {; N) [2 q9 f2 @" [7 n" g
UARTPuts("------------------------------------------------------------\r\n", -1);
! L6 g$ c3 j4 @- E+ b0 z) J UARTPuts(" C6748 ECAP Test\r\n", -1);! W6 \4 K6 Z: o8 J& D0 ~
// ECAP 捕获初始化9 O% z) ~) c7 ^! ]
ECAPInit();
+ I( A( T. w' ^! X$ n UARTPuts("Initialize ECAP.......\r\n",-1);
7 M5 h8 M% C* B3 v& B6 k for(i=0;i<5;i++)
; d/ c3 P2 o# A1 r( z. A {" |; _4 I' E4 L3 [! H( ^
for(j=0x00FFFFFF;j>0;j--); // 延时- z( y( _6 c$ Q
ECAPRead();
" r7 ^+ g- h' Z5 W: E' z }
& _8 s" G! @1 d# r1 M UARTPuts("\r\n",-1);
0 E% p3 h, A' |! s! r, l UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
/ R' J9 H, c2 w4 d/ s2 c6 c UARTPuts("------------------------------------------------------------\r\n", -1);* Z' Z$ B) g) v' S1 h8 R/ t" L
. k, ~3 ^& P$ |) f( g5 ?- r // 主循环) {; w8 n0 S# M' J' l/ d
for(;;)5 P: Q: ^" g; K. Z
{
: a/ \& p8 N: C. M: m8 t! I' T% Y' @1 H: S
}
, q$ ~ ~8 q; O. v! S2 d/ V9 N}
3 t5 S( n+ h% `. Z; Q& y) l% i4 R6 r+ S w: _, I; W* V
/****************************************************************************/
, d- ]" y- z3 V/* */
( l9 h% R. Y# H) I& r3 K7 a/* PSC 初始化 */( `: f# u1 i2 R2 y3 E+ O( y4 s
/* */$ @! D+ g" a! V2 c
/****************************************************************************/
! V4 k" N( }: ]' Y# X5 \2 W2 tvoid PSCInit(void)! e; n% A0 K: } m/ T# J
{- @$ W) x# C& g2 M9 X' H$ U6 a
// 使能 EHRPWM 和 ECAP 模块
- F: n* {2 X' M+ o+ n" A7 M // 对相应外设模块的使能也可以在 BootLoader 中完成
0 Q; S5 M5 T3 S0 { PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);( G& b; Y6 B. Y7 e7 ~( ~
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);! T3 H$ y1 i: B% H! |6 X
}# u2 X. G1 s( R: a
' [ D0 k: w5 x. ?/****************************************************************************/
( |" J1 S* ?3 \) t f0 D/* */
3 c) u( { X5 d; E4 ?& H$ P' G/* GPIO 管脚复用配置 */
3 `, E0 O( ~1 H8 k1 R$ J) U/* */* o7 L* b3 s7 R2 _) @
/****************************************************************************/3 o7 U! s" i( D1 A( A; u) Y
void GPIOBankPinMuxSet(void)
$ \0 Y; u) z9 s: j1 ^. y! d{
- y3 [& u0 s B1 S/ _ EHRPWM1PinMuxSetup();* K1 M% j7 \% A# g$ G! Y
7 k+ t% i4 ^$ X6 A- [$ J // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
; k! ]" r9 ~1 M/ i" e. V- E // 作为捕获功能时管脚方向为输入4 c* h' d! k& s* D
// 作为辅助脉宽调制时管脚方向为输出2 c% v: _2 b2 |7 I9 [
// ECAP2 / APWM2
" n* Z8 H$ C$ ~ i( n ECAPPinMuxSetup(2);8 W8 [& {) H, J. e, F
2 Z: G* J/ B! i6 j // ECAP2 / APWM2方向设置为输入7 x/ @. g4 N9 K% P% G
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]2 U3 H# h, ^6 S7 z
}
3 [ p. U$ D2 |8 p8 h) j/ q6 c/ I& T j4 s2 D' i% r; r
/****************************************************************************/2 @; J, d! J2 A# x2 _ Z7 W
/* */) f! }/ _! g) J0 |
/* PWM 输出波形 */- Y7 b! ~6 D0 s% s# f
/* */) K7 R, S- g+ M8 n7 v
/****************************************************************************/
& d6 d; x7 y4 }. Dvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)# e- f- C- {3 i! H# x1 U1 E
{
7 p& r$ g. }% N4 q$ r$ T& H // 时间基准配置* q$ D, q) W7 E$ }! S% @
// 时钟配置2 J7 D, J/ k) \
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);# _5 @4 G2 ^4 ~
% z. _: u- Y/ P6 R5 R& l+ ^ // 配置周期. F& Z3 E0 w" [' \. B' o6 O9 ]
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
. a- w$ |9 N$ j; B: f# j, [# D pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);8 Q& ]# \( W% F* G+ V/ [7 P
}" [$ n" S8 I, ]6 A" S3 n) L1 x$ U) n // 禁用输入同步信号: m, I0 C) p. c9 a w
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);' P G- j u" i8 n9 r
" o: O& b" `8 v: v7 d
// 禁用输出同步信号" b2 o/ R( m- w" m: M9 P) F8 I
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);+ ^2 F9 Q8 M5 G8 O1 w
' p: k/ M3 E7 E8 S1 l
// 仿真(DEBUG)模式行为配置
# m9 Z! `% q# k/ k/ ` EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
! l1 o5 b- v1 X5 z; e# i$ Z2 n1 ]5 t* h' f) X
// 配置计数比较器子模块
5 _" z" v1 a& w // 加载比较器 A 值/ c) L& j7 }( ^: Y
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
) ]6 H5 ]9 |, O$ P6 T# v EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
5 R+ }6 L9 U. E; e+ B& [' O
' M6 \: X; s8 g. t- U // 加载比较器 B 值3 |8 P. I+ h7 w; V/ X9 p
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,/ }9 T5 k- R# Y$ p* G
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
4 u" c5 X x) D$ v! ]. g/ ^
4 g7 G+ e" I' d7 \+ ^4 U // 功能限定配置(输出引脚触发方式设定)
0 p% R$ `/ E- i // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出) V) }- m/ j$ }" ~% V- P9 w
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,/ F0 `7 p. a, u6 c
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,( S2 ?- L/ M3 e# c9 \ {
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
0 q- p _4 H! o) R5 _$ s( T* W* T7 J0 w' [( q2 d$ W+ n$ w3 ~
// 禁用(旁路,信号直接输出到斩波子模块)死区模块8 `1 S- M0 t% t* u' n
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
' u# J% c5 W3 ?& j9 t( ^1 K" d
' c: E0 W9 O9 m1 s% K7 l& E // 禁用斩波子模块% [0 {* T( V# r' I
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);8 X$ V$ |! x9 W: n `
& t6 v: } S+ S& O, l' _
// 禁用错误控制事件
5 G) j' R0 T) Q EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);3 P; X- K7 ]# T0 I* W; V5 J
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
/ q9 g" U3 b' K+ L/ {5 {; l I
// 事件触发配置+ w5 O4 {( h- D7 s- y
// 每三次事件发生产生中断
2 f2 ^8 s- q6 H9 d4 V9 j EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
; w1 }) ?* T- h4 A( J" ~6 p9 f // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
; d0 Y( v& z5 a6 [+ s+ F EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
) M& x g: e) V p% {' A$ f // 使能中断
: v! b0 ?' C# E EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);/ h4 Q( T. Z! G" k9 @
- T/ ^( m2 v- q( g# @; M \( Y // 禁用高精度子模块
2 X# z" K9 p: ^: M. _ EHRPWMHRDisable(SOC_EHRPWM_1_REGS);3 p, {8 g& p4 Y/ P
2 z) C9 i' B4 q UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
2 o h" k' z& Y8 Y. N# G4 @3 K4 r}
0 ~, @2 I/ N( c) _
- h) ]9 V$ P; T2 L* hvoid ChopperWaveform(void)
2 x9 x* U9 P& L{
. R, G* ?% ]$ n9 ~ // 50% 占空比: c9 g2 D8 e8 O' Y5 E; p
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
; W' `6 T: u8 d# O6 i6 K7 | // 4 分频+ M# V# u5 m+ W3 p' P# _
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
& K [1 O# W6 c8 o; K6 I$ y- o // 单个脉冲宽度& i) n4 i- L4 Y+ j9 M S
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
$ w+ W4 w/ d. W // 使能斩波子模块$ \: V9 m- w. ~
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);) P: m4 ]+ y& T) F) O
}- R3 [7 A) y) h& o
. C7 w3 [3 l/ F0 u, _" k
/****************************************************************************/) K! D& ^& ?* G' C; m1 v0 J1 j, E u4 U5 N; F
/* */
" `( c+ `1 ]' n3 z$ h/* PWM 中断初始化 */% k' E Z! w8 L5 K5 _
/* */! T0 \" }+ {8 h7 ~% |& H
/****************************************************************************/- K% B: a- r) K. ]4 e ~
void PWMInterruptInit(void)8 P8 z0 h% V( ] [" w1 F0 Z
{2 ~- s8 B' A; `0 J4 I
// 注册中断服务函数
: w2 Q; R. ?4 i8 K; S6 r2 p' U* q IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
3 P; v/ O6 v2 Y% ?8 z: G* S IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
- ^% ^4 i I& z6 h
0 v0 U4 s! u4 a- v' f: Y0 L4 M8 b // 映射中断1 Y3 _: n' J7 z
IntChannelSet(SYS_INT_EHRPWM1, 2);
& I/ Y8 }7 J* ]7 } IntChannelSet(SYS_INT_EHRPWM1TZ, 3);6 A; m# i4 q, p& h3 r
/ x1 _4 J5 R& x: K& d/ |
// 使能中断
; o# ~1 h" J! m IntSystemEnable(SYS_INT_EHRPWM1);
z# }+ `* j) @3 M$ E6 J IntSystemEnable(SYS_INT_EHRPWM1TZ);
}2 E% L: T8 Y}, Y: L& g$ [$ B% e* H
+ R$ H1 f: N. q) K. g/ [; P/****************************************************************************/7 J$ \+ v. @& a9 k+ m' Y% {3 U
/* */
% R* i4 M5 d1 G% @! \/* ARM 中断初始化 */1 J: e2 v2 q/ ?: _
/* */
) y" h3 d7 `8 m; {8 O/****************************************************************************/
( s7 s) ^3 @9 F9 H3 ~/ Z5 K- mvoid InterruptInit(void)
& P# u7 V4 z0 m4 t2 h6 T0 n& T. K{
2 s6 G: g+ W1 G5 T3 o // 初始化 ARM 中断控制器
2 v, F8 }) q7 @% U, u! H IntAINTCInit();
: z$ p. F; c1 ~) e9 a
! y+ \, m! V% R. ? // 使能 IRQ(CPSR)0 Q+ h2 G D8 u* A' ^! C; I) K0 C
IntMasterIRQEnable();
+ |* o8 w0 b7 B H. l; A. g1 o) i0 ]& ?+ s: w/ X+ p
// 使能中断(AINTC GER)
! \6 E* R3 \4 g4 n5 [' r IntGlobalEnable();& y2 i# ^6 d/ @6 ^8 Z
) ]0 g. g; p8 R0 J
// 使能中断(AINTC HIER)
0 f+ m$ g( G( v- \6 C IntIRQEnable();3 q- `. ]) Y/ p/ }) n* m9 B
}& b7 B Y$ z* ?' ~: I! j0 x" w
: V v1 [3 @) Z |
|