|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
) L; W" t; j t1 @/* */- h0 x; Z; h. [5 Y7 I7 a- t
/* 宏定义 */6 ?/ P, R* ?" h, D. ~
/* */
0 b; E* b: h( u) p* Q7 B q/****************************************************************************/! T$ h; Q" ]7 N4 |1 g1 A
// 软件断点! q/ O) E! |7 R) [' ~+ b E- D
#define SW_BREAKPOINT asm(" SWBP 0 ");, Y8 I$ z# }% o) r. E
! [" d, E) e/ ]2 K# h @// 时钟分频
( y/ v9 j( J6 h9 c" w* ~' U* X* W#define CLOCK_DIV_VAL 228
1 q, ^ S8 Z2 q. m" y/ E. h7 f3 U2 u. m# z- H
/****************************************************************************/
4 s% k( ~) S, k( P, l; a+ t$ r F/* */
3 d2 u$ L3 K N) {& l5 q9 }/* 全局变量 */5 w- h/ p( v! O4 }
/* */
& P/ Y) F5 d8 g- Q# E/****************************************************************************/
5 y7 b) f& f& ~0 ?" c, L3 ~ECAPCONTEXT ECAPResult;
1 H: \& L1 G, U) f8 p- _
0 H( y3 Y& R, r: D4 z8 Z/****************************************************************************/( V- `+ H9 q0 j" A' W
/* */! \3 A9 D# l* r5 Y; _1 M
/* 函数声明 */3 M$ N2 w& t6 T1 W1 a( } u% d
/* */% d# m4 D' |+ Y9 O) W1 t8 V- Q8 ^
/****************************************************************************// B/ u% x! ~% `
// 外设使能配置' y6 z1 K# ~; Q" h. H
void PSCInit(void);
7 a) C8 I6 ~5 @" h
8 \" n: w, ~. o& R8 T/ b9 Y2 `// GPIO 管脚复用配置- R. |; Q+ g$ J/ w% Q$ L
void GPIOBankPinMuxSet();/ T) S3 F, r0 a- J
2 ~5 B0 s8 _0 f' `% U9 A9 q// 产生波形6 S m1 N( A0 j* r7 D. E
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);' `, ~1 J }$ J5 ~! y. k
void ChopperWaveform(void);; G8 L$ N0 \7 r# \2 x8 b
' q5 E2 @, C1 z3 i; e- g$ [
// ECAP初始化和读函数
& z' q4 G+ g. Z5 H, x" S7 kvoid ECAPInit(void);7 N% ^, o3 `/ O3 n* ^
unsigned int ECAPRead(void);) s$ @! u$ D0 h+ Y& S# M
) a2 ?" m1 Y3 l+ V/ _3 c: m
//ARM 中断初始化
2 A7 X8 [9 K* ivoid InterruptInit(void);
4 o% U' F" Z, ~& s G7 b& Q0 y o* w. u9 m/ A/ u
// PWM 中断初始化9 n+ ?% \; y; b+ H
void PWMInterruptInit(void);
2 O6 _7 u9 ]+ S// 中断服务函数
$ N2 X" u: A- q- W) _& J// PWM 事件
) ~& a: y) b1 T) F+ @void PWMEventIsr(void);
$ ^% l) c/ I4 `: a+ a// PWM 错误控制事件" I4 ?) O) L- t8 Y3 @ r; \" Z
void PWMTZIsr(void);/ L0 V" ?& N# C1 X) C `
* O& U9 X- |7 Q0 b: N3 G
/****************************************************************************// o0 `9 t0 B9 I9 c. y
/* */4 m6 A5 w" D" E# d6 N
/* 主函数 */
# u$ {$ p+ {" V8 @/* */2 m; x( R+ Q$ E0 k' ~7 }
/****************************************************************************/
5 g# l* i: Y0 D% B, Qint main(void)
. ~# M( }4 o- _) z2 A{
2 Y' Y* K8 ~, P8 P" D2 O. F3 p. z% N; m // 外设使能配置
& i7 ]0 Y, }5 F' D, N7 t PSCInit();$ |: u: L( Z8 i# t* \' l
5 }$ T9 y) H4 X1 N2 U
// 初始化串口终端 使用串口25 D1 r4 |% _, z0 M+ L" E3 j
UARTStdioInit();
t+ L% g) y" I# ~6 U
- C' {4 q2 a! \6 C3 k // GPIO 管脚复用配置
0 H4 {4 f) ~! B8 i GPIOBankPinMuxSet();
4 A9 G) Q/ f9 S3 j1 N4 b
. t2 d% N0 M" l. e9 N* O* B4 w // ARM 中断初始化
. |- N$ p9 }1 X6 |( b$ X; B InterruptInit();
6 ]9 P0 }9 q; G6 l7 s7 n- l. D0 x/ F; a% a6 Z$ r( G% V
// PWM 中断初始化- p$ L8 S& T2 o, [0 K; E1 z
PWMInterruptInit();) R8 @) M# d7 H4 ]
* {# a9 g5 Z' j& m
unsigned char i;
; `' F1 Q1 D" u1 n; N0 ]9 U/ k! M unsigned int j;
, g3 r& @! l$ N+ E
9 D/ J: B% s3 G- h UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
9 m+ ~: h7 Q' l* B$ i' J4 ^9 r UARTPuts("------------------------------------------------------------\r\n", -1);
8 n( A; G$ P$ h$ N, m( k* m UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
; V% p5 L/ D% M4 v' e3 w% j // 产生波形8 a$ r! A. P' P$ L. \7 Y
PWM1ABasic(25000,50);
) _* x) _: y2 _ M' L
0 c" O9 j9 R; h8 V UARTPuts(" C6748 PWM Test Over!\r\n",-1);" v0 d6 i& ]) F6 G- z4 L
UARTPuts("------------------------------------------------------------\r\n", -1);) h+ h& t1 R' m
( q; d" U- V0 e2 h) d
+ H6 V) p8 ~0 W8 [, w
2 a& m9 G8 J5 B5 ?4 Y UARTPuts("------------------------------------------------------------\r\n", -1);
! A! g% [' ?/ f. A5 N8 x UARTPuts(" C6748 ECAP Test\r\n", -1);2 _' T2 J9 A7 n3 b. l4 R
// ECAP 捕获初始化5 {* |3 p2 n' C, a$ {( z
ECAPInit();
$ _4 W" Z5 V' L$ \2 { f% ] UARTPuts("Initialize ECAP.......\r\n",-1);
# a* n3 B% B/ Y8 K# k0 y for(i=0;i<5;i++)
( `2 Q7 q# l7 f/ q, l" e) s* C {
7 p5 ^: J! H, H; D8 r9 i3 H for(j=0x00FFFFFF;j>0;j--); // 延时
6 L L, ^! C" ]# t' d ECAPRead();
( M$ P' W" J+ d; `7 e) H. y }% G& y8 |% A. d- Q
UARTPuts("\r\n",-1);
8 r8 v# J1 R) V! `8 E( O: X UARTPuts(" C6748 ECAP Test Over!\r\n",-1);3 m; T6 ]9 B0 C2 q
UARTPuts("------------------------------------------------------------\r\n", -1);
! P3 o! a* u! b- c, k3 m. x5 i
// 主循环
. m5 ?1 v1 w1 p5 m3 ^& h for(;;)2 \! v4 @( Q9 R% \8 [" [
{
; N, |6 E, J- g$ g# u% J5 h
$ Q* e$ U% N/ ^: `. ? }
# T: R! @5 [) K, y}2 p4 H! |4 |2 C
" s# }6 c( [9 `9 R6 }8 A+ b
/****************************************************************************/
, w6 w+ _& l3 j5 J& i7 _5 W& x2 V/* */
% j* H# ]8 g p$ a' \, [. l/* PSC 初始化 */
# x6 T0 I( P( Z) Z( P5 ^/* */
4 H7 ~* N7 d" L& } k! }/****************************************************************************/
8 e# q1 F4 m. K7 Hvoid PSCInit(void). r5 k, e5 ]& t* W; P1 `5 A5 ~1 g
{
% W1 R7 {8 X$ C/ e5 _+ }9 A/ W // 使能 EHRPWM 和 ECAP 模块 I& S" P7 J$ p
// 对相应外设模块的使能也可以在 BootLoader 中完成. t6 }* X- E( U+ p1 g6 \
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);6 v& S8 V0 O& I; _) h# U) i
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);6 x( d g, ?, i
}
6 Q' ~0 }5 w5 v* S4 q% C- t, Q/ m& S2 _1 C% L
/****************************************************************************/
" O/ @! w. v4 q0 {8 C( | o/* */" G1 v5 \+ V$ u1 {2 `
/* GPIO 管脚复用配置 */2 x, S* _0 W5 b) J8 f
/* */: ^6 S r9 [: p9 p
/****************************************************************************/4 D( f9 R7 L5 R3 s: I" L8 r
void GPIOBankPinMuxSet(void)
5 i/ W, O& ^, N{
+ c$ v" k$ h1 X- c EHRPWM1PinMuxSetup();% h' m3 ]/ a# @/ W& O- ~
; v/ p1 R" Z8 J4 r // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)+ ?- f/ w7 f+ O0 X0 i: h# z
// 作为捕获功能时管脚方向为输入
, k0 U. o' a1 h/ |" x6 ? // 作为辅助脉宽调制时管脚方向为输出
8 ]8 U% c+ N6 B3 t1 N // ECAP2 / APWM2* {% o c* i" w H$ w
ECAPPinMuxSetup(2);& [# ^2 N! z. {8 ~
7 i& M2 z# u# x$ O
// ECAP2 / APWM2方向设置为输入
. y7 N# x5 J$ U* h* `, G$ @ GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]& @! a. b4 K" k9 C4 H
}
9 D# o- X- X% k8 O$ q
4 n; \+ C- s$ V" U3 {& }7 |0 P/****************************************************************************/" U' U- s X+ I. E/ _' {8 L# N7 Q7 S5 m
/* */( f3 i: i8 W5 c( i6 j* I8 Z7 u
/* PWM 输出波形 */
5 I: o9 c$ r( o' D+ u, |6 F m/* */4 v8 d8 P2 u6 @+ \4 t
/****************************************************************************/
3 i0 z O: a' N% S4 c, D$ xvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)! H3 F( `' {" M( }$ e& J2 @
{( K+ f/ n. N$ \8 X4 p7 ?: H
// 时间基准配置' X1 a( n4 i- Q0 |
// 时钟配置
0 i( F+ V% _* w% K* ?8 e4 y+ G EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
, O- O! E0 Q7 c; O( _ C# b1 |2 `2 }3 o/ E. {! ~8 \' j2 f0 ?
// 配置周期
/ f" g3 U0 \$ ^6 e EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,5 B. U6 I! A- I s
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);0 r0 k4 c* W! q5 X
9 l' `: S7 }$ N6 P0 v // 禁用输入同步信号5 G) l1 C' I! q$ D7 ?$ ^% r
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
z B8 I. [& B# \( }
! V* L* |0 c4 j9 L // 禁用输出同步信号
8 R4 w: y0 z) Q( I/ a3 O EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
) q4 @$ t. T' q9 k9 Z) E/ j' [4 `
// 仿真(DEBUG)模式行为配置
5 F# b1 b5 g5 s) a& k" J EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
# x# X4 e' b7 Z6 L0 q9 I" o3 P+ \- q& {' V
// 配置计数比较器子模块+ C# r- j: N4 R7 K, y4 f. B' o7 M$ u
// 加载比较器 A 值
% I6 \+ o9 ?% C* X1 Y- | EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,: h9 t# i$ e* C
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);. z% `! c2 @: S$ T
: M, r# f6 {; W. f& ^! F# l- v( E // 加载比较器 B 值9 i' w( I ?& j9 t5 _
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
+ B' X+ r8 a$ Y+ e9 f EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);( z) e( B) t0 R7 F" _. E
! o9 q% d1 a6 {( U; U/ Q
// 功能限定配置(输出引脚触发方式设定)" B% |/ O6 J# G+ d: N* F
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
5 v% p% l t9 V* v EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
+ r9 m) q4 s2 k7 w EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,& U: J: @- S; ~9 T$ c" Q2 r% g
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);- X4 s9 l+ \" n. V0 e6 }& E6 r' ]
8 x! Y4 R1 H0 S+ q, h1 j
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
/ m% _! E# E+ y EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);$ b! j9 s7 P3 J* z
1 j! Q: ^! D/ I // 禁用斩波子模块/ _1 e: N. }3 t5 k' L
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);$ f+ q+ h' v3 O! g8 H( p% u7 r( o7 k
" {; f1 t! ?0 C. _* Q // 禁用错误控制事件
! N$ |5 Y6 @0 }6 v EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT); u) y( r! G* ~" K! k
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);. M; H% M- o2 c$ S
. y8 c* G# q0 I0 U. J
// 事件触发配置& a/ O: l# @: B/ P
// 每三次事件发生产生中断
- q3 @6 n, T; z+ O, ~ EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);/ A4 a e: A1 X/ @
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
# @& E/ }% c- |6 O/ m* j EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);$ b/ J/ s/ i3 O2 F4 x J
// 使能中断
+ c, G& n9 \1 k/ H# C EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);1 N) @3 v- a4 N4 q) s8 B
9 Y, r- S8 o5 c7 _; U // 禁用高精度子模块 R6 J6 Z* w3 w. K8 J$ W
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
8 P. @! a" h: }& V0 x& e
& x t: g' S, R; L3 C# f3 e UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
( U/ Q2 ^/ M" W7 G}. m1 ?1 d1 [) e1 D
6 u3 y/ }; ]* |5 b6 `void ChopperWaveform(void) g6 q- `' l& R
{- C+ M, G0 x) N+ o3 V- L6 k2 K" i
// 50% 占空比9 @1 a* V1 m# S$ ^% m* M- ^
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);9 A9 f# |1 ~; \. s( \
// 4 分频7 M( ^( N2 w, u
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
* V) a; F6 a9 p* n // 单个脉冲宽度
5 P6 e0 e8 V" q( `: O; r6 f9 ^, y EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);7 o( h& Y7 Z* Q- e2 k+ f8 N2 L
// 使能斩波子模块& P0 b G* W2 i3 Z3 k( ?9 Y* B
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);! V+ O' E3 s% n5 s t4 r& T" B; P
}7 t( e; @, B2 P/ [9 d
: t G) K7 H6 G- x/****************************************************************************/* |! t6 i) T1 @3 b) Y' L
/* */
3 W* G1 |7 V, r! Y( E7 [/* PWM 中断初始化 */! E2 c7 Y4 Q/ z9 X' f* s# v( E
/* */5 ]' G3 L6 E2 P; V' n9 w: e8 v( u8 x
/****************************************************************************/7 {6 m& P% B, R4 H% b" j
void PWMInterruptInit(void): F; Y9 S1 U: s; r+ r! ~3 W( b& Z
{0 l# D: n8 C9 k: ]2 h8 B0 h
// 注册中断服务函数
1 P7 ~5 D1 I$ v6 z* P' `8 F, L$ @: y IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
( _" }. h3 [. j8 l& y: k IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);4 X5 u# U9 [( U! m
5 g# g8 [. X) S: i0 ^* ` // 映射中断0 l% g: o I0 n4 Y e4 K
IntChannelSet(SYS_INT_EHRPWM1, 2);7 z9 P& Q0 i4 l& n" y
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);: v' {. P% \7 {) z( x+ B9 w% ?, `! H
/ i1 H7 z5 R. _6 _; k4 v, J Z. h8 l // 使能中断! V! T* m& ` [$ U
IntSystemEnable(SYS_INT_EHRPWM1);% Q6 Q _# i; p, D
IntSystemEnable(SYS_INT_EHRPWM1TZ);
0 L' o- A; U/ K# r0 G6 O* ~}1 Q5 v5 L% ^2 I. y* w+ A
- T& H$ C0 X2 \! d: ~1 U% c/****************************************************************************/
9 W/ o8 b0 m" r. }/* */
0 M9 Z) {9 h) `- j* {/* ARM 中断初始化 */
7 P( G; D/ c4 ]% a9 x: }/* */
7 |7 z* e$ v" ^/****************************************************************************/6 \8 v/ j+ l. r' r& j
void InterruptInit(void); k8 W4 v) v# A/ T# W
{
2 L. A9 S q( a5 [0 O v ~ // 初始化 ARM 中断控制器# ~3 f- y# I# L3 O8 w( W" ^
IntAINTCInit();
: r' h; h3 o% m9 o1 I: O# M. _1 a- i6 `
// 使能 IRQ(CPSR)+ w% u7 L5 o; d3 ~2 n' H9 O6 C7 ^
IntMasterIRQEnable();
* s2 G! T5 b r( |$ f. e3 _8 Y5 R. t' k$ r- U; h; v
// 使能中断(AINTC GER)
( S' G4 ?5 {$ f; b3 a IntGlobalEnable();) ?& ?7 j! B: E
4 d L) V9 G, c' Y9 Z: K3 E6 ~
// 使能中断(AINTC HIER)
1 v# V7 o( T+ L2 ~, L IntIRQEnable();
! } W- z# p& g! c/ z}- |3 x6 g7 Q5 ?' a i4 i3 X: W
& g O; s# i0 j& m; S& V. _
|
|