|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/5 s; c. h. T% E4 Y
/* */
+ S; ?! q4 M K- M/* 宏定义 */, c5 j3 {. Z0 [1 y6 _
/* */
/ n, d# [8 g5 s& y. t$ \/****************************************************************************/3 ]" q0 t5 M2 r* U9 N; V! }# n3 @
// 软件断点
" K- N8 s+ u" `: {- P- T+ @#define SW_BREAKPOINT asm(" SWBP 0 ");
Q( P( U! V( l3 ?6 h& k
8 Z, K2 g5 j& A+ G6 m0 M3 C& y0 A// 时钟分频
: s: _# b6 g8 @/ A#define CLOCK_DIV_VAL 228
! E8 r% j3 {( V8 `
$ ?/ k* g0 Q/ g) T/****************************************************************************/! Y* y0 H( S0 C: M. f+ k/ k5 V
/* */
$ @2 f" o! |* O8 J/* 全局变量 */0 l# i' k3 f( |( Z! {+ j9 Y
/* */" F/ i; w, V" e# E
/****************************************************************************/! d9 \" F6 r7 A p+ I0 d Z
ECAPCONTEXT ECAPResult;
. F6 r" k: \& H- _( E' Y1 w6 Z# D s' `- b/ H
/****************************************************************************/
$ M1 W7 O- o" Y- T6 h9 R2 L/* */
- H* a: m8 W+ E+ Y+ \/* 函数声明 */9 s3 y, e' D5 ]! C, p! P
/* */6 k, Z& P L( H$ H
/****************************************************************************/
9 c' a+ u0 f& [# S+ b5 n// 外设使能配置
0 Y2 w+ Z J6 N5 w% {5 Lvoid PSCInit(void);; y+ c0 |: G9 Z* ]: I7 r
1 i4 G% N. V! \3 R: m
// GPIO 管脚复用配置4 K0 q, Z2 l5 z3 ]% I
void GPIOBankPinMuxSet();' r$ E# |2 l. v4 y5 I3 o% ?
6 s4 A- K7 s5 I8 b// 产生波形
, l( }. z& W2 {3 z/ N. I% `void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
# G2 y3 s4 L; J6 {2 |# H& ?" svoid ChopperWaveform(void);
/ D4 `3 e: B" F6 Y8 J; a& z
- |. I. j$ G' i. {8 |1 r// ECAP初始化和读函数
& d7 o0 [1 V9 B8 s9 xvoid ECAPInit(void);& E9 O9 F6 |' s2 y6 y
unsigned int ECAPRead(void);) J$ x' o& r9 m* m% k9 x
2 J; o( E6 Y" {
//ARM 中断初始化9 ^" H0 o" j9 q- k7 s
void InterruptInit(void);2 r2 o' z+ [% t7 C! {* E; H
$ o: n- t6 @0 ]' @1 q/ O- I
// PWM 中断初始化# r% W, p1 Y" J; N& D2 t
void PWMInterruptInit(void);2 A* h3 Z. U$ q6 }& O$ S* K( V
// 中断服务函数- k0 e; h# s- S3 A0 P' y) D: x
// PWM 事件( l @% Z7 `; y$ i+ ]! h
void PWMEventIsr(void);
0 {( g s$ _6 A+ b, U9 ?6 Y0 E8 a9 P// PWM 错误控制事件! U* y( ^2 h( k! _: S
void PWMTZIsr(void);0 K |+ u1 n i @
( x/ [+ O# m6 r+ C7 D, |/****************************************************************************/
5 |) l: Z2 J- \4 y# H2 s/* */
. K& O0 G. k e" P" F/* 主函数 */
6 M. p4 E) C) B& D/* */" d2 t% G( e1 a
/****************************************************************************/
1 l9 j m: W7 n5 v; g6 G: _) F) [4 Wint main(void)) D2 F& G0 N* h8 H9 P
{
+ n) V5 u5 I. k+ ~1 y // 外设使能配置9 g k9 D2 H, p& D
PSCInit();
; U0 Q- }+ D& t/ @: {' b+ W7 p9 l8 M5 @' v4 d d9 K B
// 初始化串口终端 使用串口2! X9 D' E" w# {
UARTStdioInit();
" q* D- r* a) a/ J }2 P, U' I 8 p k" W( D0 Y* G# W: i
// GPIO 管脚复用配置
1 L( E0 ~2 C7 H' q6 `2 ~ GPIOBankPinMuxSet();
% i; j7 d5 @1 \
4 o0 S9 B% a8 i# r R& n- f // ARM 中断初始化! \: S% Y7 x: h) f; i" R
InterruptInit();, |3 S7 z$ R. c' [
2 p' T* N* v/ y) Z/ }* o
// PWM 中断初始化
8 V* |8 V# s* f$ @! P+ O/ m PWMInterruptInit();+ p& z8 O7 D) I1 H
8 ~ ~' m, d7 Z. z& x$ }+ g& c% }
unsigned char i;4 n' i; Y+ g- p1 p
unsigned int j;
3 Q7 c+ m/ w) B$ G3 V. X2 K j9 z0 R, ]4 r0 L& v
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
; X4 n: B# \& n" A7 g UARTPuts("------------------------------------------------------------\r\n", -1);
- w; e& k& e3 P" J9 Y0 @8 l UARTPuts(" C6748 PWM Test\r\n\r\n", -1);' Q6 ]& @! P6 |& g$ e: p
// 产生波形+ T, L+ c, |. ~/ V, ~1 z. {3 p. E F
PWM1ABasic(25000,50);
" _: Z4 O& R3 f! {' H7 C3 z# P) T( t c5 {! B$ M1 D5 M/ V) t8 v
UARTPuts(" C6748 PWM Test Over!\r\n",-1);6 m- l' ?- z; ^. R8 C9 S! Z
UARTPuts("------------------------------------------------------------\r\n", -1);. k" A# L W$ z/ S! _* r
0 |% V% x$ S, Q0 e: o; u
7 a0 ?: [9 b' N1 [
8 [; a& E, b" `; A$ c. ^ UARTPuts("------------------------------------------------------------\r\n", -1);
- b1 r- N$ w* ]' X# Y' b UARTPuts(" C6748 ECAP Test\r\n", -1);
& t* k% G+ d, F) D$ w. [" Q, ~ // ECAP 捕获初始化
8 w' ~' q5 \" D7 ]% g ECAPInit();8 M/ |5 ]* o L
UARTPuts("Initialize ECAP.......\r\n",-1);0 I2 M2 e3 x( y3 Q# h. U- Z4 t, L' `# Y
for(i=0;i<5;i++)! ?5 E" _3 g3 T Y% E# W* ~! E* c9 x
{
8 F; G, [& [ V& z) C for(j=0x00FFFFFF;j>0;j--); // 延时% ]7 ]/ k0 ^2 [' m& @, k2 b( ?. J# X
ECAPRead();2 ~7 h2 n" q3 m) j+ e1 W
}
; R! L2 L R& \/ ]9 a UARTPuts("\r\n",-1);
2 h6 }4 W; P0 ]* d UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
" Z3 R& j j4 n4 K' L5 C/ b( ~! ] UARTPuts("------------------------------------------------------------\r\n", -1);
6 I) A- t8 Y5 O/ w8 `; Y5 [1 V' ^( q3 b7 W$ ^
// 主循环. {( j4 m* ^3 {- I7 i' R% {
for(;;)) A' I4 m8 a) F1 V
{# |; j7 ~* J9 z+ U& f, Y2 g
9 u6 L! G+ f1 M! F5 R4 ? }" [! u, Y+ }- f) d3 m1 {
}% u6 {0 e2 M- f( G& Q) g0 U( F; s
$ j0 x7 G7 G3 ?5 X
/****************************************************************************/) o; T3 ?3 [6 E
/* */
" l6 a1 D( F- F" C; ^5 t7 m6 h3 A) V/* PSC 初始化 */
s3 F5 _& W4 h6 y' H0 ^, S8 x% S/* */3 B% {% x# o n* V5 ?
/****************************************************************************/) Y% o( c( Q+ o0 {. h# G6 N2 w' F
void PSCInit(void)
& O4 \( x8 k2 w0 H{% t! j3 S% L7 s% J/ y1 [1 Y) p- P
// 使能 EHRPWM 和 ECAP 模块: o4 K+ c5 G. Y8 Z J
// 对相应外设模块的使能也可以在 BootLoader 中完成; j2 \' J4 \0 R0 P8 e
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);. r0 F3 E7 m3 {0 c+ C" b5 s
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);7 o F$ p, V8 I: p4 K+ F
}
$ F5 z8 t% N, u7 l, D7 B; n8 {0 {/ G( {& y8 @
/****************************************************************************/
) v- b( t$ d4 `/* */( l3 T1 H& h" l0 n9 j
/* GPIO 管脚复用配置 */
4 x2 w% m* `, `: I$ h* y+ a/* */* q4 ?4 H# k8 t1 @& J
/****************************************************************************/
/ c$ H/ W3 \7 o" o- x5 v3 Evoid GPIOBankPinMuxSet(void)* | m2 o/ K9 s0 a' d
{
0 ]8 @4 Y- ^' v, D EHRPWM1PinMuxSetup();
" O# j4 M6 P1 `
7 m8 J& z2 V0 H8 }' J% I3 W3 ] // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
6 T) l$ o1 `/ c/ P1 [ // 作为捕获功能时管脚方向为输入* C* ^( n9 N# q2 y! H! b+ ?* s
// 作为辅助脉宽调制时管脚方向为输出
9 O$ y2 _( `+ ` ^ // ECAP2 / APWM2
0 o/ [" l/ @4 ] ECAPPinMuxSetup(2);2 B$ p1 [# F4 j" x3 H7 X" M
% U( K+ h* {5 T# W0 _& v
// ECAP2 / APWM2方向设置为输入) u4 h+ T6 B {) u2 }0 X1 w: S
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
/ o1 N9 D( O6 F9 d. c9 {}5 b% a; H; x/ ^: A2 p+ q: _
+ F8 V. e, ^, ~/ d* I/****************************************************************************/
u9 U, W+ C. L- M- G/ x/* */
* p) ?% B. s7 l& ^1 i/* PWM 输出波形 */$ P7 G% B7 a" T8 Y
/* */
* |- n4 @1 w! A) E: e- q# `/****************************************************************************/- C1 F- q! O& ]- m1 d& w
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)6 q- `$ N' V: A
{, c: l" Q: h5 j# c; {3 k
// 时间基准配置; Q& Q5 f9 F# G
// 时钟配置
' Y% ]: H- H& D8 {4 Z EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
' |" \: L8 T; D) G9 N- ~, J0 j8 [, H f8 f
// 配置周期! y$ a+ w( I% M
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
K3 g/ f4 K( A pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
' h, b: O. X9 n5 w; E5 o- L& A7 ^3 s R
// 禁用输入同步信号
9 [3 r% T5 |8 D7 Q& u6 G EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
" ~* j' r/ s- t2 i. c
3 T4 w4 m. D7 N8 f // 禁用输出同步信号2 l" z9 j% q& [& m, N9 z
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
+ G; f0 ]' z6 k# u1 `; x* J2 t9 w8 o( T8 t4 J6 X; g
// 仿真(DEBUG)模式行为配置9 j+ [2 ^$ j* S
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
, k% j, N. k. f7 z0 o( Z* J, F& F; Y6 V1 i7 w0 n
// 配置计数比较器子模块
4 `0 l" M' \. c // 加载比较器 A 值6 n$ f$ K: q. F+ Z! H0 X
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
8 t8 s0 o @- Z0 K# I4 c L4 ^$ ] EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);: `% e# d/ x8 X" P
! _7 w$ J5 t9 ^
// 加载比较器 B 值1 u' P; o( D9 P1 P3 \
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,* i! {! V6 N% P
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
" J& P' D* Z: e$ `; z* b0 A; B* S. H) a* Y6 q
// 功能限定配置(输出引脚触发方式设定)
( e7 A' A+ T: V) E // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
" {3 a* g' ^& y EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
5 ^7 \- w K r! l% q: l EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,6 y$ t9 j, c8 x% J" Q L& D
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);: d7 c. v5 p7 }/ j, c; x) i5 P
; t, I: |0 C) T& {7 n1 ?! J // 禁用(旁路,信号直接输出到斩波子模块)死区模块9 m$ z5 T/ @1 w# N! g
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
6 _! ]" K1 M; |4 C+ K9 ?! N L) m- a7 z* n2 ?5 K
// 禁用斩波子模块
8 A: X: g% c% z. R EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
- {* r4 z9 T0 ?& o
! r; }* F' x# p4 ] // 禁用错误控制事件
{ g& O7 U) x EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
. A$ i+ C# o7 m( U EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
/ y% b$ Z# a! V9 p" G% A6 f# e; }4 K5 k' |2 w+ W
// 事件触发配置6 T3 o% A) k$ @- A3 \3 T
// 每三次事件发生产生中断
0 y, `6 C( k5 t" d9 Q EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);3 ?% d! J+ y! }4 t. U7 T, m
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
9 Q7 \8 m3 W' a P+ E" W2 @ EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
/ [6 p- w7 S+ e# P8 K // 使能中断( u! L) R3 X0 h$ ]( [/ C
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
% \& ?- l: W2 o3 f
; r$ G) e) {7 T. Y/ z$ i // 禁用高精度子模块 r: N! M! r7 r* e
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
, W4 S$ J+ |+ H4 b
- A) E8 H( z+ e" H UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);9 m' I' r& S4 R$ [/ w
}
/ i0 F1 r5 @, C/ Z9 p! }0 r
2 x1 x' ~ w) s* ^6 e6 U5 fvoid ChopperWaveform(void) T0 m( _0 ?4 A/ n/ O3 ]
{
: P% [2 I; N T // 50% 占空比
+ D# \9 G% h! U& s EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);3 F; \- d) b9 ? T/ C
// 4 分频
8 w' I8 K7 c0 F1 _ EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);) I" d0 o$ a& R& @" }+ u9 G& L, H
// 单个脉冲宽度 {# }" J/ I2 U5 h+ W' B1 m- z
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
+ C- {1 w# z9 i, B0 o // 使能斩波子模块( I6 r* H% t0 \$ M- B* N/ }
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
! X$ r: {" T7 \0 U}
! z4 m3 K2 Q2 S% L: a
7 P' }: |# m6 S$ B* \/****************************************************************************/; s" i* Z! ?/ I" A8 C
/* */: W$ j/ H' Y- I& v
/* PWM 中断初始化 */; Y( b7 c2 t9 O/ \4 a% _
/* */0 [" Q2 r; B) W4 h3 P5 k" `
/****************************************************************************/
$ I6 r& {8 M t5 z' Svoid PWMInterruptInit(void)3 T+ m* H. M( I' T- f
{3 d) r! W8 o# o8 ~
// 注册中断服务函数
* n6 @+ R/ M8 o& N( R/ W IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
% D' q$ h5 i) ?0 ]7 | IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
9 Y# v% M i# x. L9 @/ E4 o7 V
// 映射中断
2 x. G. o; O9 z0 q9 B. |- [ IntChannelSet(SYS_INT_EHRPWM1, 2);! F" t" f6 v6 p
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);- N) A' `* w, O" z: w9 i
. ]6 v' ~2 ~8 r* f I# X // 使能中断8 x" n8 L+ C$ S
IntSystemEnable(SYS_INT_EHRPWM1);% o4 j% i4 X1 J! @
IntSystemEnable(SYS_INT_EHRPWM1TZ);
" J- L- |' l) m}
" p% q+ Q! Y8 m
( U& a. ?' d) `, m% X) l6 ~1 P' K8 j/****************************************************************************/
* V" }0 i8 @' v& Y/* */
; b2 m$ v: O6 f- H, K/* ARM 中断初始化 */- Z6 l' [) {# U J. T3 D9 ]- W
/* */& h" E% L8 _" e- U5 Y
/****************************************************************************/
4 [3 l6 k1 q$ @/ z" E2 bvoid InterruptInit(void)
' \* \1 }6 H6 v# }: a{
0 M7 n0 R8 a; R. e( Y // 初始化 ARM 中断控制器6 v. k* l7 }: `. z+ R' D
IntAINTCInit();( T; A+ x: h. Z! m6 e4 j
. Q) B; Q8 w4 }. i // 使能 IRQ(CPSR)
5 u7 i6 t! u0 O; k IntMasterIRQEnable();; O L- V; L. U1 P/ O) H# }* E
( B& j- A' _0 L0 B% ~" A
// 使能中断(AINTC GER); _3 t# a' ~$ V+ F, ^
IntGlobalEnable();
8 J2 u- t4 I4 c2 u7 T }: ]9 v
+ E7 ^5 Y; T' U) h- s+ Q // 使能中断(AINTC HIER)" X. L6 z. @* J2 C: A; L2 u
IntIRQEnable();
$ Z ^- C, u/ F/ N}0 y7 r) b! O$ Q8 D/ B9 i
' o6 W4 _8 x! U8 i9 ^
|
|