|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/. g9 u1 \" R4 B" m
/* */1 }3 C3 A8 A& L/ O% h% y6 j
/* 宏定义 */
* o4 O& p3 z) m! b+ L4 I3 y# V$ b' m$ x/* */
- i1 C( X( H8 M! D V/****************************************************************************/+ D. P$ J7 h8 z( k5 s
// 软件断点
% B# |2 J/ m$ j7 s6 p#define SW_BREAKPOINT asm(" SWBP 0 ");
+ S$ O5 n$ [/ Z" R2 |% \7 }# M3 ?& T8 s9 ?- S3 ]# i, _( E$ b
// 时钟分频0 u `; B( c# B- z0 p
#define CLOCK_DIV_VAL 228
+ w+ R b8 B0 H E) E. k! \- O, B. H! `1 A- g
/****************************************************************************/
, m$ O; d9 O; v7 ^8 ^- [" z2 D1 s/* */
9 s! A0 c) H1 `" j# P* x' _9 e/* 全局变量 */
4 f7 b( y* D( \( h9 D/* *// Q, ~. D8 I$ d0 t- l
/****************************************************************************/
: n6 [' V! ?- IECAPCONTEXT ECAPResult;: p+ Q, F+ M } r2 s s3 V
4 p' b3 g# p$ \$ u X/****************************************************************************/
' L9 h, Y' l0 `3 Y9 j+ H/* */
. F* s* k$ [" @7 n/* 函数声明 */, F6 V3 e; T3 D1 h/ m3 b8 @6 `
/* */6 J9 }- L/ r6 d' P7 M
/****************************************************************************/. S0 J9 G0 W$ d) ]- X; @% |
// 外设使能配置6 e1 m$ Y2 C7 e* U. A$ M
void PSCInit(void);
, }" ^. }+ K0 K o: d# S4 J' _1 r, w; h, H0 n. g3 E* c6 g
// GPIO 管脚复用配置
+ ~. y* w$ {2 k2 \( evoid GPIOBankPinMuxSet();
1 O* K% @6 r6 d( I& k+ ?3 d9 K0 K [8 D0 J- [ m# R
// 产生波形, |. x% i9 {) g9 q" Q; ~" x# C
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);' d4 t( s+ b) ^0 {
void ChopperWaveform(void);
( F2 {3 J8 L X& {
8 j1 Y! G, F* r// ECAP初始化和读函数8 S, e: n" A* @6 ?4 {
void ECAPInit(void);
, l9 S( V7 b5 u: D9 uunsigned int ECAPRead(void);3 m( y; ^7 W. ^! ?) l
+ M% U+ e0 f) R- b4 H- c
//ARM 中断初始化! f, }4 X& P. q- o: V, @: b/ g! e
void InterruptInit(void);/ e5 ~$ @8 [; [9 F
4 P2 {! N! e [// PWM 中断初始化
1 g( e1 `) W" x$ z$ bvoid PWMInterruptInit(void);
7 Z7 D; W/ R7 |8 @2 I7 Z7 {// 中断服务函数8 {. _! ^5 V O5 `; X7 c
// PWM 事件
% ?' P( |; X! evoid PWMEventIsr(void);
* n, y6 @3 v& E+ s* n// PWM 错误控制事件
3 n( b" n8 {$ d/ y3 g8 U+ E& ]* Rvoid PWMTZIsr(void);" F- R3 [8 _) `$ S( |8 F
! {5 |% {) N/ N& y7 G! A4 l9 D
/****************************************************************************/
& f1 R0 j5 e! q/* */; x) [' ^& ^+ F. W( `/ ~; a
/* 主函数 */
2 ]- ^. l, C/ w% q) N6 w2 O3 s/* */9 `& n0 O0 T1 w
/****************************************************************************/( \& j! n* ?9 q4 r9 C9 ~
int main(void); X8 G4 d4 D+ X9 g5 E- o
{
, S9 i$ g0 }+ @: n) I // 外设使能配置
7 J7 D0 O5 _4 X5 c4 f PSCInit();: }& M3 e2 ^, O3 G7 S0 G1 v
$ E8 m" r- `5 D // 初始化串口终端 使用串口2, @- Z8 _; }* w, s% ^% s
UARTStdioInit();5 K0 l: r; c! d0 {5 w% V' [
4 J5 b2 q4 L+ i6 U, X' a // GPIO 管脚复用配置: d) U2 |) _! @ |( C" k- b5 M
GPIOBankPinMuxSet();7 r6 T3 c" `+ F4 F! G
% \9 ^2 B6 X. A% g // ARM 中断初始化5 u" L5 i8 P. I% N
InterruptInit();8 g5 ^0 r, t4 m7 b/ H8 P D0 B
* f. V- I8 ]- u; M K // PWM 中断初始化
1 x. _7 |* _& a+ o" `; P PWMInterruptInit();
8 f' i) L T: D( ?8 @% d$ B3 H1 |
unsigned char i;! L9 {- P- Y ^# t6 e" a8 Y6 ?$ v
unsigned int j;
' B; v7 R4 n, B1 ? m0 X; I y0 M) R9 Z. P
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);; F, b& Q0 F8 F+ F, e4 X
UARTPuts("------------------------------------------------------------\r\n", -1);2 t4 H' m$ i: X4 T9 T# f" ]
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);# ^$ ^6 c" s" u, j
// 产生波形
0 w I- H+ E- h: E5 [2 h1 m5 e PWM1ABasic(25000,50);3 ]0 f" X+ C: j0 F$ T- u) G3 ^( ^% u
, W' T# N9 Z; Z7 {! [ UARTPuts(" C6748 PWM Test Over!\r\n",-1);
" A2 [$ U4 }; @% q+ J/ S+ q UARTPuts("------------------------------------------------------------\r\n", -1);
. h; b3 v+ m. n( s
7 m5 Z7 m5 R7 @/ Y# v) D3 @' e3 @' i, ~( r' h
B% ^- P6 A5 e& ~6 v7 p- S UARTPuts("------------------------------------------------------------\r\n", -1);
1 v5 w) i( Q: b" R# o9 e* m UARTPuts(" C6748 ECAP Test\r\n", -1);
/ ]7 c4 O& @1 d" g$ P0 G9 h // ECAP 捕获初始化# [4 l, F+ \6 f9 C
ECAPInit();* h F1 l- P8 j; P5 t! N% E
UARTPuts("Initialize ECAP.......\r\n",-1);
1 m+ t7 B3 |+ q" B+ o( i [ for(i=0;i<5;i++)3 }0 o, L% O9 m+ M8 V4 A
{
# m3 T9 H, o0 w% T* ?' y; C for(j=0x00FFFFFF;j>0;j--); // 延时; ^1 X, L' [1 D3 Q. ^/ S+ D3 v5 x
ECAPRead();
+ H5 e+ R1 S7 c+ V! D+ u |. y }1 x" p/ B( i1 H9 v) a
UARTPuts("\r\n",-1);* G' {3 \ ]$ W, P0 j$ }
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
! v) q( y: i5 x# p. ]0 E UARTPuts("------------------------------------------------------------\r\n", -1);
% z- Z) o) z7 V1 k" y6 A3 W) Q2 s: l5 h
// 主循环
/ _4 q7 x4 h G' `7 ?$ T$ ^ @' c for(;;)$ D* A; K5 U8 v4 q- l% X6 _1 I
{* b/ `! C& ? V3 ^7 j. k) ]
) p$ i' i4 R/ t' m1 A" H. r }8 r! c! t- }2 M
}
% v7 r _; [, g3 h# K* T K6 |7 Z3 ~9 y& t8 f. B
/****************************************************************************/
$ F6 b4 ]2 a, g" I( s/ ]/* */
! f" V1 H% N& U/ W/* PSC 初始化 */: H E: r! Q7 l5 d; [
/* */
. [# v1 i' ]2 p' K( ~) a( h/****************************************************************************/6 b. Z* s6 i0 l4 r1 t
void PSCInit(void)
! @2 o$ x7 ]8 f9 U# t6 C{4 ~! l0 Y3 b* {7 }, D E
// 使能 EHRPWM 和 ECAP 模块
3 ]8 e# g) S O1 E" B# P6 S // 对相应外设模块的使能也可以在 BootLoader 中完成; g9 q) e( ~/ I4 k" ?/ ?, v& H# u8 T0 s
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
! @% X% L# E0 t2 J U) w PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
8 o: @! T7 X f" p. {/ G0 f( t. T}
1 B, ~* r8 e6 r( f* p+ N3 Y
) b K6 U4 ^* |- {& s- a/****************************************************************************/
6 ^" a1 T2 _1 g' X2 P/* */! ~" }# ?+ g+ A$ b/ H6 t
/* GPIO 管脚复用配置 *// b" t" A/ V( n6 p
/* */* k% x( U$ @1 z2 G
/****************************************************************************/
5 H& N/ B: q3 h8 Qvoid GPIOBankPinMuxSet(void)% }6 `7 y) B( @- D3 [8 J6 g
{- `* H4 v4 |2 U" |, h
EHRPWM1PinMuxSetup();4 Z. q1 H' d& }9 @" K/ I5 l
% L1 M2 Y- F0 {7 R) Z // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)" e7 x1 E2 g/ n6 I% _6 Z2 D* d2 O) Z1 C
// 作为捕获功能时管脚方向为输入, f8 S3 n! b" ]; O4 H7 M
// 作为辅助脉宽调制时管脚方向为输出
4 {! f* a4 P/ G* u; e% [ // ECAP2 / APWM2) m, g/ C2 _7 ]2 `2 t
ECAPPinMuxSetup(2);9 }1 Q/ _( ?5 b; w
; I; n5 p0 Q8 r2 X1 u' s
// ECAP2 / APWM2方向设置为输入9 \* w4 U; s% N1 T
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]$ C8 n. S! a1 K8 J" t
}
$ z4 U I7 r+ v, |+ v& `& c# y, G* u% Z' |* K) g& e7 p& a
/****************************************************************************/) ~) L2 B: d) C' u% [$ {
/* */
3 ]) U k- \, S, ?' B/* PWM 输出波形 */
$ J6 I" ^7 |8 \7 X/ K+ \8 w/ o/* */5 a$ t7 p) I5 [/ s
/****************************************************************************/2 Y# W. S' ^& [ J- S9 q
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio); e' k- y" @9 N6 L$ T
{. A( ^7 V" C/ m% [, k! a; F) C8 W
// 时间基准配置
9 t2 H# n2 q/ Z1 E$ D. L0 t. u, Y. M // 时钟配置
5 ^7 l/ o5 F* k EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
% X* u. T; q! I: K6 P& q4 s
9 }- p! ^( {4 o- f7 V: a0 m1 X* q // 配置周期. d& L9 [+ U& `+ d( Z. L& R2 [6 v
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
: t3 E j- n2 z6 A pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
# y' B' i! i7 j$ M! e! U
0 h, y% W& G( B1 ^ // 禁用输入同步信号
+ g6 ?' x2 Y7 e6 m EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
1 k. \) h# e% Y+ g4 h5 X6 n6 V, r# I5 t0 F5 \' ?9 N1 K0 G6 `0 B
// 禁用输出同步信号
* a# f9 s% N; z' G, _, M EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
. H0 K3 F' c+ m+ h2 Q" r/ d, x6 P9 ]+ y# j$ N. T
// 仿真(DEBUG)模式行为配置
0 g a2 a# U+ D L0 \4 s% t; F2 d EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);$ \ K0 c& V7 C, ]# V! v3 ^
+ u0 Z* ^& z3 p& B8 F* h2 k* ]
// 配置计数比较器子模块2 T1 N/ h7 o/ l
// 加载比较器 A 值
. [4 I% H2 E) _ D( z EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
$ ^0 q ?2 U2 Y, I6 [3 _ EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);1 O6 v* E. v5 Y1 b3 M) {
/ Q6 ]$ l$ q8 h g+ f8 g: Q# A7 h7 ]
// 加载比较器 B 值
- I' A) d8 a* P4 X6 O- V3 { EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE, ~- ]% S, B) E9 S
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
' f8 I6 y: I$ H: r3 r6 A h T' w0 v0 l5 @
// 功能限定配置(输出引脚触发方式设定)7 t3 x9 z. S# A! i2 X0 \: ?5 w
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出, c8 R' ]4 U" ^3 C& h! h; ~( E8 k
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,3 \$ ]& O0 \9 J# K
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,0 E' |! ?" ?' z; J
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
: U: s+ N e: l5 D) s% I0 S3 |: ~
/ Y# |) ]1 ]- z5 W b // 禁用(旁路,信号直接输出到斩波子模块)死区模块
2 e7 z# v+ Y1 q# u' a' g f EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
4 f! R# n6 c* E* D) g, n& m7 C |" \, g$ Y. r
// 禁用斩波子模块* m1 \5 C& Z0 G5 R5 B# h
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);( l$ K3 w/ ^" c# k1 m4 v9 m& ?
2 |( y/ U0 f5 @) i; @% m! W8 F) P7 M // 禁用错误控制事件3 `0 }; j- P6 g, r: r' X; {
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
. d# M9 D% K; N, v EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);% k8 S7 ?, ]" {. [+ e
6 c4 y3 D$ B6 n8 D/ g; m
// 事件触发配置& [+ ]- n3 J" N& W
// 每三次事件发生产生中断
* H- s, ~0 m/ U7 ^' b; f. c5 G EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
! U/ B) N( q% [+ J H# S! d // 时间基准计数等于有效计数比较寄存器 B 值 产生事件# y7 x+ ~$ n$ u4 z/ K5 ^- A& z
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
$ j3 w0 M+ B& J& j6 g2 Y // 使能中断6 M5 R: B. n% `: d) U+ G1 g% ]
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);: B. {1 M. g+ R0 P2 v5 w
1 J. D( i$ E7 K. m+ m
// 禁用高精度子模块3 \; l: ~" K0 S- \; ~
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);1 g$ A1 P' t. }
- |7 ~9 p* m$ n3 w& B3 F# @3 M8 ` UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);7 Z" x4 w) M$ x: U+ X$ [
}& H' z# z( }' |/ ?- y, s5 c
# ^% y& T. X: H) @; ^' s/ @void ChopperWaveform(void)
. w3 d. c- C) m, W9 |{
/ ^) f! N4 l; H+ Y // 50% 占空比$ l% y+ c5 h2 R ~9 T
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);4 I3 G" h# R) I {' j
// 4 分频( u3 Y2 j$ u; j4 a6 ?( {
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
% t8 f j& Q% o# M. ~+ _ // 单个脉冲宽度
/ c! A8 W: v6 b5 f0 ]8 ~0 \ EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
7 w: Z8 M4 [( Y8 o) L# H // 使能斩波子模块
+ E+ ?3 `$ \# {8 J/ v/ p, A1 t EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
( a6 I4 w) a% I$ z9 q }" ~, L2 k}' d3 j' H; D8 Y }$ d& w4 v
4 I3 u% o7 G+ V1 F
/****************************************************************************/
* W+ Q% g5 g- p; I: @0 a/* */3 a5 b, _; k; e. P
/* PWM 中断初始化 */4 _# m; W n& u* z: h6 H! v
/* */
4 h1 t, \; o* u. K* }( W3 P/****************************************************************************/7 h& I& O& ~& j1 G6 `) [
void PWMInterruptInit(void)
4 @; ~8 V9 H( O* o{7 i7 |8 W4 `. I" y3 x* W! W6 \
// 注册中断服务函数 `$ y) i, x/ ^3 h; e# L% _
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);, y* m, o4 c% w' _
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);- i; s+ V; w( }$ t/ b- ~
! r0 V; N- s! j: [1 [5 p3 [, _
// 映射中断 y7 G( C6 x2 O- _% a+ @1 ?
IntChannelSet(SYS_INT_EHRPWM1, 2);- _6 R9 D) @) H* S1 O
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);2 m' A& Y/ f# z; ?9 c4 D
# m4 T( v- D5 ]1 V$ Q q // 使能中断
% I$ t8 b! u4 ^. f3 n- r! C3 o7 c IntSystemEnable(SYS_INT_EHRPWM1);% o$ O6 X3 g& l
IntSystemEnable(SYS_INT_EHRPWM1TZ);! g' G$ }+ ?2 I6 h4 ^ T
}
" V: O( ~1 A* z( d' u/ x4 t3 k
4 d" t# z, H2 F3 C8 o/****************************************************************************/7 g; J4 B W% q
/* */; z( j) _/ A" b. `
/* ARM 中断初始化 */
) z9 T8 X2 ]7 B9 g n: j. Q, P, h$ P/* */
5 p3 |0 C0 v) c2 v2 w$ g9 c3 O7 d/****************************************************************************/1 b( d B, y, B: e8 a- Q
void InterruptInit(void)
& W7 K1 o I n2 S$ M{9 k4 B6 o \, K0 {% y: l
// 初始化 ARM 中断控制器
+ A$ Y2 c) {% w2 A1 N IntAINTCInit();, L7 q4 ~7 Y- r+ r6 x
2 _3 E( I9 N; k6 B' X
// 使能 IRQ(CPSR)
7 ~3 [: u C, \1 e% D# R2 q IntMasterIRQEnable();
4 R6 `. e) n1 S, C) @ R4 ~% x% A( A- A# O* {6 W% y
// 使能中断(AINTC GER)
* D7 K$ s& A& J7 J; o1 j IntGlobalEnable();
6 ~, ^7 M* Z. [. f
* F1 }0 n! C( f, A" ^& y) p$ Z, x // 使能中断(AINTC HIER)
. ~- T0 x# b' I) \" V; p" X- y IntIRQEnable();9 v E9 Q* q! f H2 |
}
* Z; H( k. i! b$ s5 M/ b! ~0 N" ~" ]. R) ^# k) o
|
|