9 X8 H3 I3 Z) p* y. f. V( \0 z8 W/****************************************************************************/: ~& Y) z; g7 P" U
/* */# |" {" i! \( A% L
/* 主函数 */2 w, }7 ?4 W; [& I- c" h$ L; y
/* */# ?# H( I) e9 Q( _$ n: n0 I
/****************************************************************************/6 Y. d4 `; z3 A9 `
int main(void)+ k: S% c7 u& g5 j
{ 6 v& J5 J" \! @% x, T // 外设使能配置 . V# q. {2 C" D PSCInit(); " E1 E8 E6 W7 V: B5 m8 e9 }2 a3 A: l$ n1 V; k# J* F
// 初始化串口终端 使用串口2 / T& _' S# u4 \" D/ w8 C T2 F4 u UARTStdioInit(); ) s1 `0 [& ?) V& B7 m8 g: c7 b E. d# c" s" P" D* o8 J+ ^ // GPIO 管脚复用配置- _# f5 P7 n) `% m P R: _, v
GPIOBankPinMuxSet();# s* i# j" J+ W. T6 y
9 a+ o6 g. j% n+ }7 N# F
// ARM 中断初始化 ( N0 C" U( g2 h+ [ InterruptInit();- N5 y) [' n9 q$ Q& y8 ~1 ^
: D- E4 m8 ?3 Z // PWM 中断初始化+ y- `/ F4 K$ U9 f. f% v6 }
PWMInterruptInit(); 6 i5 B8 Q# K2 P K9 d 9 X4 f: F$ e& C' h unsigned char i; & a+ x* m8 Z/ d [: j unsigned int j; 4 O; }8 L0 j( T- N: R8 U6 l2 q : \# ]# `2 v% B2 ] UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1); 3 J! N5 B" ^. q; T- V- R7 y. L f) C- I UARTPuts("------------------------------------------------------------\r\n", -1); / s6 e! e* k( c" |; R" K( _. t UARTPuts(" C6748 PWM Test\r\n\r\n", -1);$ Y* B! W3 F: n6 T- v* {; V5 p
// 产生波形) F) V& P* x7 P& j6 H3 L: b
PWM1ABasic(25000,50);$ X" x9 C. c& [+ G7 D
2 }& I5 e+ [4 ~/ c0 D1 ~) Y UARTPuts(" C6748 PWM Test Over!\r\n",-1); 0 r0 c6 \+ ~2 p! e9 r( y! w8 y UARTPuts("------------------------------------------------------------\r\n", -1);0 g" X5 R0 ^- |8 D5 X$ ^" S! q
" o# N. g6 r! X7 v, I5 z
, V& e# @- z( v' c. `
2 @/ [3 {4 H$ L5 n! e
UARTPuts("------------------------------------------------------------\r\n", -1);5 o% z7 H; g8 I( ^3 B4 G2 u# P
UARTPuts(" C6748 ECAP Test\r\n", -1); & {0 A9 C8 q: q: Q3 d // ECAP 捕获初始化 0 t; |. W+ C' l& v% m& L ECAPInit();! F# m, s$ e `$ b
UARTPuts("Initialize ECAP.......\r\n",-1); : ]: ~8 S: Y( O for(i=0;i<5;i++)0 ^- N. d* b a5 C6 p* z7 K
{ , x' h/ Q% u% F+ `2 e4 A U: E for(j=0x00FFFFFF;j>0;j--); // 延时 ; d3 {5 `# x. m/ C1 V8 m) q4 d ECAPRead();9 ]" Y2 Z, F4 f
}/ l" j/ r+ K& b% y* I1 a% C
UARTPuts("\r\n",-1); 4 C2 r2 ?4 y( o% {& C9 O UARTPuts(" C6748 ECAP Test Over!\r\n",-1); . C% @" i' A b$ i8 t% T UARTPuts("------------------------------------------------------------\r\n", -1); 7 ?- s3 l3 q3 z% P& C; d1 R # D( m* e) |5 L( B1 J$ p0 } // 主循环 C) B6 L; Z- E8 `- x8 J for(;;)/ R% r' |2 n U! i6 k6 M
{ 3 X( h; b: u" \ / ^: d0 Y! l0 ~& l$ t } % p- p5 B7 K) j( i5 ^} 6 G! k9 _* [7 E + ]6 p) f: W) Z5 X( I3 C, t5 s/****************************************************************************/+ U6 t( M1 [5 B: S% S/ U$ j
/* */* o3 _- r2 U5 U$ d+ T! t
/* PSC 初始化 */# u. E, m" ?7 O" V" d0 i& _
/* */ k: _3 o& I" f+ i1 q8 Z/****************************************************************************/ + J3 ]6 ?9 _/ Z$ J; lvoid PSCInit(void)5 ~, }$ \" }: c6 I4 w# ]0 A
{ ; ^" N& z1 O8 K9 \5 n // 使能 EHRPWM 和 ECAP 模块 ( L- \+ ?" N5 M& ]. V8 W // 对相应外设模块的使能也可以在 BootLoader 中完成7 y- B4 g4 l, |
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); 2 N2 T" f1 e6 R5 O) B, P7 v/ b0 ~ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); K, m, z5 H4 j+ y* @9 X
}3 K/ D s7 }; d0 ?( x
2 @1 ?; h6 M* }3 [. V
/****************************************************************************/ & H# v9 c. d+ W* ]/* */- ]: H5 R" z9 k) }3 R
/* GPIO 管脚复用配置 */ 0 _1 T7 y- Z0 h, {/* */ 3 R& }4 q$ L0 T( w4 Q) x# N: h5 t/****************************************************************************/" H4 h4 c) R% I! F+ D
void GPIOBankPinMuxSet(void) / z& a, R F+ k+ f{ ( l+ B: t/ ^1 |* _% k EHRPWM1PinMuxSetup();* ^" {# \1 D2 U! M, m5 r5 q- o; O
$ k3 _$ r% O/ ]; m // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)2 [6 v; x J3 [/ W
// 作为捕获功能时管脚方向为输入 1 X& F8 _0 ~" r8 }: s, K* F8 u // 作为辅助脉宽调制时管脚方向为输出4 ~4 k9 s U- W/ H+ b& ?: K1 Z1 H
// ECAP2 / APWM2 ; |0 @3 v+ s6 g$ f+ w ECAPPinMuxSetup(2);4 S# s/ }( J3 S/ g
& {3 d8 `, M8 H& L, |; d // ECAP2 / APWM2方向设置为输入/ O. }" o. t- _+ [3 l, n V. [6 A
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]6 j- N9 I2 z7 i" E3 r( g' P* n. W
}+ D( k' P a" c
/ C, _1 x" ^$ D6 s/****************************************************************************/! W4 V( j6 \; X, n1 P) ^) C, b
/* */ ( }+ h+ ~- y- l! h, S8 K# `, a/* PWM 输出波形 */ |" E h0 w p6 T2 p( V3 R% E/* */3 Y" e3 h C- r( A3 @) |0 ]0 `
/****************************************************************************/5 K$ H* h+ t1 c0 A9 m( \
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio) : s2 }9 R8 n; u5 A" _8 B o, ]{ 7 T- Q, U) ?4 o. ?% y- `2 k7 f) E // 时间基准配置 ! L d: p$ z% e* m0 W // 时钟配置2 @+ @9 ]' N, q% {
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);. R& y" m4 h3 e% C8 v+ ]
7 t# n% H$ a' L // 配置周期 . L! D. z, {! X$ U EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL, . m- E, K K) e* _ j pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);% P* u8 W7 @) f- e9 Q
) S- A/ }. H* n
// 禁用输入同步信号: D% h3 I/ j. I3 O9 s
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS); ' R7 }7 O. A1 T+ R1 p. M, _/ d# D" b/ v+ e) i
// 禁用输出同步信号; ?* o" P: c2 d
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE); ( b+ c5 X2 G K+ A# S( d3 J, Z# a& @0 g/ w4 z- V3 ~2 x
// 仿真(DEBUG)模式行为配置 4 @) {9 k8 l& t EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT); : A- V0 g ]$ ~$ q" y 1 |" l8 {; t) y6 J# W' l! S // 配置计数比较器子模块) a; f; O# l) L
// 加载比较器 A 值% u6 ?8 |) i7 c- q
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,% T# n& \, F5 C, ~* S' _2 y0 |9 H. ^: p
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);, A* _8 G# w s7 o/ d8 Y
; }, C) B2 S' t5 \) P2 z
// 加载比较器 B 值, u" w: [* X9 [# g, h
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE, , A( w4 h# e" {) k% f1 }4 M% T EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL); & S( ?; N4 I. R0 N q9 W5 I: F) w% I* J7 `! p; U/ s- \/ X
// 功能限定配置(输出引脚触发方式设定)+ R9 E. ?, ^6 @! r$ G
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出7 b2 a7 S! E$ I) N- G" n: T* W
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING, 7 O) I g3 x& m EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,0 D; Q( i! v6 J( N4 ?: N, |
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING); ! _1 a, Y" U) g6 J% D- J8 ^) Z& s0 Z5 S! K, D! d& u/ U
// 禁用(旁路,信号直接输出到斩波子模块)死区模块 5 K* b% b! h; i4 b EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);: i; b1 z9 @! I' [0 ]0 O; |
$ l% S2 N) R& S. }
// 禁用斩波子模块 # k' o# R' R; w' y" o5 k& y& m0 X EHRPWMChopperDisable(SOC_EHRPWM_1_REGS); 9 _5 m, @# Y% r: x 4 N8 `+ q7 L" z) S+ \0 L // 禁用错误控制事件 9 z" ?- B+ l0 u5 g/ Q" K EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);6 \, N3 G3 `& w8 }3 F
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE); ) C. ?4 `" Q |) ?: X9 b" R" q9 f, R j
// 事件触发配置 9 T, h2 q* {( Z9 q& |8 e; ^ // 每三次事件发生产生中断 ) A. |# u' v1 m8 B( y1 G. a" t' L EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);1 U8 J& e& k6 c
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件 0 }8 s8 g' R& K EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC); 5 l/ d) J4 @6 o% }3 ~$ F; J // 使能中断. S3 f, h! b4 ]2 F( {, B) g# I
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);2 d4 s) q+ D% ~4 D8 n
/ ?7 D1 p: J; g8 l) q0 ^+ H
// 禁用高精度子模块 4 b& V9 Q4 t6 v; O+ t7 k EHRPWMHRDisable(SOC_EHRPWM_1_REGS); / f2 i/ _8 ?) w; r' r0 m/ I- F# m3 H; S ~% j
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio); 3 S! z1 O1 j: @4 S6 x# ]}3 S1 H2 G/ ]8 k7 F6 M5 `6 g
6 E$ Y7 f6 l0 }, Cvoid ChopperWaveform(void) . o& k' f4 e# o# c{ ( ]. h2 d3 C" ^: [ // 50% 占空比 2 ` q8 R4 X, z, w- c5 m EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);+ `+ x, H" v2 l+ k
// 4 分频 7 Z Q* d* F& P3 j EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4); * M* ]* ~: A1 T7 ? // 单个脉冲宽度 & O1 `. Q5 l) @$ m% _ r3 u1 c EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF); ' c5 {) C& Q* c. D* Q! e- r/ b" A8 l // 使能斩波子模块 5 n, z; O9 a, }# s/ S; X2 l EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);; k5 O1 D: K. e; }
} ) S4 j" W' I s5 {7 G" h Y" ]: H7 \/ H2 i t% C. \
/****************************************************************************/" b# U# B; t7 i# Z9 e: w
/* */ 2 ~1 i& E7 N @- Y* C9 I/* PWM 中断初始化 */ - Y8 s/ r& A; d: K8 e/* */( x' k0 o9 R& U/ ?. R0 { y
/****************************************************************************/6 Q' o6 }, m% `" ~! ~. `
void PWMInterruptInit(void) - o9 Z" O# d' ~% I& o. N. W3 F& w, F( o{ ( {1 G, k; `5 u. E# W // 注册中断服务函数1 ^- [) G+ ? }1 I& W7 r
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);7 V9 c! ?% m h+ U9 k
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);% i( a. @/ C' G+ M9 j
5 ]8 s+ ]! |( p // 映射中断5 p6 N( S4 Z: V2 y! j
IntChannelSet(SYS_INT_EHRPWM1, 2); 4 U2 P* D# I9 a$ ]0 t IntChannelSet(SYS_INT_EHRPWM1TZ, 3);/ z4 O) O' U) [" \! t G {
6 M: Z5 O* t S2 `. E% p
// 使能中断 ' |/ T/ D, }9 N! A IntSystemEnable(SYS_INT_EHRPWM1);4 q9 X. I l, D# H/ J
IntSystemEnable(SYS_INT_EHRPWM1TZ); $ E: R* p a) v3 ?0 D} 5 r' U3 d+ W- J- g4 H. y- e/ f( R' q
/****************************************************************************/3 Q. a0 S; {; X0 o9 E. M6 H; F
/* */; l# R8 B* P9 \6 b7 W0 p6 c
/* ARM 中断初始化 */; i( ]% Z) b7 o4 R" @
/* */ * y# h4 Q, d7 q b) _, L/****************************************************************************/ ! _ H8 J4 Q$ X* A( p! l( Z1 Bvoid InterruptInit(void): f+ k6 M4 ~2 Z4 ?
{* i' P. ^2 q3 a; ~' s( A& \0 r
// 初始化 ARM 中断控制器9 S) I/ F* z& q3 Z6 M: O
IntAINTCInit(); 6 o% F( e: ?9 A, w% L ! A; x X9 G- O6 s3 O' U // 使能 IRQ(CPSR) + n2 N. h+ T$ D6 f: d9 q& `3 h* d IntMasterIRQEnable();: X4 L3 f; f- ~; s$ `
# j( z$ Y- y( T/ m/ h, [ ^0 g) m
// 使能中断(AINTC GER)0 Z5 q& m0 j9 t/ p; O m! t' W
IntGlobalEnable();7 M) H: _0 V3 O: g7 K8 l% f
% ]4 O# G2 O5 }9 I5 ~
// 使能中断(AINTC HIER) 7 n" \4 ^$ w# u/ E) t IntIRQEnable();7 N6 w" V6 J% Y. }& [6 }
} # B! }% l! ~0 c& Y0 Z 2 v+ I( w+ w9 i0 Z2 {* y8 x作者: 浙江第一帅 时间: 2018-10-30 17:03
/****************************************************************************/ # {$ S z: p* Z$ ~# ]/* */' n2 D# h- U( K
/* 中断服务函数 */+ h3 o F: K! z
/* */0 }: H& `8 B I* I" h5 y
/****************************************************************************/% K% E/ l% ?' O- c7 ~2 X3 `/ B
void PWMEventIsr(void) + |" R! g) f8 c8 h( S{7 b/ a1 E) b D; f- @* M. i
IntSystemStatusClear(SYS_INT_EHRPWM1); / j4 a" I |$ V9 H 2 u" ^& M7 @" y( T' \ EHRPWMETIntClear(SOC_EHRPWM_1_REGS);' K* v3 t! t( w: d, S: I
}9 _& y, Z1 U6 j0 H2 o) T; n
2 I5 {* a( |$ \; b: W
void PWMTZIsr(void) . ?) y% S2 T: O( K{ 0 o$ B" ^7 G2 \1 c/ n. o; I" Z+ w IntSystemStatusClear(SYS_INT_EHRPWM1TZ);3 P& ?- c9 t# p/ A! V
8 l! W0 e \# t8 m+ s6 F
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);/ o9 }/ W. t. Z# d |' K
}5 c: k; R' K; b
/ f5 Q6 w$ v% o: n& H$ s k
/****************************************************************************/: O; c4 \% L/ ?. m- \8 v4 X$ o
/* */: T. _3 Y$ m# B% Z
/* 初始化捕获模块 */3 V: ]& i @. `3 z2 T+ F
/* */& W# M$ R! q: P2 u1 L
/****************************************************************************/ 7 ?0 q+ `/ \$ q$ P2 ?, |void ECAPInit(void) - Q9 W/ A! S1 O9 E& k& p{ 4 L% W7 C1 d7 w1 h; ?) G) [ /*-----设置 ECCTL1-----*/( R H/ k/ w- O
// 使能CAP寄存器装载 0 _; i& F. {! r. y; q" x, i ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);) ?8 R1 b1 I6 ]& l4 N. }* [
// 设置预分频值. ' ]/ z) k0 D3 B ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);* C' ]7 Y$ ^! F7 M R8 ?
// 上升沿触发捕获事件 2 p8 c/ f- W. O5 {, H( Q ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);0 q" d( s5 k# I+ C2 |9 J* U
// 输入捕获后重新装载计数器值.% G K4 @! G0 d2 ?7 ~
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1); P: b' l ~- Y) ]) N) {) s2 h4 O0 |
/*-----设置 ECCTL2-----*/ : ]7 _+ M- p3 J9 P0 q' l8 n // 连续模式 8 K0 f2 ]% U$ g4 g9 l. v ECAPContinousModeConfig(SOC_ECAP_2_REGS);* I; y: T# }. K5 Z% k6 o
// ECAP计数器TSCTR持续计数 ( ~7 k/ G/ d7 p3 _5 `5 _0 ~" l ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING); 1 t. z5 {9 ~$ ^9 R; C. U9 _ // 禁用同步输出和同步输入 5 w) s5 P0 @# q9 y, i" Q! g ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE); 3 F ]9 f" v1 K5 I$ r( r% ^ // 配置 ECAP 2 为 CAPTURE 模式- v# p7 G$ @5 j
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE); ( X' S/ w1 E+ i0 j1 l1 U, l( N! O) U
// 使能中断- _) J. @/ {4 h
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT); ( B* v ^) B7 A3 d5 C6 `* F+ }5 x8 u} 7 k4 Z1 ^0 H9 q6 K$ g4 m- B+ F2 H2 s& u
/****************************************************************************/ : q- t' f5 V: G* Z/* */3 X; i# m: o1 t7 Q. b
/* 取得捕获结果 */ 5 M6 D3 R; D a) R2 V' V* n/* */ 2 m6 `2 L9 @. t0 J' X8 N/****************************************************************************/, h2 y* C: Q9 {( ^
unsigned int ECAPRead(void)% w5 `- J5 @$ [( Y5 W9 ]
{ + C6 M' A( W% l, ^. R unsigned int capvalue; 8 j4 p% p" [6 _, ^6 w unsigned long frequency; ! X* W0 A6 E8 c, @: c9 C% N t+ S' {5 x! _9 ~' j/ W // Event1 中断标志 + c% U- v ?# _& ~ if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))$ x3 Z4 C4 p& v7 s* F4 r
{ $ O, Z* ]- f Y, n3 Y // 取得捕获计数" F/ U+ \2 m' c2 h
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);, C, Q" t/ B' q, c! e% y0 o
capvalue = ECAPResult.cap1; % {" T; y. ^% E0 f 7 y5 K6 o: |7 e5 `, S // CAPTRUE 模块 228M 时钟主频 : K8 q% n, s8 s. E frequency = 228000000/capvalue;2 X# `- E1 ^* Z: F( H
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);0 t, o8 C+ e: ?0 Q {: _