|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
4 b% t- A) b1 R5 d8 y+ O/ f6 l! I/* */3 l7 P# X1 p: c1 d8 q8 R
/* 宏定义 */1 ? A6 v' G" u- H9 R8 c' ~
/* */
/ \/ C4 E. f5 P8 x+ w' y. A+ n/****************************************************************************/
8 s0 }( b% X) N& @2 d, T+ |// 软件断点
) D( d& b0 ~6 l) E7 i8 X! x5 ?#define SW_BREAKPOINT asm(" SWBP 0 ");
4 n9 K" W: w% M! B3 Z: d$ Y. N9 |: U) {3 E0 F% y
// 时钟分频
2 Q5 X5 E* a, s& Z#define CLOCK_DIV_VAL 228
3 A& b) ^ a. d% q0 j( \, `6 r y ^1 k) h2 a( J/ i
/****************************************************************************/ B7 F( G& `5 D3 L J+ Q# h) d) F
/* */
s, A# `( Q1 A5 {/* 全局变量 */
& Q6 @7 w9 R, k k( O4 x/* */
# o& m1 \. I! ~( u/ F/****************************************************************************/
1 k& C: w, {! S2 YECAPCONTEXT ECAPResult;- W6 Y" z$ V% m& L. }/ V
) ]( e& H+ L! f* a! X
/****************************************************************************/( F% C- p+ a- k# n3 C5 e
/* */4 _8 h& Z8 c* D! e: C
/* 函数声明 */
8 r/ h, A5 w# K0 s0 v+ K# e/* */: ?; T& p* q! K' g
/****************************************************************************/
) H" O- ?( [% W" r. {// 外设使能配置
[) h2 W$ h) D+ @void PSCInit(void);& c3 D; g* P- ]( v/ [: l0 b
' g- Q' a& m7 J* g! i k9 z& D// GPIO 管脚复用配置0 G3 W, ~( W5 J
void GPIOBankPinMuxSet();4 t' {4 e* l% g9 r# U5 h# f
; o/ i% S- h$ a7 \' k, W// 产生波形0 i( K% f# C% f
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);+ c9 ]5 U2 W: Y, k5 ?3 p" `
void ChopperWaveform(void);. `5 G4 J. n: K4 U% G3 S
9 E) H6 r L+ E" r- W3 F* ^% }// ECAP初始化和读函数: p) S8 {7 @7 _ f! @
void ECAPInit(void);: F0 Y5 S4 W+ _+ X7 Z- g- _' q
unsigned int ECAPRead(void);
! d1 | V) f `( Q# y
% D( A8 Q$ y$ U; j& A//ARM 中断初始化
" f* ~; h$ F' o, _void InterruptInit(void);
/ M$ r6 I+ L( }0 K' [, T; q/ u- E6 \: o2 C3 ^; v* r. X7 ~& n
// PWM 中断初始化
# B& f6 h- F, [* j" d% Mvoid PWMInterruptInit(void);
" j' e+ }: F8 v// 中断服务函数
) ]6 z F: r# `8 o6 r# R// PWM 事件
4 d8 A: \) d. a3 J+ zvoid PWMEventIsr(void);
) U% _* m- n* n// PWM 错误控制事件
) y6 _/ b8 |; {void PWMTZIsr(void);
. _( ]" x/ \1 K& t; q5 C) @" @$ W: J! Y
/****************************************************************************/
# m* B' W$ h, Y$ G/* */: w, k6 h; z& t7 c. J9 y3 S
/* 主函数 */$ P4 |4 T5 B0 r3 { V) N
/* */2 Y( S) W" P5 C; W
/****************************************************************************/# @+ _5 J, t4 \8 b
int main(void)! N. d: U: _- l2 x, l
{8 U% ^0 j) |: j' e6 H
// 外设使能配置
4 r& H' V! Y* X( } PSCInit();$ s& S' v- \5 ]! D
7 R0 V. F. N6 g$ r+ s/ q7 V // 初始化串口终端 使用串口2
7 n: a) b& @: x0 o UARTStdioInit();0 n/ A7 l: X- y7 j9 B' G/ ~
8 d# B' {2 ?6 P, ^% M3 t( w
// GPIO 管脚复用配置0 x+ \2 e9 _ w0 K6 L2 @
GPIOBankPinMuxSet();
5 U: A5 G. S4 U5 q% U# |' r$ y7 ~% c
// ARM 中断初始化
1 R) u- {* {+ f. W* A; ` InterruptInit();
, K+ s0 ~' Z+ L2 @7 F
) P& c$ ?* a, H ` M // PWM 中断初始化
8 Z" J; p) r/ x h8 Q9 p2 x PWMInterruptInit();4 x1 q! ]: C5 \2 S5 A( Z0 ^ z
9 N0 r* u5 u3 i) e7 N unsigned char i;
. i- d3 y% b- ~, p4 W* w4 h unsigned int j;
0 D9 ?- y9 I2 ^2 j" \/ f. R: m# S. S G. ~2 ]4 |! Q) d2 e
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);% l9 T# X3 y# j7 |" p0 j' Y9 e L
UARTPuts("------------------------------------------------------------\r\n", -1);8 V7 _- [$ E% w
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);( e6 _3 @6 \$ }- I2 Y4 a
// 产生波形
$ Y% Y+ f& D D; e4 O PWM1ABasic(25000,50);" M: W+ ?' M% _: x# }: e
# X6 m3 o1 i, [& A( H
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
% H0 p9 `! u; a! p1 H UARTPuts("------------------------------------------------------------\r\n", -1);; a* _, j: S& p- S& j* I
/ E$ a( v, i1 T, k
3 }" C2 A8 I* H
0 Z& \' x) @' B5 w- E9 y UARTPuts("------------------------------------------------------------\r\n", -1);
) o/ L- ?' u9 n. u UARTPuts(" C6748 ECAP Test\r\n", -1);
& O9 X, u5 [" l2 E' J // ECAP 捕获初始化( M, K5 L( s; V/ E+ ]
ECAPInit();. s0 {; Z/ g4 z! K4 l9 l
UARTPuts("Initialize ECAP.......\r\n",-1);
( Y+ a% v8 p1 z- _" U- [, @7 v5 y' ~, S for(i=0;i<5;i++)
. G5 J5 y. y0 y {& Z5 K+ u* l) L5 G Z8 X+ ^
for(j=0x00FFFFFF;j>0;j--); // 延时/ W& p; h. P5 p: {! o8 J
ECAPRead();4 H: X3 H' H O/ ~ I0 x
}! M! ^1 k" E4 B6 S, Q9 }
UARTPuts("\r\n",-1);
# R9 @( M# n% U D. y1 K UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
. y: A; W8 Y+ s' H' D& l5 f UARTPuts("------------------------------------------------------------\r\n", -1);, {2 U' ]" R, Q. G, d( ?( O" I
) l' Z. e) T2 ^9 X) k7 x. `
// 主循环
! i, e6 j. B4 w: @6 z for(;;)
[/ h; b/ [1 A. T5 q) u4 R+ s {1 H& j! Z3 I6 v/ z) C- L- F
6 i _' T" }- {0 R. @8 j }& [" F+ R3 V3 O% \' k
}
) B! V, [8 m) f9 z( ?3 L; n) ]% l$ f, _
/****************************************************************************/: X8 |, L! H S8 P1 s: m2 B
/* */
4 a, Z) a; p7 z4 c; B4 Q/* PSC 初始化 */' y# W1 ^1 s+ S# ]6 A
/* */4 z# z: u! M8 O, q. a
/****************************************************************************/: ?/ v) B2 Q$ T: S2 O$ T# T. N
void PSCInit(void)
* n- [; d9 c+ U7 `+ l{- z1 j1 E, e6 D# b$ Y
// 使能 EHRPWM 和 ECAP 模块6 s$ h% V0 V, g( E4 C" r% e
// 对相应外设模块的使能也可以在 BootLoader 中完成, |5 X) N1 Z: o8 c. \- \+ ?& t! Y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);# T/ s- B6 r F J: ?$ I, X' K
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); P2 u t& }/ Z2 q6 |% E
}- r8 A8 s0 @/ z# x- E0 b
/ @/ j; O; V! z0 a4 U/****************************************************************************/: q0 y2 U9 p) F, n& N" t
/* */8 a' e- r6 k( @* r1 E
/* GPIO 管脚复用配置 */
* c1 E ^, z1 m7 t2 d/* */
) p4 j* u8 }+ \9 u1 _" H/****************************************************************************/
& ?0 L4 y% A, X8 k s! r( dvoid GPIOBankPinMuxSet(void)
$ @+ P0 P4 U* {9 W4 W* V' E) P5 c{
9 L7 Y- l( P+ r, t0 _- p EHRPWM1PinMuxSetup();
- n2 o& g$ X1 y- f. K/ I' ]$ ~2 d6 S
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)- S# r) l5 H y
// 作为捕获功能时管脚方向为输入
3 q% _3 N0 x2 d& R! W9 v( N // 作为辅助脉宽调制时管脚方向为输出
( }) n6 |% B; s. g; b7 F // ECAP2 / APWM2; O K; A8 s- Q1 e8 u% [
ECAPPinMuxSetup(2);. E* s- g t# F
6 ?+ o0 V, s) ` // ECAP2 / APWM2方向设置为输入5 K& ? n% E8 t4 v0 C. g8 @8 d6 X
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]6 m! i/ Y0 E4 |5 T8 P
}
& ~3 `( E* c* o) D. Y$ @+ q4 H4 D# o' A# Y; K$ X0 H4 G
/****************************************************************************/
* `& C1 r+ I' \/* */
9 G8 e7 Q$ g4 Z/* PWM 输出波形 */2 H ^% Z, h6 k5 W, z
/* */
/ M9 V0 g6 p+ R! R z/****************************************************************************/
' C9 E* A5 ]! ] _$ Y8 Dvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
N$ Z$ n* H2 a3 I4 c( A' h9 w8 j{
! `6 B; |2 k8 N# \2 y' m4 A // 时间基准配置
- S/ L! o6 p) ^ // 时钟配置
% p3 H! V- G& K EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
" ?/ M$ |3 Z/ E5 c, M7 Y8 ]
" {( a( R, q" T! L8 i/ s3 b9 l // 配置周期
& C6 j8 ~/ l- F$ [: a EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
1 M$ M* V# U' p5 x pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);+ y9 |- Y4 e: D7 a
* [! d' E. N6 Y. \ // 禁用输入同步信号$ B) o t; Y+ W4 v4 B' o
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
" A: G3 s. l+ N) J
1 @* j7 |/ ^0 \/ T4 n9 h/ u // 禁用输出同步信号3 x9 q7 W1 U& O- D7 U/ ^( m5 R6 m
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);. f( h4 K& S- R/ K
3 X+ y8 h/ l$ O$ ?/ s0 d // 仿真(DEBUG)模式行为配置4 M$ X6 [! k! p! _# a
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
' u$ e; o1 D% @. ~& F9 U5 p2 q' e- M( U' _7 u0 s
// 配置计数比较器子模块) D0 _6 R6 S% j- B9 F) }. u- X
// 加载比较器 A 值
4 Y8 d7 h" I7 k' |8 v EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,' Z$ I# t# M$ _) B+ A- s
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
& O! ]: _: X% {& V9 n0 N% @3 v: P2 e% A- `) I4 p
// 加载比较器 B 值4 q" X+ [: }+ h/ Q; U3 ?
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
% h% P6 F+ o4 C EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);4 m ?# _: ~; M6 r
0 L8 G S- _# D3 y // 功能限定配置(输出引脚触发方式设定)
3 v# I& q8 D8 W // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出- {8 T* J8 n, g6 ]' I4 j
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING," g( q0 r# B* m: v' f
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
% R7 N- _2 Q1 h# r EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
$ A# z/ F6 B( F& Q
. k) h: P- {9 N // 禁用(旁路,信号直接输出到斩波子模块)死区模块; a$ b n8 D' v d2 g- j+ N1 G
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
2 E& ?, h B2 R- x4 M5 R0 w) q! \8 q9 D) [ x" ~
// 禁用斩波子模块4 a& E1 H9 ]/ I+ D. |
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
9 z2 Y; z e# A1 k3 |
% \. E, U$ d: \$ z7 D // 禁用错误控制事件
' y* u3 f8 D% {2 Z9 G& I EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);, p! N& F4 }9 S" I6 u. a5 a
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);% R3 i! N3 ^% O/ l! q
* g$ R' b4 z; e6 E5 j1 c+ W9 {' N
// 事件触发配置8 V1 Y. T/ f( f x$ Q
// 每三次事件发生产生中断
0 K& t) E; c- J6 o+ d& n6 P EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
# A: L7 Y4 ` F" ]3 m, g. y // 时间基准计数等于有效计数比较寄存器 B 值 产生事件. {( h+ ^' c' b2 O! A
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
1 a+ y; `0 b4 G$ N" Q // 使能中断
5 F1 `/ v( b( w EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);3 X4 @5 E) g4 ^6 r5 {
. X1 t* b" H) w# \5 b // 禁用高精度子模块2 h! K+ `0 _; G2 h9 s1 D
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);3 f5 O1 g3 G# F& S
; Y2 t7 Q- Y; p8 Z$ _ UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);( H7 C) O! C8 b3 g& Z
}/ F/ s( x; \9 L0 o9 M2 s
% G q9 Y; a Y; s# P
void ChopperWaveform(void)
6 J, o( Y& y' q' B{( o3 f3 B$ \+ Z& U7 _& s% \
// 50% 占空比
8 V6 W) Z4 k$ S, J: s+ S9 a; B EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);# {9 U9 e3 g+ {/ W% A! E
// 4 分频
5 o8 d+ J {4 P9 X1 n! m; \5 Z8 N6 b EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
! z$ S# Y- c, S0 ^$ f' t1 e // 单个脉冲宽度- F/ b* u( q: F$ _
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
% Q2 N& w! _4 G- X# x$ C // 使能斩波子模块
. v+ z. B, Q: d. o EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);5 x* A- u& f$ z0 t1 G
}2 k' B4 Q" n; E6 a
$ e" s4 Y5 S9 Y2 C+ G8 `$ U
/****************************************************************************/% i/ J5 l P8 ?. o" b( D. u F
/* */- { J7 o( F5 R3 h3 E# B# G; z
/* PWM 中断初始化 */
, q0 L, E/ I) K4 [7 _8 @* n/* */% V1 ]0 Y, V) ^- f: L% F, B
/****************************************************************************/
/ E# }) n+ z! n% ^' r+ x6 i ivoid PWMInterruptInit(void)0 S" c9 O* t& W% u' Z8 Q
{
4 C2 f1 V5 p) h; G9 D // 注册中断服务函数
z; C% e! x2 q5 ^7 C" U& I$ h2 d, r IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);4 A! z# w3 D6 @5 @
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
1 P) R5 g- w+ z% ~/ C0 G6 `0 @4 k
7 a$ J. C3 S# f // 映射中断
D- p; N9 c B! C: ~* w! ? IntChannelSet(SYS_INT_EHRPWM1, 2);1 `9 Z6 P) J) i) v! q4 h
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);* t* u. B2 J5 e4 s0 f
* O) s: s. Y* h( J8 J: D9 l* R* y# g
// 使能中断
8 H' @4 x" Z3 y u8 j) U( T. ~ IntSystemEnable(SYS_INT_EHRPWM1);$ C! A2 R2 P% b \, B7 o f
IntSystemEnable(SYS_INT_EHRPWM1TZ);" F& C0 h G* R1 h& V0 u
} R5 S0 D) _3 q6 |! b
6 G' R# U* E3 x8 p% k* T0 B
/****************************************************************************/
9 Y2 _( P$ o) p# g0 ?/* */ \& F1 W, I2 F' E. r2 B' {! K
/* ARM 中断初始化 */ A* U$ M& r2 E( j
/* */
4 c. `0 W% f/ F d- I/****************************************************************************/+ B8 p+ P" Q! p0 d
void InterruptInit(void)
9 ~$ E, z" d# f8 X{
& \) |& h9 U$ ?% R! c9 @4 C // 初始化 ARM 中断控制器
2 }- ]. q$ J% _0 i) r* l: r IntAINTCInit();: k. _& ?( A5 U( G
# D/ U7 r0 k5 b4 x
// 使能 IRQ(CPSR)
5 D! J9 {' l6 W IntMasterIRQEnable();! G$ V2 p8 @ Y' v$ A& e. N# A1 G
! o+ w6 w. ^) k9 T- @( U/ u ]
// 使能中断(AINTC GER)
, X$ ?- ?' ]! n" ]4 t" h IntGlobalEnable();1 W/ h y& K7 f# O
) z1 x- @/ p# g7 t5 g
// 使能中断(AINTC HIER)
2 i4 ~! o8 U" m IntIRQEnable();
* e+ N' m; b& U2 Q}) n9 S9 l) J0 p4 h% D/ c
. m; ~) @. K& \3 y |
|