|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
0 J$ B; w% @1 M, S/* */ y5 x1 w P; a4 [' ]
/* 宏定义 */
/ C( r0 R, L1 Q @ G/* */; U5 N2 Q h( ?. C. G9 @( r+ X
/****************************************************************************/
+ c1 o: @5 b! k2 b0 |, q' x// 软件断点) t- c' {/ h" F6 r* v& q
#define SW_BREAKPOINT asm(" SWBP 0 ");
. m, ~2 s. a+ c" v
3 M$ d+ V" w/ L6 C) T// 时钟分频
, g" h- F1 Z$ e, x#define CLOCK_DIV_VAL 228
8 y8 P1 {0 y* T% ~% G" V
$ l% n+ {8 W; Y; d m# P/****************************************************************************/7 u# c8 v( E$ P- L
/* */
0 X0 ^6 ~$ L3 }4 b) z s* N/* 全局变量 */) F6 d/ H; T+ X6 P
/* */
/ s2 x! h, p! f8 n4 }5 J4 \/****************************************************************************/
3 j8 C: y! t; \ ]ECAPCONTEXT ECAPResult;7 s4 q. f. g" e7 m2 ?
; A V( c2 S! v6 C1 L/ S! p" [0 R
/****************************************************************************/
) S# d( K" x k2 p; k) M B/* */7 c8 q6 Z2 J* \0 o9 U& I
/* 函数声明 */7 a0 r* O( g; i( c3 G
/* */
( W( O v a% I7 b1 g5 p. O. i9 p/****************************************************************************/: P+ e. V6 c& P: Y
// 外设使能配置
a" P( y* `& ]. v3 T$ bvoid PSCInit(void);! h( i, e6 R; W& _- Q z
/ f4 D% r4 Q$ T0 i
// GPIO 管脚复用配置
0 t8 B% F! ~( }6 d5 L+ g) Q0 |, ]void GPIOBankPinMuxSet();, C, L: t' K8 f9 X! P; F( ^
: W& B& b- W. \6 R8 X* i1 o8 ]// 产生波形
" O" I {4 c$ L! jvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);8 ]! R+ Z1 I5 E# ~
void ChopperWaveform(void);$ K2 T6 ^) c0 y: E7 i% z
; m; h \+ n. J: s4 b9 a
// ECAP初始化和读函数
) D0 ^' @& _$ R7 K0 @void ECAPInit(void);
; m9 H. s/ X/ I" [4 M) nunsigned int ECAPRead(void);
# \4 z% f& H, q# L" x: p, ^6 r5 r5 N i4 |8 }" _ W1 `4 S
//ARM 中断初始化
! _* E- U5 K9 ^. o5 Uvoid InterruptInit(void);
C7 v `+ B* D. x# z
! f6 i# k* |( b4 W4 ^% n: i* r// PWM 中断初始化
" J2 @9 ^+ l& U/ G6 \) Cvoid PWMInterruptInit(void);; l9 i% Y0 R8 g: s$ I" ]# E
// 中断服务函数* }- f7 b! r, m& m% F6 R
// PWM 事件2 Z+ p X5 _) F2 U ^ |9 ^$ U
void PWMEventIsr(void);# K3 D! `+ W0 @* c" N% E. V" f
// PWM 错误控制事件3 H1 s$ w/ ?( C7 h! O8 ?
void PWMTZIsr(void);$ Y/ j+ J" J# m( u! Q
* @2 k5 Y/ @7 @, }1 g; p7 G& H/****************************************************************************/
( J5 W T$ w3 `/* */3 x" b! D" z4 n5 M) C
/* 主函数 */
0 e# g: V! c9 i' D6 V/* */
9 N/ G" g6 u9 s' Y Z# F! I/****************************************************************************/
1 A p4 O, o6 s7 g. Mint main(void)
# Y+ y- H& g1 y+ y% F/ @$ Q- d% Z- v{1 T/ B9 I3 V7 z. U3 m
// 外设使能配置
( c: T) l& L. w, g PSCInit();
5 l2 z" A8 D( [' U
/ e6 u' K9 g9 Z% |/ O0 s! S. b" ]* g // 初始化串口终端 使用串口2% t }0 ~' A2 w0 E! z2 I4 M
UARTStdioInit();
; W# d$ U; c1 N! T8 Q0 Q
8 O4 G- w5 G1 E3 r5 N // GPIO 管脚复用配置9 R9 K1 n0 V' V+ v. B
GPIOBankPinMuxSet();0 y5 X9 }1 X; X T
, \) ~% B/ ~! `( F) f2 F
// ARM 中断初始化: y- I: y/ J, ?
InterruptInit();
6 z3 U3 z- G3 X+ O: q6 c% N
- f7 x1 k( O0 R& e1 K' J' l // PWM 中断初始化
* @5 W2 P. U, S1 D: k: _& v PWMInterruptInit();- I4 Q) f5 E, j9 z
. r* }0 T0 r! N u3 o1 C( ^7 [! B
unsigned char i; q0 A' J6 T" C, z$ N9 \: s* h
unsigned int j;5 h& U) g; q0 A a* y9 {! S
|' t l# K+ t3 Y% ?; |
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
2 v. C- f$ Z ]9 t" v/ W( w' R) { UARTPuts("------------------------------------------------------------\r\n", -1);# y7 ?- Y, r( Y1 i
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);6 y, _1 f, k/ a2 }* \/ ^
// 产生波形
% q' c0 }9 I: S PWM1ABasic(25000,50);
! R/ V) w! h2 V4 h G
' @: w* r, p$ X6 X" V' }2 A# ?& ~ UARTPuts(" C6748 PWM Test Over!\r\n",-1);
q) a4 @2 O2 k# s! v9 T UARTPuts("------------------------------------------------------------\r\n", -1);* C3 }" K1 o: n+ n4 o/ K$ w
4 M+ M/ m- ]8 [3 }
$ s' o! r& G1 k$ i b+ c
, W4 Z. \7 ~" [, r3 E UARTPuts("------------------------------------------------------------\r\n", -1);9 S3 Y n4 ?! g' L& j6 q
UARTPuts(" C6748 ECAP Test\r\n", -1);6 }" d* e2 f3 V/ k T- P) r
// ECAP 捕获初始化 i( H" |+ u% J( W) |6 y# Q
ECAPInit();' T) l% P$ k) H) ?, G
UARTPuts("Initialize ECAP.......\r\n",-1);& { m1 q" h C
for(i=0;i<5;i++)1 I2 Z& a2 F0 O6 f+ W1 O9 _8 m& S3 Q& @
{, a: a( J; i5 S7 Y1 w* m
for(j=0x00FFFFFF;j>0;j--); // 延时
! b' W) o4 e# D) t3 H U6 | ECAPRead();
4 g1 O+ |9 U* \: ~ }0 s0 p; P, U/ p6 A$ T' Z, v; ]
UARTPuts("\r\n",-1);, T- w7 u# u$ |
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);) @2 q2 q9 h# p
UARTPuts("------------------------------------------------------------\r\n", -1);
3 ^# a% o, L7 b; q2 B. p% o
8 D4 a6 ~. R# I! w" T8 w' `! G // 主循环
, R8 ?, d" ]1 J# h# A% D. f for(;;)- _* w" w! ^! D& `' B6 V6 K
{3 l: v% y- j% z- V
/ X; f. r6 A# Z7 V9 I3 t/ v
}
+ C% s/ |0 z7 X}
5 S- ]3 r' m4 {( t
1 u T5 z2 b1 L. _/ q/****************************************************************************/
- @# H0 W, e+ l, H0 ?6 \/* */4 c& J% ^. N% t) _% s$ W2 F% V
/* PSC 初始化 */9 m J3 c! l1 c
/* */
% x& q2 C2 b/ Q6 e+ A/****************************************************************************/
' H! U8 @9 r, B5 e' r! Jvoid PSCInit(void)! k' Q0 [7 @* f: w4 J
{3 G; L6 v% f5 q/ r
// 使能 EHRPWM 和 ECAP 模块
7 J9 F4 f" F8 g# W // 对相应外设模块的使能也可以在 BootLoader 中完成* F2 o: G; b; c' O& W+ a
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);4 F9 e2 a5 Z% _- C; \
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ { U: P5 I+ D, h}( I: P$ r# b( ?( b; _' K
. [/ p6 Z9 H2 R k$ L0 T+ P
/****************************************************************************/+ f% U# y7 ?6 {1 P" K
/* */: U) n- D; J; j6 ]8 C
/* GPIO 管脚复用配置 */
7 B" r# l# [" F0 x. x1 ]4 P5 y2 X/* */
# y' K: ]) `; M0 W+ A# V9 P/****************************************************************************/. |' h/ e) U& T1 z9 J& ~7 f
void GPIOBankPinMuxSet(void)7 b" y0 X0 u( e' l9 B' }1 @
{
* F# B { o6 i+ u% b EHRPWM1PinMuxSetup();- D5 W$ v/ R7 ^0 `; g. W. x
; Z: `! h# X& m$ B& J0 l // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
1 g; {( T1 ~/ ~4 }) Q // 作为捕获功能时管脚方向为输入
9 w C, n: z* I- z // 作为辅助脉宽调制时管脚方向为输出7 B4 z8 P2 o0 L. {; I) _; @4 j. b
// ECAP2 / APWM24 Q1 b, n5 u% c) w
ECAPPinMuxSetup(2);
+ R8 l# C+ h. f% B \! j' }. C6 [- w V, m( w* f* `! ~
// ECAP2 / APWM2方向设置为输入! o) a4 {# k) _9 j
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
0 m# w' b& b( U; _8 V( j( g7 g}4 P+ \' k2 { s; l( D% H9 _2 ~. k
# {( i) B) Z/ |+ H, q% ~+ X% k/****************************************************************************/2 z/ o" Q5 V/ v- X5 B D
/* */% t0 a' @4 \8 p" q1 x
/* PWM 输出波形 */
2 x \9 q1 e8 ~! ?9 T/* */6 J. ^0 ^) A. P' N' R
/****************************************************************************/8 `/ Q0 m. F( o' G
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
# t" J1 W, \) v, s2 N0 @/ a6 J{
1 m( b$ p9 K8 \% U // 时间基准配置
5 S# D) x7 a! V6 G$ `/ h. N // 时钟配置% J" O) J- o& L' r P* b
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
- T! h6 H: k. y) L% W, n9 q& ~* v1 [; N: t
// 配置周期- b* F" N/ R a( W- e
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,) n3 n$ z$ o: Q( E
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
6 B) B" p h! z! ^( g+ C% X/ ~& l% }4 C$ w+ s& V2 D0 {, e
// 禁用输入同步信号
5 V; l$ {9 n! c1 X; o EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
6 }) @. R& }: _( ?
3 P3 a) U/ p) [! z) { // 禁用输出同步信号* E* Y1 P& m3 g4 T5 i9 L
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
6 I1 x0 j8 X1 M6 `5 v+ D" W
% g# N& g# i2 N( Q // 仿真(DEBUG)模式行为配置8 B7 v) y% O* n& Q
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);3 @- M9 l a0 p4 E" O! K0 D
2 S3 n" b( j! V0 h1 O% r
// 配置计数比较器子模块
4 [+ G! ~# X- I# G // 加载比较器 A 值! R% J, e+ f! I# i
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
- o% H- n8 ~! f+ A4 ^ EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
! _* U. a& `0 x9 Q% g+ M% j
: o) R3 y# ~) i @" u# H // 加载比较器 B 值
7 X" N) c; n( @) L EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
6 l+ C7 }3 A( u V EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);, z$ N! D; C+ P2 y9 k2 n
3 }9 U) D) D) S3 h // 功能限定配置(输出引脚触发方式设定)9 e; P5 d8 n+ M! k% }. e
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
" b, y1 Y5 ]+ q$ R6 R9 Q( ^ EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,; b" g6 I: s/ g/ [% H2 X) T; @
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,% ? `- |+ |6 u N% K+ I- r" Z' |
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
$ }/ P' M- o3 E q6 `9 }3 l0 K
& L: y, z4 T7 d8 I- M6 F // 禁用(旁路,信号直接输出到斩波子模块)死区模块
5 @8 {5 Q- e9 S* c EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
4 K5 g6 |4 I: o) I4 g% X2 T
: T6 `+ q! h2 l- [$ E( F) z // 禁用斩波子模块
3 a+ c3 S' I( b! g2 D EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
! j( h& N/ x: ?7 ]9 c/ e+ J7 _+ k5 K. x+ c' W3 j3 \
// 禁用错误控制事件; c; L" U: x- _3 G3 }
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);+ D: Y4 c4 `/ ]$ a; U, y
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);+ y, W7 p/ [! D# G' _
) ?2 X3 `( O) p( b* f! b6 r+ a
// 事件触发配置
, ~9 n; r, \6 B! s* o# z9 m4 ] // 每三次事件发生产生中断
$ W9 o/ d! u3 W7 F' | EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
) d/ N( E4 J* |& _- w // 时间基准计数等于有效计数比较寄存器 B 值 产生事件6 G) ]: p! i5 e( b$ Z3 ~4 K
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
- o( m9 R: c* O8 ^. j; k5 ~: L2 c0 p4 @ // 使能中断4 d" P9 {/ }5 ~8 j1 Z
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);' s6 x3 C# j- {) P T" ?& X
. S1 a/ l% G& a* _ // 禁用高精度子模块
# ?" [1 t* f; p( l" {; |$ R EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
8 P9 Z5 G! g* b9 b' q- \$ |& T" x/ b- G5 @' x
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
8 C3 b* D' w e4 ]; e}
( C- V3 Y0 A& _* M
, p3 }4 }3 B( p' P! ~void ChopperWaveform(void). r2 Q: s/ k0 ~* V; Q! y2 ? u7 k6 E
{6 |+ x d% x" B
// 50% 占空比
5 r6 G2 s# R4 x# q$ `7 E7 f1 M2 g EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
( ?; M1 Q) g/ T5 @! L, e // 4 分频, C+ t" }9 |- U; s. i3 Z7 x
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
) j |$ g9 }0 p // 单个脉冲宽度6 F- f$ h/ U0 _' f7 {% p0 T `
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);1 R. B, j4 ?. X6 n+ H$ i
// 使能斩波子模块% e z6 [- S4 V' C% W, v! }' J) F ?
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);8 I3 S5 L% E6 n" g0 Y! B* [
}- ^% v, ^$ o8 \
: C7 E! `7 w( ?- [! U& p3 V$ b( a
/****************************************************************************/5 q5 B4 c) j* f' b4 |. g
/* */
: o5 |) k: k1 {# f0 Q/* PWM 中断初始化 */
) r5 h6 _, }: f+ T( \/* */
$ y9 W* w g5 u1 q+ n# @; w+ y/****************************************************************************/
, s" c! X( J" d% }. Fvoid PWMInterruptInit(void)
0 [7 H- @: @( Q/ f5 R$ l# ?0 d{
" Q- g8 d+ _$ l+ D9 u: v // 注册中断服务函数3 w) x; X! o- ?0 Q ?( i$ b1 F
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);$ k: L, S( c( u! L
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
1 J3 y5 M; k3 u1 M4 r9 D( S! g3 [9 b! `. O- I2 m8 J% B/ N6 g- L/ R0 q2 Q
// 映射中断6 \# x0 T) F [9 U
IntChannelSet(SYS_INT_EHRPWM1, 2);9 t# a* _, F2 G! P, S' _+ h
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);0 h# v0 P+ d* Q
7 o* u% r8 m; M a) C$ `
// 使能中断
5 r3 O6 M/ C' E4 A' f IntSystemEnable(SYS_INT_EHRPWM1);& d3 m0 k- }8 i. l# R" B4 T
IntSystemEnable(SYS_INT_EHRPWM1TZ);
% \2 y9 T+ u2 C, W4 r}& I5 `0 g, i# l/ c* {1 p6 e% d6 g
: w5 n5 V1 ?! k/****************************************************************************/7 A/ h ]$ a/ g, S [, a4 V
/* */' y$ j7 g% j2 `) ~# [8 b
/* ARM 中断初始化 */! W) ^# @# W) k; |2 |
/* */
7 F6 r- H6 f+ d& i/****************************************************************************/
4 P& t. ~# { q* U ?void InterruptInit(void)' h3 J* J0 ^" v+ q( g3 a N
{
4 X/ \* C3 w) {& `2 t) e6 F // 初始化 ARM 中断控制器
0 C4 x2 e1 K4 f+ S. C: R* m IntAINTCInit();
2 ?/ Q" }) N3 z4 N( x
* m: E; v' k. X0 k0 p/ j // 使能 IRQ(CPSR)- \+ x, J& T. t( b
IntMasterIRQEnable();
. e# R7 b+ f1 h6 f" O) ?. C
6 O N" x' |* }4 @1 v( K$ y" r/ l // 使能中断(AINTC GER)# i. B3 e: C- `4 i1 W% e; n
IntGlobalEnable();/ F9 j7 S3 P% y* t& E
4 R" p; g4 `1 P {* |$ Q // 使能中断(AINTC HIER); T( v* J0 n3 C
IntIRQEnable(); m! F }8 y& E4 \+ e
}
z" V; S& V# w+ D$ b1 D [
2 r4 F; J0 I/ R* `5 B0 `: I |
|