5 Q* y- R9 U! N1 n( a/ O // ECAP2 / APWM2方向设置为输入* ~9 }# A r* S# A/ ]
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]% C3 H* Q+ \3 B, i9 K
}6 j. l: G/ i9 V7 _) K4 H* G
& s: _( |( M0 k% K6 H1 N# S
/****************************************************************************/5 i/ K- }, |' q" l- @
/* */ ; P. R# g! ]% F! W1 D. q# v% z9 [/* PWM 输出波形 */ ! R: c8 n8 U5 }+ h9 h9 @/* */ 5 I2 {% n7 e( D, P/****************************************************************************/! P+ }# O- @/ w5 t
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)6 T) ]/ L$ b! P" q+ l
{ 1 U3 ~7 {8 A7 [ // 时间基准配置 0 Q) l& m# r% g5 P" L/ d* f // 时钟配置 ; @- o# Y( @% P& s EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ); # W( Z% D0 G& \7 ]9 ~0 O6 K1 p" A W3 v# K4 W6 H6 @
// 配置周期# \5 n- {. s1 j
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL, * |6 U- V5 C. w) E7 J pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);, {! s: R! Q; ~8 V {
! b J$ R+ B: J( T( l3 i
// 禁用输入同步信号 ) p1 J+ ~% d- n" @6 R2 | EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);6 A, p* }: U. E" L% R& H$ R
0 i" J5 f4 Q L. p, Q' n4 A9 @ // 禁用输出同步信号 6 ^' h4 ~$ y) e0 A# P. G, w EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);) E. k l. o k" Q+ Z
# K4 H/ ~1 e9 D2 e // 仿真(DEBUG)模式行为配置 8 p- }2 h* g4 G8 ?+ g) V EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT); & e7 q5 C4 V- V2 f6 U # i! j. Z. q, Y" N // 配置计数比较器子模块* W7 y# ~2 u0 W U# W1 a/ e
// 加载比较器 A 值 1 ?; y6 }1 ]! {2 K3 K! v6 W: c& Q EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,, I4 t$ E/ I1 G) t! [- @
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);! ^7 p0 s, A) V5 Q7 w6 A, |1 U. ?
( j- J* U( g. k D // 加载比较器 B 值8 P5 n1 c% U) `; N5 ?! l$ y
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,. X* K+ [! \7 [2 |1 h* T
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL); " M6 U$ o' A' L: J) g( j ; P0 J) U5 I" M // 功能限定配置(输出引脚触发方式设定)8 {' U7 Z( n/ {7 h$ Q2 d
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出; ]8 x. y# v y8 |
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING," G3 y1 f: r* X. p" Z
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,2 B5 d# f3 F4 J$ j) [
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);$ T5 R. M6 \* b
# T: h3 S- p0 m7 F // 禁用(旁路,信号直接输出到斩波子模块)死区模块0 E4 m$ Q& i# e/ h8 q' ^# E
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS); 6 m; {) P! g. N# T _. {" ?5 w; D, `! m' l, M, f
// 禁用斩波子模块* ~, |) t3 Q% {- n: F
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS); - n" L2 _5 o. _8 Q& H4 u9 t* C! t. E3 O3 I( ?! R# y. r; Y/ z
// 禁用错误控制事件' o3 Z9 H& I u# @- o& G. P7 e5 k4 r
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);; ]0 v. p7 s( C
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE); & U$ g7 |0 }& c) M & h9 A2 H) v$ f, B: | // 事件触发配置1 ]/ H m' g$ d4 ~. i& B9 `
// 每三次事件发生产生中断 ) B; ?2 [; _3 {5 r, A EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);3 ]' D% Z' k. p$ n- w* G, K. h z
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件1 H# j6 Z: E& _/ I
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC); " I' y# s2 R! P; x$ S( W3 j/ R // 使能中断' g' f5 e- `* q
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS); $ J) E: G/ r0 }. }/ O6 [! M+ v4 s- I1 n, Z
// 禁用高精度子模块3 ?4 I* e5 I7 o& Z0 U
EHRPWMHRDisable(SOC_EHRPWM_1_REGS); ' A' U5 Q# }; i0 }1 q. c) @: [5 C! h1 g6 z* u
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio); v( u2 R# R2 u1 T9 U7 X% O( A} 6 Y" L8 @/ x& o3 X1 T1 e Y. Y& |
void ChopperWaveform(void)5 W2 m5 C+ w5 [4 f. m0 S" O
{ . Y: h& S, @, S, c // 50% 占空比3 M$ ~7 R+ P& ]; \4 e2 c" [8 j. k
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER); + Z% m* Q8 G- ]6 ] k+ ~9 z // 4 分频" h2 U, d3 W' [! ~/ m: Z' I: v
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);; N5 a/ u. J" m1 l
// 单个脉冲宽度$ C4 L8 I; ~# b
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);2 [) Y& L9 a6 E
// 使能斩波子模块 6 f8 h2 W+ j8 ?! R EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);) i& E+ p) Z, F" h" {3 l
} 7 I! R2 ]$ j+ B( Y9 N. D0 X4 `* i( ?9 y4 c9 P% L
/****************************************************************************/ , c; N, A. q: _7 H1 u1 k/* */0 W0 `- I5 W0 i7 N
/* PWM 中断初始化 */ 2 V: ]: o4 l4 F; p; x2 D1 c) z9 a/* */ # h0 ?2 i8 D. c" O6 S7 J/****************************************************************************/ ! J& O% C/ Z" ovoid PWMInterruptInit(void) " I8 a/ X; b% R4 M _6 V$ \{ 0 X* k) e- r) ? // 注册中断服务函数 ) u" h" G/ U% T* _2 X IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);0 I; B$ O- q, Z; O: G4 j1 q
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr); 5 z. h, p( \0 j3 S" }6 { ( q% F5 ?; T/ W/ ^) n // 映射中断) y; x; J4 B) ]( _
IntChannelSet(SYS_INT_EHRPWM1, 2); ) ~) X# j# @* w IntChannelSet(SYS_INT_EHRPWM1TZ, 3); : ]& K0 H2 w( t7 O* F. F; k3 C2 r1 u. `* D" Q
// 使能中断 9 P- O* q/ n1 k, F9 c: S, ~" e IntSystemEnable(SYS_INT_EHRPWM1);3 @: B! N* V* w. c; X) q
IntSystemEnable(SYS_INT_EHRPWM1TZ); " J' R/ ~+ {, t% p$ Q}+ f- X- I4 B) A j
" j% e& G/ ~. r* A! V
/****************************************************************************/: o3 L' \& i" h. u
/* */9 i7 @* h% E. S9 u! x- e
/* ARM 中断初始化 */7 i6 @% i- S9 T( C% c7 m
/* */ / e8 f4 R& G1 q* B i: ]/****************************************************************************/' Z0 v4 q* I: p6 H+ H5 F) A, a4 w
void InterruptInit(void) 6 C' B9 _0 l) a" ?9 Q{' D& H! K. B4 q0 g6 }5 d
// 初始化 ARM 中断控制器2 Q7 U) ^9 X8 n5 d0 m
IntAINTCInit(); ' F$ X& ~& k \ 3 \3 Q$ U/ _; l8 Y- w // 使能 IRQ(CPSR)& @/ T; e" v' o5 Q8 k: \5 \# {
IntMasterIRQEnable();. V" B/ [3 z0 |" f5 [! [ P
& k% m: `- A6 h // 使能中断(AINTC GER)) S0 L) h/ [( I& j2 @ f
IntGlobalEnable();7 M" S" ~4 F& {
' c4 Y* Y/ g: a
// 使能中断(AINTC HIER)0 G" k+ g/ [% m( V
IntIRQEnable(); 1 F+ f! n2 x3 R# @& s} , g3 q' D8 ^, B k T6 W , n+ ]4 {0 Q9 l作者: 浙江第一帅 时间: 2018-10-30 17:03
/****************************************************************************/ % |' a2 Y. G5 Y/* */$ v! ?" t4 M8 Z) x" w' Q! |
/* 中断服务函数 */0 P) K+ F. b" x& D0 l7 ?7 O1 Z
/* */8 O( S( H0 V: o! R+ P! I9 `
/****************************************************************************/: u5 r; ~7 c, _3 J. U# R2 E1 b
void PWMEventIsr(void)' @# k) l8 G0 j+ N3 t
{, N6 Y g3 {7 P% D( F
IntSystemStatusClear(SYS_INT_EHRPWM1);# J1 R/ c+ I* E, V5 L6 s- k: A
; G! c, ]( I% {3 a
EHRPWMETIntClear(SOC_EHRPWM_1_REGS); ; r4 Y1 N1 C* m}" |- f) G3 i5 g+ b. I
7 y) L8 J/ I% ]) Y. b
void PWMTZIsr(void)$ i) W( P+ J: C' d5 h6 m, {
{( ^0 O, }5 E5 ^1 |7 x. i _
IntSystemStatusClear(SYS_INT_EHRPWM1TZ); ; ?; \7 V7 Z$ n2 V' h" v, f4 b2 Z/ d# ~9 J2 w* T3 T" Q
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);. t) a5 N+ J4 J, F, ~3 S- b/ n
} 1 `# z" c' Q# X 2 R( T) E0 _6 s6 ]6 ^$ v& N/****************************************************************************/ ) m; v1 o6 c& e/* */. [( M6 g1 Y5 x. T5 P, e! ~: T
/* 初始化捕获模块 */ ' u. W4 e! q! t+ H2 W7 ^/* */9 W3 Q: O( F" x( q( v4 Q1 `9 y' l6 \
/****************************************************************************/ ; e7 M. v' Q, \$ `1 c1 h( X* @8 C Evoid ECAPInit(void), \0 R3 Q. x7 `, T" A2 l9 b
{& [2 a5 f. E# w1 N% f
/*-----设置 ECCTL1-----*/3 a& I* w1 \2 T K
// 使能CAP寄存器装载( j5 q# y0 O( K9 A) [4 B
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS); 1 N9 a7 T8 r9 Y/ y9 n; G, `* |8 n( Y // 设置预分频值. - d4 P" X2 h. k( J ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0); 9 Y1 Y. t2 u! Z. R2 F p. ?3 @. ]0 Y // 上升沿触发捕获事件 - C1 ~. M, Y$ n# i) Z ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0); 0 C" K1 U) n7 ]' w. [* {0 Q9 P // 输入捕获后重新装载计数器值. , f" C$ w3 Q+ m3 d+ g/ y ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);$ j9 L# x& u) j' f( i
/ M4 v: k) C7 m5 E$ d2 K
/*-----设置 ECCTL2-----*/% v. [' i `8 v; j6 T4 k
// 连续模式+ y2 O/ p/ U; L/ g$ o& c0 P% g# {
ECAPContinousModeConfig(SOC_ECAP_2_REGS); ! `& i% n$ Z& t, f: z% S! } // ECAP计数器TSCTR持续计数9 P1 D2 {4 w6 F7 k# j
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING); , l* s/ n. _4 U2 V5 b // 禁用同步输出和同步输入( o5 I( v8 @, m0 h" k9 p
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE); : [: W. g P- o; E# p' I O. f // 配置 ECAP 2 为 CAPTURE 模式" r+ R; H |# U/ }
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);" b5 ~* o! X7 H6 n/ R1 G
9 E( t# B- Y O$ ]" J) X
// 使能中断 $ U+ Q+ B/ s9 t2 x* o9 @# s2 `; E" V// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);" J: l4 {4 q" e
}8 R2 ]8 A, N7 R: g$ Q9 \
& R4 K" ?& h! z- W/****************************************************************************/ - |4 b3 F: S% [0 i c: K" S5 ^/* */ , V' V& F; D& q: e1 s) o/ Y2 }/* 取得捕获结果 */$ E& u0 T8 r4 c9 W! a* t
/* */ . j$ H G4 Q$ z/****************************************************************************/ ! z* s6 E3 N K' z1 ]* ^unsigned int ECAPRead(void) & Y- M6 K! F1 e. v) s) s. ~: w{. N5 ^& q' K, V% Y* [5 [6 x
unsigned int capvalue;( [; y8 j! G# x; t) R7 O# Y0 h
unsigned long frequency;! A2 ?2 g5 B. R/ @
5 Q- N1 ^" x6 Z5 f+ ~
// Event1 中断标志 ! S3 I/ g; R/ K, x9 B if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT)); f }) K" s8 i+ |7 y6 l8 Z4 T
{" D8 |9 u6 S9 f0 q0 v: l
// 取得捕获计数 4 u+ m! ~6 ^; ~8 M B" O EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult); 7 m! |: X6 c4 ]3 @( \0 p capvalue = ECAPResult.cap1; - j8 Q; p; H# d5 G8 p1 k7 C9 ] % Y) \! d9 N6 n7 h0 d& v // CAPTRUE 模块 228M 时钟主频" H8 _7 b! N5 }6 R' V) n9 q5 W1 E5 v
frequency = 228000000/capvalue; ) u' b) Z0 ^/ q. [7 U$ T) k UARTprintf("ECAPRead:frequency = %d\r\n",frequency);( k' f" b/ {, A k# Y$ x+ K