|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/4 F" |$ |( U+ e! g' h H$ l. `
/* */
x' R6 F7 }. i" k( P$ @" x" O/* 宏定义 */
: S0 Z% z/ H# k; c/ I( v# D; h/* */
/ ?7 p- h% |5 k5 X9 B+ ], q/****************************************************************************/
$ R' w5 Y$ Q/ i// 软件断点
% I6 l; h. a1 r9 b# x2 D/ L. I1 ]#define SW_BREAKPOINT asm(" SWBP 0 ");. H: v" }0 |- u/ @* d( t+ H- \+ U P, s
, L2 l( `7 s; k# i( q// 时钟分频! H2 T8 o! _! z1 _+ s" M
#define CLOCK_DIV_VAL 228$ u- ^# I1 y& n( x
9 c* P8 s) M+ x8 F% r6 |3 b/****************************************************************************/
/ |/ p0 _( H8 ?& y/* */0 A o3 U/ X/ ] S1 [
/* 全局变量 */
, l; M& a f; |# p( h/* */
+ y" m- m8 U v8 j. u/****************************************************************************/6 r5 g+ h; }1 z
ECAPCONTEXT ECAPResult;
# ?# u. c& B* d# x7 y4 x+ d9 G
3 D! p9 e$ K! X. f- c8 l$ I" E/****************************************************************************/
) ]/ B( y7 N& f2 K; D2 r" L& _/* */9 R5 v3 B: W* L* v
/* 函数声明 */
% O! ?! M! _5 _2 X0 `/* */0 H* W6 @% {" Q) w# Q. p( V
/****************************************************************************/7 ?( l' ^- I4 n! z" B9 B7 j: ^! b
// 外设使能配置
" m8 N9 ~. v2 ?. Fvoid PSCInit(void);
/ Z* S/ q, E; ^. g! k' h- H8 i% M
- `( S$ X4 \1 z4 s1 J9 \# P5 Q// GPIO 管脚复用配置- k# X; u) {- D
void GPIOBankPinMuxSet();
# ^. G2 T3 V( z4 q0 j: m5 t( c
: e4 J/ j4 h; g3 m/ e$ r' _' j/ f// 产生波形5 z9 r8 h9 F0 Z0 j* F
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);, h, ?8 ~- c! C# T D; ^4 q
void ChopperWaveform(void);
. v- E# {7 L& A' d& E; f
6 N1 ^* q' k( X8 B// ECAP初始化和读函数$ V- E9 F, F. Z: `
void ECAPInit(void);
/ B! g0 x$ m/ ]) ^: k% l {, ~8 Punsigned int ECAPRead(void);
0 p% X. u5 j. g
I2 l' ?, Q+ y3 Q//ARM 中断初始化$ u9 N, v- Y% ?! C2 n
void InterruptInit(void);
- N7 v. w0 x$ D1 R. w# Z0 F7 n+ V6 W4 ?$ W/ Z8 P _2 |6 u
// PWM 中断初始化" H0 [* D/ ^, S' e6 S. d0 ~" @
void PWMInterruptInit(void);
6 T+ c0 V/ W) L6 [: Z5 q m// 中断服务函数
8 T) k' r$ j7 }2 O7 ^// PWM 事件; c/ b) k+ l! n9 f
void PWMEventIsr(void);
9 x# D/ d4 B7 z! d/ \* ], E5 P// PWM 错误控制事件
! [4 ]( u( a& `void PWMTZIsr(void);
; l. m, ?+ [7 N( E) _2 |# A; Q! j( _
/****************************************************************************/
- I7 E( s0 @3 P) n' U/ N( g/* */ N- K6 C( h* ~' ^' z, D
/* 主函数 */0 L" v; S* e5 N1 |& X4 j
/* */
/ |7 J! L6 z# R/****************************************************************************/
- x# `, L* W5 ~3 E, nint main(void)
* x% [& S k) E' c- k{4 V. S, L# q2 d/ E
// 外设使能配置
. x7 g1 c2 b5 p( P' ] PSCInit();/ ?$ y7 k- @+ l7 R s7 z' d
5 k5 `6 b _, A
// 初始化串口终端 使用串口2- A7 I9 S8 D1 b! Y
UARTStdioInit();- B( M2 Q' ]! B
, I) V2 H% j# S; s
// GPIO 管脚复用配置
' A& _8 @" v" j GPIOBankPinMuxSet();
& q! G' a% q5 _! ]7 x1 i+ _' z F# J, U& y
// ARM 中断初始化) W/ p) ^6 _0 j* b3 x# f
InterruptInit();
3 `5 m' k) m6 u x. K4 Z
( `9 M) ]6 x. S9 S6 c+ [ // PWM 中断初始化9 p7 E0 s9 J9 g* v' L8 N
PWMInterruptInit();! c& ~2 d5 @% {8 z
3 T' x; D' x9 `. G0 ~3 \" m$ F unsigned char i;6 e% U, n7 K3 n* ]$ c9 F7 X
unsigned int j;- o! F- {. _1 x* J0 M' A2 q
0 O! s# ^; f6 M. B" Q$ u UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
7 ~$ {* G9 W7 n; {4 b, X, U9 J, H" i) P3 c' N UARTPuts("------------------------------------------------------------\r\n", -1);
9 q- ?. O& t- P& M& H: F3 d: A- s) w UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
- C5 l+ b& \) p: y // 产生波形- S! ~& g3 W4 @5 T2 K6 [* s2 h
PWM1ABasic(25000,50);. y; ]% \/ Z8 A) B! L9 o' s# t
7 d+ T$ _( p. U4 K R UARTPuts(" C6748 PWM Test Over!\r\n",-1);0 D) u# T+ Q" \+ x' R& L4 J* y+ G
UARTPuts("------------------------------------------------------------\r\n", -1);& H: o# B1 o. x5 q9 W' J
1 t" j! V( n% a0 I( j3 g& K( j+ q# q5 h. S$ x+ n% i% A
+ G8 X# a2 a- S! J UARTPuts("------------------------------------------------------------\r\n", -1);# ^/ K8 S* S4 h+ I3 Q) u
UARTPuts(" C6748 ECAP Test\r\n", -1);) M: e& G$ |- M O2 f
// ECAP 捕获初始化) t F0 h" S& h+ Z! Y$ Z* M. b
ECAPInit();# u$ w( E- i- ^( x) C7 A6 E& ^" T5 u
UARTPuts("Initialize ECAP.......\r\n",-1);; B+ t! h* y2 o' I* ?- ~4 v5 |& ]
for(i=0;i<5;i++)0 \" _1 T( Q* R0 v/ v E
{
' \) m( c! V! ]% G" o for(j=0x00FFFFFF;j>0;j--); // 延时
: @! c5 c4 X4 o; m& G' l0 B ECAPRead();
& m, q+ F2 j2 h8 u* v. C }$ U! E. m6 n- g9 q* c* B2 _' o
UARTPuts("\r\n",-1);
C$ `* u" v! @2 W UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
, b8 J0 u t9 ` ?& E/ @ UARTPuts("------------------------------------------------------------\r\n", -1);
) i' o1 s+ q- d9 f8 V$ D2 R3 U
// 主循环
% L/ \+ i3 j, s3 r/ f% U for(;;)3 ~% P0 a& R5 k# ~$ X+ r
{
8 W2 N, A- |' D+ p$ j& H3 ]7 c5 J) l
}% U1 {$ \: q3 h5 ?& O# Y! r
}. G& \% f. v% r* V2 f4 u: R
6 w2 S9 K4 U' @* G$ i% q/****************************************************************************// q7 U3 b3 Q8 {: I5 t7 F9 Y
/* */
2 M2 v& q5 B5 d4 `. Z. n/* PSC 初始化 */
+ Q7 L4 M; s; Q: T$ Y$ p2 Z* F J" I/* */( A# V' i& y* J h5 u
/****************************************************************************/: s. T0 ~1 k2 d% I8 N0 z
void PSCInit(void)
! K, y4 ^' a0 z2 e{8 ]$ u7 c5 V. N1 a3 F0 Z
// 使能 EHRPWM 和 ECAP 模块
( f% X1 i9 M3 b // 对相应外设模块的使能也可以在 BootLoader 中完成
$ N" I) W) A7 R PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
6 R% i- k% t ^) t PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);& B9 O2 F. m& t/ p% X
}
2 X, ~8 v# `* C, g0 D% y# z/ G( Y- V e! @$ o
/****************************************************************************/
" U9 Z. Y' ^. E/* */
' L3 l' j3 r; k/ M/* GPIO 管脚复用配置 */
, H/ W% p0 S; x1 y" o/* */
( k/ j8 t, k7 H7 l& x8 w' a/ h4 Q/****************************************************************************/
: p y4 }" B: K3 }7 P. evoid GPIOBankPinMuxSet(void)1 J9 b/ v" w: R- O. z8 E; f
{
1 g" @8 Q- E5 D& g EHRPWM1PinMuxSetup();. d9 y( u8 y& U9 [
1 J2 n0 ^ B; ~+ _
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)/ o3 s& k* J. S. ~5 b/ V& Z+ o
// 作为捕获功能时管脚方向为输入) O8 y% E5 B+ s4 a2 O! v, f, p
// 作为辅助脉宽调制时管脚方向为输出
! I R6 D/ d7 @% U1 o, I/ O // ECAP2 / APWM2
9 N* l8 C: h" x9 \3 H+ ]8 }- m ECAPPinMuxSetup(2);, ^2 J/ K. y1 O( `) `1 N! M
4 Y- i# V' z9 w: v3 |$ I+ a // ECAP2 / APWM2方向设置为输入% d! {( S8 L0 S8 h2 r- `6 s* l+ Z% d2 W
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]# X, D! E: P" r' P- p# i8 @- {- _& h
}+ [/ J* u3 X; C l! a+ \9 I
( }, r I, K1 k3 q6 [
/****************************************************************************/: {( z7 l4 S2 ?- c# Y2 F
/* */
7 e' S7 h6 h) w* ?4 u: Q: _& P/* PWM 输出波形 */) S! b. J& T8 Z/ Z* q# }+ B: X/ Y
/* */
?2 ]1 L# K$ F8 [/****************************************************************************/
* M' r7 i3 }8 a; tvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)) N- c; C ~+ C. b
{
+ Y! W! W$ T( r$ s) ] // 时间基准配置
3 w( w0 i' Q8 j" R8 i8 f: n // 时钟配置. _2 G2 ^. S+ q1 F- b$ m
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
/ e! F! w% ]% f1 ]; b" m8 C" C# Y: b
// 配置周期& Y9 y0 x5 O% B0 ~' |
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
/ X. S* s Y+ S pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
: r) T. q' f+ s4 s6 ]' |1 I7 ^1 @$ i% K' C/ ?0 n
// 禁用输入同步信号
# P# ?. I: V2 G7 p* {+ K EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);3 y' T" a4 v+ G; N( J8 J$ h$ g
9 c+ M1 ]% O4 w& R
// 禁用输出同步信号
2 u# k% e! b! d+ j, j" z EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
* R& l1 a, [& @3 d7 e$ _1 }, D
\0 m0 ]0 ^/ n // 仿真(DEBUG)模式行为配置
* n1 c. k6 R- V' G% R# e! l EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);3 l# x. C F! v2 p& V
9 c _: }# g1 p
// 配置计数比较器子模块
/ ^7 b( _! g$ @" R // 加载比较器 A 值
/ ], u# G# T% m# e ] EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
! v6 |4 [5 J4 q EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);6 G7 r% |$ Q. P% p9 o
# @- r! @* R h' X- E
// 加载比较器 B 值# z2 u4 C; N3 i. q& N
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,3 Z2 E! _) j8 w8 m
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);0 q+ R" E: s( T2 ?8 j. c9 P
) P8 D2 G. l/ B: q4 N* ] // 功能限定配置(输出引脚触发方式设定)6 D+ F Y" ^2 ^
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出) |4 {' A2 ~1 h$ G7 k8 Z1 }
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
3 _; u6 _; o. X7 n1 B EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
& \$ y P: Q b1 N EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
8 w+ L+ c. C( R" L. [) i" I) u8 i: C: R
// 禁用(旁路,信号直接输出到斩波子模块)死区模块( w9 \* c' k2 ^4 y9 d
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);& x |* E: a2 X% G3 ~% i
/ T& p$ f$ t; s0 I // 禁用斩波子模块! _5 l+ K; v, X- d% L
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);4 I/ R6 v+ X7 `, J$ ^
% }) g8 o7 n( j4 J, Z // 禁用错误控制事件% N& s9 A: W, ]8 G4 ^& F& `
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);; M( @& n$ g" ]0 \: j
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);$ X' m- W& e8 u1 R' f) F
i7 @; }( u/ Y: d/ q // 事件触发配置 C! r( t8 n4 d7 K
// 每三次事件发生产生中断
9 v; f$ _# u; K5 e) i. _+ B EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);) j# A$ v# J. C: ^
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
& V: k. k1 G$ p) W- K EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
1 }, N9 f" t/ G2 H3 b4 a // 使能中断
" y/ v) v* o& k+ D# g* q EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
4 g5 s6 j3 U1 |# ? [+ A: ]( g6 b5 e
// 禁用高精度子模块
* e7 X- H3 }- i2 K EHRPWMHRDisable(SOC_EHRPWM_1_REGS);6 A3 A" A3 z; D, m4 S5 J8 A" o9 R
& P0 z5 o0 G3 T' |- K, I8 h7 x5 U UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
0 l2 i9 _# Z! N8 A0 W}* m) |' a+ v7 G: {' d3 n8 K3 K
7 N8 t" ?6 o n, ^% b5 z1 z
void ChopperWaveform(void)
) }3 _8 |8 ?: h' B" M{+ n, h( Q2 i) n( z
// 50% 占空比% F" G( z! h9 F
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
$ r$ M5 ^- I/ c5 V# t& y! { // 4 分频. E' h' [" e1 m' M/ ?
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);* w9 n2 F4 W4 H+ G% G" b
// 单个脉冲宽度; i$ p) K3 `' [
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);. P& g, R1 F& o9 F8 I8 Q; y
// 使能斩波子模块
4 ~, e) W8 u* C$ C EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);) e8 U/ b( O; }, M
}+ u1 \( D: Y2 x6 {
4 j: u! Y0 s& x! J n! M
/****************************************************************************/
' ~3 Z% K# y* y3 M7 k0 }% g) n/* */+ H( i: v3 ]+ w# }8 Z" e' D$ c( H
/* PWM 中断初始化 */7 V/ h( }4 r( e% M) z
/* */
1 K6 f. k- w% f: K5 n1 ]; O1 i/****************************************************************************/* ^7 `1 O% s& l6 W0 A$ W# y8 f$ [7 U0 E
void PWMInterruptInit(void)$ A: X- Y. {7 k3 o- A+ M
{! y& ~% \* m K% T; O
// 注册中断服务函数! c$ R/ m/ b* \3 l1 S
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);$ w# S* w2 u. `5 B# M; I4 J p, B% ]
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
4 X9 S' Q4 X, a4 `7 n
# z# q% }6 k O3 ~* F2 N- ?; U5 x) M // 映射中断 |* ]: p0 F( x8 t
IntChannelSet(SYS_INT_EHRPWM1, 2);) I1 j3 Z5 I# j' u- i* ?* p
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);- C5 \0 u% x# Q/ X8 i- _
3 k2 u$ g% {( W5 P1 w6 X7 N // 使能中断
, ?8 D3 i5 \1 }& O' \2 \ IntSystemEnable(SYS_INT_EHRPWM1);
) E W8 l, c- N& s" w# [ IntSystemEnable(SYS_INT_EHRPWM1TZ);( \* h( @- q6 ]! W) h) U% A
}' q. \# @4 Y% m2 O
; G- X; e- ` a9 m8 O
/****************************************************************************/4 R2 P% @9 ^- I( D' J- h6 C
/* */3 A. z6 K s/ j( j! ]
/* ARM 中断初始化 */8 N' _# _- I& V9 p+ p% H; ^
/* */
' R# F: r" ]2 e, A f. K7 A/****************************************************************************// V3 e+ U' Z$ l( T$ j
void InterruptInit(void)& m8 x( w/ n1 k/ C2 n. a0 s, k6 ~" `
{4 l3 ` P0 f0 K7 Y" ~: X" J7 ]
// 初始化 ARM 中断控制器
4 W3 I$ C# D+ P5 @% W IntAINTCInit();
# r9 c" ?8 n( N3 S6 W9 P, I4 B9 _5 `7 R1 A: g3 v9 Q
// 使能 IRQ(CPSR)
* d* y3 _" I/ `$ _ IntMasterIRQEnable();
7 C* Q3 H( R4 k q- q8 `/ s
) ~" t, Y& e. n2 W1 {- p- [ // 使能中断(AINTC GER)* |: x/ ?; R* @
IntGlobalEnable();% T5 q- O: |: l; ^" [
- b$ e8 S8 c" I' Z
// 使能中断(AINTC HIER) O8 S) w' q/ P7 Q
IntIRQEnable();9 U D0 B3 q- R. J6 a
}
# X( g! s) w: ]/ G+ f1 p, [" s
6 k2 D2 ~) ~/ x' L |
|