|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/, f, V, m. q, H+ J. Q
/* */7 C L/ B: U, s* V( z3 {# v
/* 宏定义 */
0 _' M0 ?5 Z. b1 K3 B% R/* */( \6 T& U1 p! w: p, H% N
/****************************************************************************/) g+ g# V4 T* s3 f8 g# j& Z' ?8 \" l
// 软件断点
$ m% P' ~" H% d0 {2 z9 e+ D( t#define SW_BREAKPOINT asm(" SWBP 0 ");
/ N' M( L% ?& a9 I' u/ L9 j+ Y6 \
! n6 A3 u+ }- N" N// 时钟分频- k& N9 {0 Q* P' M* [
#define CLOCK_DIV_VAL 228
/ n# B1 K/ l; o( { ?8 C
* G2 w5 A* ?' p" p) |- _$ N+ K: \/****************************************************************************/9 H3 k5 d$ V; D/ o1 d9 a2 p
/* */6 b- M7 T3 H$ D! k1 ~- y
/* 全局变量 */
- Y. T: X& m0 X0 F( B, V/* */ S- s0 C6 d$ v+ T
/****************************************************************************/* ?. q1 j- B9 V) a {# n
ECAPCONTEXT ECAPResult;
+ p) }% b! ]5 M) \: M; Y
% Q4 h3 @# s# I8 ?$ m3 H' P! v/****************************************************************************/
6 S7 @! u* E6 R$ c! a/* */
2 \0 i* E$ o; ~/* 函数声明 */# `" T% t& V8 Z3 }$ p
/* */
, b: B2 T& H% w6 [0 O! _/****************************************************************************/
# p$ x6 U) ^& l ~% f. Q// 外设使能配置- @; Z6 h9 l, ~; F& b% o$ t/ L. w
void PSCInit(void);
* A( p0 `! y4 z: C
/ l! O. `1 r2 D4 j// GPIO 管脚复用配置: e$ L. U5 z8 M3 b' u- m
void GPIOBankPinMuxSet();
8 [ ]. ~7 z6 ]0 G
T l6 Q/ q# b0 @" x// 产生波形0 q; p( N9 A7 I5 Z( _ K
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
6 M- j6 L J+ v" Q9 ovoid ChopperWaveform(void);
+ C* W- f9 [* l3 _0 p9 k; Z3 W# t
& `* e H5 Y$ r+ f) U& C// ECAP初始化和读函数
0 x V+ d" K, W( P% cvoid ECAPInit(void);; s4 B( l. K8 ~0 G9 j
unsigned int ECAPRead(void);
% [# ?( v0 _5 F- _; w
- z/ n: @0 }! z' b, _0 I* F: ~* N//ARM 中断初始化1 ]6 v V6 W' V. R9 w, [1 Z" ~
void InterruptInit(void);0 O& V4 K7 V3 d5 b' a
9 b1 K* F8 \6 n, c& |// PWM 中断初始化
5 e e0 F8 {) S1 H" Cvoid PWMInterruptInit(void);
4 i, w) t2 x2 Q1 ^( ^$ V// 中断服务函数
# ]' L: k. P2 [' a0 P A// PWM 事件
3 P+ C" T* W2 Q9 y" L; w5 A4 U- O3 Zvoid PWMEventIsr(void);
3 U- y8 T5 ?$ g6 _, c6 O// PWM 错误控制事件) {8 _8 W/ M, I% @+ V' D$ V
void PWMTZIsr(void);0 q$ o3 c% l- q
8 ^) B& s$ c" {; W) W
/****************************************************************************/
( K2 R" N0 m0 S4 C/ `: Z) k" a/* */
( U/ d. z# |/ y( z; p/* 主函数 */
& F7 ~% d0 z) U1 a/* */
4 g8 e/ i$ ?6 H9 S4 u2 d% O% k2 L7 s/****************************************************************************/
( N1 _3 d( E1 Z" N7 Q! aint main(void)* x8 m( [! q! q6 o+ |
{9 b/ A. R! ?5 {" [1 u
// 外设使能配置* K7 ~2 M n' }) z+ w
PSCInit();- i( n0 `9 i$ _3 A# b
( z0 n( x$ o; H( H) C // 初始化串口终端 使用串口2
" g: m: V$ M0 y9 v! z" n UARTStdioInit();) e! Y s2 O! [4 c) @6 q
6 d5 v' K. j+ h* y- }2 g // GPIO 管脚复用配置7 _+ e; S8 o, \2 O
GPIOBankPinMuxSet();
9 p2 t/ j2 {4 b% O& J3 R/ D" V2 H* m1 A: x! k
// ARM 中断初始化
3 P- i- N# V& B InterruptInit();, t% E$ C) T) H# p0 u' B
* A: {/ f: y r7 O: o# V+ v // PWM 中断初始化4 i7 O( P6 a+ d+ M
PWMInterruptInit();
! ^% p7 K( V+ ?, P
" Q( A3 P. W- ]/ I) U unsigned char i;6 W M) k0 K8 p- J
unsigned int j;
4 K C; O. V4 V4 ~; \4 I
1 X. \/ z1 K4 r+ i UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
, E" {. B* s6 {8 n' t6 Z& s3 q UARTPuts("------------------------------------------------------------\r\n", -1);
; H' }- \, g0 ^3 k UARTPuts(" C6748 PWM Test\r\n\r\n", -1);0 o8 i8 y2 @3 t- \' L# k' a# u
// 产生波形9 W6 G* |: p4 s6 L0 R; @* l
PWM1ABasic(25000,50);
. Y* R1 X* b3 t/ ~8 f: G
- D r& T% q& J/ t" I9 {" O5 m" \ UARTPuts(" C6748 PWM Test Over!\r\n",-1);3 C5 X! [- x4 l) ]
UARTPuts("------------------------------------------------------------\r\n", -1);
+ T+ B6 \+ t( H0 d3 G$ c3 S* a1 V6 o( i2 _- ^4 I; E
- M0 [8 ?/ P( K p3 K
7 I" h/ z" \3 u. A- z& [0 o% @ UARTPuts("------------------------------------------------------------\r\n", -1);* ]( S2 S0 L. j: _ |; P: k* z2 p
UARTPuts(" C6748 ECAP Test\r\n", -1);0 S0 E4 q" w7 I, l' G: N6 l
// ECAP 捕获初始化
! s1 R& D' ]* Y9 T3 O( F) q ECAPInit();0 x, X: d9 E1 h s j) Q7 [. {7 E
UARTPuts("Initialize ECAP.......\r\n",-1);" `6 G2 g' i5 P! S
for(i=0;i<5;i++)
; ~' g/ s' u/ @ Z5 F- N9 p+ b: N4 A {4 V! b( ]9 M5 v
for(j=0x00FFFFFF;j>0;j--); // 延时
7 O5 N! a, U, I L% Z6 j; k ECAPRead();
+ b. l3 G z% @3 O }- \3 {: I4 Y c( V% ]1 X- G
UARTPuts("\r\n",-1);( W) |. u; {* t4 m" n
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
) V3 F1 |0 V9 T+ x* S$ @* p UARTPuts("------------------------------------------------------------\r\n", -1);' R5 W6 h- ?( E$ i9 J4 h+ u" g
' \+ j5 Z; f$ h* y! {; ` // 主循环$ O% H$ j1 j) Z$ ?
for(;;)
! M, c0 B3 P h0 R0 p {
^. r7 O2 G3 l+ a
9 `7 ]$ I$ p {( o }5 ]0 d4 d! @' @
}
( E. { T- v# V h* B6 H& B: A
7 q" x+ t- @* m/ n7 Q% [1 O$ A6 K% A0 U/****************************************************************************/
) v5 u$ s6 k$ C9 B; \/* */7 i7 V+ }- O1 q8 K/ _5 y- v4 R
/* PSC 初始化 */. q# a9 ?) ~8 ?# I
/* */8 Z; K' j7 D+ @0 Z7 x
/****************************************************************************/! b: q. z# `, C' ]
void PSCInit(void)
; u4 ?. l9 w4 W{8 S! |6 j; @7 q* |3 G
// 使能 EHRPWM 和 ECAP 模块
0 B& q3 b) ?2 y8 o // 对相应外设模块的使能也可以在 BootLoader 中完成4 b5 U2 O! u; ~6 ^1 t
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
8 M* V: `8 A% U! N2 f PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
' Y. e# k* f$ q. @ M}
/ ^5 Q K6 x: A7 u1 X, q6 E' A' p, P* b
/****************************************************************************/& _2 z# s, t$ ?% {) W
/* */
4 [5 i$ m- t% Y4 n. J/ g, n0 G/* GPIO 管脚复用配置 */
$ B# j9 `9 Z4 P6 U/* */
) B5 f/ K8 [( ]$ u# O4 h/****************************************************************************/( N2 B g v( o- w
void GPIOBankPinMuxSet(void)
/ p# a# o, ?4 H. M1 i% k/ ^{
) s9 a) P1 Q1 k7 j EHRPWM1PinMuxSetup();6 `! D/ \* `3 I& d4 f: g2 J
! `6 d* j( Y# Y& [. `& b
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)- H- P3 J, q; D* s- {' U
// 作为捕获功能时管脚方向为输入
- ?- B5 m% }( q( |* T3 @7 J y+ r // 作为辅助脉宽调制时管脚方向为输出7 W& k4 m8 B" Y4 e* Y; v
// ECAP2 / APWM2
% O4 q9 Z8 c! L9 i# ^" i# X ECAPPinMuxSetup(2);
; J& Q4 }7 @& _+ o' [( N2 n/ z1 n$ ~ J% R# V
// ECAP2 / APWM2方向设置为输入$ W& ^+ M# k1 z# G, k
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
7 y. C# j1 @" [4 E8 z$ R}
6 e8 Q2 ]8 q. p1 l; ]% N; b2 z v; V* J W& {8 t6 Q6 W& n
/****************************************************************************/0 a" j, @/ P7 c/ x4 n
/* */
9 H" t6 W2 M& O/ Z% f* p- v, K$ ~/* PWM 输出波形 */
& W+ b( D' P) t& x/* */
: b4 ]" x9 K- E3 \3 B/****************************************************************************/
2 _3 G8 l0 }4 kvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
1 d7 w' C4 Q2 N2 q{4 q% t! I+ K$ ~" I8 m; p
// 时间基准配置( @2 ]8 f1 [7 \/ \: S' B
// 时钟配置
2 ]; u0 r" e' P) n3 C: P EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
8 P) m+ `# @( d" i+ @$ f! e8 N ^7 k+ C- [ i
// 配置周期
8 J& n7 Z( ^/ j+ N, H8 J/ k3 }. @ EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,. \! D5 o& g9 p$ ]3 v, b
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
4 c$ b& J6 u3 J% f. X& o( j$ c3 d0 U; P9 L
// 禁用输入同步信号
. s. H, A& Q( G4 n! h0 J EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
! B3 j4 i+ ~8 G
/ d) w+ E$ ^0 `$ T; a // 禁用输出同步信号
4 [, |# t- E) u& l) B EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
_( I6 a W6 Q' g' O- A% q' m% z" ]1 I6 ^# r
// 仿真(DEBUG)模式行为配置
! h- r( O9 k) t8 B EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);+ v! K$ \9 M. h
2 \% W/ l- n; t; W% o6 q Y
// 配置计数比较器子模块6 e" o4 M2 |5 o) ~( b3 X* @
// 加载比较器 A 值
7 F" x$ d& K1 {9 U1 s) ]0 F EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,0 ], S+ g, H' w# Z6 E. F) I
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
4 T5 C m d$ `3 m8 i, I
" i8 S. o% T* O // 加载比较器 B 值3 _: O/ _/ E V
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,( G* S1 ~, C$ p/ ?. F x
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL); t3 ?1 d. v: F( b. Y
$ {0 F. j, B5 j/ u9 }2 a$ }5 m // 功能限定配置(输出引脚触发方式设定)
9 x9 | i& r: y" v6 O // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出* G% T6 e( V0 [! P, U" F; @& G/ ^
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
4 L9 Y) t- d3 z; Y U4 |% m EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
3 H8 Y$ p2 Z7 K: n2 u/ V EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
/ r) A9 i9 {' G2 ~; V0 S6 c, Z7 [/ h
// 禁用(旁路,信号直接输出到斩波子模块)死区模块$ c9 F9 K1 N2 m7 ?7 m
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
Q) w2 P$ g) o
C3 B6 c0 k: i4 A( v. E6 ? // 禁用斩波子模块% R( L0 U; U$ e( B: i" `& n! @
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
0 L3 Q3 U( y. V
l. d6 Z+ E$ D; `- ?7 b6 U // 禁用错误控制事件8 q* T. u9 Q. E
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);( y# ?6 x6 M" z! E% I) a9 M
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);4 t6 T2 X/ F5 d' h4 e9 C: `
/ h. u1 i! I- o2 N) | // 事件触发配置. U/ A; ?- f3 y; e/ q- V
// 每三次事件发生产生中断* r. d) D$ s" t( B
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);+ ]( {+ c. Q% \4 s) u
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
6 y* Z+ q0 ~- B) r$ V; u EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
) K: u- O& v I, M6 t( { // 使能中断" E" S$ C% h( H, F7 R, ]0 i9 a$ X
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
' c. S. L6 s% P# s# T1 E7 W f/ I( C
# d6 r$ A! c9 J- C# U, C- t4 z // 禁用高精度子模块1 C9 M8 ]" q+ b6 Y& {4 P
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);4 H2 B; J! t) Y
$ k4 r/ ~1 k) N# i; G UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);6 C, S# f3 Z2 b& p1 U
}# l( n/ c' G4 | {5 |4 |0 Z# w( |
# ]& N; p: E4 L. d" G3 W
void ChopperWaveform(void)
5 B# |9 y* u; j1 c$ i0 z: B{1 [9 I7 x, k# `
// 50% 占空比/ R4 F8 N; ?0 G% `4 }& j
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);: c4 i! M7 p& G; \5 u9 [
// 4 分频
# T, C% m7 Q, M EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);0 {9 A- x# \& A
// 单个脉冲宽度1 B! Z$ I7 E% O1 r: p
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
% R) [# J8 ^/ o o4 S // 使能斩波子模块( f$ i* b- {3 O+ H6 G6 O8 q- g
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);1 ^- ?' d: P1 g8 [
}
w; T( }2 _! Z! k5 g& C& B" d& U% v
/****************************************************************************/
/ z" c) F t3 r/ z/* */+ u' T1 J M4 U
/* PWM 中断初始化 */
6 }+ M P9 J& z/* */, \( S+ w2 d9 `- p, D
/****************************************************************************/
2 S0 p/ F0 G, u; U4 lvoid PWMInterruptInit(void)2 q- ~; \8 V5 ^2 E
{
1 D& n% P ~; S3 k6 M9 G // 注册中断服务函数
% m$ h/ H5 o( o5 d4 O! d* a5 s# l IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
5 n# |2 v( i7 {. n6 D# i6 ^ IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
8 I$ P/ O( M2 O: ^6 p6 I
q, d) d+ e1 F/ ]7 G // 映射中断3 h4 F- ~/ @% [. Z. t% q3 e
IntChannelSet(SYS_INT_EHRPWM1, 2);
3 O% J: f+ \4 z: h6 J d: U- n IntChannelSet(SYS_INT_EHRPWM1TZ, 3);3 Y% L# C! t7 S3 a& ]$ `; X3 V
: e6 h5 h q# U) r // 使能中断4 E& j. E7 C, Z! Q: N; i
IntSystemEnable(SYS_INT_EHRPWM1);( ^3 g; @+ G2 l9 U! X6 {" R
IntSystemEnable(SYS_INT_EHRPWM1TZ);
4 H! j, v' w9 V2 Q& v3 q3 P7 a; f}; e" a0 A) u: I$ ~, S* i
% Q( P, z0 z3 D1 \* c' o8 F, ?7 d/****************************************************************************/5 i8 Y# a8 R6 B' F8 ~
/* */
G9 e# N3 | J/* ARM 中断初始化 */
7 a! S# }# R7 J3 a& p5 i7 w/* */! k4 \: P U( V/ T: J+ X4 \5 U) z
/****************************************************************************/$ S6 S5 v: ]$ o$ G" L3 D
void InterruptInit(void)
3 s/ c7 }- \; a{4 B) }; V6 P1 O. a" \: E
// 初始化 ARM 中断控制器4 z# H1 Q& L) M B6 z5 b' e7 y
IntAINTCInit();
+ X: q" P( O3 u1 p, C. D6 J( t$ V8 y" A) `" c: A2 c
// 使能 IRQ(CPSR)
+ F9 X1 T% @7 K6 y IntMasterIRQEnable();* C+ T! E6 n% u$ {- n
5 ~$ ^! }/ j7 F" E // 使能中断(AINTC GER)
9 E3 k5 G' L5 } ^ IntGlobalEnable();7 h' Y9 X3 ^! T& @9 Y
$ Q9 A0 o0 t4 u4 T A2 e // 使能中断(AINTC HIER)$ E) G2 Z* a; E
IntIRQEnable();
8 t$ y0 X, U2 h}
4 F4 E9 Z# R3 T6 n2 e# }8 F0 w5 q0 g5 _! W: W+ C
|
|