|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/1 i6 R3 q! d: \4 R
/* */5 I3 e# H1 b( L: q
/* 宏定义 */
! u l+ L4 y9 l, t1 R/* *// i% c+ P3 U3 Y
/****************************************************************************/; |; l# T. R& J j" l* U
// 软件断点
' y' Q, A" S& Z0 r) U7 {8 ?% q5 ?6 w. s#define SW_BREAKPOINT asm(" SWBP 0 ");3 w# o3 n- j: d6 p3 v1 S- `
- @& k* J& o1 L# ?# P. ~
// 时钟分频
" N- \; ]) U' i4 c: b' W#define CLOCK_DIV_VAL 228
( n/ E, l$ f- {$ e ^% i% a4 n. _- Z
$ N. m2 t9 E; M3 P/****************************************************************************/
c" ^( D1 P! w- z2 U2 ]; `/* */9 }2 `/ q7 ]/ U" V. Y
/* 全局变量 */
0 |) F) M7 i6 x! F( U/* */& q3 o0 @' \( a0 H! X
/****************************************************************************/! `1 N6 `( G4 ?8 ]5 x a
ECAPCONTEXT ECAPResult;
; [ o0 C* b/ P$ B3 I. t* K+ j0 Y- N0 P( M) Z8 {- _- V7 v# ~
/****************************************************************************/
- _$ [! i' M2 C" ^. I. j/* */4 \" _+ D$ H. f1 R# B7 T* t2 ^
/* 函数声明 */
( a7 Q8 a8 b+ o9 S8 M5 N3 ]/* */
, S, t+ S' D" `& b/****************************************************************************/
. W) ?& _2 K* Z. \' A// 外设使能配置; z. ^" |& ^2 Y2 `5 Z4 S
void PSCInit(void);" C6 W \0 O+ x" N9 g2 b; M
" _6 d) x/ m5 I& R- y
// GPIO 管脚复用配置
9 p4 s: f7 f) c6 hvoid GPIOBankPinMuxSet();
/ h- K/ Y1 i/ M' G5 C8 V& E ^1 [- y9 C
// 产生波形1 a3 M* ?) ^4 ^
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
0 {! r H- D; x' ?/ c% W! D3 e2 w, fvoid ChopperWaveform(void);
5 D0 _3 F9 ?3 ?" R
4 a1 p# u- [3 a# |% x/ r// ECAP初始化和读函数2 R: J! u! X7 R' D# z, m
void ECAPInit(void);
* w4 p$ a0 ~- }: Y% {unsigned int ECAPRead(void);7 D: N7 y; z% [. c8 [" q
) n" [6 o; B% h* R* |5 {1 i8 R3 c; ^
//ARM 中断初始化+ h* U# ]% U5 c' W9 e2 w
void InterruptInit(void);
* }' A2 [/ I: W4 u1 L: U1 l0 Q" Y4 t2 g* b- S6 E" |4 w u( V
// PWM 中断初始化
, f8 g0 E& S5 |/ H; R* uvoid PWMInterruptInit(void);3 Y# ~, P* K4 x( ^
// 中断服务函数1 q$ k9 q! \9 _/ C5 ]$ f. s6 [
// PWM 事件
6 L/ l0 q7 e$ @, O/ J7 Mvoid PWMEventIsr(void);0 j% E9 }" Q9 |- a2 N' P
// PWM 错误控制事件
, w9 i3 a* R3 V6 P% U/ dvoid PWMTZIsr(void);3 U/ l) S0 v. a# U3 r" Q/ g4 s
. ?4 J7 L/ A+ G( n3 Y- m4 P. |4 d/****************************************************************************/
( B- R4 O8 F+ U. ^) H/* */
) C/ d7 I$ V+ Y6 r8 a& `7 E% z/* 主函数 */
' F) X0 D- e4 E/* */
; z+ _- k* c% {* s/****************************************************************************/
- j4 t) y6 k7 f; R7 H, g xint main(void)
3 m* D C# ?6 n9 P ?$ ^' a{
3 @8 J8 P5 y3 P/ i- R4 V! D0 P // 外设使能配置
0 z0 K( X/ A9 q4 t& B2 m9 d; f- ` PSCInit();
$ d0 P9 N( f# r
& S/ g4 L3 z8 L$ \' m // 初始化串口终端 使用串口2
: j, O. P# R( f3 h/ N" Q2 T UARTStdioInit();
; x0 s$ w4 o: ~- q' N9 M
2 K( |8 N: [' e$ O+ j7 a* d, b5 k // GPIO 管脚复用配置* T/ S2 r, I0 J5 t
GPIOBankPinMuxSet();" \( e& c( l9 ]# I% d4 J
5 N& \# P3 ?% V L! f4 o+ y+ m
// ARM 中断初始化
% F1 o& J7 k! v; t0 i0 a v- } InterruptInit();
( V; `- u# T( J' \5 q
$ w9 Z! M6 B- t4 d& J# q5 X // PWM 中断初始化. u3 U2 }) V2 B$ V1 D* `
PWMInterruptInit();
# D4 |) b7 s% w, q& U( M% A" R( e# @6 K% v2 ^9 O9 P
unsigned char i;& m9 \+ G$ q( f, ~3 i4 p- z
unsigned int j;
# y' p4 \$ o# H
5 n* u7 r Z, F UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1); k, `8 B$ q( M8 w9 R# u
UARTPuts("------------------------------------------------------------\r\n", -1);. L* p' R @- M. Y `8 v7 a+ }* f
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
2 j' J; A Z- X" W // 产生波形
. [. C. f$ }3 A& N PWM1ABasic(25000,50);- Z. K) [0 T) G$ c0 n' w3 F9 ~
; h: y- m1 R9 z, @' h# X) e
UARTPuts(" C6748 PWM Test Over!\r\n",-1);. {9 E I; R* C: S+ N3 @
UARTPuts("------------------------------------------------------------\r\n", -1);1 N4 {/ R5 x' |1 s( t
0 k( X' r# a7 \
9 [- `3 c% V4 i2 ^1 {' }( h: t
4 b* @2 A) ~% u9 d
UARTPuts("------------------------------------------------------------\r\n", -1);3 E, v+ }1 g( g ^# n
UARTPuts(" C6748 ECAP Test\r\n", -1);
) f- M: A1 ?) k6 Q& F // ECAP 捕获初始化
1 b( |" o2 r. }0 ]$ | ECAPInit();$ t2 d: a D3 F+ D( w+ S2 `
UARTPuts("Initialize ECAP.......\r\n",-1);
; ?& A# K* u8 C1 y, M. s for(i=0;i<5;i++)
9 t! X9 M" b' s: ^) t& Z {
6 J4 ^* R: T ~% k/ u for(j=0x00FFFFFF;j>0;j--); // 延时- m/ g6 X' q ?) N
ECAPRead();
! G+ G/ Q5 b! ]: `6 s8 q# i6 F9 d) ] }3 f2 r9 Z( P5 A& ?' j" K! @. v
UARTPuts("\r\n",-1);- q% d/ _* q3 n) J: h0 E% `
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
4 ^7 Q& ?" M% S UARTPuts("------------------------------------------------------------\r\n", -1);
, C& I" U3 y& S n& G6 k: A: [" @7 s1 `2 d2 A, j
// 主循环3 Q9 ]. c: Y; j
for(;;)
% v" l6 v# i3 F+ O {2 g: u, }' ?+ K5 T- Z% x6 |9 O% N
2 y( G8 q# p* _ }
6 V m) f' M/ c, O# }/ i* e. C}
5 E# N# k7 `5 Q! |* b3 Q* o: D: V6 b( n( I( r7 Q. c7 r9 W) x5 c; q
/****************************************************************************/: Z2 a' ^2 i& A
/* */- X7 F5 J! m! x3 l6 @" l$ {6 v4 M
/* PSC 初始化 */
+ {0 e2 M) J! z/* */; j- R: @7 y% q( z" ]
/****************************************************************************/
0 l/ h( ]. i' X" A' d' d/ X7 ]( Nvoid PSCInit(void)
$ N9 W1 ]* p* h" d{7 j5 i5 C% l6 l' g) [! U F( m+ h
// 使能 EHRPWM 和 ECAP 模块- K: H, Z, q+ x+ P( g
// 对相应外设模块的使能也可以在 BootLoader 中完成! T7 G# y$ e9 _# [ {& z* E0 I- H y1 m
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);$ [' M* M* L9 C, c
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);: _" n* [# N0 ]) _) L
}; d% z7 z! R: N
9 r3 W5 U- c1 e/ q7 D* q& `
/****************************************************************************/+ D! P% q$ o9 r2 k2 b
/* */* E/ G. A- A5 l' w- T) U/ {
/* GPIO 管脚复用配置 */- |$ _6 Q% x+ J! v E( `) X
/* */
6 E6 P1 A- l+ f" [/ B/****************************************************************************/( I+ X8 v$ R& I6 A. Z3 `% A/ `" ~+ `
void GPIOBankPinMuxSet(void)
% v3 {5 M5 ?' J( v7 [/ a{" a2 ^ C: C' S6 i+ k) q8 f' m" t
EHRPWM1PinMuxSetup();: l0 A( M7 T7 Y6 R0 Y/ l7 u
$ b& y3 C6 J+ [
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)% K; C3 h) ]) Y& Y6 X8 X0 x0 i
// 作为捕获功能时管脚方向为输入0 @2 w* W( ~8 ?; s: ~, E
// 作为辅助脉宽调制时管脚方向为输出
2 s! @# S y- R) w7 Q( q& i3 m // ECAP2 / APWM22 b# }. F/ e& r) K1 ]
ECAPPinMuxSetup(2);
\- @/ d9 J8 b! C0 K" X6 i# p% `. }7 d. `
// ECAP2 / APWM2方向设置为输入# d% \% s, h6 Q! |& O% F# y# X
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
K @ _0 K2 v1 q}6 R! H" i$ m+ H( P- D
" B0 S m' o Z* p6 u- H% a/****************************************************************************/3 i1 S) \$ h8 G+ ~5 g; L
/* */
" M/ S0 |- j% w$ k2 ~+ h2 Y/* PWM 输出波形 */2 t* b, T* a! R% O- A
/* */
9 z9 N, i7 ~: ^$ F2 w/****************************************************************************/
' L0 q% S" o& I( {1 y- b" [void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)2 r5 l4 r$ V8 C) Q0 M! a7 \& L2 `
{ r/ j! x$ c, _* N g
// 时间基准配置
4 ` ?, q) }' c7 T" B2 | // 时钟配置5 F) t: m1 ], @! p% o
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
& T. u6 @' t# Z9 Y, z. m. g) @
5 x4 ~5 v2 [0 ^( Y) w2 r; Z // 配置周期
6 S1 l5 n; ]& X9 t. W( M: {) Y EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,+ h8 Q; _3 `0 i, ~4 `& }1 [
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);5 V3 O7 B! \8 c' S9 U. g
9 R5 L- J( T1 m1 P // 禁用输入同步信号! u# R+ s( j1 |
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
% D& T; f1 x1 {, m8 N8 A; H& c+ k2 J: a2 D, Q) M) b+ u( _1 M( y% ^
// 禁用输出同步信号
3 m, F) j4 E8 K) F V EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
4 c6 i" g+ H- K6 z7 }' }0 j! ~# }5 T* t3 e6 B/ h. p8 R
// 仿真(DEBUG)模式行为配置
+ x, B& ^! F( y7 {+ ^! R EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);0 g, Y- k; |$ E0 e& C
& ~- N) M% ~9 }; A, l) ?- V4 l // 配置计数比较器子模块; x2 I( {8 ^% i; ~6 A
// 加载比较器 A 值
' O& H* U/ T$ s1 g; ] EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,* r C$ ` G" a4 l) s, s
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
( n3 H! j t9 ^. L7 T- a/ g, x$ c% h) g- `+ j) [1 I
// 加载比较器 B 值( E3 q# x( g- q4 h
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
) Z9 K9 `* H% F( @+ K EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);% k0 Q3 Y3 S. Y3 ~1 z" Y9 i
" m% f r* b+ C, Y- w
// 功能限定配置(输出引脚触发方式设定)
- Y7 _3 F2 [/ W* E6 u L // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
4 y0 }0 Q O* E8 \# t EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
' s+ v& K% [3 e8 O EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,0 G# e# [3 m M) v; }2 N
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);# f8 I2 P6 E+ X8 Y
6 I% A/ t ~% H/ x2 f" P // 禁用(旁路,信号直接输出到斩波子模块)死区模块
( m3 n# g, I1 D5 k3 B EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);+ y5 i% G1 A- u3 `" P1 r9 Z
3 Z5 z* p3 W7 u3 [6 _: o9 O // 禁用斩波子模块
1 r. \: X B4 A! h$ S EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
, @0 j4 F+ }! C
. K! @! Y) h; v7 N9 r3 Q" x // 禁用错误控制事件
: u w! q8 d- n; {% D EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
p' d5 h" }( P; |& V9 D$ |8 x" z EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
! \6 [5 r7 z$ G1 r: q0 L: @' [ G& e$ a
// 事件触发配置
1 J5 Y/ n- |$ V. M6 _ // 每三次事件发生产生中断
: F0 z" ^5 D3 c( E, B! B EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);7 | e- o9 I3 }$ y8 L
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
1 f& f) U/ i0 l; }. l EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);( h6 x# f$ I8 @) ?
// 使能中断
% Q% Q; h" A: F9 ]+ L6 N" |; | EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);% j D) m0 t+ {) |9 r3 z
+ |* _9 F: x: ~4 L4 g
// 禁用高精度子模块
4 v& c+ x+ K V" `5 d EHRPWMHRDisable(SOC_EHRPWM_1_REGS);; v5 _5 t& K3 r2 d3 Y7 g9 S
& G+ Y ~; v0 _$ l1 i0 Y: f
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
8 T) J0 o. g. Q}1 l( ~; J$ m$ c
3 K; E5 d- L! v* u$ N
void ChopperWaveform(void)
/ ?5 T; h& |1 O S0 f) P* e{$ Q' H; l+ ^1 i- V; s% u
// 50% 占空比( I1 I, }9 @/ {( z% R1 Z
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
. o( h* ^# B+ u# j // 4 分频( j6 f2 L2 u; H7 K/ X
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);' ~& R3 t- f$ h: d! ]
// 单个脉冲宽度
, W [! F+ h2 ~: U9 _# g EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);: j' B. M$ T! M% c9 R4 z
// 使能斩波子模块
# L2 S% `/ R! C. |+ N EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);& O3 K, z1 n. E. v* n
}
- B7 h& q' C( l! P4 f) R5 f
F& O- v0 k0 a- W* f' b/****************************************************************************/
; y6 `' I% a1 Z5 W) T/ J3 i5 ]/* */; U3 K( S' v/ D* l* G7 H! n
/* PWM 中断初始化 */" N1 _/ @7 g! p( K; G7 K8 N
/* */
, }( t% j4 i% r+ f0 u7 x/****************************************************************************/
3 }4 X/ Q" v @# q9 _void PWMInterruptInit(void)
1 r e' f, v2 F{! \+ s. O& }7 K
// 注册中断服务函数# @' v$ O& e. v" X: {3 }
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
' ?) S# H, r5 Z4 k+ W% z8 d7 }1 h IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);+ v# q7 S+ v) t( [+ z
+ p2 q9 N+ }+ u5 @
// 映射中断
" |5 K% o4 Y$ ]: S0 t' B IntChannelSet(SYS_INT_EHRPWM1, 2);0 B( p, V9 r; C. X( W. p
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);1 N: y; X% r- @" C, ^
& r) \: w8 K4 M: M% ?# i1 S7 I
// 使能中断6 n* g* M1 i" J+ z0 V
IntSystemEnable(SYS_INT_EHRPWM1);. c- n7 l* E O! V% P
IntSystemEnable(SYS_INT_EHRPWM1TZ);6 o6 M8 {0 T0 ?5 h) Z
}
! M- T1 w7 z, L d/ f9 g( B3 C9 s8 f9 T1 k1 `4 F; Q
/****************************************************************************/- }' D6 e# a/ R: b# {! F: r3 }
/* */9 v! I2 C& q! \* d3 s0 |
/* ARM 中断初始化 */
: a& R& L' c' \6 E1 U2 C/* */
# K0 `3 W$ c# p5 [" w, V/ ?/****************************************************************************/
$ V o$ w) u% q) hvoid InterruptInit(void)7 e( E4 m2 G- _, { k( A7 U- [
{. C! T. u# V2 b; S* B2 O
// 初始化 ARM 中断控制器* \! E7 H) l$ r9 r) h E3 x" p
IntAINTCInit();; b& p) v, D( e5 Z6 p1 v5 \
% ^" G! u7 i7 ~+ h // 使能 IRQ(CPSR)
! q, Y4 K6 V# p3 Y7 T IntMasterIRQEnable();
4 }7 l+ [" y3 m9 ?) }# @4 `! g, o9 m7 [# c, w% b2 ]9 w7 ]- u
// 使能中断(AINTC GER) `+ t4 E/ j/ h) {, B* E8 ?
IntGlobalEnable();; r/ g8 c# {9 S3 t' O" x2 ~1 ]
8 W) `! Q- O& U* O. u* _8 d // 使能中断(AINTC HIER), @- R& w$ w2 q/ o% o. T7 K
IntIRQEnable();
( E. v+ b; C6 B}# _0 A" o( ~3 ^2 V- R
) P! \+ I \7 g( u |
|