|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
3 T& ~) {& s1 M {4 f7 w8 o% @/* */
/ \+ ^. P8 h6 N) \/* 宏定义 */! y- y J% |" _2 V, [
/* */
4 }' o% n, @2 Q/ ^" `/****************************************************************************/
# P9 f9 m$ w! g, h6 P5 {// 软件断点3 q$ q0 F) Z7 g/ `5 y. r1 C Z
#define SW_BREAKPOINT asm(" SWBP 0 ");4 S/ @; z+ ~# s* B" `
9 K/ e+ _( f) b5 u, u' Q// 时钟分频; E3 S4 L9 [, c8 e! e5 J8 W
#define CLOCK_DIV_VAL 228
$ w& X+ I& \4 k! \& b5 V! ^) a; h1 m; Q; _: @" e" h
/****************************************************************************/
& q' Q" U5 W) q+ F: s" W5 G/* */
* N* j0 h% p8 X B/* 全局变量 */: T- v/ ` H# x% |
/* */
* [6 o- v: g: r3 S/****************************************************************************/
% g/ z y) p5 { ~1 yECAPCONTEXT ECAPResult;( t# Y, B8 r$ }8 ~" G
! N/ A9 q8 U" ]: S( z! U3 J/****************************************************************************/, ], |/ J. C% N6 J
/* */$ u6 Q! S4 L$ `$ B
/* 函数声明 */
" Q' U% r3 @1 H6 y/* */
( w4 s7 b; M6 \/****************************************************************************/ ^; ~6 a1 k* N, @2 H4 f* f
// 外设使能配置$ B0 p ?% r5 G! ]0 d4 @
void PSCInit(void); }0 n, L# ]2 i- K s
0 R; o# _5 u8 k2 \8 n$ T, v& j7 t
// GPIO 管脚复用配置
9 s/ P* L# c* Cvoid GPIOBankPinMuxSet();! J, t$ `( Z+ d. n0 L
5 [; ?) q; D' Q' A
// 产生波形* |# E6 }7 X6 g1 p
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
, Y" m$ N3 v @7 R5 i! O1 D2 S1 kvoid ChopperWaveform(void);5 [! R A% f& r" \# v' Z
3 z: w/ L2 W4 i# C/ Q0 t
// ECAP初始化和读函数# P$ f: }& ?1 V8 ~
void ECAPInit(void);
5 U; M( g! |( I% X% K- B" Aunsigned int ECAPRead(void);
+ r- M* y0 V/ t3 s0 o/ f) Y
" F$ f+ y% a+ @: z5 A//ARM 中断初始化
+ ~& h# X! m: y! jvoid InterruptInit(void);
0 e( k: S5 c+ F4 y
7 q: I9 @; M2 T' x// PWM 中断初始化
+ t; k7 o: e$ ?7 ] R$ Qvoid PWMInterruptInit(void);$ Z" h0 \( o5 X/ E; b
// 中断服务函数% ~- \. \( f$ m4 ?- g0 G8 W8 d
// PWM 事件
. ?6 v& f" D3 N! u$ g( x& v1 t$ Bvoid PWMEventIsr(void);2 G7 c* s- h+ @' w+ d
// PWM 错误控制事件& C5 T# M: d: F2 h! V
void PWMTZIsr(void);% r0 V5 H$ \* R/ V7 D% {0 j1 i# S
+ }) i8 b. S8 U4 }/****************************************************************************/3 Q. B3 V2 }' ]; J4 [' M
/* */
" `- E: M( X+ Q/* 主函数 */
3 a' o) Y& [& R, v) V2 s/* */& X' L* K' C; ]$ R3 R
/****************************************************************************/
$ z5 g9 s5 K* }4 W# Jint main(void)
5 c) e# J: w1 y& M B! |2 H{
7 [: H$ L, x2 F* |+ r+ h+ C // 外设使能配置, Y) a- h+ u# W% L
PSCInit();- G/ r. e/ N+ G% ]/ b
* f3 t% P0 ^) U( I1 D
// 初始化串口终端 使用串口2
( U7 V0 S- s5 a$ Y UARTStdioInit();/ N) q6 A# O- d$ c s, G' R
5 Q" N% O) ^; l4 \2 \
// GPIO 管脚复用配置% _* _+ i8 j1 L9 h5 f; k
GPIOBankPinMuxSet();
1 {+ k2 l6 V* S( Y% k( Y. D. h: |1 P3 N
// ARM 中断初始化
1 X' n2 y( |: f) E8 K InterruptInit();+ A+ T6 O3 m% x+ D5 t5 I
% ~) [0 G( \! B: Y8 q
// PWM 中断初始化; R8 G' d: ?2 ^
PWMInterruptInit();
! P6 A, t6 H- o5 G6 B5 s+ y6 W! Y1 H2 J& X( c W: R0 q
unsigned char i;" Z- P9 W) m; e5 \( Q
unsigned int j;
! I1 Z& E9 h/ `& V
( n6 w7 j H/ m; _$ ^ UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
6 B2 ~/ ?* I( r$ T0 E4 Y UARTPuts("------------------------------------------------------------\r\n", -1);
: v* Z0 I* ]2 }) w; H UARTPuts(" C6748 PWM Test\r\n\r\n", -1);9 j% ~& w7 q6 p) [7 j& z
// 产生波形
( B; J1 k+ v0 |: ~& D2 R1 k PWM1ABasic(25000,50);
/ ]# k8 s( E5 K" s: R1 a' z* ?( N8 v
! f8 a& f4 k9 I( \! V& q/ C UARTPuts(" C6748 PWM Test Over!\r\n",-1);. m. ^ x6 U* n; V9 A
UARTPuts("------------------------------------------------------------\r\n", -1);
& L" Q- a2 y) J! ~+ y0 h6 m
1 R( c9 @8 F! u! M4 Z3 k4 p, \. I6 i6 @8 M
- W; x) f0 Q' P) a3 J1 d UARTPuts("------------------------------------------------------------\r\n", -1);, z+ J2 \8 M7 y2 Y* J
UARTPuts(" C6748 ECAP Test\r\n", -1);& h, H; O: _9 v
// ECAP 捕获初始化
* b9 _# Q/ e2 i' P ECAPInit();
* Z" s- e4 e- \/ W; w: w) m UARTPuts("Initialize ECAP.......\r\n",-1);
8 f. J( j- r0 G5 B for(i=0;i<5;i++)
* H+ u/ u+ _. c. e# s& O {$ C& _8 `" r# x& Q( F* S
for(j=0x00FFFFFF;j>0;j--); // 延时0 ~3 w( Y7 g2 m8 b2 b
ECAPRead();
$ P* W( S9 k4 W: n$ d* I }/ c, ^1 `) t( G& l
UARTPuts("\r\n",-1);
& F6 D$ U$ {% A1 k UARTPuts(" C6748 ECAP Test Over!\r\n",-1);$ d6 C, d3 [3 t
UARTPuts("------------------------------------------------------------\r\n", -1);
6 y) C# J& j3 [$ k8 D0 W+ F% a
// 主循环
' o- F- [5 u% k( a5 r% P4 _& h for(;;)1 F5 |9 G' s& X; c
{- X' E8 ]0 j. V
/ P. i: P+ L/ ?8 H, @
}
' J* b8 C2 t1 d6 x}
) }) N" B3 ~$ V' v% o) V1 `- c* q
/****************************************************************************/
+ X% G, g) g& L3 o) V+ N- ?/* */
. Q* M4 c' G8 I( ~* `& i/* PSC 初始化 */
6 x- z" C5 \, G/* */
1 N2 `4 C3 b8 |4 Q/****************************************************************************/" ]+ x' a7 ]8 i3 d
void PSCInit(void)
& q4 w ~7 e: ^& \5 Y4 b! }{- T0 g6 {( n3 q6 K; D& ~. U, N
// 使能 EHRPWM 和 ECAP 模块
5 P- @. t! Q$ n1 R1 @2 b // 对相应外设模块的使能也可以在 BootLoader 中完成
: i2 s7 R. v* E. p9 _# h; J PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
2 j8 m; l3 v4 X( n PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);$ X! T8 L0 [- [5 {: F
}
0 P$ e: p4 K" W1 ^5 K
, K) \% h0 J [ [+ b/****************************************************************************/: M; m8 c8 ?* ~" u2 @! ]
/* */0 L3 m- K$ n- F8 z! d
/* GPIO 管脚复用配置 */5 E* c/ F, i: ]+ I9 y: Q
/* */* R9 W8 a# o% C k
/****************************************************************************/- s) C& N0 T. D% b5 V% U/ T+ }
void GPIOBankPinMuxSet(void)- ^7 q: ^2 z& m5 _$ V5 b6 Y
{
# B! q- `6 A) l* |0 o) J+ l* U; v EHRPWM1PinMuxSetup(); v2 D# j6 I+ o; n
( U' u( H$ a0 P! U, A
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)- m0 v0 o3 a% L& d2 r
// 作为捕获功能时管脚方向为输入
2 q' p; m, `/ K. y: i: I // 作为辅助脉宽调制时管脚方向为输出$ o0 p0 k0 K+ X2 z9 }8 A
// ECAP2 / APWM2
& D$ @/ B% R# |: F ECAPPinMuxSetup(2);
) ?3 {$ B1 y X6 b0 k6 F
* @9 D% B0 U3 y2 K: ?* d // ECAP2 / APWM2方向设置为输入- J3 {% s- F' K( Z; x$ Z
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]0 l4 S v! w& x4 L# D
}
1 C: i% G, v8 ^- x3 F9 C6 q5 @9 q0 C# p0 n! f/ Z$ ^' n! J4 K- d
/****************************************************************************/
. |9 f1 t! Y6 i6 N* ~; `7 [ b/* */' ~" `" V6 d, \/ Y- ^7 c9 W' q
/* PWM 输出波形 */4 o) t3 Z0 J( w% @. p( Q( G
/* */
5 k8 @1 L! _% Y8 e9 b/****************************************************************************/
. e3 G9 j0 F, F0 I3 R: lvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)9 U! D3 N/ t: k* s) u, ~
{
}8 r" `5 j% x: N& N8 ]# I/ P- v // 时间基准配置( b# Y1 O: ^7 U; F. k$ X
// 时钟配置
( D" T3 I: R9 x4 H: K' j( @ EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
" e+ J% q' s0 P: U A3 _: j
& ~$ g1 A! l2 H // 配置周期4 U/ `- @2 p( {
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,8 ]$ t9 ]2 e( G
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);* ?2 b) P2 y4 [: d
' e7 `( t. e( T8 V0 t9 C: f/ T // 禁用输入同步信号
$ U1 P% t4 c f* U# ]/ j4 _4 k EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);! x! x- C+ h! j/ q% |1 k1 D
8 h5 a6 T+ h9 {5 k ]
// 禁用输出同步信号* Z q2 p9 I* d9 Q$ O
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
1 C# F$ t- m1 J3 d/ C2 E. ?' ]+ j( h6 f: u, a6 Z
// 仿真(DEBUG)模式行为配置
F3 F$ M( N* O EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);" H) @9 \- K6 T. n9 }
8 [& f+ t* D- I0 T4 k6 \) x // 配置计数比较器子模块5 | Y6 e' x: N9 I& |9 ?9 H$ H
// 加载比较器 A 值
! G% ~! @6 o* G9 Y) |# h) F EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
& R h) A5 z# _ EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);) x% f5 g( W! I* V3 ~ @: ?
* a: _1 K/ E: I" ^3 t // 加载比较器 B 值
, t) Y1 ^/ j) b1 n EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
& j/ N/ A E) r% W7 ]; j; f3 W8 Z EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
3 \- k9 P3 H7 m+ x
% N! s% k; |7 g7 }% t+ | // 功能限定配置(输出引脚触发方式设定); O- b7 G* J2 `: y4 m' ?! j q
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
$ H$ x: r& y& } EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
" Q5 H; ]3 c2 M# n/ ~. h$ f7 p EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
' Q1 P: F. N5 K EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);/ Q3 }) X9 i S
8 {6 i6 l# q% V0 K* I* d1 p: J // 禁用(旁路,信号直接输出到斩波子模块)死区模块
$ a0 H$ W+ v* A& \2 x EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);, ~5 }+ H* ?5 O# d0 V
0 c( U* e. n4 ? // 禁用斩波子模块: A0 O6 P* G2 e2 X r
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
$ `: v. _* T1 A; z4 p ]; X* o3 ^' u8 S8 [" ~+ |6 C1 ~2 m
// 禁用错误控制事件
7 ?+ W5 X8 ` w* M EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
" h/ S$ X0 S: }; P) V; L3 T EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);8 z, e. H: B( |- A9 x, s. D$ Y
) B, }' p) j( j' D) v9 R ? // 事件触发配置
: N. `- O2 C! M$ y // 每三次事件发生产生中断 p3 H- S/ q% z2 T0 j0 p
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
4 M1 N) f0 e+ x // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
# S0 p0 ^% u/ s EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
0 Y8 j/ K1 A: ^" k // 使能中断# N+ C: |5 b5 n0 z7 N2 S
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);5 I2 ^- a) ?4 c3 u5 j
3 A+ z6 B. a9 n4 s // 禁用高精度子模块; [* K" k' X% H( C. l
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
! r5 k* d) c9 _6 b4 y; Q) c6 n# J1 b& G9 L# ~; Y; n
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);3 k9 c" v2 n6 g: H; g# u# P
}
2 \+ |$ j5 ~' y( q4 A8 k0 a, F& a
void ChopperWaveform(void)
! `1 Q) l# T& ^" [6 f! n{
0 r) ?6 y8 Y' w* ^2 i: c8 ` s/ i // 50% 占空比
+ V' ], U* O6 ^8 r: ` EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
" p9 N, L% z! w. |% M( U3 k // 4 分频' A. J( F6 E; Y% D+ _4 X+ A
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);8 E' P: x4 o; \
// 单个脉冲宽度- ?2 j, I0 x: i B7 F
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);/ \( Y7 a6 o+ T: c n$ X1 G
// 使能斩波子模块. q; `% B% k/ C& u. U7 L) H' W
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);1 ] ^ t; X/ \6 T( _0 n- v% M
}
. T, Z% L* H& e0 J. c
) \$ @# K2 l' X2 E% g5 X1 f/****************************************************************************/6 Z5 W& K1 j+ N& u. T
/* */. u8 P. F8 L- t( `
/* PWM 中断初始化 *// S5 d, Q ^) J ^* K* n
/* */
3 d- V5 N& l' M `; ?6 [/****************************************************************************/
5 L% y# f+ O& k/ _: o: fvoid PWMInterruptInit(void): D8 Y# Z, O5 c: V1 I
{
# x0 F! Q5 f. x2 o // 注册中断服务函数
7 h6 Z9 W) [1 @- \3 j! |0 l IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
- {+ e* C+ b0 ?* }2 U IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
$ ~8 B1 Y5 s7 ~) t7 u
m/ K( I, O: f( X // 映射中断& @4 w( h) v7 @
IntChannelSet(SYS_INT_EHRPWM1, 2);5 H4 l3 y) ^: d( S% G! O8 l, j% A/ i7 Y
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);! n3 o1 U9 E( E
% h \% q& m2 v5 U
// 使能中断
. F0 I- x1 F+ t# K% l IntSystemEnable(SYS_INT_EHRPWM1);: R; [2 T6 R. m, g
IntSystemEnable(SYS_INT_EHRPWM1TZ);
7 N6 Y( C3 f. \}& J7 m% P2 D+ I6 I$ H
$ Y4 Q: e$ ?6 x6 v) C$ @$ o. |; q/****************************************************************************/1 }7 A2 s% D7 t) P# _% I
/* */9 R1 H6 x, Q9 x1 R7 ]
/* ARM 中断初始化 */
$ \+ k/ G" p( h7 ?5 n. y6 b/* */
4 {, m! G) d; @9 k( v/****************************************************************************/8 H6 Z9 d& u# q: o4 K+ T2 F, t/ s+ b
void InterruptInit(void)
& U, A; @: |$ d( F- Z' X- o{: Z$ V& s v2 ]# u2 s4 q$ S
// 初始化 ARM 中断控制器
. g2 F" M3 O( y: u" I1 Z6 J, ] IntAINTCInit();- @7 B* b) |9 A0 p5 f, v! H
2 X* |( _( F" q4 I: e# E2 L& [ // 使能 IRQ(CPSR)# u. \% o- r6 |
IntMasterIRQEnable();
9 ?3 [( m4 J D2 \/ G$ G* u" Q- \( z' L1 p
// 使能中断(AINTC GER)& z' a0 X6 ?/ o9 m' X- s/ I) p; N
IntGlobalEnable();+ p6 Z! j: Z+ Y2 W c
! r1 A0 l# x9 T* k( Q3 v
// 使能中断(AINTC HIER) b6 }, k* h% ^7 R) J2 C
IntIRQEnable();# p6 i9 F! P% w' S% T$ W# L* S0 }* z
}
5 ^6 @ B2 |! L4 \( M2 t( T: z9 w K; E
|
|