|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
+ c1 s9 j& D+ d+ u/* */
* ~0 k; n9 O [$ N/* 宏定义 */
* a" f. w! n8 d7 i/* */% s, v, H; A! a5 z- \- N
/****************************************************************************/
# D g3 p1 N& v// 软件断点! z/ b- P7 }0 k& n8 g
#define SW_BREAKPOINT asm(" SWBP 0 ");% S' j! n2 u& H1 [1 ^8 _! Y
1 p0 n" b8 y% e. ~$ h4 E// 时钟分频
( m b) H* S: }! z#define CLOCK_DIV_VAL 228
, J$ ^) b8 B4 g% j2 Z, \ n: }. h3 H- J" a9 Q0 V" U
/****************************************************************************/- a* M9 U! k7 K. v& _/ o" q
/* */
6 a3 W0 x; l( [7 V" K& e$ F/* 全局变量 */
5 p7 e ~5 k( Y! M/* */
& H0 q% n7 x5 ~/****************************************************************************/ L) p/ L& {& v. W5 m/ ^
ECAPCONTEXT ECAPResult;, i! k# p, Q" \0 `$ |$ _
+ C7 L. ?; H7 `& e3 O" p3 z/****************************************************************************/# X+ z+ a" H: e# @$ V% w
/* */. k- g3 c1 u3 m+ c
/* 函数声明 */9 z# d5 @0 A+ u/ K& U4 @) {
/* */9 [/ {6 X) `6 e- r7 |% U7 X$ b
/****************************************************************************/; f# ]- v8 j6 Y8 w/ A
// 外设使能配置
* f: S) A' G+ M! avoid PSCInit(void);
/ g% w' x, E9 b1 A
8 _- R4 ]& B# c& H1 ]// GPIO 管脚复用配置
& C S J) ~; ?1 e' ^8 a7 T& Avoid GPIOBankPinMuxSet();
9 `4 F! v1 a) w3 E, r
3 F. l. |. X+ w( V" x6 e; N// 产生波形
- K4 ?# ~9 @: L" T8 c$ Uvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);# d0 j2 Z4 V, o% e7 w! S0 w" h
void ChopperWaveform(void);
2 N) ?; v. X( x" n; s# A0 ], s4 W- |
% I3 O( P! Q' n y1 n5 k$ c+ {% V// ECAP初始化和读函数
, u9 \8 T7 G! S, dvoid ECAPInit(void);6 Q6 Y8 Y. t) v) e1 Z4 B# g0 w0 ]" u
unsigned int ECAPRead(void);
: r3 m: a. `) A8 X. s1 l
- g0 T0 f2 p A2 l2 z4 v+ q//ARM 中断初始化
9 R2 J0 b) D4 e, h2 c. Qvoid InterruptInit(void);
% L: m- R5 h8 l# x6 k% I$ w" C* j
// PWM 中断初始化3 g7 y3 @) }) K$ Z
void PWMInterruptInit(void);; R. h; X7 a1 ^* X" G
// 中断服务函数
* ]+ O1 U( n; [2 Q// PWM 事件+ a/ d5 Q9 K- B; G3 {" M: F
void PWMEventIsr(void);
8 V6 U( t" ?2 l' k6 } s& X% `// PWM 错误控制事件
" c' a/ B7 r/ S: }* Mvoid PWMTZIsr(void);4 [' q& W8 _$ E: L/ Y
* P# L* s' T0 b; @
/****************************************************************************/
( a2 ^3 U1 b& N( r; O' t; z& s/* */
/ t# \2 d2 ~, H/* 主函数 */) k8 t* Y9 b/ O* D
/* */: `" Q; x: |+ U. _
/****************************************************************************/
6 k! Y9 ?6 u5 _int main(void); D1 d0 Q0 S+ A; M$ {! K5 S1 I
{
9 l; l! ^7 r$ e# I: d" F3 r // 外设使能配置+ U6 m- s( ~' I' b
PSCInit();
3 ^. _/ `5 |9 A5 [
: I9 e$ g$ ^( s* E% z$ j+ n4 b6 a) j // 初始化串口终端 使用串口2
0 j- Z1 c3 l, s& q' @& M) e UARTStdioInit(); K6 U3 ~3 w) B% u
% y) y/ e$ r% C; ^ // GPIO 管脚复用配置
& }2 X" X/ Y/ K6 u% A8 V GPIOBankPinMuxSet();' A" L* P% l, g6 ]# k/ d
7 U9 W2 ^1 G$ G4 O1 V9 T# q // ARM 中断初始化1 e! p3 {' _+ _5 J7 i! {) B
InterruptInit();
, n% G+ A- ^5 T+ ?
8 A3 g- M) O# n, `9 P+ h' Z // PWM 中断初始化
8 `# W' ?1 w+ C PWMInterruptInit();
2 K4 Z6 M/ d4 h* q' K& h8 E) I0 r7 j) S& u5 _
unsigned char i;
# z' R( u7 h. z- R5 j unsigned int j; F* y1 R2 I9 J t6 T
4 v) v: U( ], N0 Y1 j5 U! t( {* Z UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);& \4 r% Q9 B1 A- `) U
UARTPuts("------------------------------------------------------------\r\n", -1);$ q$ q; |' X1 @8 L6 B; T- m
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);6 P6 i, _9 k$ e, @4 J9 I5 h+ T+ p. m
// 产生波形) v; C# I" N) ?$ @ V
PWM1ABasic(25000,50);
3 |% m3 K8 j' h9 x' \ X
+ _- c- Q1 \* \ UARTPuts(" C6748 PWM Test Over!\r\n",-1);
. i/ _: T0 e) i$ @4 w0 M UARTPuts("------------------------------------------------------------\r\n", -1);3 `; w1 U6 q, q- j* V4 v2 u
* E" e7 E* e+ O* R# @' Y! r
N6 s3 B' X) P2 d: W
2 q3 ~+ V2 m6 G7 i: I UARTPuts("------------------------------------------------------------\r\n", -1);9 y, G8 J& G1 M7 v' \
UARTPuts(" C6748 ECAP Test\r\n", -1);
% [' A# V: g) d7 R+ N // ECAP 捕获初始化2 ^) y' z# X, b, O2 c$ d+ }( I
ECAPInit();. X8 U9 e% E& f! \# d
UARTPuts("Initialize ECAP.......\r\n",-1);) t# t+ ?9 V; f' y6 p4 E
for(i=0;i<5;i++)5 E3 o, ]( b& ^- U. U" I
{% r. Y9 ?3 O5 v9 c n* t
for(j=0x00FFFFFF;j>0;j--); // 延时' t5 r! q, O$ o
ECAPRead();1 {9 S: y& s( W, e4 _
}9 _* D! ^4 q+ O. Y9 ]2 x/ i* d
UARTPuts("\r\n",-1);
3 C5 X1 h5 C+ ]9 l: y+ g7 X UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
+ t* m3 f+ L" h5 z( ~% h% C UARTPuts("------------------------------------------------------------\r\n", -1);* j- T$ _; h" [% c3 H# i
. c6 s4 M0 I5 j5 i, A+ A- ?; u6 [
// 主循环8 J {4 }+ U2 V1 j( j$ f
for(;;)# I6 V4 I: @0 u& V
{& I3 W, B; K# B' \- D& m
/ L8 H- N. R$ D/ x
}5 c# }- O E/ T* d; B
}( m- ~, ~1 u; Q' ^, ^8 h6 h
& L' F7 h# z; y: u7 D$ c0 I. M7 K/****************************************************************************/
N$ T8 s/ Y T1 ?( Z/* */; V+ M- o! I6 c/ P. h- h4 J7 ?
/* PSC 初始化 */
9 a2 u; U2 I3 P3 g" z9 k! r/* */$ a: u/ @+ k4 F2 j0 H
/****************************************************************************/; y* }! }+ [( A; z d2 O
void PSCInit(void)
0 v8 d$ k o5 a% Z/ E, p5 ?{% r8 _ |2 `/ m
// 使能 EHRPWM 和 ECAP 模块1 d. V Y( F) {! p9 \$ G5 S
// 对相应外设模块的使能也可以在 BootLoader 中完成
1 j" Z+ z2 K( l$ ^1 s PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 d4 U3 o3 j; `$ ]8 g* p% J PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
* g' {" a, l% N/ G% y}
; i3 y: W1 i, l: V0 q+ @$ I+ d; y8 Z4 C7 v" z o
/****************************************************************************/1 t' H! n8 g+ b( U# m/ i
/* */# Q0 S' m. E7 x% I4 t$ w+ S
/* GPIO 管脚复用配置 */& n1 ?3 U a! z6 J7 M
/* */" s: P6 Q1 b" I, H$ W/ q3 i
/****************************************************************************/3 m& a0 U) C2 j* o' p0 L
void GPIOBankPinMuxSet(void)6 C \" Y7 b9 p4 `3 e, `( U
{
" f7 E, _# k" H/ |, Y a% a1 W EHRPWM1PinMuxSetup();
% H5 ]7 A% s+ A
" D( _6 p; {. Q9 w* D' S7 ] // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)# [7 ?) d4 W1 I) d/ M
// 作为捕获功能时管脚方向为输入# L! v9 y% F% y$ Y+ @- P
// 作为辅助脉宽调制时管脚方向为输出- b" a/ _; k u* ~8 M; [9 |& o3 ^0 H
// ECAP2 / APWM2
% \0 C/ b' B( s9 r ECAPPinMuxSetup(2);
/ k5 o; K9 t$ b+ v2 q1 r5 `: V) j. Z8 `$ U: Z9 T$ ^, d
// ECAP2 / APWM2方向设置为输入3 r6 t( W' D/ q1 F" K
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]* I* U2 c% `/ v5 {% d( Y
}
# p" i9 M2 x5 y% ^
9 ?4 y, K# |0 ^( M6 `* L% E2 ]/ M/****************************************************************************/
' b& ?; n7 ?# F" m. Q3 x- X+ ]& o/* */" j" K# g" g% I: p
/* PWM 输出波形 */" S* d$ L( I4 ^( `
/* */
+ E8 B' [2 a2 m/ j O" T/****************************************************************************/# `+ g0 f7 z" T: ?% s9 S4 `
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)! p# l, O3 r( ~: y% Z3 B1 M& x, g
{: ?: M7 [/ }) g+ C
// 时间基准配置/ j3 p: D* g: C
// 时钟配置. v( R# y- S9 m4 N2 F& Y
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
# D! a' ]9 @6 }# A0 _! k: n9 c# M8 E1 s) Q8 u
// 配置周期
3 M: O: X6 z3 C EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
+ K! C3 o0 c1 N8 c( C pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);4 ]! F) S2 r2 J- b8 j$ D
5 Z; E% f' W1 z, k6 t& R
// 禁用输入同步信号% j" h5 Y5 s" S3 `8 Y
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);) H% j0 v( t' h( s1 ^
; F& n5 u0 c i7 t @3 z // 禁用输出同步信号
) P. i: N( m) Z5 V) Y8 f: d. U EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);7 X' U8 s+ e0 s
) d9 H) r2 o) w& l' \# i
// 仿真(DEBUG)模式行为配置
7 f) W4 Y- W# b/ c EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
# f( R2 ?4 K9 b
! M. _4 }& ~6 s# U/ g // 配置计数比较器子模块
# T- M3 N. W$ J2 p/ L) Q$ e // 加载比较器 A 值
, i- D& S6 M4 E) G# z$ r; u5 D EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
6 C+ {! R( ~. [& w- g EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);+ ^$ ^/ G# [; w3 b' v
_8 R( b) i$ \( c: w! d- P3 \ // 加载比较器 B 值. n1 J6 a2 a$ P
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
9 J# G$ |1 W" X5 n EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL); h; Z G( ?8 A
; k4 u3 q \7 l+ a // 功能限定配置(输出引脚触发方式设定)/ R+ B" H2 o) }
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出. ]0 S b+ F# G s& g6 X7 V4 V; v
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
9 Q3 u) f" d9 V; E+ W7 j( Y EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE, X# \" u, O; j$ N( w$ m5 @7 E
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);; I9 k9 B2 C& y
* L* T; y! x/ j8 y7 y // 禁用(旁路,信号直接输出到斩波子模块)死区模块
+ g+ }2 e: o. J9 e EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);; f, U j7 q$ E
) x( q" j- P1 a A u
// 禁用斩波子模块: _3 q2 [9 {) o& K. Z& d
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);+ P) C( |, _) C! v. e$ ?
# ^4 \$ t* e+ s4 U // 禁用错误控制事件
* \* q, ^- M; \4 _( M EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);: c S; D8 J' A! v# Y4 p* G
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);# ?( H4 ~( {6 P- v
3 ^. l0 d0 u: `+ I5 p7 [$ S
// 事件触发配置
' `* R6 A5 H+ s5 ~8 i W/ w" ? // 每三次事件发生产生中断: G8 s& F, w: D: L+ h& P' `+ z# L
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);' i o1 h4 h: ?! e o
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
; C) P2 o0 j( K4 Y EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);4 d7 Y0 F6 G; j- B3 V
// 使能中断
% i& }6 a. _# W$ p* t$ a EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
6 G" \! f) K: I' V& v: f1 q: @6 \. M0 k" n1 {' M+ {3 U
// 禁用高精度子模块% I9 W9 {5 R; [- Y% }) K% z
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
1 K. V2 S2 y( X- G8 |, I' m4 Z' ~6 q8 b0 _5 p
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
7 ^4 p7 t/ V7 q5 O}' Y) i9 r, O7 q/ }
& {8 j/ L0 b- t
void ChopperWaveform(void)
) a4 u' S$ K- p* O+ ?# f{% v. T; v! w+ _* w E
// 50% 占空比0 g* n$ t1 V1 r9 `8 | V2 t
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
" n% G' E7 h1 T; k E3 r( Q // 4 分频
# ]. P- {9 s0 @, R2 W+ H- P8 M EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);( Y( \7 G1 k9 v+ ]6 O- X1 c
// 单个脉冲宽度. }( i& i; h! I5 }$ N, W
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);* Z6 G, {& i5 T% ]% p
// 使能斩波子模块7 `7 J0 A# {! E7 I b) E `
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
5 u7 x' C( [! l* _3 @6 M% X}
$ Q n2 M3 B4 z! L$ N6 R4 B; h+ S7 f
- `" p* j$ l6 i4 {: X& \/****************************************************************************/
% ?6 T$ S$ Y1 K+ B' G0 p# Q/* */# k: j: O7 W. ?, W: \
/* PWM 中断初始化 */
) i9 u, R: e/ U: B( [" O) I+ \/* */
/ ]$ o" h) _+ U/****************************************************************************/1 N0 z# c7 Y [" @
void PWMInterruptInit(void): M. ? R. ^- n+ C
{+ I8 m3 f) T, @) N+ i
// 注册中断服务函数
% _% ~% ]) ~0 j2 h: c. i, T IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
3 m+ w4 M+ d; F4 U2 g IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
# }) S- [) Z \$ [( y0 }
! v& a7 q N+ X6 [, x9 R; A" ` // 映射中断
/ M0 T# @" x3 V# Z; _5 d4 ]' v IntChannelSet(SYS_INT_EHRPWM1, 2);
# o4 N* y9 }0 V IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
# \) N D! V. @2 s/ ~+ d; K$ G! C+ [0 I3 [. L J) x- \6 k; ]
// 使能中断" a# U( s2 n8 f% n6 @7 Z' Y2 q
IntSystemEnable(SYS_INT_EHRPWM1);9 p% Q0 m2 V1 c& v* t
IntSystemEnable(SYS_INT_EHRPWM1TZ);
/ [0 W9 Y1 z5 Y J: U}
) D+ f. s4 }2 f1 l4 R
! S: h/ Z" X7 E) A# s% e/****************************************************************************/
* l9 t, b: D2 [% j: G! M, r& W/* */
2 V2 M* o; C. [! S7 G/* ARM 中断初始化 */& ~( \6 [" }* Z3 A
/* */
/ n U1 G) J0 Y5 [ I/****************************************************************************/
) \: `" i) }3 [6 G9 avoid InterruptInit(void)! Z6 Z# \/ b( ]: B" N; n
{0 ^ l1 w9 K# ?' f8 g# Z( \
// 初始化 ARM 中断控制器
8 Q8 b5 i8 @. s- j" f. Q IntAINTCInit();
! c$ n' M5 \1 K- k8 d6 }. n* z( R( E- U+ q" g
// 使能 IRQ(CPSR)1 a* k8 j) h& {1 B
IntMasterIRQEnable();
; o& v5 v! a/ o0 R2 H2 m, p4 e! e
0 s( z% ^3 D n$ H9 C+ U/ u // 使能中断(AINTC GER)
' a5 Y& g3 _3 p+ q. z \/ U6 } IntGlobalEnable();, o; v. U+ f. `+ ?
3 P# H `( D e7 {4 x' m
// 使能中断(AINTC HIER)
& o: n* G& v/ |; h' J IntIRQEnable();
5 _3 ]) w) g- N. G+ B. \- J}
( Y4 J: ^7 n. ?4 v" ~/ D4 H# i+ ~9 U0 i7 V4 H9 l, A9 l" Z# T
|
|