|
/****************************************************************************/
3 d6 |# u/ @4 E. s/* */
- W- }- `: z8 e' C% [; R8 V' d$ K/* 宏定义 */( n5 o" ^6 J" O& p! N
/* */ m e+ A' e+ ?9 c9 \
/****************************************************************************/
' I$ s+ I6 v- l4 b2 [: F+ q// 软件断点
) j# x& H( [5 A4 P6 P- n$ M R#define SW_BREAKPOINT asm(" SWBP 0 ");+ b0 N }5 O# X/ H% c3 l
- t7 B. T# z5 U7 E! W. i// 时钟分频" U9 X2 i. h" D2 P( ?
#define CLOCK_DIV_VAL 228 x6 C# B( Y4 |' u3 b/ |/ `
. a' o0 ~- M B9 [) J3 G2 x
/****************************************************************************/
% x( Q) F1 M4 F5 ~. W/* */* y: { E& Q( B
/* 全局变量 */- K# ~. \0 _* U8 ]1 c' |+ _, ]0 m
/* */
6 h" _# F% I ^3 d- k% I- _/****************************************************************************/
! ^: [8 F+ O& U: T1 nECAPCONTEXT ECAPResult;
* u2 a3 i" f' F% P5 ] k* }1 {; ^$ w) L: t4 L
/****************************************************************************/
/ I1 T, |; [# y; H/* */1 R+ ^+ s6 C3 E% |9 e. Y
/* 函数声明 */
. o- q1 \# r9 f9 S# S" k* ^/* */
2 {/ v+ R! |0 z* _2 h" f/****************************************************************************/# A: y2 u+ b2 [2 Q, r
// 外设使能配置
0 [" i" w9 Q. l( |- E3 Gvoid PSCInit(void);& V3 p: {- W! L- c# P0 l( P) G
8 Z) O. V7 y) A# ^; L2 p3 M8 }
// GPIO 管脚复用配置- N! u+ v+ j$ r) i5 t0 y. I
void GPIOBankPinMuxSet();
: U3 e( I3 m7 Y) L2 t
) ?8 F+ K1 @+ o* g5 Q" T4 s4 G$ ]$ S// 产生波形4 Y _1 M o9 F6 x5 ?; D& b9 c
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);7 x1 s3 J4 {# [, Q
void ChopperWaveform(void);
( Q$ \* B5 W( X' C) K! e/ O# A! X
// ECAP初始化和读函数# b) w D9 j' I' _8 \
void ECAPInit(void);, c0 _; m$ U+ v X
unsigned int ECAPRead(void);! i% R: z0 q" J, p o+ u
. B+ _4 F( @+ k5 o8 l/ [6 I
//ARM 中断初始化: j C4 k' h. _/ G) T+ v
void InterruptInit(void);, C4 O& u( t+ f
% o5 I* p0 C/ B/ v// PWM 中断初始化" o! A0 r' V/ K1 R( v) }
void PWMInterruptInit(void);, O3 s- J" P! `, d& \
// 中断服务函数
9 ?% n3 ~4 E$ O2 J3 F* m% u// PWM 事件
7 A+ j5 D3 G3 O9 d5 D% k! c! P' Hvoid PWMEventIsr(void);/ _3 i* P5 T0 B& n" X) s! r
// PWM 错误控制事件
5 L. C! E) |# b6 b: j( Y9 o) G* I+ avoid PWMTZIsr(void);
# D$ K Q, A0 R) t2 D& |8 x6 Q/ X% `
/****************************************************************************/4 ~: p, z! D* O, }, l
/* */
( m! e5 a$ ~% b; P" H+ S/* 主函数 */
! h3 u) w- ~ L8 v) E2 }/* */4 C3 A, e* G* q$ s$ ~, A+ }3 D+ j
/****************************************************************************/6 s& E2 |' E0 ~+ G& l4 [
int main(void). l) V+ L% `* g K. D- i3 K |
{$ o4 i6 ^3 M% b3 Z, Z. I
// 外设使能配置. I6 c7 d; H( U" D
PSCInit();; ?9 G! Z8 i( S5 ?% u
0 J* b% W1 c A1 U' \% E6 Z
// 初始化串口终端 使用串口2- C& [4 @" K% H0 Q
UARTStdioInit();
) l: d6 l% N% P/ u9 K
5 ~1 R& l$ ~( C$ \5 [6 s3 c // GPIO 管脚复用配置0 G- m4 \4 X& w7 ?- {
GPIOBankPinMuxSet();1 K2 b7 h9 @! [
% }+ K2 j4 O/ ]8 c1 \6 F // ARM 中断初始化0 }4 R% ^+ g- n* `
InterruptInit();' s( R4 w+ E; A) _# B
# g; y2 ^& T9 I
// PWM 中断初始化% H0 ~; j4 u' w3 i I; F
PWMInterruptInit();9 M g3 {. T1 B( T
/ g+ S6 ]' l/ N6 Z& Q
unsigned char i;
. T0 L5 w6 x" N8 i/ V. S unsigned int j;
, |# t- v+ r" A2 F" T" R
, C4 x( n) R6 a0 B/ I+ f UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
' {' u" @, d+ A1 B3 j UARTPuts("------------------------------------------------------------\r\n", -1);( l) {: i% L3 g' C. D# E, A
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
, G* S: J# K6 y- ~" T+ x+ D // 产生波形
* q7 p) H# [6 v! Q$ u% R+ y PWM1ABasic(25000,50);
; B5 L2 P! k% P& w
% r+ S6 L$ ^( j( C UARTPuts(" C6748 PWM Test Over!\r\n",-1);
3 |3 K- e0 g" e0 w6 | UARTPuts("------------------------------------------------------------\r\n", -1);7 M- p' H" M$ e
]/ a9 i' B9 r) r' x
4 t9 ~) i. s1 c, ~ Y+ A% Y- u# m
; ]' a% U# r; T UARTPuts("------------------------------------------------------------\r\n", -1);( e. s v. p0 U9 K3 D- I; l% c
UARTPuts(" C6748 ECAP Test\r\n", -1);. m4 a+ c1 d/ Z0 [- |, B' l
// ECAP 捕获初始化* d8 I" ]3 u4 \
ECAPInit();
3 r& h2 Q* g( W UARTPuts("Initialize ECAP.......\r\n",-1);
9 y2 U! W" j9 w6 ?. a6 \9 `3 D for(i=0;i<5;i++). o* S8 L# `+ {
{" s6 R( v9 N' [
for(j=0x00FFFFFF;j>0;j--); // 延时
7 e0 r0 z) d3 F1 m1 ]9 {5 X, Z ECAPRead();- B) U# K! }1 C! h( N
}" s( n w' b2 S, O
UARTPuts("\r\n",-1);
- {& L; n0 ]& m5 m0 B UARTPuts(" C6748 ECAP Test Over!\r\n",-1);4 Y- Y2 K* K( |( U6 n
UARTPuts("------------------------------------------------------------\r\n", -1);6 x+ Y5 j S- w( O: W
6 {$ G8 m8 K& L% V2 n) L // 主循环$ Q; j" J6 M: k/ ], N4 d
for(;;)7 M2 d4 C# @, c, s9 d
{
: h! q \$ u/ `0 q$ F0 b1 W. N( C
}
! A8 c1 E# P6 d1 o9 E: }}
5 i4 a6 b' o; w- V
: a) |( u! N1 p* m' z( l/****************************************************************************/( P8 Y0 l h6 r! W3 P
/* */1 t# L* _: Z1 K1 t; s1 x8 X* ?
/* PSC 初始化 */( |% G1 Y& O8 Y, _( z
/* */: ~, C& }9 A1 u) W# K/ I
/****************************************************************************/; G. [3 k) I) Q! R6 L* ^
void PSCInit(void)
! @' l# v L( j+ z: c0 |# I2 [9 c{; N9 N% X% P ]
// 使能 EHRPWM 和 ECAP 模块% q+ `% U! R" q
// 对相应外设模块的使能也可以在 BootLoader 中完成! ]: ]0 ~% M9 W, [: H& J, D7 c
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
9 P6 Z9 O% M, \ q" a PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 j4 K U' i# N& N- m* I}
4 @) l- h% }) g( a! D7 N5 j0 \1 G3 l. ~* `7 r$ D. K1 q8 i' m
/****************************************************************************/
" E) B) M8 |1 P$ h/* */6 V; F5 d4 m6 v/ c
/* GPIO 管脚复用配置 */& y% L* p% g3 L3 V a ]
/* */
0 U* E2 X$ i" }4 [! d' F/****************************************************************************/
: w) p. B3 W- o9 Z! D/ b( wvoid GPIOBankPinMuxSet(void)
9 k" p* _6 u J0 Q# ~* n9 R" }{
" d* W' V2 _5 y" z0 E, Z EHRPWM1PinMuxSetup();& E3 h/ u% ^& d9 b$ l w6 h; _
/ U" {5 A% E2 V4 D) U0 [; A* X
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP) L6 U; s% I3 y. Y) g& c m
// 作为捕获功能时管脚方向为输入! s& f: h0 z" I- E. ?1 e
// 作为辅助脉宽调制时管脚方向为输出
8 k& f* m( E6 o8 X // ECAP2 / APWM2 u% \9 {6 v0 k
ECAPPinMuxSetup(2);9 t% W* K5 E {5 g
+ K8 ]: N5 g3 g7 N+ ~+ M; \- H
// ECAP2 / APWM2方向设置为输入
- j0 z# p0 S- P& Z2 r! c GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]8 n/ E# [' r8 A, t5 ~
}
* n9 ]& J, K0 y% u' _3 L4 \( `5 y: Q/ j% W
/****************************************************************************/
$ Z9 B* p% \. D/* */
! N! `/ u" e8 Y) k3 M. b+ L/ ^% ~- v/* PWM 输出波形 */
1 r) L& C ^) J0 Z% F; B% T/* */, q3 [$ Y' N0 [* P8 j) b
/****************************************************************************/) l/ {+ g$ N5 W0 D7 u& H2 z1 }
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
$ h$ ^' ^7 [0 A& S) ^. E8 O{# {1 A2 t, q; g6 n8 \
// 时间基准配置0 e% s) V: n- B. z! w3 O; k4 i
// 时钟配置
# ~, M( R' q& ^" x8 d5 n- S EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
( _+ n/ r. o+ b( e
% P- j" W/ s i/ P- M& X5 i& i f/ G // 配置周期
+ c$ `. S/ G* ?( `" s EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
! t- ~' P7 T1 \( } pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);$ U" B1 Q2 E: b( S q
; r- \. j/ D F6 [1 ?0 E
// 禁用输入同步信号# P1 z/ k. B4 E; H
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
! s$ y. F, E! |2 F/ Y
8 |0 m2 N ~0 x/ ~9 l4 ] // 禁用输出同步信号4 {, ?, k4 M8 z& k: ?6 [
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);2 t( D$ Z/ M) S( q
3 C/ } q. e' V- W
// 仿真(DEBUG)模式行为配置: M% y5 E5 g# t
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);$ n; g. s* H% G
; q1 }9 V4 l" Y // 配置计数比较器子模块
& T8 K. d S4 F- ~ // 加载比较器 A 值' c* w5 U# O% C2 O* `+ F8 ~' R
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
- R; h$ g0 w2 E4 D) l EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);$ Q' W5 T' u$ B* b0 p4 a
' @ Q( d" b, m/ _/ d
// 加载比较器 B 值
, L+ I" r" z) `4 u0 Z1 \' u M EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE," ]4 N# h9 ?, K
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
# i$ ^- O: o/ H$ v! k& R# A8 m4 W& h3 D. e9 Y, Y
// 功能限定配置(输出引脚触发方式设定)7 e4 W O, D0 e% o$ f: S9 {) I
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
& k8 \' G7 S. J# W0 i& Z EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,) a" s5 q- N# h; [+ T. d
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
2 r3 G9 Y' K. c: U. X! x EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);$ K$ m3 q! i4 X2 _7 l0 o' g
& Q1 R- K% }3 j/ P2 X ^
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
b! {4 @, b+ d& k1 P. g EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);" h- w. j4 b4 p7 m$ }! `4 i
& |6 W! ^/ A5 P/ z. B/ |" @5 k // 禁用斩波子模块. [4 g3 ? _( M; w
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
5 y- x' P! u0 L; c) Q: F0 v: a2 k! G5 i. i2 P& b4 u: O3 x4 i% L
// 禁用错误控制事件
* k, y7 }3 s+ w' s5 Y. G# v EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);0 y* `$ x9 `" M6 O2 R* Z
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
0 q S2 k9 M! M" E3 w) T" y) U
( X) ~3 T% U& _- t4 L // 事件触发配置1 Q P- T& e1 a* w, Z. O4 t
// 每三次事件发生产生中断6 ^1 j; ]5 m$ |& F3 n7 l
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);/ B# x- ^2 x: u
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件6 h, r( H) ?9 f- n! o
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
* S- t2 E/ r- V0 T0 `3 |6 ~ // 使能中断0 A" M+ E* K+ ~4 T
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
7 c( o# C+ m L5 J9 z9 e* {$ c% ~ v9 E& L
// 禁用高精度子模块
5 h. S5 w. M, n& G' u( y EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
2 j1 q* H, ?- @5 [8 w
/ j' v+ q2 c' ]0 J6 w; q f* A1 j UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);0 b9 k+ B% l% O% S! `7 _! x. M' ?
}
' X: _4 \' X- D# ^. r
3 o& C' x L& |7 {) D4 ]5 Evoid ChopperWaveform(void)+ D- d& I4 F! u3 [8 R0 a
{
1 K; r2 v. i7 c$ P3 c& R4 ` // 50% 占空比
3 N* U8 I+ `! K5 C EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
9 @/ E) z7 V5 A% z& C* m // 4 分频
' @, F! p& I8 ?* ~ EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
5 R% i/ d0 I2 v7 n2 s% L // 单个脉冲宽度1 I. t: b# ~" P3 z! j: _) }9 D
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF); ?& f \0 u. \3 N: \
// 使能斩波子模块
9 p4 J2 F/ f: b9 F2 W EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
# k+ O& z" G( W, Q$ i* f4 D}5 b( T, f- r2 J8 q
0 R y' E6 l1 Y( A* y/****************************************************************************/
$ {% C( I. ^8 X( i' v' p$ E& ?/* */
) o4 ^: a8 y* y) ]7 }/* PWM 中断初始化 */
7 X+ m( ~+ s v6 _. V0 H+ O/* */
/ [7 h8 ]- |( m' \8 j Z* o0 k/****************************************************************************/( s+ `9 P9 x& o: C3 E9 w! L4 n
void PWMInterruptInit(void)) o; u/ Y8 I- j* ~# w8 }) x8 W- ]
{* \, R4 F, q+ P- V: X
// 注册中断服务函数2 c' ]2 v$ u# o! Z
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr); f; [ a8 G$ R
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
# b- M: V3 a" _* X+ L4 O& ~5 s; w4 N
// 映射中断
' Y0 ~& O! m- K0 H9 t IntChannelSet(SYS_INT_EHRPWM1, 2);
* ^# g* u4 h* i+ X8 Q& k. y IntChannelSet(SYS_INT_EHRPWM1TZ, 3);1 v. y- t; Z+ l8 v/ n/ E+ i8 v3 @
$ _) K$ f+ Y0 `, u- [! }* S // 使能中断5 R5 p; Q1 s( ~& S/ ?( m' a
IntSystemEnable(SYS_INT_EHRPWM1);4 {3 [! X: ?0 g
IntSystemEnable(SYS_INT_EHRPWM1TZ);) i% [, d$ |: l) E1 w% n: V5 W
}# q) Z: u& W$ j. x9 w
! B C7 @ p6 n& E- X
/****************************************************************************/
$ ]! Y4 r( k) P e4 y+ Z) @ F0 H/* *// o$ j* c# h7 X6 p$ ~" h
/* ARM 中断初始化 */
! e: |) w8 a4 [' f. O# g* t; ~/* */! }& x. g, g, c% g6 a/ [
/****************************************************************************/2 Z$ s# A. L9 @# Y# Z
void InterruptInit(void)
' {9 r0 N$ e; D6 J1 J( @{
3 [9 k9 l1 ~, O // 初始化 ARM 中断控制器
+ S0 @( z3 V2 R' J: H( t1 | IntAINTCInit();
4 l) N; i/ @' a) V) A% W, d8 U. M3 E
// 使能 IRQ(CPSR) a' _/ V- ^1 J0 K( j
IntMasterIRQEnable();( L& h* m9 s( C' w& g
6 \6 y, r+ ]# R3 A: d
// 使能中断(AINTC GER)# | K x! X2 A1 X3 D8 n5 G
IntGlobalEnable();0 Y) W9 `: }) M% V- y" P% [
8 C6 |( A$ r8 P3 L& K
// 使能中断(AINTC HIER)9 W/ C/ k" l1 |2 n! ~1 ~) m
IntIRQEnable();
" u) r7 L' ~4 R- |& s}
: s& f7 ] ?7 V K: n
+ N: Z, l2 b: `% U5 H' ?+ R& s |
|