|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/1 \8 f% @; ?- s7 p: k; V
/* */
0 ~9 [$ [& o/ j/ r4 T4 m9 H: j0 x3 R/* 宏定义 */& f2 B# m; E/ x
/* */
/ T" f5 z8 E+ G- l! b" }8 |( C/****************************************************************************/( D6 u2 S, U! t6 X' @
// 软件断点
% z1 Q5 [) u |" A- A9 U#define SW_BREAKPOINT asm(" SWBP 0 ");# L) _: ^* Y6 t8 Q
/ l" g5 e( Z" N0 e' K/ _& i// 时钟分频
) I& L- [* X9 J7 I#define CLOCK_DIV_VAL 228
8 k2 g$ M. A8 r: C$ H' [9 D+ K( \' W) j( f
/****************************************************************************/6 C) g6 G( t2 [6 B* A4 S
/* */4 x# n) u8 s/ [2 Q b1 ?
/* 全局变量 */
, y+ @; b6 W C5 Z) O/* */9 _$ W6 _0 @5 f9 R
/****************************************************************************/
$ f( o' [8 W5 H$ sECAPCONTEXT ECAPResult;
" f9 A; j! G: X$ M9 ~: \, B
) q" m7 y W) }0 W/****************************************************************************/* u1 ?* G, ?/ P& C8 z7 e1 ]" w) }
/* *// t5 t, r0 e8 O; p
/* 函数声明 */5 t4 Y/ j, O/ W2 K% E' |
/* */
K+ D% W& h# \. u1 ^) S/****************************************************************************/
2 |- m" |3 F" g// 外设使能配置
0 c5 V! |, C5 D# d4 ^( rvoid PSCInit(void);! Q% t4 e; X) I: T( Q _
: J5 w' p. R6 G// GPIO 管脚复用配置
1 B5 x' G0 Y" ]; \3 V8 svoid GPIOBankPinMuxSet();
/ y+ x* o8 I9 A& I! w! j! K' U2 o1 D
// 产生波形
2 y* W+ q$ _' A7 c! Evoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);4 B# d e R" z1 @4 A# q
void ChopperWaveform(void);3 i0 a8 G4 l1 S1 p
( y4 W" W: Y! \, V7 [
// ECAP初始化和读函数. d! D0 B$ J, t) V- g
void ECAPInit(void);+ e2 E- x% E+ o
unsigned int ECAPRead(void);
" w: l2 t4 e; D4 ^2 `: \# z& @' {
//ARM 中断初始化
- d; M3 q. t4 G: l+ ovoid InterruptInit(void);
( o8 a2 c+ z. e/ [& S( b& S0 x6 Q# A" t6 k O
// PWM 中断初始化
& C. O) N/ P( F2 j# ~$ Y1 j& Ivoid PWMInterruptInit(void);- z. i4 [9 i. T% [8 d
// 中断服务函数1 t6 X# r9 r& M$ [
// PWM 事件: ?& q8 V- o8 _" _( v
void PWMEventIsr(void);( j( l3 q4 {& v0 m b
// PWM 错误控制事件
# ~, m3 B3 e( |3 Z7 q8 y+ @) E1 kvoid PWMTZIsr(void);
u- I9 Y9 w/ r. X* Q1 F1 `! W) X
/****************************************************************************/
: i; s$ ~) K& R3 J4 _. {+ H/* */
' y4 t: F0 H2 v, q( p1 ~/* 主函数 */
$ n/ V2 b7 @9 f0 ?5 M, L/* */3 h9 G. v7 L: m. L- R( T
/****************************************************************************/! u: j+ X' y% Z7 a4 q* C
int main(void)
# F* h5 p( X" O- t# S0 j{
" I5 q3 ]; h* W! |; t // 外设使能配置
% W; `: P$ `" d6 \/ i+ @" o1 ?3 A PSCInit();- c- B3 m7 Q, j2 \4 }
6 G& F) r* ^) `# W: b" z+ z // 初始化串口终端 使用串口22 O/ N: a! ^, {' K1 e# x3 g
UARTStdioInit();+ v4 N# B# a; [3 [9 R
; B8 G! y: |0 O0 ]3 ] // GPIO 管脚复用配置7 Q" ^; A9 r* L, m
GPIOBankPinMuxSet();
5 i$ I9 M+ F6 K" W1 `& X
8 z" c; G9 A& ]+ g9 z9 y // ARM 中断初始化
2 i$ ?, F8 L' u& |- P" x InterruptInit();' R) U \/ B3 L9 h. ?# J
* z0 w8 Q9 F# R1 E" v' D2 X% }; w // PWM 中断初始化$ q2 J! R! \* n: X; x5 Y& h" ]
PWMInterruptInit();: ]- i! C0 C R2 A& \( v# k0 X
' J. h0 x4 `" u7 N" Y; k
unsigned char i;9 C- X- j# ?: U5 Z
unsigned int j;5 h9 w! f1 n* s9 S
' r) k/ _; j0 z' z: Q7 a, [. H UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
6 R' Y, `0 M+ v$ s UARTPuts("------------------------------------------------------------\r\n", -1);
7 ]+ {! u# v) {% y. U$ O& f UARTPuts(" C6748 PWM Test\r\n\r\n", -1);1 ]9 L# \0 I: L @
// 产生波形- h- Z" h1 i5 V& s8 L
PWM1ABasic(25000,50);
8 i2 C' s: F8 X! U
) l4 k) `0 U$ [! g1 k9 V UARTPuts(" C6748 PWM Test Over!\r\n",-1);2 P9 A2 p) O! |
UARTPuts("------------------------------------------------------------\r\n", -1);, T# P1 U! q0 o$ u4 f5 ~: ^
+ x+ {( L8 Y( b0 x; x( T9 u3 Q n. s3 N
" A" t; [2 {+ p' C. n S
UARTPuts("------------------------------------------------------------\r\n", -1);
" ]. Q" p! U. K8 P; n UARTPuts(" C6748 ECAP Test\r\n", -1);- D7 ]' ^. O% z& F
// ECAP 捕获初始化
! A$ x4 ^9 s$ g# w2 F ECAPInit();& Z1 F0 D; }7 b/ C, c. ?" s
UARTPuts("Initialize ECAP.......\r\n",-1);. l# f8 L+ N1 G' g$ ]9 v1 N
for(i=0;i<5;i++)) [- a3 L) j; A) r2 H% z
{
- \& b: X) L" |& M for(j=0x00FFFFFF;j>0;j--); // 延时" q `) K+ K: O0 J. X7 V
ECAPRead();4 @5 w! w% a8 r$ b& r" a+ \+ t* h
}
- e; c2 y! f: c; b' L" J UARTPuts("\r\n",-1);' K6 Z5 [. m1 r w* d
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);6 J. v) b G/ {2 ?- Y3 k1 R) P
UARTPuts("------------------------------------------------------------\r\n", -1);2 B) l0 | \/ V6 j! M
7 k! d+ C: T# a7 S9 h+ s! H // 主循环
9 y& x3 d( }* e: o3 B for(;;)
4 ^9 e1 B$ J) x, e {5 L# W) y+ r9 y# Z" @+ C
7 I9 q+ J: ?4 \( G! A. h- a* S+ m
}
+ t. U) K* l5 F- v j}) c$ ^! ]" B5 H) W; p& H
; \" y$ @5 V2 C* p/****************************************************************************/! T6 ? F4 Y d9 Z4 K# P
/* */
; ~, B, d6 ?* I! T0 j/* PSC 初始化 */
& s/ j; t M# d# S( L$ C; E; W" d/* */- ?" d5 a+ d6 c+ ]
/****************************************************************************/( s: F# y- g/ y
void PSCInit(void)
6 n+ k/ A5 E$ \4 W. n# g{1 s+ e0 w. j' b# D) n
// 使能 EHRPWM 和 ECAP 模块. ^& e6 @2 i+ v3 t2 D: U8 T9 f9 I
// 对相应外设模块的使能也可以在 BootLoader 中完成
( p5 |, @$ G$ l; A3 M$ w PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);" @8 G, E6 C* W* T
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 W7 _' j0 w6 D' w' K0 |9 R) b2 B}6 ?2 @4 R& m7 r/ @
1 p9 W9 ?, O& G/ ~ A/****************************************************************************/- x$ E) p) {6 F" D z$ c; B* ~" o
/* */
' c7 T- I" v. R& w/ f5 q/* GPIO 管脚复用配置 */
2 p, t* N# C3 E8 f: R0 p8 l/* */5 k' M) \2 j0 Y( |/ }
/****************************************************************************/
C4 u% Y* m* A1 Z: Z4 s# `. B/ xvoid GPIOBankPinMuxSet(void)
7 ~6 {% Q- `8 o{! l: a. Y3 F; l+ [) `
EHRPWM1PinMuxSetup();1 L9 e' ^/ a* m$ Y5 y; F
6 D( U% w: V8 y" _) y, g6 G // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)/ z( e9 M5 S/ K2 n' z* [7 o8 W/ A( A* ]
// 作为捕获功能时管脚方向为输入
" l/ C" j8 }5 j% {0 A. @ // 作为辅助脉宽调制时管脚方向为输出# m3 Z" C; W1 Z' Q% K
// ECAP2 / APWM2
9 C. W9 m4 A/ G+ I, j! w; Z ECAPPinMuxSetup(2);
! R5 U% P0 _% N3 {- Y2 P) N8 i2 s/ v& u
// ECAP2 / APWM2方向设置为输入
' i2 l0 f: G K8 c0 N GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
: ?' y* h% S/ e6 `! ], z" R0 W}
: Z# [/ P! j! Q5 @ W. v: s% V7 _0 R2 _, y ?/ l v" g
/****************************************************************************/
6 J' E0 p( J7 M, ?/* */+ l9 p# o, a5 d, E2 B7 i. @* S
/* PWM 输出波形 */
; K. o+ @$ L4 \+ W) G/* */0 A0 c% q' f5 F' O
/****************************************************************************/$ A3 D% h4 b5 P1 p# b& F
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)% K; f& G g/ J- V
{" d$ Q8 K3 u, P! J2 ^ m
// 时间基准配置8 \( E5 [* {- F4 Y( M8 `0 `: X1 J* m
// 时钟配置0 ~5 I% e1 `3 h8 ^: B' P2 O
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);# M; J8 O! w* [* |
. B% z" t4 G% M+ @. ]$ e p // 配置周期7 R/ l9 |, z3 Z/ N7 |
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
" \8 f9 y7 ?# C; ~5 \& B q& X pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);: U1 n7 F" g3 ^$ q/ F3 i
% q- `4 F& u- Z // 禁用输入同步信号
0 H) P! v) X* ?* t2 R( Z EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
, a) I% t6 h0 g4 E
3 p1 S; K6 V8 R9 w* c // 禁用输出同步信号) H' p* D) {- b) [, O
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
; r0 Z+ d2 L& B$ F; g! V. ?0 g: l6 `
// 仿真(DEBUG)模式行为配置, i& w& E. k3 x2 e4 w1 x H
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);! l! d# |* A2 ?5 g8 b
" f9 C# q! w7 |1 g# r% y9 I // 配置计数比较器子模块2 G( ]1 M2 K' g7 M4 X
// 加载比较器 A 值0 m, ?/ h r5 ]8 r: t4 o' @
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
( `2 `4 Z+ E" F g EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
& l; D. [8 M9 @) z8 b
( ~) J6 g6 g: u. c3 V2 ? // 加载比较器 B 值
9 j: Y a# [ G: W" V1 m EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
+ A. A0 `0 v4 d* _. p* x EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
6 }9 z- }. R! a5 H( h& W1 u6 ~- E# @3 f5 G5 w
// 功能限定配置(输出引脚触发方式设定)
" z' I% r8 h$ A J$ r% q // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出1 C0 j( S- X, l
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
: H; Q% y! n1 x. B& h EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
5 O, \( [4 J# P EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);' \" \. j( C$ x1 ^0 e# `; J
# n* u; V" Q1 G: F4 C# O // 禁用(旁路,信号直接输出到斩波子模块)死区模块/ X$ A; _4 [3 g: O, S& D
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);4 p$ ]: g0 Q! p: y) ]; n
( y7 @/ L- r( Y: Z$ F1 I
// 禁用斩波子模块
2 I/ A m7 K: K0 }9 m" ~0 `. | EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);5 Q A3 X) w1 c2 h
+ C* N: l% R+ l& x* X* z% S3 X( F // 禁用错误控制事件5 C7 G$ h4 ]) B. a1 g
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
$ ~. I6 g! N0 k# m7 l EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);( ?! B' L( w* U6 U% `. I7 }
: q& |; n6 U! G; I6 V! K/ p- v3 h // 事件触发配置
" M: P$ g8 X9 T+ W7 L // 每三次事件发生产生中断
8 r- L. _: M9 f) n. P2 w$ F- k EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
+ e/ J1 |$ d3 R. C- C // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
; V' `* b% F T* ^, g EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);: Q) ` V- k# b# ^+ }
// 使能中断2 I0 T& n% C( k9 ~6 _5 y+ c( Q' V+ U
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);. c5 s j j8 ~
# Y+ L& H- x5 i0 x) K1 i8 l$ d6 | // 禁用高精度子模块9 [! J8 y7 X6 h' w
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);$ n! M+ J% O) K: ]9 j
( j ~! ~9 E; j# u UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);( o! M9 V- ^: |3 l
}
4 f, x( c' k7 B- h8 E' f! N5 M' K4 g" \' Q: i
void ChopperWaveform(void)3 |3 J% K% q( a" f4 w. W( k
{- I: `4 [) d& o1 ]4 Q5 j2 M0 L
// 50% 占空比
# }! [0 N! f! }6 z* d0 Q EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
/ h. F0 k4 G2 f# n // 4 分频
" R# ^4 u9 a p. H/ u. H EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
+ Q2 r1 N1 `" J: q, y0 H' [8 G // 单个脉冲宽度
6 o) Z/ f" b# ^; W: w EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);, r+ _" z2 ~( N& {
// 使能斩波子模块; H; ]9 @* l! y+ [4 r, g6 n" z8 n
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
o" w) N1 Q( T4 }6 {/ f}2 u$ [) f; B2 p, z
( {$ s/ ~! y. c, g& P/****************************************************************************/- \0 d1 X {8 S
/* */+ u" a* ?: T' E! D# n4 I. v9 f
/* PWM 中断初始化 */. _; @5 H7 p, K# f L8 `
/* */
% \, S5 y! f! b6 b/ D" t3 C+ ?/****************************************************************************/7 S8 q+ h9 c: G0 ?
void PWMInterruptInit(void), @) G1 Z7 H, ~1 L6 h( x; w
{- |4 ~7 ?3 t( a% _/ ]0 r0 ]
// 注册中断服务函数/ w( B [1 [: x* l# e
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);9 m* v) C" N* |7 b( Q4 d/ `2 m
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
3 \. c8 j- a/ v, |
Z/ u+ g" z5 f) ], r7 b // 映射中断
4 r5 K& V! l. ] Z4 D' m IntChannelSet(SYS_INT_EHRPWM1, 2);* r3 f" G1 e1 I
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
3 v1 {$ @# P5 C
) @5 y U9 `: P1 [ // 使能中断
k" g q5 p6 a8 b/ W IntSystemEnable(SYS_INT_EHRPWM1);
6 A4 M4 M9 p# @% d. F IntSystemEnable(SYS_INT_EHRPWM1TZ); L" d' P7 ^. i# r
}
' Z# l! i1 m4 S/ s# k* O1 W6 v9 a+ w
/****************************************************************************/
' v4 X6 g% t$ h% x4 l8 H/* */
3 w B7 x% n# O% p' y: S/* ARM 中断初始化 */ U4 f9 H# e. r- ]; b- g6 P7 S7 `
/* */
' P! W% E4 N2 u/****************************************************************************/
d4 ~6 u3 z4 M4 Hvoid InterruptInit(void) o) |% K7 z7 A5 n' u
{
) t5 z u# i r I8 W: n# \6 s // 初始化 ARM 中断控制器0 Z, o+ b$ U# N" i
IntAINTCInit();
' V- K' ]( \; D8 t! r5 ]
& i6 c. f9 A5 ?" p // 使能 IRQ(CPSR)
( {. R# ?+ G0 ]' d IntMasterIRQEnable();
+ {! f. [. G( E5 ?* P* ?7 l, K& W3 `3 z% i: Q
// 使能中断(AINTC GER)
/ z9 v$ k' r, L) ? IntGlobalEnable();
3 Y; z, i, r5 w/ N! y
' O. _6 I7 N4 v$ A. p. f: k; R // 使能中断(AINTC HIER)
1 e1 S6 w) P+ T) ^3 w9 F+ C- ] IntIRQEnable();/ C( h- t" U6 {, J, _
}
1 R7 v+ D! a* B u5 H% S& ]- N
3 U1 r& W6 F W3 H" R |
|