|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
; M& S0 O5 Z7 Z$ [: Z/* */# U/ u( x' B9 d6 x+ d
/* 宏定义 */; E, w) D" _! r
/* */
' _$ r( M: f2 K! s* U( V3 D" j/****************************************************************************/7 [) J0 v- S% i! r6 l& \
// 软件断点
- }: @" C/ s3 Q% [ |$ }, B#define SW_BREAKPOINT asm(" SWBP 0 ");
% y7 p; ?! v+ c
2 `/ g8 r' k, ?1 Y) _" i// 时钟分频
0 x3 y6 Q1 j' L# k; W5 f#define CLOCK_DIV_VAL 228
: N" l% O3 d$ R+ F- @- K6 f1 \
Y7 `' @; D! y9 ^% M& L1 w/****************************************************************************/& q6 |! `. F5 b& t! t, Z* I
/* */
7 z) n: W: [, u- {$ z( q' p* I7 v2 N/* 全局变量 */
9 Q1 L) ~* ~1 h$ }6 i/* */1 D% e4 w9 e. z* P7 a
/****************************************************************************/
1 x+ \7 D, X8 X1 i# FECAPCONTEXT ECAPResult;7 {, F3 n/ e W, |4 o' S' y
5 m$ R5 e7 }; e
/****************************************************************************/$ F0 r! X" v- A- g7 V: r' L
/* */3 u* j& L* O$ R; r; e5 y
/* 函数声明 */
/ o- z2 V2 ^5 B3 l. }/* */
: I# ^' S! b6 s, p/****************************************************************************/
- U E0 S, y3 e# f, s# W' d/ W// 外设使能配置
2 ]5 W: a) d& ^) V* I2 @4 v; Uvoid PSCInit(void);
& P8 Y, W, P9 p& Q) V/ y7 r* B( b2 i j9 ?5 V
// GPIO 管脚复用配置( Q1 d% t3 M6 a8 j% u! e$ M
void GPIOBankPinMuxSet();. V& s: b. O7 X9 J X6 S7 ^/ o
$ |; R: I' e5 u3 T9 }
// 产生波形" V# N `9 R; n4 ]& ^5 ~" S
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
9 t) l7 k9 I. L2 W% ]# Xvoid ChopperWaveform(void);2 O1 S8 f% X) q, w( ]* W, S
0 T/ Y, e, ?! A- Y) a3 z; u! e// ECAP初始化和读函数
% a, F. P& H0 H- u1 u" y3 t' fvoid ECAPInit(void);9 T7 j3 [/ D+ N5 z8 a9 ]' U
unsigned int ECAPRead(void);
) L [# d7 x v9 w {2 }, u) p9 Q% [
) U9 Y$ r9 l0 I3 V//ARM 中断初始化
9 C; J* L1 U- N: ]5 avoid InterruptInit(void);
; q' s Y, }3 x/ @% L0 y3 {- J6 U6 r+ P5 t- K# }
// PWM 中断初始化
' Y% C& _3 x, @' ]void PWMInterruptInit(void);; g$ d$ m( Z9 B7 ]8 Y x6 P. a
// 中断服务函数$ k" g3 ] t" Y9 f4 A
// PWM 事件" S( M- d ~4 i% C' R9 R
void PWMEventIsr(void);
4 ~3 w' z, N+ l# }+ [' `// PWM 错误控制事件) M3 i; E7 t) l
void PWMTZIsr(void);
7 J9 }+ y* t7 w+ k! y% V& Z
# m4 |; D8 e1 p/****************************************************************************/& a0 N4 X* N6 O2 A
/* */
# w0 d" a" S" E/* 主函数 */$ y" h, t3 U a7 p
/* */ O6 R1 }$ W4 D7 r9 d
/****************************************************************************/3 H* M6 E4 u1 ~' ]3 {# J
int main(void) U( a# G& A/ m; a$ X
{
5 Y# ] H- j! D6 T; V // 外设使能配置/ O" Y R1 N2 { ?1 C* L
PSCInit();
) K) H, I4 R6 a) g' R, w6 f6 n& [" q/ {: H
// 初始化串口终端 使用串口2" O8 x0 |$ S& r7 O3 o8 O
UARTStdioInit();
' Z8 O& l: ` u% J+ F! [$ n
+ T, D) ^, K3 v1 h; \ // GPIO 管脚复用配置; {/ n' [" }3 h/ R% z' m5 R
GPIOBankPinMuxSet();: b6 Q, e/ e! I( E) {
9 {: A: l9 K; m% n- C0 z- j% r8 k. F& J // ARM 中断初始化. t& c+ h" E9 P6 M9 |; \, |; Z8 V/ _0 |; J
InterruptInit();% @: A$ i: S) u; b* b
& `$ F& W& Y8 x7 \: C // PWM 中断初始化6 f* g$ ]1 B% o+ O! c
PWMInterruptInit();
7 c1 u$ Y" I' s3 q9 s. P" b( J/ L1 C2 G: h4 ~/ R( c
unsigned char i;
# Z6 Y/ G8 n3 L& d5 y: |6 l0 D unsigned int j;" ]) U% @6 @9 N; \7 E: @0 B
^7 c% c: |" k& G! d; z. h
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);1 B ?" W1 t) r w: S
UARTPuts("------------------------------------------------------------\r\n", -1);. _+ v5 P/ F; u( F: {! B
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
& m- @" u0 Q; b& y // 产生波形9 }2 i$ z& _/ R! E9 V
PWM1ABasic(25000,50);5 ~5 ]3 t' F: a8 U( y9 N# o! J0 @4 k
# w- @- n6 I! i2 O+ y; r8 X# p UARTPuts(" C6748 PWM Test Over!\r\n",-1);
; S# N& S+ P6 i7 P7 a7 W UARTPuts("------------------------------------------------------------\r\n", -1);% e6 n) x* v) k5 q! z' J) g
+ s5 N9 m% F( n1 N! L& @
1 Y3 B% u" o W; ]
/ \- k$ E9 V$ M% }( r
UARTPuts("------------------------------------------------------------\r\n", -1);( u. K) k! m2 e3 H7 f0 k5 {
UARTPuts(" C6748 ECAP Test\r\n", -1);% @2 o" x5 v; Z ~
// ECAP 捕获初始化
2 i: m) i3 k6 A; a. C ECAPInit(); B ]% v* P7 l6 J
UARTPuts("Initialize ECAP.......\r\n",-1);* S7 S1 X6 Z% E- [
for(i=0;i<5;i++)+ i0 P3 a+ P5 a1 w1 U" ]
{" u$ r+ u5 c: J+ I7 Q( [3 N
for(j=0x00FFFFFF;j>0;j--); // 延时
2 H3 h5 v, \. k% f0 |* M, y ECAPRead();
4 ~2 M7 U# G {# ^: J: ~& X }
- k+ \- U) E7 G, D UARTPuts("\r\n",-1);
& I* V* K# u @' c/ g+ V UARTPuts(" C6748 ECAP Test Over!\r\n",-1);& S9 r+ C& E& j* {1 ?5 ~
UARTPuts("------------------------------------------------------------\r\n", -1);
& t* N1 l0 T( `4 Y. N- u/ P; y2 C4 k* E3 v2 r4 u
// 主循环
' U- F9 }: ^7 w! |4 I for(;;)6 \# Q- w. Z( @% j
{
4 E: n# ~* _9 m% } o- g3 R1 k8 d- N
}4 \* a1 f N2 b, p' ]; K# c& J3 S
}: I; I& U1 r: F- y: p$ H% q/ B9 i$ E
/ h* m% N: X. c6 s3 ]" S/****************************************************************************/& b6 W m) J; \4 C
/* */
, Z% L1 M. B2 K# `4 y/* PSC 初始化 */
) U6 c% I2 S. g) O& ]4 e8 r7 P/* */
' _2 C( U! i1 x8 u1 [) c. C/ I/ m/****************************************************************************/
$ H0 g4 p# ?4 Z7 j2 M; Wvoid PSCInit(void)
% b$ ?5 ^0 q: U{8 d) U* ?' s. P8 M
// 使能 EHRPWM 和 ECAP 模块
7 a2 R. S: r H! S // 对相应外设模块的使能也可以在 BootLoader 中完成/ f& C, n% q' Y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
0 D: K/ H, d" X PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);6 D$ @0 ]( }! g4 ]$ ~) V7 ~
}
8 ]: c' z6 B& T) f$ }) N4 m2 E! J h+ y, Q
/****************************************************************************/
2 e+ Y K' [. R4 K' H% ^/* */
8 b- p% e* {; D6 ]% F8 y: ?) Q$ ?/* GPIO 管脚复用配置 */
( `% g" c! W. b# y% w3 F0 ^) g/ [/* */5 y! k. y5 M/ q2 c* z" v# S
/****************************************************************************/6 c$ J, C9 z a. i, l* x
void GPIOBankPinMuxSet(void)
0 V6 j8 F# C# i- ~: i0 X. H2 E# d{
- }. ~9 K! E- z+ j( i. z, J: g EHRPWM1PinMuxSetup();
- I, v, c/ u0 O. V# r$ P5 q( Q/ Y" t, m: P9 B I
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP) |" W9 m5 Z9 _) ^
// 作为捕获功能时管脚方向为输入( H @ V* n% b
// 作为辅助脉宽调制时管脚方向为输出: b- M2 u9 g/ J7 o
// ECAP2 / APWM2
+ e P4 b. v0 z$ }3 W7 S- z: Z- Z( Q ECAPPinMuxSetup(2);
( _6 I# { F4 I* I$ z) D8 X6 B2 D5 ^9 v* o5 Y3 p" J
// ECAP2 / APWM2方向设置为输入5 I6 W' Q/ J) `$ g" T
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]1 h' Z- V& u+ d; @$ @! T$ D& m( ?
}" a( I& q3 n+ ~1 e
$ e7 s5 _6 s; v9 i/****************************************************************************/) _: Y' J4 H8 d# X$ h0 Z+ _
/* */
8 T2 |1 J) e! B- E9 U. E9 ~1 q/* PWM 输出波形 */1 K0 O2 r- r, J' K
/* */* b' ?0 | X# u7 _# P+ |5 ?
/****************************************************************************/- @' p. _# l$ _0 U0 K
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
) q1 G. r; ^0 C" O+ g! o% y( U5 ^* o{
8 n* ~! @" h% q- F // 时间基准配置& X {& \. V& E% a
// 时钟配置
" a6 n! M4 ~8 i EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);% T" n* m/ o" k
$ I3 J0 O; f; [
// 配置周期: ]9 S1 _9 s( n+ _& N
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
. z& L3 |% \! Q+ B8 a pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
7 t' | F7 N& w9 {8 c
/ ]% k; C3 E# u0 ?8 ?7 r* k. C // 禁用输入同步信号
2 `2 H9 I# ]. e9 L' V/ R EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);6 G0 v" Q# m/ M* i. `% I
6 M: l' c e' R0 U7 I // 禁用输出同步信号
8 P5 O, r+ ]- j2 g r1 h4 a EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
4 r% b! ?/ C/ u- D, T4 f" [9 t0 @8 T
// 仿真(DEBUG)模式行为配置# k* S- t( }& s, b6 J1 \ u
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);! D+ i4 _! \' n- ^. L9 E/ b
( q3 a4 [3 F% y0 m: s% z) M // 配置计数比较器子模块
2 l- }7 d' k$ T2 [7 a // 加载比较器 A 值" T2 u6 {% c' A6 W% X& V
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,( E/ t3 V- f: `' n1 d) z$ s
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
* G8 Z' I( ^& F3 I( z" P: R; p
' }- _5 n7 r" z // 加载比较器 B 值
+ t) a+ M7 O/ T F* a( D EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,5 j. `0 K& N7 Q+ o/ ]- s( \3 @8 q
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);6 h7 Z0 _: T4 o9 L2 d
/ d# C2 K2 Q! F( k // 功能限定配置(输出引脚触发方式设定)
4 u0 t% U4 D1 P! P! C) ~ // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出 s8 Y( L. U8 p7 H' T# k
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
: Z# C) D; V" }3 e1 q. D EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,6 Q3 W6 g( o8 E- `+ c# P l
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
& z+ U* d' H) A2 q5 s, ~4 f. v/ z9 P2 p, x2 x# Q; C2 ?
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
1 F4 m, S# t' h3 U* r8 | EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);+ q$ C+ c2 j! l/ Z' Q/ o* j. }# g
* C" W! O1 V$ G0 V
// 禁用斩波子模块8 H/ v- U* u' K4 n4 e# H
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);2 E% {. K' v; f9 O1 r8 h, c% R
( r0 i1 J+ x R3 F { Y1 @& X
// 禁用错误控制事件
$ t4 v y8 s0 O$ K. ?! Z( A7 Q7 U EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);6 p) t! a, N2 E
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
. ]7 f1 i8 j& Q- G% ? }* g
8 c8 M# `" m7 P5 A6 R7 h7 i% | // 事件触发配置
9 P/ [) b% a. |9 F! f, s // 每三次事件发生产生中断
1 p7 s$ O6 u2 i! c1 a# T9 j8 m EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);& g8 ^8 [ y6 X. I7 O" e/ f9 K5 Y
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
( W: ?/ U) H7 x$ ~7 ] EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
* n/ x. G: F2 W // 使能中断. z% m) ^ M% o% z7 G; V; _
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
# h- q2 q5 f" G, R* n& ]% V5 _0 g5 R$ n7 n1 N% s/ |/ M& {+ ?/ E( j
// 禁用高精度子模块
/ U0 S! C* L c% f EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
. d! [! H) c' j7 O% T! r; ~, H5 U4 \ q
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
8 c2 i/ h3 s \$ c- w$ g+ P}$ _& H( z+ X' a! E ]7 z e0 e' i
( T2 A. o7 @/ E+ ?) _5 t' T
void ChopperWaveform(void)$ `# q2 \. }! ^7 H& l
{. O6 _$ B. b( |( t& A4 B- a* S& P
// 50% 占空比1 v i2 p( E6 j m
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
+ }2 I) {3 i1 R4 x! _' d // 4 分频" B8 t6 |5 \+ }1 _# ~2 I. p
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
# ` X% \ M3 D3 m7 e // 单个脉冲宽度! p9 Z6 R, Q# R3 W2 d- J
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
: l7 Z/ H/ A1 D4 a4 ^ // 使能斩波子模块) |9 E0 a& C2 d, N- j8 Z3 C
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);/ j& u7 n& D! X" s. k
}1 A. |( R# q, r6 h
5 ?9 k) o4 ~$ d% y; c1 @/****************************************************************************/1 d: V1 Z4 D1 g% r
/* */7 T4 q1 q0 K4 ]' M% k, m2 d
/* PWM 中断初始化 */
# h* e+ V& }& P/* */: |6 [2 _: ~9 n2 j) H' ?% u
/****************************************************************************/* o+ {! G' \3 P
void PWMInterruptInit(void)
. h% f q* A" w+ P" I4 v{
! N) g+ l) ~6 x' e) x0 m9 n // 注册中断服务函数2 g7 W" s; k6 z |/ E9 H v
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
1 |1 m0 c1 J2 e1 T* E IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);1 i8 V; ]7 C! C" k
x) p: l3 ?$ b
// 映射中断
: ~" O5 }; z y IntChannelSet(SYS_INT_EHRPWM1, 2);' r5 V0 E9 b% t" O
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
- ]! I" r% v6 B4 G
& I! |' R# F, a4 @3 ~6 A" e8 x // 使能中断* @+ Q, A( j9 N+ F8 G5 c
IntSystemEnable(SYS_INT_EHRPWM1);
% o& X p" T' Q# T J IntSystemEnable(SYS_INT_EHRPWM1TZ); g3 V* G& f3 g5 M& k
} I& L9 ~1 C, ^' O3 b
3 u5 A! z- ?' B# Z
/****************************************************************************/
0 d! ~. k/ h3 K5 n. A/* */7 C6 c1 F' m. Y, c$ I L2 P
/* ARM 中断初始化 */
1 [& J( \" c1 J1 g. h! C/* */
* V- @) P+ B5 _/****************************************************************************/0 b) \; q& c. y' M# P2 n! r* Z9 }
void InterruptInit(void)
- a0 o# _& L" A: j9 o4 _7 m{
! a- G" x- d9 w' M4 X, \# l // 初始化 ARM 中断控制器
, W) g" ^3 z6 p) Q* \1 D6 e IntAINTCInit();- \, j; W7 K5 [% }; @
* b& n& g& a6 k' C. Y+ x
// 使能 IRQ(CPSR)6 [& T2 _. u0 r( Q v" b
IntMasterIRQEnable();
9 H6 k& F3 O e! h' d
0 y& b9 K$ ?3 A7 l // 使能中断(AINTC GER)
8 W1 _' c: R% m6 f IntGlobalEnable();1 W: i$ S. d2 I; J5 Q- x' `
1 E6 F' R2 S0 D% X O2 C
// 使能中断(AINTC HIER)
2 l2 S1 K8 o- K4 H9 {# J IntIRQEnable();# o& [9 e* H! E
}
8 C- w9 A" x6 Z, u( }7 E8 q! Q
2 }/ X3 B& E5 v* {6 @/ N# s |
|