|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
& V8 e* z! `2 [- t( m9 l! L/* */
1 O/ _' Y6 M: O a6 O7 y+ t/* 宏定义 */: W( w- i1 Z w
/* */
8 c7 Q7 b) w: d Y9 ]" _: e _/****************************************************************************/
) s) s. F- M4 @7 l// 软件断点
* h+ {. @8 p4 G#define SW_BREAKPOINT asm(" SWBP 0 ");
: |: ?" G, W' }3 X0 I$ u9 m$ B( ]+ z8 W) {
// 时钟分频 ^8 [4 M7 K6 U- J& Y
#define CLOCK_DIV_VAL 228
* W. w* G6 ?0 O1 V2 E+ R8 O4 P- ]7 \, b& t1 j7 L D% o( R
/****************************************************************************/7 _3 H( H: u/ [# Q) f0 q# u
/* *// p- G# z3 d8 e. O
/* 全局变量 */) b/ o: L/ [% L8 N/ M4 X; [
/* */. Z! L/ w& Z; E3 p0 c
/****************************************************************************/: E0 s* U1 B% B5 x$ w
ECAPCONTEXT ECAPResult;0 d7 U0 P2 F1 p2 u
1 c: ~- c2 A X/****************************************************************************/
+ ^1 I' C% A4 n3 c) H% [' x) h1 D/* */
\2 @4 H' d. ^/* 函数声明 */
1 }- `( O o' `/* */% M6 E6 P. [1 K' [
/****************************************************************************/. t0 A" g0 ?- }2 \/ e5 P) U, x) @
// 外设使能配置" c+ C6 m4 g8 J. V" B! P, k# T
void PSCInit(void);
" }8 Q. t2 j) O# O5 b1 s" z" s' B& A/ ]# i
// GPIO 管脚复用配置" i# G g/ G: A0 r2 {
void GPIOBankPinMuxSet();+ q# p! O& X# ` _3 {+ D
9 T+ O6 O8 i1 u0 q) U6 A// 产生波形
8 ]1 K ?1 n2 L$ p: Tvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
$ `- x# {) k" F, d( ?void ChopperWaveform(void);
/ w. W& [+ N8 W& M1 G' Q! B. @9 G( {. _: _% T
// ECAP初始化和读函数 O, h1 c' h( m9 k; T4 d
void ECAPInit(void);
/ B6 \9 ?- P [# D- Q; ?unsigned int ECAPRead(void);
: L) c+ [' t- x0 N
, d S9 c( W: T* z//ARM 中断初始化
) ?. |) |/ Q/ V3 P" M& jvoid InterruptInit(void);
. x' W1 k4 B9 I( A: S) N$ t% G" P8 B, a
// PWM 中断初始化
: N" q7 ?1 H+ ?7 G- j! o8 j8 B- Dvoid PWMInterruptInit(void);0 e- P3 @$ W! v. v
// 中断服务函数
0 Z- Z) M% @' |- A+ P- I) i1 P// PWM 事件
0 O+ y8 `+ ^' D1 ^9 R! J) [0 Z0 Kvoid PWMEventIsr(void);
, v2 r6 {" ]9 \, |) j4 M) `) S: [+ G// PWM 错误控制事件. r, e" z' `, X8 g0 x' S
void PWMTZIsr(void);
, L2 w1 p; Q, K6 |0 ^: s4 f5 L' |! u4 R) K5 m- h& s
/****************************************************************************/
" r) m. d1 C* X) k, s5 O/* */+ A& m" ?" c( P% m7 C* h- S
/* 主函数 */
o* z" t5 m4 H$ F2 V7 y: w/* */8 x0 }: w( |$ ]0 Q- \5 J8 J- l
/****************************************************************************/
0 i# R, H/ W& Q) Dint main(void): B8 Z8 k. c, O
{; O9 A t) i5 E( n3 S3 S- p
// 外设使能配置4 n( Z3 `0 ~8 Z
PSCInit();- `( E0 A3 ^6 w, S6 r0 G' I
+ Z0 H6 K. \8 n# `% G& i
// 初始化串口终端 使用串口2$ W% t! _: ~( X0 G# q6 _
UARTStdioInit();5 O) B( d3 |, n
/ H6 `% k6 b' G! R6 _# X# O- k // GPIO 管脚复用配置0 |! J$ d) S5 _
GPIOBankPinMuxSet();8 {" g0 y# R7 z. M6 G
$ \2 T( Y$ h+ i3 Y! n a
// ARM 中断初始化
S# s1 X( |$ R, Q8 i R InterruptInit();: P( L% d' B6 I
; X: O' v7 ]4 g2 W1 E. L2 n3 f; e
// PWM 中断初始化9 u+ t, r' x, z
PWMInterruptInit();
7 ?0 A6 V: H: b5 r% e
/ o `( e0 r0 B5 |+ Z9 j* A unsigned char i;
6 m9 F6 e5 ~3 X! w1 [; n- L9 V F# p/ K unsigned int j;
5 W3 w$ `6 Z6 m) `* e/ g( G2 I& x+ B
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
; ^3 [5 e/ R6 m H$ W- Z UARTPuts("------------------------------------------------------------\r\n", -1);
7 D* r) [2 O! n; Q$ }! B8 K UARTPuts(" C6748 PWM Test\r\n\r\n", -1);/ l+ w7 t& D! T% I
// 产生波形
8 M& L% L" V B% K+ p. M: L Y* @ PWM1ABasic(25000,50);
4 ]1 Q+ T# ~: T1 [" W3 ^
; _, g% `7 V0 L) C3 B/ m UARTPuts(" C6748 PWM Test Over!\r\n",-1);4 K" n' Q$ N1 l/ b% I# |
UARTPuts("------------------------------------------------------------\r\n", -1);: M. l2 `! h% @; h# N9 q
C& _5 u2 J3 H3 h
' W6 z( Z% g5 h# W) Z( `6 }5 G
% E) M: O7 u7 a/ A. o
UARTPuts("------------------------------------------------------------\r\n", -1);
' I2 Q( F; R& ?6 V3 u4 q/ C UARTPuts(" C6748 ECAP Test\r\n", -1);4 J7 u9 ~3 T4 e/ t. z
// ECAP 捕获初始化0 n, }+ |& l. T I% @
ECAPInit();
9 f* n2 F$ Q- W1 u UARTPuts("Initialize ECAP.......\r\n",-1);! o d" a6 Q6 h/ E+ n6 R
for(i=0;i<5;i++)
9 i/ C9 j5 `: p9 u, c' ? {( N" ~7 ^5 G0 N
for(j=0x00FFFFFF;j>0;j--); // 延时$ x* O" U0 U0 }4 K" _4 m2 \1 Z) S
ECAPRead();0 y% a* u$ o7 r# X- @
}% \/ v# e1 ~. R: J- i
UARTPuts("\r\n",-1);! w, I3 R- S/ {* A; q2 r
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);7 o' U* L6 ^& y% e) G3 j+ S2 `
UARTPuts("------------------------------------------------------------\r\n", -1);
7 @$ n! H. `- D* V
: o: A- X% B% n4 U! b // 主循环
7 }1 ~8 P8 ?& S: _+ ` Q, t for(;;)
h& W5 N2 c6 m, w1 ? {
_8 s+ ]$ F/ l0 L. k0 J3 A2 h
+ z3 E( r. A5 Z }
, s4 }* u% S7 L- X& b( [+ S}: T6 W& j+ r/ k/ N* @
5 p8 `% b5 U* A v* x. L g# H& ]
/****************************************************************************/0 U( b8 N6 A( t4 b+ j8 ^
/* */8 ?* a. J. o* }# P: ?
/* PSC 初始化 */
- a( U/ Y) R! s/* */; n2 t. e: u! u8 @* n
/****************************************************************************/
0 p+ y) c9 }2 d3 jvoid PSCInit(void)
! v: U: h) V' o# d3 T) H2 l6 N{7 D3 W# L2 J- k' q) L$ g
// 使能 EHRPWM 和 ECAP 模块
( t4 y) N& _3 p) ~( h3 k7 D // 对相应外设模块的使能也可以在 BootLoader 中完成& s( Z' k* x* k; O+ @/ {
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);# e1 r c0 x& W4 n4 X
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 _9 {0 j X: D9 v: p, T$ P1 L}
$ ~ K6 }$ Y) V0 n+ v0 j0 c/ |5 }
* u3 x, i) T! \7 @) P/****************************************************************************/- V; s6 W4 W+ E5 p, ~
/* */ r# g+ b) [9 {- A7 y
/* GPIO 管脚复用配置 */8 C- @7 Y8 H @1 m2 Q w
/* */
: g- s1 q5 |( T# O" J& L/****************************************************************************/
" }( t8 m& ]; |8 p8 ^1 _3 xvoid GPIOBankPinMuxSet(void)8 z, b+ V% _# [. }6 v$ G
{ Z# X- @/ P; V6 N0 m3 c) f
EHRPWM1PinMuxSetup();
+ e- L; ]% c/ l% `( Y/ L0 @9 w- E5 a+ M
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
! [. ~/ H$ P! F, M // 作为捕获功能时管脚方向为输入
" q) Q$ |0 f W // 作为辅助脉宽调制时管脚方向为输出
& c& o& A+ Z+ q/ a! ^) P5 O // ECAP2 / APWM2& h5 @2 |' j, j9 _+ G: G2 }
ECAPPinMuxSetup(2);
; q' T7 L. |, E- k& S- q
' R) {# b- A( q( @% F* q# B // ECAP2 / APWM2方向设置为输入( H) e9 N7 u- e/ L, Y$ u$ I- S3 H, B
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
% c& t% y# G; N+ L2 `! i; u( K}) I h8 P$ N& K( U) ?) N" M1 ~5 Z
. \! E6 l E. u/****************************************************************************// _# i$ B7 S6 H! C% ~# L/ Y5 T
/* */
/ j: L9 P5 J, Q4 J# @/* PWM 输出波形 */
/ V% S8 [) P0 y( I5 [0 [: Y/* */
" J5 w" |* A) M/****************************************************************************/
4 d' H8 m8 ]( t; v5 J) Nvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
X. s5 k' t& n1 U1 x8 f- w# {3 E{
- |7 e8 } {: H // 时间基准配置' H; L8 m# V. |# \
// 时钟配置* {+ x; L4 ?# ]
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
3 F1 W# w# b/ s) G6 F o7 J6 A) Z
i# l/ N0 w1 T, Q2 Y // 配置周期
) K( U2 J! A% b% Q EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
: A# g! T* E6 w$ o pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);0 Z. h! r( M1 c6 h
3 h9 a' R# U) c1 x // 禁用输入同步信号
2 K5 m9 i7 v( U' M& f, J6 X+ P EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);$ a7 ~0 f ^ z8 n. l
) O( z* K3 g* _; t
// 禁用输出同步信号
' }" B# {. W( b6 ^7 |% F* U- T4 } n EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);/ r& W7 I6 B, Z6 g8 w" b$ a# l1 t
9 C( |. g9 B! v$ ?- \0 [9 ` // 仿真(DEBUG)模式行为配置
& A, J( O% a q2 C& E& u- A: | EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);, S/ s' B3 z* n `2 a* m
$ ]1 I/ e+ D8 H' c& d) K8 M' I
// 配置计数比较器子模块$ h* @5 E. G1 E/ G! v; U: s5 L
// 加载比较器 A 值; e, A3 Z h$ Q0 W
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,+ ]* y7 O6 Q- F O+ Y- n% k. v
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);" B& }. Z, d- O5 E0 O8 ]9 d. n) G- R) D
5 Q% i- C4 U& @5 ^, c
// 加载比较器 B 值+ G6 l0 B% ?0 G' |+ @3 f) e' f
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,% V' g; l0 e) x
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);, X3 }6 m9 W# Q" |0 H
6 G( H& ?5 s% g; ~: s+ A // 功能限定配置(输出引脚触发方式设定)0 ]" J. |; p6 O+ z
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
4 Y- m2 ]; L. K- U. M# _ EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING," Q1 | y7 a! ?: J# G
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,, Y# k) D$ ^7 l! y
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);6 ^6 A$ q+ [, \5 B0 x6 `1 s1 x
. \: F4 A; l6 x; L" g
// 禁用(旁路,信号直接输出到斩波子模块)死区模块+ u. B- D2 {9 U
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);2 k( t' j9 C) R( X* p) c
, i# W! I+ z( b) {! \& @ // 禁用斩波子模块
( d) H: ^; ~3 u- f EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);# B. o9 L' b; k6 S4 Z
" j. Y* b# l) U2 r* |
// 禁用错误控制事件) K) H5 E, E/ S; @; i" K% K' i
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);+ l, _, X3 R) i5 r
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);+ f S8 W4 w/ n9 _- k
) P6 z3 ~ u0 ^ Z- g
// 事件触发配置
( W: a* T8 y$ ]: k // 每三次事件发生产生中断$ ~0 H% q1 c7 P g1 E! v6 s! H1 u
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);9 C* l, H# k7 v; O. F- v' A+ y* @- a
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件0 v' j/ k, r1 L/ W7 Y
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);9 ^! ]1 n# X0 t# G
// 使能中断
% S5 N$ m, F: G; t* p; b EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);4 x6 L1 v$ J6 G
" E$ Q9 Z8 y! k; @ // 禁用高精度子模块7 i: k9 m+ S" S T4 [8 e& @' M, N
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);. W7 T$ Y$ E5 z
: ]% `3 l: @/ E _$ `0 e
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);7 g, K( J8 Y- E z5 z2 F- T
}" f- d$ U9 Z8 ]( b. }! u& o
+ b. H. r8 P& T2 o9 ~+ c. l1 E6 k) E
void ChopperWaveform(void)
& V+ b/ \0 L6 S5 U" H8 _1 D `* ?{
: Q* X7 C7 u- ~9 R( ` // 50% 占空比' e: k1 r; K% T& q
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
3 W" F! ?3 W$ u" ]! U // 4 分频
$ X4 b1 Y% c: F/ b f# {$ P EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);& @, F. w; c3 t G& e1 i! I
// 单个脉冲宽度$ b# `+ `: b5 t5 X
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);: C. A: _& r: I! H7 A; o# O
// 使能斩波子模块6 X# n3 k# u# E$ g. G
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
- v1 \" t+ m1 p) s( @3 d3 R}
$ T4 o2 {2 D. R- B- L7 J
5 F5 y2 k |* t6 c! Y/****************************************************************************/; T% A& x! Y4 M; E$ q
/* */
* j) A2 k2 Y. M( d6 n' Z2 W- n/* PWM 中断初始化 */1 R5 a" m9 m7 }1 j
/* */
5 t4 n0 F2 o' U$ y/****************************************************************************/) k" n. T( H) W; Q. _
void PWMInterruptInit(void)
/ g4 G! ^$ T, F{
9 @( ?; O4 l& \( k$ [. ? // 注册中断服务函数
# k) y8 ^, z4 p) o& B IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);2 `6 l3 o; Z3 @5 V7 _
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);0 j1 [7 v ]& v/ u( t4 S
( I6 c# g' u2 ]9 w // 映射中断+ @& X; r3 J$ o z) f) U) }3 }
IntChannelSet(SYS_INT_EHRPWM1, 2);
% R1 Y- A$ h8 ] IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
; \6 ~8 ~& m( g6 I1 w1 @+ c' z: X ?+ m" ]/ D0 e9 U8 E
// 使能中断5 O* l$ O4 n9 X+ i q
IntSystemEnable(SYS_INT_EHRPWM1);7 W0 }2 j7 O J; G" k
IntSystemEnable(SYS_INT_EHRPWM1TZ);
$ Z- Y/ \% x8 `7 c1 d}/ `2 f2 f+ f) i/ ~, o; M/ q3 n
" }9 K5 `; `2 {- r1 r1 U% [
/****************************************************************************/ s4 H: X p* ` P$ R; v
/* */0 g4 k( g8 S( \
/* ARM 中断初始化 */0 L+ q% n. ~# y
/* */7 @1 C4 T7 h1 {' H7 d$ y" k
/****************************************************************************/
5 [$ H& q/ g* b, C* _: R' f3 Mvoid InterruptInit(void)
- m2 _, |; q) i6 F- t6 r& @{# ^9 X( y! V E0 M
// 初始化 ARM 中断控制器
) ^/ F- _9 o F0 O. f9 S IntAINTCInit();2 L! C8 N* c/ @7 o
7 `2 y4 r/ j% u+ h4 Y; F @ // 使能 IRQ(CPSR)" x1 s# e6 m& l+ k/ Q- w
IntMasterIRQEnable();- P+ Y3 m$ m/ j' r+ h1 X& q
' l+ F% }% t" s0 C // 使能中断(AINTC GER)4 p/ Y& m9 [( W2 y
IntGlobalEnable();
# X$ f, c6 g3 _, z* ^3 n
- b4 g( H+ o" Z8 d // 使能中断(AINTC HIER)
. S1 J, t! f- M3 ]& B% i; v, S IntIRQEnable();8 `' j/ w2 [9 I
}
, W6 g. Z+ E3 Y4 D( v2 e3 u( }$ b. h1 J- K5 Z" R! R2 _6 k/ ?
|
|