|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
7 e3 j% \& O* V2 I2 @+ e$ Y/* */' w% n! G: m1 a- Q/ Z: a
/* 宏定义 */- b/ L- `% T, A( }9 J
/* */
: q4 \0 L: l1 S5 b* l/****************************************************************************/
( u C" d! ]$ p% R' {, s* U% l* f// 软件断点
9 \+ X3 n# T: t2 L& x#define SW_BREAKPOINT asm(" SWBP 0 ");' R3 W3 [8 ~8 G% j) {" N: e; q- e
$ n# B l% }) Q2 {* J' K2 l
// 时钟分频
G- j7 E8 r+ m#define CLOCK_DIV_VAL 228# Y) J7 D1 p) t* F' O
: p0 o* o- g. R x- N( Y; ?9 v& k- p
/****************************************************************************/5 S: F3 d9 u. _6 @$ R, i7 L
/* */
5 ?4 V' C" t8 h6 r- \7 _/* 全局变量 */
$ A0 J+ ~( y' O/* */
1 i h0 M3 I3 E* h3 A' k/****************************************************************************/
% H& F4 i. h. E5 g! V% QECAPCONTEXT ECAPResult;
3 S: L2 E: p5 z3 V' |
" N# y: _) ?" s- q' d6 F: |1 s/****************************************************************************/
8 h! _. \* s7 w, }/* *// M: G9 f& z. [4 _& E* v$ |
/* 函数声明 */+ s7 a% l. c! c) U( }+ b, @
/* */- e. N+ Y3 i* e3 s; G/ [
/****************************************************************************/" {6 |3 @) f& j3 i% b! \" [
// 外设使能配置
0 i% a. ?) G- d( H2 \8 F" Lvoid PSCInit(void);
p8 A9 L5 }' W6 `& ]0 o
( H6 U" t6 ^: r l// GPIO 管脚复用配置
; W& {9 D) Z+ N+ u2 `& hvoid GPIOBankPinMuxSet();, d5 ?" B; L& i4 w7 }' f# f& [
* y9 Q; T4 N) n7 X( h+ F3 R
// 产生波形
{6 |, ^4 u; e# b! i# C# `void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
) a. w+ |5 n3 p' F! f9 m; c( L G, p5 Tvoid ChopperWaveform(void);
& f( I) m K% ?5 X4 y& J2 X0 ~; i( v4 {4 @, d6 n; X1 v5 d0 n8 e4 {4 i
// ECAP初始化和读函数
9 F0 _: G. F o/ Nvoid ECAPInit(void);. `- O7 L( w3 P1 j0 n# O0 L; d
unsigned int ECAPRead(void);5 E. @& M/ s, m- W) O
7 Z* p, P2 e; t' Y: S//ARM 中断初始化
$ U: x& y) m) k" f! lvoid InterruptInit(void);& Z8 ~5 P/ ]% P: {8 x$ w1 X6 C
7 k }) j" K( P* ?% a// PWM 中断初始化. U- Q. x# d9 P6 f. J v3 g1 S
void PWMInterruptInit(void);
, p1 G! Z1 x3 `0 d6 v$ L// 中断服务函数
( K, h) g. K) Z9 [; I// PWM 事件
# v- g1 M% e& h R# ^void PWMEventIsr(void);
/ I/ }# Q: q. {4 {// PWM 错误控制事件3 c- ^% v# |( j
void PWMTZIsr(void);3 ^" W3 T+ s6 q& c5 F
5 k# R& f6 d8 D0 x/****************************************************************************/
! M3 b- ?" @. @3 z5 Z/* */
. a" v% I6 F# b/* 主函数 */
( @# L0 U! v1 x% q+ E* `/* */. n* P! B) Z8 y7 C+ A* Y; }. [
/****************************************************************************/
: `! u0 ?8 s% X* p, G$ cint main(void)0 L1 H( x1 Z4 |& A7 A
{
+ I0 B+ J" _* N // 外设使能配置% R0 K7 L9 {+ t# c6 }8 N3 T/ n
PSCInit();: [% q, _3 v5 J, t8 D/ A
8 e8 Q( s) w! `7 b. N. I // 初始化串口终端 使用串口26 Y3 k4 P; H8 U4 Q: M" ^2 C& p
UARTStdioInit();
) _% D- L y6 w9 L, a
8 |) E3 o) T3 d // GPIO 管脚复用配置* u) |9 F' P; Y4 i( F- Y( A( _
GPIOBankPinMuxSet();
J: t. l; g+ N
1 e0 w; x/ a' F5 g0 O# x // ARM 中断初始化
: y( V' h: N, I7 R' Q. r; m8 K InterruptInit();
I. p% R/ W6 S, f
2 ~7 L; x u- O) a& s // PWM 中断初始化
% ~) v, p; L# F$ x) e" F5 e PWMInterruptInit();8 \! ?0 ]7 m# k9 w9 s8 m- W
6 H. B$ b) m' a# u( Y7 w! j
unsigned char i;
0 c* P- h \9 q unsigned int j;4 q# t+ t+ s( b2 Z& C% o
8 o, g. E8 `( J) U+ U
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);; l* Y( a0 A- c' i- Z
UARTPuts("------------------------------------------------------------\r\n", -1);! F" D j' c9 N
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
x% _0 H, a& X // 产生波形% G/ p. c2 e, Y+ M+ {/ I5 b
PWM1ABasic(25000,50);5 y% p; L* O' v( d) s
$ x; ^* ~ `: ?4 a% [ UARTPuts(" C6748 PWM Test Over!\r\n",-1);
. a- ], ?! [; O. {# [% S L( Y& n+ U UARTPuts("------------------------------------------------------------\r\n", -1);* f" D7 S- i) P z
0 G- u1 D- z' \" F/ f
+ q9 T) n! {- S- V9 @: O7 z- i, a4 u' m+ ~9 N4 w& R
UARTPuts("------------------------------------------------------------\r\n", -1);) B- x$ u( g, B1 {( [) A
UARTPuts(" C6748 ECAP Test\r\n", -1);
2 J/ ^) b% r9 c+ y // ECAP 捕获初始化! C! E3 K! `% L& E1 B2 @& c
ECAPInit();8 R8 U7 |& B& C' w9 d( D( m
UARTPuts("Initialize ECAP.......\r\n",-1);4 I9 E a* S, D9 V
for(i=0;i<5;i++)
1 ^( k: U& H2 _5 S( v4 t {: [( g! m- U d0 ~2 Z
for(j=0x00FFFFFF;j>0;j--); // 延时. ?* b/ p: ~; N+ k) g, K2 p1 N' t
ECAPRead();- d. G( z5 A2 ~* i. \6 Q
}
4 S! u* K2 C0 U+ c UARTPuts("\r\n",-1);
" J7 j8 h7 _9 b: Q; T; j: c# _5 N UARTPuts(" C6748 ECAP Test Over!\r\n",-1);+ E) H- y# ]; L& J7 A) n
UARTPuts("------------------------------------------------------------\r\n", -1);
# W1 z f8 M1 ]) B( e
2 T, I7 t" S- m# j6 E/ V5 P // 主循环
+ M$ w* y% `+ \! B _- Z1 M; ? for(;;)7 k7 {- b4 ?3 e
{; n7 ^7 v8 D. @0 M/ E ?! F( e* |
2 f2 i% g. ~' e4 v4 P' U }) k" W3 x# k4 V M2 L- ?1 S4 Z- M
}$ [; k0 T% V% _& Y' H
2 b5 i4 m9 c8 H+ x+ w8 F/ A+ {/****************************************************************************/
+ S+ W u4 b% g% l) ]2 Y/* */1 x2 q6 ? a' f1 }# o) W* X( M
/* PSC 初始化 */
4 ?- z$ h. L2 O6 z* H8 U/* */6 \6 P" w/ [8 y6 n1 g6 U+ N
/****************************************************************************/
, B- p- f8 I9 w- r5 v$ ]5 [void PSCInit(void)
6 Y& k' Q2 t0 }* _+ r4 R+ @. V, _{
1 w+ e! J" A6 u4 ?( J1 u // 使能 EHRPWM 和 ECAP 模块
+ w. A# ?. v @3 i. y // 对相应外设模块的使能也可以在 BootLoader 中完成+ `7 t5 H$ e# Z" \3 }
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);! D8 Q% b# C ?" b- g
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);& ?. B9 h; k1 L. K
}
9 V, h# Y8 @: } Z3 T0 Q X y
0 k+ k/ c/ D0 v! Q, c/****************************************************************************/. T. F: j& o3 h2 P9 W7 _+ C
/* */
5 l Z6 n! D! q" Q/* GPIO 管脚复用配置 */. {9 _2 n7 U7 O4 {
/* */; n$ S) Z }0 v3 W9 z6 R' j/ q X
/****************************************************************************/9 `9 r* j7 D. F# K W
void GPIOBankPinMuxSet(void)
5 q+ o+ b1 Q1 }5 K! X) u. i8 c{0 _, W. D# p+ D" O
EHRPWM1PinMuxSetup();! _* W) V& }; X% @& ]1 X+ b
7 C- q5 l& \+ S/ n9 p# h: b
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)0 E$ M2 b! v% d% l9 M
// 作为捕获功能时管脚方向为输入9 V, R; @% }% I: c4 E( e( B
// 作为辅助脉宽调制时管脚方向为输出% x" p8 l ? z6 j
// ECAP2 / APWM2
; Y3 M3 G7 l5 `9 _6 h( H' i- }4 c ECAPPinMuxSetup(2);" W% e' F1 t8 w
/ Y$ l6 s8 r. z" P; v // ECAP2 / APWM2方向设置为输入
1 d7 f$ \, L2 H( T4 E/ A* F GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]+ w! C' p) u" ?/ N' _ C
}
% |. p2 ^: ?) T( n/ E; k
4 Y( j; B( x7 n" O% g# j4 ]& g/****************************************************************************/% l* `) D6 F1 x& \
/* */
! G) O3 J i# c: U& D! D- `/* PWM 输出波形 */
) L7 ^2 P3 c7 ~( @# L7 r* \1 s/* */
, R* F/ o7 K" |# x5 m! D W/****************************************************************************/3 I+ G) x9 D; l9 x
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
# J9 f: a0 i; ?. R* \9 }" c+ Q. n{& a' i+ h, x7 @; X. L: \9 N+ l2 z
// 时间基准配置
8 N+ q, f+ w# g // 时钟配置
- E# ~) ^( y6 Q EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);' n& W0 C' z% K4 j1 \
h" t, G, p9 m2 v // 配置周期4 c; u4 c j) O8 ?! r
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,9 I( @; Y% ]% T" E: T, ]" s
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);% R; y. D/ ~8 x- ]; Z7 N
2 g3 E& \- A4 Q- R1 s8 U. C0 b // 禁用输入同步信号
N3 _6 N) M8 Z' o EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);1 I; W5 [' k) \( t# n. h
; R' V+ b {$ D/ i
// 禁用输出同步信号0 ^# K( r2 T3 d8 A& P0 D
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
0 ?- U2 ]/ @' M8 g( y- q9 s# c# D0 M8 a6 {# H' W: O- [+ f; F
// 仿真(DEBUG)模式行为配置
* Q+ K. N' T1 t/ a EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);+ Q5 Y+ Y$ W" U1 S& [2 D
, u! D; z4 \' B' P
// 配置计数比较器子模块
4 K+ e+ R, i4 S! j2 v# A/ N5 y4 V& R // 加载比较器 A 值; n+ F1 s4 u5 y/ {% d. _- c5 ]+ @
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
$ y+ u8 R! b; b EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);1 G4 F' U* n/ G I
# }( M6 N) r8 ]7 `6 h. ] // 加载比较器 B 值 `' l0 E) d9 ]2 u2 K! c+ r
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
" R$ a7 z3 c8 Z& U" ?, O) R EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);& L( N- Q! ^5 ?
z( B- M5 Z* s7 W4 L% r( M7 [
// 功能限定配置(输出引脚触发方式设定)
, M, E" Z% K2 F0 Q // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出5 R$ \" e3 j: e
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,3 I2 p4 W& r# b" q+ H" R- V; H
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
- W4 a1 s1 \9 ^3 j) I EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);4 Q2 F' |3 i9 U. I- w0 Q- {
# c' d0 H& ^; f
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
+ Y$ _0 W% F2 _% R, t3 R0 h1 m( F EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
: C& W8 {. P/ j$ q1 p7 B( h' X! m) s( p7 X4 s) m! {
// 禁用斩波子模块' x+ o+ K9 x E- d% Y% i
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);: v: L( b4 D: L
5 \3 _' A1 U" U" X" O* [ // 禁用错误控制事件! Y1 `, S) b2 }! a3 B# S1 G3 C
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
4 t+ d8 m6 p& ` \' k' I% C. Q EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);& O1 e r; t: L+ Y2 n6 @0 V5 t
" s3 I& f# Q; y& y
// 事件触发配置
6 z5 Q# G* i) H5 e4 R1 r( B // 每三次事件发生产生中断
3 I) B; b7 l7 M5 [) F3 M EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);9 u* v5 R' t$ O% _. U; J* J
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件3 `7 O: ?& E1 E9 b S" ?9 N; N
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
# Y( h7 W" W5 e2 u0 |+ F // 使能中断; |2 ]) @- Y/ N2 p& n9 t( t3 ?
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);+ L2 [7 b* r% T" C. H$ d2 C
" V4 P1 J3 ]3 Q( b! Q // 禁用高精度子模块
( ~! ?6 t3 q- J EHRPWMHRDisable(SOC_EHRPWM_1_REGS);! R7 b* Q' r3 I0 \3 [: ~
5 ~6 S1 t1 f& r' z UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);5 G6 A! }2 a# p8 {* }, J
}) l$ o! S( L5 O+ l! u9 i+ l
8 @' s( j% j) ?( X' b
void ChopperWaveform(void)
2 a; Y! `- P/ b. p2 T{
# s6 T( @/ x' b // 50% 占空比
' J: ]2 e/ F$ y* D# i F EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
$ Q. n: P4 l3 w. Y5 T. R // 4 分频
" o% _' u0 K* ]9 l5 i EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
, w* C# n. t1 z- ^6 f // 单个脉冲宽度
' Z* j5 {; K1 |% r L2 { EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
# m( A$ A) v8 t8 }$ j/ ^ // 使能斩波子模块* V" B+ m% R B5 q. O) g3 B
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
. N* o7 D. j" S# x# b& ?}
/ H" g( r: j- @- S: Q
9 F; T: Z; v) l$ A( ? p5 B) _/****************************************************************************/+ ?9 H0 G0 Q. Q7 A7 W" ]7 c
/* */( t0 [7 n/ R' |, {" C9 C
/* PWM 中断初始化 */
5 P/ m/ q* }# _4 @; T0 e, m3 w$ m/* */" O+ P+ E$ T5 u( [
/****************************************************************************/ y4 h! x2 j6 U1 c* z& q/ L' J
void PWMInterruptInit(void)4 p, C% X H) q8 g2 u# }# G* j( Z
{
, Z6 d' K9 C w/ ` // 注册中断服务函数" U& e% X/ k1 C$ C8 q3 y! ]
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);+ i: K, b0 `* ]. m/ s _# n
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
; T- j4 M9 ]. |) G0 f5 h! _" u4 n% e9 t( b: K4 j! C
// 映射中断/ Z# m0 v5 ^7 D
IntChannelSet(SYS_INT_EHRPWM1, 2);
: y4 h, `. V5 e IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
8 Q g) y1 H( m! ^3 d( J% ]3 ?+ w
// 使能中断5 \& _. V/ y. u- `7 f
IntSystemEnable(SYS_INT_EHRPWM1);* Z7 n$ k6 x% o: P4 }* o( b
IntSystemEnable(SYS_INT_EHRPWM1TZ);* l7 g0 U. E3 U" T7 [9 u( d7 m
} L+ ^% [& z- u2 P7 s9 R
0 q4 y1 K r( V; w
/****************************************************************************/$ B/ O5 C/ F/ j9 i& }
/* */0 w' q0 s9 X' ]( ?
/* ARM 中断初始化 */( D- H& |9 l4 ?/ G
/* */: B8 h3 o5 X. e& W2 U. a
/****************************************************************************/
p& }% D) n4 q4 Z5 s4 C7 G* A! }void InterruptInit(void)
0 x3 y6 U7 t' j6 ]{7 R) k# v! P% u* m! c, O9 o& k
// 初始化 ARM 中断控制器& o$ h+ n- X1 f0 D! U
IntAINTCInit();9 r. f& L1 S+ Q% c' K! D1 j
/ {4 c+ O* V( D! T. {
// 使能 IRQ(CPSR)5 J- X3 H6 |, n, K5 |3 O( P1 ~2 U
IntMasterIRQEnable();2 ~( `* K( }& j/ \
6 V# _. u$ A$ b% _ // 使能中断(AINTC GER)% S' D* o6 o- V A
IntGlobalEnable();
2 h: f& G; G# J- ]' f
% L9 h9 n' W" \, G! n* o // 使能中断(AINTC HIER)4 x, p5 I- H3 g! F) e
IntIRQEnable();* n2 W7 u8 z Z0 L
}* m* S+ O f* f$ Z1 o9 I; r" F
& m+ y4 o$ `1 ^* i" B; [
|
|