|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
, R7 U! F9 e6 T3 c/* */8 Y0 t$ I: d7 u( C2 W: D4 G* ~
/* 宏定义 */
* }2 c( c! {* q" r6 F/* */( g* d Y% ~ T- N5 e
/****************************************************************************/
/ m- K, i( F2 p; {// 软件断点
/ j& x. L, z, Y0 n#define SW_BREAKPOINT asm(" SWBP 0 ");6 x8 O" k7 v3 Y, l: @
3 P. c$ Q2 q8 I3 n. P// 时钟分频
+ o( k8 V; C7 g5 E' o5 X#define CLOCK_DIV_VAL 228# s+ I6 G0 Y; t) N' m( L$ h9 T
9 ], Z0 @7 `4 I( V9 S2 A/****************************************************************************/
4 B) D0 b, T+ j9 w! \3 C2 ?/* */+ s/ Q1 D: h( L3 @! S. v
/* 全局变量 */& W' B% m x/ C" u+ }4 {9 l' ~
/* */
& V9 ~$ S" {% C2 @/****************************************************************************/* C+ O( `6 [" K. m. O9 G) C2 a
ECAPCONTEXT ECAPResult;8 [+ P, x7 ~- Z7 ?! Q6 A3 T/ E
% X) c9 |6 L/ Z5 ~! z3 n3 u' \( U/****************************************************************************/
8 T0 _9 n/ o) R/* */5 g. h7 W7 \& n# }; |
/* 函数声明 */ d8 n! G6 C4 x- `
/* */
2 B0 Y1 `4 C, u0 E) \( j/****************************************************************************/) v3 O- G( Y1 i, f
// 外设使能配置2 X# p$ ~( U4 Z) x% @7 [
void PSCInit(void);
* \1 m7 U3 S$ o, v" K- z% h' r1 E/ d) E
// GPIO 管脚复用配置
: U- b( x/ ]( s# E" Bvoid GPIOBankPinMuxSet();
% ~ f4 u2 s6 i6 u! ~% P% h" \9 C( g. a. y$ M L1 I
// 产生波形
# ~ l# ~) ` K: @+ C a4 C2 I! Kvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
6 M- S( s( j W1 H9 Tvoid ChopperWaveform(void);
/ g+ K1 r$ b3 M+ Z L0 d$ ]- O6 o/ Q* l7 @. L4 P! y4 Q
// ECAP初始化和读函数
: f9 R4 Z1 q) C# B1 ^; @- zvoid ECAPInit(void);) i' C- I. w3 I0 b0 H5 Q7 ]" p$ G* v
unsigned int ECAPRead(void);
6 X3 n# p) F$ S, L, T& F. s" ?, M D
//ARM 中断初始化2 w/ C+ M( e) R/ R4 F( L
void InterruptInit(void);" X5 H& `/ U$ x& D0 B v
" y F# k4 {2 k- A2 q8 H// PWM 中断初始化
. b% K* L" P: }' ?$ N+ S; [9 Cvoid PWMInterruptInit(void);# q, E8 O$ Y; ]; g3 e) j+ _
// 中断服务函数
. B; a# X0 p4 p/ n# }7 t& j// PWM 事件
, S& M7 F! w% g7 z, evoid PWMEventIsr(void);8 K; x; D; Z' [0 B& a$ y' m
// PWM 错误控制事件
7 o4 J% G2 _# o8 svoid PWMTZIsr(void);
; f6 \0 P, l/ F- X6 d
8 b. S9 P5 i9 Y8 d" T, G/****************************************************************************/
9 R. U! {, L" W- @( y/* */( F% M5 c; Z- Z" l. N- g! T3 W5 ?
/* 主函数 */' R5 H/ c# S/ Y* u9 q7 u0 V4 b
/* */- D% m- K K; ^4 O1 v
/****************************************************************************/
6 n+ P( s8 U* ^5 J' [; Uint main(void)
) o3 Q3 v. L8 R{& n5 l. @# Y& Y5 ^4 X- y
// 外设使能配置6 s; a* s- _8 J) q! D" f; w
PSCInit(); B: W9 U ]5 R- Y& Z
$ \5 a1 h, k# r, x2 m7 `0 S
// 初始化串口终端 使用串口2
9 k/ j5 V- P3 j2 g5 A* k. ` UARTStdioInit();+ y6 x+ O& R2 n( F& H0 o: I
$ C4 P( L7 k( @2 f0 _ // GPIO 管脚复用配置
a1 K/ I7 X9 j* u( B GPIOBankPinMuxSet();- B s2 B/ w" T
4 G4 B4 S0 K8 b+ R
// ARM 中断初始化
+ o$ @ n# T/ k8 ^ InterruptInit();: o9 O9 Q5 U) t! N5 R
$ V# h8 f6 x6 c
// PWM 中断初始化
: ^! H, ~" x8 c, n' o2 j$ | PWMInterruptInit();
" J6 C+ Q. K: D4 e* l m9 f& O/ }, [2 l9 l$ I' a
unsigned char i;
) F. s' r* L; W; c+ X unsigned int j;) v) _/ \0 e/ K) N9 i5 b- s
: @: s/ P% N0 s6 B: ]5 G
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);" l. p$ ~8 i) I8 h! ^
UARTPuts("------------------------------------------------------------\r\n", -1);" p- ]4 z% d0 A$ B1 Z) i) O
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
. g; B# a' P: p) b8 g) H // 产生波形 V) p% m. x% J. `$ e
PWM1ABasic(25000,50);
5 T5 V: M4 c( V: u
: g: D( d( P x S, D0 ~! F UARTPuts(" C6748 PWM Test Over!\r\n",-1);
o! p5 K; b+ l% c4 J% h UARTPuts("------------------------------------------------------------\r\n", -1);% D* I! {3 i( m8 D5 o v/ w; y ] A8 D* ~
8 R% x+ E6 U d8 g! j
, L) r1 H& q& }, ^4 P( L8 ^# h5 S' w1 B; G% `& {( `; D
UARTPuts("------------------------------------------------------------\r\n", -1);
3 e. ?" N* R" N) E) G UARTPuts(" C6748 ECAP Test\r\n", -1);
$ R) h6 T; L" |0 f // ECAP 捕获初始化
) V8 y: V+ m+ j6 ~/ y ECAPInit();
# ]$ t0 Q# H$ R* u# p$ T# K0 U( \3 O UARTPuts("Initialize ECAP.......\r\n",-1);% _- B3 X# |/ P5 t
for(i=0;i<5;i++)
7 D! t" u8 V/ ?* {2 o {
0 o7 C; _! ]# ^ for(j=0x00FFFFFF;j>0;j--); // 延时
' I1 M$ I: C% A" r+ \ ECAPRead();5 j J# T/ s' a5 e6 o% ^
}
- ]# J# l& @2 ]5 i; A UARTPuts("\r\n",-1);, d* \' D' ^" i6 T) m% a5 Z
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
1 K6 t" W( E9 t. ^9 ~ ]$ x( x1 Z UARTPuts("------------------------------------------------------------\r\n", -1);
% _0 U6 Y5 o8 m a9 p6 ^& O; _8 O6 A0 D3 p7 P
// 主循环
$ n0 X2 c. W& c1 e for(;;) K- O" ^6 U4 E( V
{
8 M+ c6 g% |8 @2 A
0 r- K$ z! J' r }
/ ?; l1 P* Y, \4 x}! a; g, {4 P' o$ U: i3 u. X5 [
; ^0 D+ j7 v9 `+ `8 @' D/****************************************************************************/6 I$ J- H. w C b# b% H% b
/* */
k8 ~1 a) ?7 F5 L/* PSC 初始化 */7 F1 K- p$ o) h2 v/ A# Z* s& N
/* */( ?& |; v7 `. U) a' {
/****************************************************************************/7 ~6 v: `) K( V0 H, a% v
void PSCInit(void)! J ]( ?$ s8 l: {
{
! I) y' Y! o) o: N( ~ // 使能 EHRPWM 和 ECAP 模块0 Z! N V/ e, P- I0 t4 Y, T
// 对相应外设模块的使能也可以在 BootLoader 中完成
# S4 g0 u: | O& R' j0 w, {# \+ ~ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
9 R! ^6 a; W. B$ b. _0 L PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% w: u: s8 l2 U1 |; Q# y) s}
" X E+ h. K# J8 x* a' J% w" R/ e) A y9 W4 l
/****************************************************************************/1 D) A" d' S1 S" x4 r4 u; _
/* */$ P1 p" O0 p* n* f% F
/* GPIO 管脚复用配置 */
9 ^. w, U# K9 A; L/* */1 n; w. }* D: \1 ]
/****************************************************************************/
4 e5 H2 i/ y: \* g6 u) Jvoid GPIOBankPinMuxSet(void)( i6 R& Q* c: M5 t
{
5 \5 u$ g* i- M$ L EHRPWM1PinMuxSetup();6 T Q* w4 @. F. N
# }1 i& b, G8 }' Q% h // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
+ r' v+ X9 \0 i) o) Z // 作为捕获功能时管脚方向为输入) F. z. Z/ }5 @' v1 O
// 作为辅助脉宽调制时管脚方向为输出
8 H$ {# B* ?" S, @. ~: g; G2 M% w // ECAP2 / APWM2
- P- N! o9 b6 U2 X% {! b/ q( Q ECAPPinMuxSetup(2);
5 l' j, y7 A d5 v! K9 e) a: x1 h6 H- e( x/ }: h: q/ r% M
// ECAP2 / APWM2方向设置为输入- K" C, @) G" X. E* I
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7] E8 [* x0 w" S3 v5 J
}5 r8 i+ f$ ?$ H* L2 H! t F& ~
- o7 s ^ w% [; S. w/****************************************************************************/: T, g" \7 P5 I( ^/ o
/* */
3 W: u8 J% A1 ?5 ~4 E/* PWM 输出波形 */# Z9 n+ @1 _7 v, q: J3 S# c
/* */' b1 s- A7 u8 `* h8 |! k( D: G4 s
/****************************************************************************/
- k# K) C+ x- G% H2 Ivoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)8 ^0 s6 G6 R1 s: h
{, f Y- a! _# i' E7 o, e
// 时间基准配置
- ~# {2 n) D0 t // 时钟配置6 Q+ A, x, G+ V! H
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
7 u: y- U# b7 R0 h2 `
- F- \3 p) q" {* {8 e // 配置周期& i3 | i7 m+ X) X8 A: h, a
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
4 h0 C* Q- `) j9 ?! b' K pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);) J n% x1 C8 o" v! F% _. A
: j# }, F' j3 \( i) b8 ~
// 禁用输入同步信号
+ B8 H7 k1 o4 J" D/ E3 } EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);4 L; Y9 d6 E& T2 i
) f* _" O$ A( k2 ]3 Q // 禁用输出同步信号" {) o- v: ~- E. K7 a; D' W
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
- V# {" l* V' O+ ?) U! K2 Z% I& s$ A: Q: m0 I: L& e7 q: W! z
// 仿真(DEBUG)模式行为配置
- U0 z2 _3 _5 n$ }% T/ ^3 p EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
+ Q$ M( o/ v0 `- p5 k' v! s8 w- H2 h# z- S3 ~' u! O
// 配置计数比较器子模块% h! C% F% @7 S
// 加载比较器 A 值
, l: Z4 v' \8 j# G! U EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
+ A: D6 J- x0 p- a3 D; z9 | v EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
7 [- Y+ k! Y) \2 V' \ d r
' b: R, ?5 S3 f: K // 加载比较器 B 值
2 m# T/ U) K/ ~+ @ EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
2 W: l/ w9 d- z" z& @5 l EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
9 h# x3 S& E, ?: ] ~7 U p/ h
# `# m- v" P9 K // 功能限定配置(输出引脚触发方式设定): S7 l/ k* [) O+ _( Z
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出6 Y9 O8 A) |+ Z Q% Y4 I4 N
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
5 {" b' p; I5 d, s: u# D EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
+ T* @/ b0 G _: _ EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
5 _; R+ y' \$ H2 n8 v* b2 W/ E% @- c; Y" F3 ~: a
// 禁用(旁路,信号直接输出到斩波子模块)死区模块6 S9 M4 u' I$ x" W8 Z; A6 n5 [
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
2 s9 p' N3 ]& E0 s& X; h5 E
$ Z4 c9 G$ X3 b/ z4 c // 禁用斩波子模块# x7 H& J# g& y$ n5 |8 d
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);% F) M9 B4 a: U% X( B
& A: ], Q9 r3 v5 Q. b0 K# S; W
// 禁用错误控制事件
( ]. K; z" R& N3 V EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);& n7 u: l& L* N9 x: b
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
; v3 G& P" [6 f) I% h5 ^" m1 Y2 f
2 T! m' n" g O" `6 x k5 E // 事件触发配置) ]6 u- ^/ M) p* p
// 每三次事件发生产生中断
1 Y: a- o' t8 O$ Y EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);) u- I3 y9 W+ N- N; a, D" [5 f
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
# \+ \0 z o0 u$ \% ~% h. z EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);8 o! b# V1 v& {6 p$ z/ s
// 使能中断; w% m# T; T/ X3 c9 Q, y. U/ O
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
* h3 O9 P# A# c5 U4 Q K! S4 u7 Q6 H' B! O2 ~8 ~
// 禁用高精度子模块
+ H! j! |( k* t, |/ e# n EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
! e# z0 b5 Y3 Q$ z
2 C5 X: L P) A. \( t UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
) Z( s9 s, F" h% q/ B5 H}* j6 ~5 W: y% B' z+ c' [
3 ~% M& ^ E# x0 w1 c7 G# Kvoid ChopperWaveform(void), N) P: z+ F O* c$ D) _
{
1 Z) _) [9 [+ i. S5 I# x5 P' y // 50% 占空比
, g6 b6 y+ K$ S5 W3 D' W" }/ Q5 }! l EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
0 {4 [, |" s) i/ W+ ? // 4 分频
( a0 K5 f6 Q& o5 g% U EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);, o4 }3 B- a) a. J) ~, F
// 单个脉冲宽度
`5 Q7 }& [; f/ `2 c4 G6 b EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);' Y6 B" m4 U2 T: a# I: C. M
// 使能斩波子模块 Z1 A0 ^! s- ]8 X
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);( H2 z; A' N' d& H) V
}
r! o( H3 ~$ P1 K* A C1 ^9 k4 e# Q( b% _2 g- ~
/****************************************************************************/
& u; J" y. R* t7 J) J/* */; t5 Y% a9 c: ?$ R8 {9 w U
/* PWM 中断初始化 */
6 s4 \, E8 I/ X* y/* */
% Y5 x( w, ]' \" {$ Y/****************************************************************************/8 B6 \* R* I6 o8 s* f( G
void PWMInterruptInit(void)& k8 ?* w2 x$ K, c8 ?
{3 i$ N( a- `7 U% {+ B1 ^$ g
// 注册中断服务函数
7 ~8 t- E4 G4 V' l, J IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);9 \. L9 @6 G5 b, j
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
% B# A' H: } j2 f9 _: r5 A7 |3 g
// 映射中断
8 f$ ]2 O$ y0 }2 N IntChannelSet(SYS_INT_EHRPWM1, 2);
+ |1 ]/ i" z: K) U, }* @% w0 M! d IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
+ n/ u1 _# G; x( F1 Y; r$ z: i
& C9 `( H$ p; r) a) l+ w // 使能中断
# O5 a$ }+ D, a. b2 c IntSystemEnable(SYS_INT_EHRPWM1);
" g# I& J0 c: r( G4 x3 s# D IntSystemEnable(SYS_INT_EHRPWM1TZ);( b/ M7 k6 n3 ]8 b1 H1 \8 J
}
+ V- }8 F! J0 B" i1 W4 r2 M7 X) X' Y5 f; c" U9 Q
/****************************************************************************/
8 q9 l% I( S: `$ X& M/* */6 o$ K! z s; Y0 y( d. z
/* ARM 中断初始化 */
: R( ^$ p. D* ]* y$ s+ L/* */
) q5 s* R" X7 ~2 O* a7 D t/****************************************************************************/
. ~8 P* Z5 F0 @9 n$ j) jvoid InterruptInit(void): Z- K2 R4 s5 C) [! J# j c7 ?
{ q9 j. Y2 x; |! A2 S4 D. C+ b u
// 初始化 ARM 中断控制器
3 Q: I9 ^" y8 ]; J, N/ \$ } IntAINTCInit();
# R8 d6 t4 F0 p0 N/ X/ b. @* `2 b- P6 T; {7 z) o- V- A
// 使能 IRQ(CPSR)7 |' |6 T B; R! G) G8 v
IntMasterIRQEnable();
2 u# E5 v. D3 c
2 m6 i" ?) Q7 W# k. Y t; u // 使能中断(AINTC GER)
9 |- G3 o# E. [6 r ]% Q IntGlobalEnable();
% y* v% ~1 A: e0 i' B8 x0 a( m+ i' ? `" x
// 使能中断(AINTC HIER)
- d* b& ^% r3 l0 K( b IntIRQEnable();
1 S; X& y! P6 ?- E# H3 ^* n}# ]6 ]$ b1 z3 n% Q R% f- d
* {# O: R" \1 C) ^) \( g( P4 M |
|