|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/8 y! H& X$ z, c" b9 r: s) r
/* */& r. B2 A( ]$ H$ r9 C: b$ J' S
/* 宏定义 */" \+ }/ g0 W9 Z* A+ X3 c
/* */* j* n# j W! d) I
/****************************************************************************/
1 b4 S9 b) T) G9 ^1 @5 t' Y6 |// 软件断点: Y" M% t4 r% A- ^+ ^5 x+ u
#define SW_BREAKPOINT asm(" SWBP 0 ");' b" k8 @$ W7 ^1 i, r
2 ]: k# `8 h3 @8 j) `// 时钟分频
! ?/ B% a' X% ^8 c7 O7 s- ^#define CLOCK_DIV_VAL 228
5 X: G, e% J) u3 f. J9 V7 J% _
7 i; }" T5 ~: y8 n/****************************************************************************/
+ ?/ e: v! Z/ p. [/ ?4 J/* */
+ X" Z5 V* ]# a! U1 V/ h- v/* 全局变量 */
" G7 W# t( K/ s0 t0 O4 `/* */# z8 P4 N3 s5 G5 z! M4 U
/****************************************************************************/
9 w% S' q1 \: P8 R+ z- U* M7 `! cECAPCONTEXT ECAPResult;
; P4 N8 U0 h, n, m
# {, n4 v$ X' p) e# D% v5 p/****************************************************************************/
- L6 D- R7 G) [8 P4 d6 P) |2 a/* */4 O" M) Y) I1 \" l* Y5 L: v2 U
/* 函数声明 */. @1 P- B. {6 _; c! U( N; e
/* */
& S) p* [# t; [: Q/****************************************************************************/- E6 s1 Q4 ~9 `8 P0 ?3 R
// 外设使能配置
0 P% f' q' S' `* ?4 C5 d0 kvoid PSCInit(void); h7 s0 K- j! h* A+ l0 b6 s1 |
/ O7 M4 \" ^6 L7 ^4 } _// GPIO 管脚复用配置
9 M; \4 {6 s( }- e' uvoid GPIOBankPinMuxSet();# e8 ~- n# A* B, r$ C
# C3 g% ?) x0 |: a/ E9 F// 产生波形2 K# ~/ m1 q6 p% m* N" H
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
7 C# b' e$ s8 @7 q4 p5 Z# ~void ChopperWaveform(void);8 N! a4 N5 h" S2 v3 \: N, w
5 F r2 I7 l; V, ?9 H7 ~
// ECAP初始化和读函数
0 V1 m+ W( J% W; c u& Mvoid ECAPInit(void);0 A* W Z! {) a
unsigned int ECAPRead(void);; J5 F: Y6 G6 t
0 Q `# z1 ~! @5 W//ARM 中断初始化
1 d: ~; y2 Z0 |; \! L: c5 X: gvoid InterruptInit(void);" t9 j: N0 Y0 _! O- d
! \( F% A" K; ]; T. S// PWM 中断初始化$ t3 f# Q8 J0 r9 r7 `! q* h: B
void PWMInterruptInit(void);
: M( z6 L& C8 G% a# F3 j9 o// 中断服务函数
# e9 m5 X$ Q! g// PWM 事件
; [( @' {3 S/ t( b( N, Dvoid PWMEventIsr(void);
) l5 w! U) d! n5 e$ B8 F; X( c// PWM 错误控制事件# k: c. \& t+ a3 e: k# K
void PWMTZIsr(void);
], }; J, d4 {' M" i' p# Z6 `2 q1 ^8 o; f X7 n
/****************************************************************************/7 {& |. n" Q1 B+ G
/* */% \0 |7 z# ?! O5 n s+ v
/* 主函数 */' V* e/ d$ b+ n/ {; w# b7 {
/* */3 U) X6 D0 m. P8 ?# o# {6 p; {/ _
/****************************************************************************/
! [( n: f: i; _/ y; b. yint main(void)
( _( L, c6 Z' E1 o& U3 [9 `{
3 ]+ X; ~0 `. N3 z5 x // 外设使能配置
6 R5 x- C" @. \7 N PSCInit();
5 d$ Z$ x! w: N7 v4 P$ X# f: `) k
# m3 J2 C' Z/ y( m // 初始化串口终端 使用串口2
4 c" s5 J7 @8 J. @% z UARTStdioInit();& _+ x5 [% @3 x& y0 d! J: a! U
) [2 c X5 u/ ]9 O& I // GPIO 管脚复用配置( W! M* d+ A0 m! Z
GPIOBankPinMuxSet();
6 ~" H& }9 o3 k. \8 @9 v* \( b
# l G* l" W5 z3 ^/ z! P // ARM 中断初始化4 ^0 T7 h$ z) @$ f! d* z& I
InterruptInit();
3 @( k. p- g( Q' h7 t" ^4 b) R/ J6 J6 ]( W0 E
// PWM 中断初始化
9 r' a9 z$ _. y" i. U PWMInterruptInit();
% L9 R6 I5 l" \; G1 b5 z- n: O2 b% r c2 `9 [& z6 S& J) n2 N o
unsigned char i;* j8 R$ Y. z- m1 y
unsigned int j;) M( d7 }; j. I/ ?3 m: {0 @
5 p# @( [2 P- z# ]0 {( k& O7 D' Y
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
8 p" X8 s! J, T6 t4 \ UARTPuts("------------------------------------------------------------\r\n", -1);
% _1 `4 N, k* B8 y UARTPuts(" C6748 PWM Test\r\n\r\n", -1);$ O0 U! u( i3 p2 ^& Y7 J
// 产生波形
- \+ K6 ^5 ] b: v/ `* e, C PWM1ABasic(25000,50);
+ ?8 X7 E" [8 m1 m0 [
0 U5 @6 A6 t( |' `( E: ?. G UARTPuts(" C6748 PWM Test Over!\r\n",-1);+ J& H5 Z0 K. S" ]$ P
UARTPuts("------------------------------------------------------------\r\n", -1);) d& \, D; x9 F7 ` ~
- p1 }0 {9 y& l1 U% `$ g3 V& H. Q& n0 H% M( E4 e1 h4 h6 D, S
; c, M) R8 Y) N' @2 W! b5 \ UARTPuts("------------------------------------------------------------\r\n", -1);$ h# G M6 f. `, Z
UARTPuts(" C6748 ECAP Test\r\n", -1);
% k$ B4 i" g: L8 ~- E$ n3 l$ O // ECAP 捕获初始化
6 z$ K' V" Y" R! W$ L, @. V ECAPInit();
^* g9 g# l. `, M UARTPuts("Initialize ECAP.......\r\n",-1);9 B" T, n# A' }% f: B- N- d5 B
for(i=0;i<5;i++)/ T- B: c6 i0 G7 k, h c
{
7 J, ~, ?$ V' N- l for(j=0x00FFFFFF;j>0;j--); // 延时/ n. s8 d6 |4 P& g4 [
ECAPRead();
7 @5 o! v' n9 e: [; v }/ T# g1 I) C# M! q
UARTPuts("\r\n",-1);: G( u9 E6 j v. b1 [
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);* R# b( f; \0 ]& H* p7 S9 I
UARTPuts("------------------------------------------------------------\r\n", -1);
' H) w/ d6 ?: _, i/ s
/ C) g/ g- s7 ^# t5 J* t // 主循环8 v/ J$ o0 w6 w& k r# |$ B# X
for(;;)+ d& s" n- Y6 J! ]% ?% K& v
{
4 G5 W+ O; X; m1 y: i% C# j2 Z# ?% w/ m2 Z( g0 U2 w
}, t/ H7 X/ g* I$ E( {7 \* _# k- b
}
: p# x y+ X4 A- S4 g" c2 \" j% Z0 Y9 F, S
/****************************************************************************/
$ W$ a0 R3 E% V/* */
6 a' S% W& L; M- k/* PSC 初始化 */
+ a4 g" t0 d3 h+ H: g/* */: y1 \5 y( y+ L1 ]3 f- e
/****************************************************************************/
V% M! X) ^4 K, l( ?6 Lvoid PSCInit(void)+ ^1 C. t! U: _
{
* M" i, C' b% u7 q! M/ R5 K // 使能 EHRPWM 和 ECAP 模块
^& Y6 F3 v: | // 对相应外设模块的使能也可以在 BootLoader 中完成# q! k! S( n) g' G
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; z9 \+ o: ]$ I/ L8 `1 |( ]2 B PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);% q8 x$ F# p! H5 h/ t8 R9 C& o
}
1 k6 u8 j [+ D+ |- q; K# a
2 e- n% S" p2 y6 O/****************************************************************************/& _. E6 G! X4 F+ A
/* */
5 s1 N7 I; {' o$ o! _+ B" o/* GPIO 管脚复用配置 */& p0 k) P& d1 A! ~& |+ m6 s" }( {# H
/* */" x6 L9 ~6 D2 G" y5 O6 A
/****************************************************************************/0 V. o, \6 U$ _# J
void GPIOBankPinMuxSet(void)2 U7 b5 Q2 Z# y
{
; r+ c8 `4 c0 \- g1 g, k& u' p EHRPWM1PinMuxSetup();+ k4 m" h* R- Z/ [
8 }) v1 ^8 L0 Y- Q
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)$ ]9 x' v* `0 p# k. b
// 作为捕获功能时管脚方向为输入7 M* L7 s& G" g
// 作为辅助脉宽调制时管脚方向为输出! ?# v( D7 \; n. D
// ECAP2 / APWM2: ]2 V5 o( e5 v# f
ECAPPinMuxSetup(2);+ E. t' d4 l7 c) W
+ Z: L( G, C1 U+ Z7 m% F // ECAP2 / APWM2方向设置为输入
* v% b% _6 N6 U2 q6 p GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]0 I: \, o* p8 I
}2 ~! v. f. P0 H% R9 A/ ^
7 V/ o( X: B* P2 h/****************************************************************************/2 Z, ]9 _' H* ?% n6 ~1 v
/* */- X% y( ?' r# M ^
/* PWM 输出波形 */
5 K& D' _0 c/ s; @# S6 s8 I: x/* */
I5 S; Y& V5 o# l/****************************************************************************/
2 Q8 @$ x" J% d7 A7 a: i5 vvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)( G: Q. Z4 q) ^; W- I5 f7 ~6 a
{9 F+ ^& M$ M7 H9 m
// 时间基准配置: W# _' C8 Q" r
// 时钟配置
# y- |/ L8 q3 ` H, k( G3 ? EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);8 \* B; ^* c2 c5 |
" f% M2 v+ n' {0 z0 f1 S
// 配置周期
+ Y5 \; n1 K' H EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,- |: k2 h# u9 h6 l3 m& ?$ r
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
: P9 h. |4 s2 t6 n: s B/ v) L& u# u8 E* ?2 t( j
// 禁用输入同步信号
* s; p2 l6 e% A EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);1 r' Z F5 `# U9 H
! r' K/ T1 H$ m q4 m
// 禁用输出同步信号
: [% ]4 |1 g" ~- K+ p0 { EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
- N4 U M O5 S; z, U) `6 ]8 ^1 a
/ P! y6 j+ E$ K8 t1 P& z // 仿真(DEBUG)模式行为配置
( ~$ b9 z6 j4 @8 {# J EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
: T1 R5 Q! v6 b0 T2 Y: E6 n
/ l4 g4 h9 l- X8 i" D" T // 配置计数比较器子模块
+ d3 `2 A2 R/ G // 加载比较器 A 值7 t& W @- I4 e3 x9 ]* B
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,- w$ C- q% j: h. X; V
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
5 E! u' B, e5 L+ T5 q
7 N7 p0 e+ P; w // 加载比较器 B 值. }* [9 L7 e+ Z# b1 X' h5 {
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,0 F5 ^' s2 ?' D! k0 z5 f/ G1 h
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);9 d" _( E9 G4 I0 M
9 h' p1 S7 c! t8 J" d) w // 功能限定配置(输出引脚触发方式设定); h; Z: O/ K/ d! }% M
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
% l$ f/ ] Y _. A8 { EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,' n& o* K! j E* ], O
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
' d# z! ^! n6 z/ B r EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
5 c+ n! @6 I, D
, Z+ l/ O3 x8 ?: q // 禁用(旁路,信号直接输出到斩波子模块)死区模块
1 \+ U+ ]" X- t' g; i: |# n' h EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);+ j& N. Y$ {3 b; u% E. H7 B
$ v$ s$ b0 k* c8 h- \ // 禁用斩波子模块 z8 S" |# n4 Y; i
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
3 f- }- ^& g/ ] A" [: u$ h: x/ A0 k9 I: o0 s. x* l5 e; T! q8 S
// 禁用错误控制事件
% |6 m( ^4 m4 M) z# M; U3 a: O' M EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);( p5 ^, V$ {# t' [
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
[- u# {6 m/ C1 H. \& x$ ] S. D
// 事件触发配置6 e- K7 G0 |% K$ ^" T1 O. e9 ?
// 每三次事件发生产生中断
9 g+ y' ^8 n) W4 j7 \ EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
2 l* N3 J1 s* I5 Z0 ]7 g // 时间基准计数等于有效计数比较寄存器 B 值 产生事件: j7 R9 j7 c* _( l
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);) }7 G* g0 N: k9 S9 i: Q* y7 f
// 使能中断
, K, X5 y" D* r& h( p. X7 p T EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
- A9 T3 t$ J* y5 u7 X9 z
0 @; I8 m4 V, d+ u9 `- v. @4 O // 禁用高精度子模块1 X U7 }8 q4 s- }* O
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);0 X+ w2 T# A6 K0 P0 f, D
R! s* A9 X3 p8 _6 I5 l& g
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);1 ?. F5 x$ Q* r! Q5 A: L m
}6 T* Y7 E7 L( @! [
& T$ N7 C# X* q+ n3 E8 j: Uvoid ChopperWaveform(void), b0 G C, k j/ i. V: H
{; D$ e5 o& @# P' Y9 c
// 50% 占空比8 z$ J0 f+ a _. X
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);# w4 e& }1 \- s% z L1 ?( P+ b3 Y
// 4 分频
/ M6 ]+ N# o- I% A# z5 C | EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);: f! |8 Y" c& c" B3 m
// 单个脉冲宽度
2 X% h/ _- B" Y EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
2 W2 b A+ Z3 O' _- ~- ]; f // 使能斩波子模块4 z0 X* q% H/ P6 Z4 J
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);9 G/ A3 F s4 b6 p
} w+ _5 I* M: m% w* ]/ N7 p9 C* ?
) W7 k' I) c w- O
/****************************************************************************/1 J# `6 k5 @3 [/ {$ r6 z i
/* */
' _. d: O& S4 } b8 S0 m% I/ w/* PWM 中断初始化 */
# g. |' e K# C/ d6 V/* */
b/ B% P8 t6 J( _# [- ^- [: V/****************************************************************************/
?2 r) y- S! V& O+ t- Dvoid PWMInterruptInit(void)& [2 |. Q9 O. m8 I! z3 x1 S8 q
{2 p0 c& }' d& D
// 注册中断服务函数: _- ^5 ?: u5 ^! Z) v
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);6 h9 \2 g1 t' H9 F- Q
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
5 G; N+ r7 Q. L" \. {; s" t) G
/ g: i6 t7 }. |1 C5 i // 映射中断 t& F3 L( k' Z m4 }
IntChannelSet(SYS_INT_EHRPWM1, 2);
% u+ s9 f' l0 C* {2 P IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
/ y% L/ E8 |$ |, M& @( s2 c- Q8 z3 N7 Q3 k
// 使能中断
~+ b' B+ s2 q" i) A IntSystemEnable(SYS_INT_EHRPWM1);
/ h X9 {7 L3 _, P5 K7 o IntSystemEnable(SYS_INT_EHRPWM1TZ);( }# K2 }7 a# X
}; ]: W- P$ S1 T9 {+ h( n! h
2 b. M4 @( ^: _; a+ O/****************************************************************************/5 F( d, ]5 K9 M, T+ ~/ |
/* */
% s V+ A1 U( j; ^9 L2 L+ S( B3 b/* ARM 中断初始化 */
# Y) _" D j$ R6 m5 i5 Q) {: |5 n/* */
0 p, u1 G1 G* \- ^5 z/****************************************************************************/
" f1 {1 u8 x. I; G2 \9 E; M8 Z4 k9 lvoid InterruptInit(void)5 A0 O9 Y* U) f0 Z3 N
{
4 n+ l: K$ e* A: y! { // 初始化 ARM 中断控制器# r8 `! T' g% n# b/ g
IntAINTCInit();* L$ B3 P5 `& h) B2 y3 ]$ }
3 a o4 d/ H' a- X
// 使能 IRQ(CPSR)
. W4 K8 ~# X# x5 h9 E2 V IntMasterIRQEnable();
# x2 m: [' @' z& I, ]
* H, f3 B# x: @- M // 使能中断(AINTC GER)( E+ t, B) Q2 m* [
IntGlobalEnable();
1 _& V7 }& f5 P* `# \
+ s) h$ L! {* b+ e1 Z // 使能中断(AINTC HIER)- o1 ^! M. X, k3 |; z$ t
IntIRQEnable();. P* Q$ c+ ~' V' O6 L: g' t$ z- O
}
7 u$ o" q& ^( q! M, H
0 D; d! f8 _9 S |
|