|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
/ `% v& U& k& n; k4 u( y0 j/* */7 }# D$ y* j: ]( z. D& i2 i+ S
/* 宏定义 */
6 U' S0 t( j4 F1 A/* */
0 H3 O6 [9 u, O6 Q6 |* q, {' h, ?- K/****************************************************************************/4 U$ z! V" @% W+ R2 Z- c1 w
// 软件断点& D, ?% W) j( C' A8 Y4 R
#define SW_BREAKPOINT asm(" SWBP 0 "); K$ J, n0 l' M4 d3 O. x
& x$ V% y6 |; v. o! H
// 时钟分频' ^! |: |0 C0 y# `' v9 F
#define CLOCK_DIV_VAL 228- h, H# a5 o9 q
+ |9 l3 R" A3 d2 s7 f, g/****************************************************************************/" i# X4 p5 I; C$ J' X( v y
/* */
7 x- @- K) M% E, {* [ ]5 L2 V" y3 O/* 全局变量 */5 A+ t9 K/ x0 M, O/ f
/* */
! @8 O+ T* C* H0 _/****************************************************************************/: P/ l4 i( ` G% w j5 _# m- H
ECAPCONTEXT ECAPResult;: a8 }1 e8 Y* ?9 ?1 g2 w; h
! h# @0 j x- x; ?5 b @; w
/****************************************************************************// I3 {5 {2 U$ I, p
/* */
E, y& M1 y) p. }& J: {/* 函数声明 */
( o- I0 i9 I0 a5 A/* */* ~ W# `4 f- c% F
/****************************************************************************/5 |2 R: V9 q; `! W& l6 _
// 外设使能配置% V( z- ^ r: s: ]2 s
void PSCInit(void);
! G3 N1 C/ y! _- q/ M a$ t8 l9 |' F* a# P) N P/ Z Y6 G
// GPIO 管脚复用配置
7 ^* y- v8 |2 W; [: k1 _; w1 pvoid GPIOBankPinMuxSet();, t" |% D9 p/ \8 L2 i3 x
. U- ]' F0 Y# X7 r& e! }
// 产生波形" E, z/ s* y! k9 V( {* u# s
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
+ j. G5 ]0 S1 Ivoid ChopperWaveform(void);
% w- k( h" u: L( Y
& v" y0 ~! w1 X+ C% B// ECAP初始化和读函数
% N D( u+ K8 E' f7 M8 N7 I" b! N4 zvoid ECAPInit(void);
& I# J4 e6 X* g5 v7 ]5 Y% F3 Punsigned int ECAPRead(void);
* |0 f/ [3 ]$ P7 c$ C( j% j) h0 _; \+ F9 i. q6 G
//ARM 中断初始化6 }9 f7 M; d% S; _
void InterruptInit(void);
: t- D. A/ J: c; w( y
, X1 s: I2 s; m/ G9 z// PWM 中断初始化
* ]3 N2 e) J3 U) Hvoid PWMInterruptInit(void);
0 G% ^. a" W- l// 中断服务函数
: @# W$ n( k( T// PWM 事件
; Z* K) A" j7 Z$ u# Bvoid PWMEventIsr(void);4 v m/ L6 E; e- Q4 z
// PWM 错误控制事件, V; O2 v/ _* C6 O- v* j
void PWMTZIsr(void);
" X2 R0 D. \# B1 {/ R6 Q
( O$ p) X; S6 k2 R/****************************************************************************/, u/ P6 i }! d" X; u3 e& V8 S
/* */
: M3 a B2 a- ]/* 主函数 */1 A `* Q' @8 j; s9 A- F
/* */- ~8 P# m6 O' \" G
/****************************************************************************/. p) O* u ?% |5 Q
int main(void)
+ b0 [3 A$ C: Q* Y! o{# C k% ^% q8 `; B
// 外设使能配置& ~1 U" t* y$ ^9 ]
PSCInit();
; F' ^8 G5 z$ X, s% R- \2 t2 w
; D: I. t* D3 V // 初始化串口终端 使用串口2' a) i7 o2 r ]9 f4 ?, ]4 p
UARTStdioInit();5 o( L$ a( }: Q/ i
2 h6 e1 X u0 h6 h$ A9 q' \4 B) {! w
// GPIO 管脚复用配置: J6 n4 B4 r$ p) \ D0 T3 _
GPIOBankPinMuxSet();
+ T8 s$ y/ |' q1 N
( g8 O) ^% s4 g0 b: y1 f4 t8 o$ K C( t // ARM 中断初始化# M$ b4 ?7 ^; U4 f N( g# c& v# E
InterruptInit();
9 d/ u0 z- q1 @/ W* i2 `) i* K% F
$ B( {2 E6 {1 W; O* t/ O // PWM 中断初始化( ?" h4 }' V J; X; c' Q( N
PWMInterruptInit();9 e, @3 t% g# M8 o2 s e1 h( h
1 }' h7 W3 ^" @. r* f
unsigned char i;
3 ?; U0 A* `0 r7 r' e& Q unsigned int j;9 r9 ]0 G. w5 A6 F) R% f, s
7 F5 |5 z$ A4 X* t; P UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
4 y% O# v4 ]$ U0 L UARTPuts("------------------------------------------------------------\r\n", -1);" q9 N7 G3 \$ g5 o! S9 [. N
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
1 y! }5 j# ~( q4 G // 产生波形0 h& _! V9 g4 @2 I2 f
PWM1ABasic(25000,50);
( r$ @4 C$ m" D; n) ^; n% Q: }3 W, e& v3 x: q
UARTPuts(" C6748 PWM Test Over!\r\n",-1);4 k( l4 i0 G i" w- n. V
UARTPuts("------------------------------------------------------------\r\n", -1);
- [6 Z. X5 l b8 m0 L8 {
: c% k. n, F6 J, F+ g9 N" X4 ~8 W, |6 q- r
* n5 t7 R# w% ]3 O' N UARTPuts("------------------------------------------------------------\r\n", -1);
: m. h" F) i# H& X) R UARTPuts(" C6748 ECAP Test\r\n", -1);
$ w1 M- G4 ]4 Y; l- O // ECAP 捕获初始化8 _# `! [0 j4 q
ECAPInit();
8 _! b$ k& g7 [ UARTPuts("Initialize ECAP.......\r\n",-1);
! Z$ n3 a3 M! W! q for(i=0;i<5;i++)
( ?$ Q) J' P% Z R7 l; _3 L {& G! W, v! d6 y! g
for(j=0x00FFFFFF;j>0;j--); // 延时, C% _4 l4 N- o: _ X" g" n" U
ECAPRead();
' U; Z7 F `( _! {, n7 X# I9 e }2 G3 Z$ V. f, f5 Y* r
UARTPuts("\r\n",-1);
" |2 n1 ]4 [ h0 _ UARTPuts(" C6748 ECAP Test Over!\r\n",-1);2 r4 k) U! U& z9 X" E. B* S
UARTPuts("------------------------------------------------------------\r\n", -1);, w% H# b7 k2 t; v$ C% p$ q
5 c* U4 N3 L- n- @
// 主循环- U1 z9 g0 g& a) {
for(;;)
1 `+ b: F! ~. q9 J4 D {/ Y# V( h: F1 X0 b" o- ~4 M7 m
+ }0 X# A3 X2 f& _
}
' |+ z- r, i# X( r2 v3 ?}' p' K8 y1 F2 m
8 a% c5 i5 H0 q- V% L" V8 E" I/****************************************************************************/% V' {- S: p7 S. |
/* */
" W+ D5 X6 u/ c& Z/ ~& D/* PSC 初始化 */
2 n3 }/ y/ J$ W' n$ u/* */" Y% g4 F7 W: s& p& |; x3 a
/****************************************************************************/6 M* z9 u0 `0 l1 \6 s$ \0 [
void PSCInit(void): ?3 E/ m, n& P+ y0 ^
{6 q# J; A) [9 n1 K3 C' L' |
// 使能 EHRPWM 和 ECAP 模块
' J0 T6 r4 ~7 U // 对相应外设模块的使能也可以在 BootLoader 中完成" o' P3 ]4 y2 D- k8 x& ]
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
3 u4 _3 q; ~8 a$ H- l X" q y PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
! \1 u# L" y% Y# A2 r}
|6 ]' S& o4 c* @* ?4 |3 n; J
3 y* ~5 t5 a7 u/ X: l$ {! H/****************************************************************************/
% j; T' @' k; u' u' F/* */4 k: Q# i9 u9 \7 x$ r- [* v) f
/* GPIO 管脚复用配置 */1 |+ Q7 F( V; v1 \/ N+ F
/* */: s/ I3 Y/ S2 k! h! O6 q4 ~! W
/****************************************************************************/# m5 @; D U2 [% R' F
void GPIOBankPinMuxSet(void)8 `2 E& O( c0 @( B8 V
{
* h' c, I) \; ~1 X! B EHRPWM1PinMuxSetup();. F/ }7 Y! z3 I% R' H# s
, H$ Q/ ]" q) h
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP); u- q% T, n- R. K3 y4 D
// 作为捕获功能时管脚方向为输入
8 j3 \6 s/ z, [6 k% S- X6 {; y$ x9 H* K // 作为辅助脉宽调制时管脚方向为输出; r; t X- y7 ]' F( Z: C
// ECAP2 / APWM2! P2 U% N/ }* x( ]' i0 C
ECAPPinMuxSetup(2);
' i7 l& }: X0 f# E+ y9 G' e$ J2 \; K- A E$ S
// ECAP2 / APWM2方向设置为输入' C. V5 V& A+ L l* y, k* m" S
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]+ e& b0 f- f% B. T
}" ^6 h* L; p/ j
. K) N8 e7 A' ?# X
/****************************************************************************/3 Z" ~( j/ b& F+ k
/* */
, p, x0 |+ S- z) V+ S/* PWM 输出波形 */
- v7 n2 V- J5 R0 v4 j/* */1 w; X$ Q1 K2 V/ e8 y6 W
/****************************************************************************/. L- }4 O9 ^( T+ Z1 ^( D
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)! Z5 U- h1 m$ Y" d3 _) n
{
6 S8 I3 h: q" X // 时间基准配置# F- z& X! Y" G( T4 k% n
// 时钟配置6 l# H! D" |* v* p7 I
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
: ~7 F$ e4 F5 j1 i Q! U* j0 \. }6 ^: B
// 配置周期
# N: l& I2 p0 z j# G EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,: N3 f+ G4 M9 |
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);0 n7 ~3 O) N; c7 ?6 u1 y+ u# K6 y
8 F% ]+ O* A2 Q8 L
// 禁用输入同步信号
! L* K3 i( I) O3 k+ m: H: p' u EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);5 M; r5 I# |. ~
3 m6 B1 {0 h% z' \8 w# O
// 禁用输出同步信号
' }' c; h3 X+ U3 H. ` EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);# Q+ I3 K" `8 f4 |* j
& V% F8 i, p8 ?3 | // 仿真(DEBUG)模式行为配置
( X5 z/ ^ I5 j @) H EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
& Q; O/ V" O( H6 v8 `! ?$ `( C* F4 }6 }2 O d
// 配置计数比较器子模块6 b! L0 P) H' A% G! K0 d) t
// 加载比较器 A 值
# [. }, v( u, b3 D( P2 F% M EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
: ?8 L# x# F( t1 y9 w EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
+ t$ g& R& E- u& `6 ]0 |
; ?& c) f3 t" B- h z) T# I7 `+ e // 加载比较器 B 值4 l$ U$ O$ M4 d* u# Z6 ] |& |
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,0 ~, ^! l5 }8 y0 G8 _
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);* }! l$ K1 V6 i
% S& A) p0 [* g7 m4 H5 D0 w // 功能限定配置(输出引脚触发方式设定)$ d4 ~8 O. j6 z* l' N( v
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出; ^8 K) E" T# i) c" W/ T: A9 P
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,: f7 }# T4 Z7 S* b6 M* i% y
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
# l R& `9 U! C, r! t+ H" f EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);% U9 Y* h- I8 f& F, {8 B2 Z
. o' u# O1 z) c; Y: W- v6 g
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
- O9 m7 R- {3 Q7 a* B! y EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);3 {; h w( S ~2 Z6 j2 T- s
' g9 e2 y7 v' O: V
// 禁用斩波子模块
* X1 { t7 T% c. J% O& J8 I+ U EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
- a" M3 a" P+ D& i9 W) s
4 l+ P5 e, }( ?: w2 z+ q" ] // 禁用错误控制事件
# q% D8 ]- W8 D0 ]* \ EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
0 l0 m" x, N# G; \ EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
8 H, K& v4 G" D6 c4 i) @- }' f% R
, P4 B9 B+ i2 z! F! H // 事件触发配置
3 o# S3 \$ w* S, b0 Q // 每三次事件发生产生中断5 C. D( T9 W& k3 A/ S
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
4 V) }3 s' s# r" J \5 f9 ]/ k // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
5 A! g' x7 | E0 |: m+ A EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);/ Y6 V" m7 E. l: I/ X; C
// 使能中断
* O z6 K ~' V. t EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);1 H# {2 R$ B, L# f8 O
8 m2 s0 r$ {" Y+ h
// 禁用高精度子模块: x. W' g- W8 |' C' [
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);/ o( I2 O& b* y t9 m7 p
0 l% S) R7 L( O) L UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
8 m6 f+ X: m; X0 [1 D}
/ o6 p# I' R3 W7 f3 z
1 g# ], g& ^$ @- b4 @% k0 d" f4 R% Kvoid ChopperWaveform(void)
$ `: `1 D6 n! O, @{: ~! Y3 c/ W) s& Z8 e( E7 i
// 50% 占空比
+ X5 G" C" V* j/ g* | EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);6 f7 X& z/ {: R1 V
// 4 分频
6 p+ Q2 M- h8 U7 g, H0 T EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
; F. E0 Z' C/ l: t4 g" `2 h // 单个脉冲宽度2 |; h1 L) \ S
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
- R# ?; |! X) I; f/ ~ // 使能斩波子模块
- U8 C" [7 ~ q" h* H' t EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);2 B: ]. l, G0 g" @) B; D# r
}+ H# @8 t4 a& {* V
. W6 R9 y& C( I3 ^" j/****************************************************************************/
! z/ z0 e" \: E2 O5 \) L/* */
. g/ l/ l, O' z9 b: ]0 J# F/* PWM 中断初始化 */
% M* N& s/ t: J( W/* */
( t( S X0 U4 M/****************************************************************************/
$ ^5 r) O8 b0 L( g3 cvoid PWMInterruptInit(void)
+ v9 s, o' `. ?; Z$ m% n{% |* Y7 r" r- M* s
// 注册中断服务函数
3 x/ H$ V. a9 o g IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
4 z" M* G* ^2 Y0 W' @2 Y1 ~7 \+ T, B IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);8 ]$ X, X9 ^3 A1 H+ J' D0 _0 [
0 G9 k8 e0 r. h4 V2 t# Q // 映射中断
, z0 I$ L3 S, i( ]' t IntChannelSet(SYS_INT_EHRPWM1, 2);
/ p- a( J+ C& Q5 V" } IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
- e9 _. y4 I* w' j
$ o, h. Y: _; s: Z6 r$ f) f // 使能中断; u) ?$ ~- `( O) d. R+ l, h
IntSystemEnable(SYS_INT_EHRPWM1);; m2 M5 h( k; h- Q- q) Z5 B2 s
IntSystemEnable(SYS_INT_EHRPWM1TZ);: ?7 {& O9 {7 j8 x/ u- x/ f
}4 c6 O& h+ i$ N/ X; ~- ?
) |% Y+ n3 H% O9 I/****************************************************************************/# B' Y: a4 k7 V" Z
/* */! H% n. b6 H5 N8 p9 p8 a0 U: s
/* ARM 中断初始化 */
; [% F, F: H7 P* y/* */# ~7 [! D: r# _; c( \
/****************************************************************************/7 W1 `/ x' D" R' i2 ]) I6 p
void InterruptInit(void)% r* q8 l7 L1 g' n& K
{
0 b; a6 S3 R+ ^% }: e+ k, a // 初始化 ARM 中断控制器
$ B# F) W8 b% f5 b) j1 C: Y4 O IntAINTCInit();
3 d I; \& u+ F7 M+ S0 d+ ?# z/ G c. ]) N9 h- ?2 j7 I% h
// 使能 IRQ(CPSR)
$ r' G) v9 a4 T' Q7 Y8 v IntMasterIRQEnable();
; j% b: {7 B& C9 A9 o! B( U7 F; V/ K# A' z- ], G: Q
// 使能中断(AINTC GER)
9 q0 ?1 P; s Q Y: P \ IntGlobalEnable();
' Y3 X1 [8 A; m; I% x, w& T" Q1 F" }8 m, z% ]8 S) C
// 使能中断(AINTC HIER)
4 B3 t( G' R- s IntIRQEnable();1 g9 E* I. `, a5 @# L p- U% A
}
% ?3 i2 i8 N( C1 u
7 p" y, v7 n2 U' L |
|