|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/0 k' b1 E% n( j& d, a+ A( R7 E
/* */7 ^% [0 k* g4 f! q% G1 c
/* 宏定义 */4 ^& A( W& D- v$ u. {$ f; S1 M
/* */
3 A2 d3 o7 D6 d9 |& L+ y- `/****************************************************************************/( i! i6 Z0 A, j3 a! d
// 软件断点
4 w' `% F2 S- G% G#define SW_BREAKPOINT asm(" SWBP 0 ");$ ^, Y$ q* f' v
0 c0 N5 N7 l5 v2 u% d" [4 X
// 时钟分频
9 t- {& r6 h7 p" E#define CLOCK_DIV_VAL 2286 k# L! }% d: d$ U5 y
- P1 T( K0 A1 P) ^ U( X/****************************************************************************/" e' d3 @' D! q
/* */
* y0 X5 J4 J5 @0 W0 G& T/* 全局变量 */
; h4 | K: R; p4 o/* */
! i* h& e6 l$ w; o8 j( c" U" w- a/****************************************************************************/
( X6 N1 z7 M+ I3 x- ?ECAPCONTEXT ECAPResult;
( F, L6 ?$ \) v/ b$ X& V& p
& T, f' V6 V. C( E/****************************************************************************/
' L) q; o7 H% S& _6 @/* */
: K/ S, b8 @) s1 z/* 函数声明 */- h2 x( g$ r. N: _0 x
/* */! y4 y, h9 m! _9 E
/****************************************************************************/
) B: N/ k9 D# {* P: w: g: g! A& X// 外设使能配置: J) _4 i$ O7 [/ u* S
void PSCInit(void);) V$ o% [& n% ]
9 p! c/ t6 |2 R: ?7 e
// GPIO 管脚复用配置
( T S5 U* V; D+ I% s7 d4 L. qvoid GPIOBankPinMuxSet();6 N( e, X1 k% e# N+ |5 |& x4 N" ]7 m, D
* T* ]5 O3 O. @8 j0 l/ V( t3 {* b3 r0 G
// 产生波形
- S) {1 O* l3 c' [" |. {" cvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);. J+ F @* |- m) A
void ChopperWaveform(void);. E e P& c C3 }/ \; B L
4 a5 i# }; y7 V2 D/ ~& U" x// ECAP初始化和读函数
8 i- ? q- \. S7 n, i- t7 rvoid ECAPInit(void);
: n9 h0 [+ a! e5 Tunsigned int ECAPRead(void);
5 D# S1 N: X1 n" [2 o/ r# [0 M* O
//ARM 中断初始化
# c' N7 b# ~5 wvoid InterruptInit(void);. J5 w% S: Z/ ~: Q4 y
1 A$ V% R/ B, P$ o// PWM 中断初始化4 s" z( p A; w( ~( B- U: b# ?
void PWMInterruptInit(void);
$ e% E- M+ M& Z& P8 a6 h7 n. S8 @5 l// 中断服务函数
$ c1 ]7 ]+ `# F. u! v5 B4 Z// PWM 事件
* n" G& Z+ `6 e3 l! X- nvoid PWMEventIsr(void);
' T& x4 y; o2 i. i# m; s// PWM 错误控制事件
% _3 R+ X% h- C& K, N+ }void PWMTZIsr(void);1 w6 ?- V# I0 Y& j% a/ {
$ U7 R" H+ \" Y1 x7 |
/****************************************************************************/
! Z1 k, b0 G, ~* `/* */0 [% i: s( I8 z) n
/* 主函数 */6 M* d6 x- ~5 f4 a# {1 m! i
/* */) u! a# U$ \& P+ g; P% G
/****************************************************************************/
2 b' t0 L; k" `+ Q' Xint main(void)$ Q6 t9 O$ I" i
{
3 Y' k" y# |; d) Y Y+ r // 外设使能配置
: @1 J8 A: R- e/ O4 }; P PSCInit();2 G4 H! N; S8 z, i
* u0 t& B0 B+ L3 R2 a // 初始化串口终端 使用串口2
0 t. D4 I, \4 S UARTStdioInit();
8 G; O! a5 D8 u& o) \1 ^) J& p * \) B+ y- e$ L2 j. q
// GPIO 管脚复用配置
" L& u/ c. ]& N' _ GPIOBankPinMuxSet();
# [0 h8 W3 g# _2 V: B1 j9 r
" g n8 K) |. w; G2 x6 y# y6 w$ s // ARM 中断初始化; R* l- ^& b1 z! N7 ?
InterruptInit();
/ \* f0 x u T2 W( ?" p0 l" I3 Y5 F' s8 J8 B
// PWM 中断初始化* K- r8 Y" @' y! ^% e# V1 l
PWMInterruptInit();
) u' c2 j* Y+ K) y6 n8 K# \( z2 W5 Z( z" o/ B( N( R$ @
unsigned char i;% \/ s" Z) n8 H# p" s& j) O
unsigned int j; l. Y3 j9 i; ^
$ _0 S _8 q8 ~: C' U& H* }: b- j) W UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
& ]: l; M7 S1 p' M# X% I/ R, b# s UARTPuts("------------------------------------------------------------\r\n", -1);
- F& ^/ l6 a- K" [9 W) R4 ?7 q# Z UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
5 X8 H8 x) `( M0 m3 w0 G // 产生波形
n: s# a0 ^7 k R PWM1ABasic(25000,50);, X7 Z: y9 G9 l8 B8 @2 Z7 D) | c
1 T6 c0 @; O8 i' w. P! g UARTPuts(" C6748 PWM Test Over!\r\n",-1);
- p+ z3 s4 q3 X+ O UARTPuts("------------------------------------------------------------\r\n", -1);! S% W( ^, m6 I
4 U/ Y% G' r! \0 T$ i8 Z4 C
: R8 k. m% j+ T. ^9 v" }7 k6 o$ \/ B1 }; d
UARTPuts("------------------------------------------------------------\r\n", -1);8 V! n) R* \2 c9 @
UARTPuts(" C6748 ECAP Test\r\n", -1);
G7 ?, N0 ?3 N" q. D! ~ p // ECAP 捕获初始化! N: U- `' q. E
ECAPInit();
. t- c/ Q& }9 q( x UARTPuts("Initialize ECAP.......\r\n",-1);
/ |; s6 M7 \ C$ _( }; j0 m' u4 J* Y for(i=0;i<5;i++)9 o+ h4 M# @" E6 N) k: V' f% c
{
& a5 p. J7 J, X% W# G' n. I for(j=0x00FFFFFF;j>0;j--); // 延时
8 R1 _9 H7 ^3 L# i9 s; e% E/ a ECAPRead();
2 y% p1 a) F$ C& W* E }: G# r8 d& [& N4 S4 n
UARTPuts("\r\n",-1);
7 @/ G2 A: Q# L" m& p UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
0 e6 n! v7 b( @& N UARTPuts("------------------------------------------------------------\r\n", -1);5 ^% e) l, X2 r% ~
1 k& h" O, N& k8 \" ~; k$ j // 主循环+ q8 _' v( @3 [- A" O% _
for(;;)
4 g- n' k6 T5 I3 S4 z {$ ]' p+ ~* x9 ]2 _% N
0 H) S1 A: D6 ~ a) h
}5 [: m$ A- e+ t3 i. [
}
6 @$ i( s8 C- |& v/ A/ Y* O
0 \. K6 H, Q. X# T/****************************************************************************/
5 i/ H! S' W; g/ K/* */1 Y& L( L0 a: }* ~" u* N
/* PSC 初始化 */
% g" h- o3 ~5 q, I9 R' d/* */# M, I5 K: i9 v! m" H
/****************************************************************************/. t& ~- g9 T1 r
void PSCInit(void)
3 Y9 P4 q2 v% N" P. c{+ l4 h8 }* U$ _8 k0 P6 z
// 使能 EHRPWM 和 ECAP 模块/ h8 p$ I# N# E& ~
// 对相应外设模块的使能也可以在 BootLoader 中完成/ A% C; J" q. ~3 _9 a6 x y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. E2 Q# h. h8 i$ z/ H i PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; ?" U5 K& S% a% k. @}
p1 x" M8 \: {" y) U7 r: h2 ]+ L) D: G7 t: A% u9 ]$ `" E, i% ]
/****************************************************************************/# n2 d! g: v: }% e. n2 Z7 Y: d; H
/* */% F/ g X, b1 k
/* GPIO 管脚复用配置 */5 @( @% Q f b7 ]/ m7 f# s1 ^
/* */
& a% g2 E2 B3 V% f G; l/****************************************************************************/1 e3 A4 [: y9 v
void GPIOBankPinMuxSet(void)
1 ?' x9 z. y" j+ W{
* E: V x; i3 }! K) t1 J EHRPWM1PinMuxSetup();
' h1 `' q, O/ S" R2 R4 ], S9 x( @/ W0 a
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
) Q: ^* v0 B! V, y+ _7 ^. }- ?' v0 \ // 作为捕获功能时管脚方向为输入. y% L$ T, r" f0 J" k* M7 h+ e
// 作为辅助脉宽调制时管脚方向为输出
+ w) `2 d: Y M7 Z3 F" u1 i // ECAP2 / APWM23 X- O% W9 l9 q) u9 B
ECAPPinMuxSetup(2);
* c* f# L$ v, y# L
0 {$ H: f$ a" b q5 o( D8 H // ECAP2 / APWM2方向设置为输入
3 w1 t9 S# W0 E% i+ j GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
x2 P# W9 q2 |7 r% {1 ~- e}
0 X, C( X# U' V- B" n# q; Z$ j H4 u) M4 |, J4 F8 A$ K# P
/****************************************************************************/9 B) Q2 Z" |4 `+ s; _2 F2 I
/* */
* N ^& I }: n5 u# e1 s/* PWM 输出波形 */! M: o2 H6 E2 z& z9 ?
/* */: F% ?& P& o) p+ E
/****************************************************************************/
0 I4 h# r' H3 r, [: S/ B$ pvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio); k, K/ V' v! E& Q% m
{
0 T+ D/ L0 @0 y" X ~& l2 K // 时间基准配置" D! k# U3 k, s
// 时钟配置
. H2 q- M6 [( t1 ~* g$ _ l6 L' o; u EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);' T X j Z3 X4 K6 F( V: n$ P
& V! m( o+ n0 N% n3 C9 L# M9 U // 配置周期7 i4 e0 n* q4 \% K& y4 p$ ^1 Y
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
5 `% R0 @: Q% h! l2 C pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
' r0 k& o3 g9 W T% z% G7 m6 y" P- J# R- s: A) N
// 禁用输入同步信号
+ s+ s, I$ R* m" C; p$ M EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);8 N; |& M, _3 C+ G6 |
- M# R4 B/ K7 b& b& j
// 禁用输出同步信号 g- I# L$ j/ D s
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);* i- [& b# a7 ], U$ P) K- z& e& i
1 x: h8 X- {7 y {- ~
// 仿真(DEBUG)模式行为配置6 v5 B4 \) [4 W% X2 D0 y1 N. V
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
9 [: Q2 M; W A( ^+ w) d' e# \
+ n5 i* V: u; c" L, I! l5 p; @+ d // 配置计数比较器子模块
( [# \. [' F1 J6 q0 | // 加载比较器 A 值
* L3 A2 g4 J0 V2 W EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
( N0 P# h1 E1 J' M EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);& u. O5 L7 p* e- u
{' t. t. [; I/ x8 x6 J" u% b( @0 u // 加载比较器 B 值
( Z3 X& L+ \* j0 e1 P3 f% X EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
5 j, X! f# W' G6 Q. h& Z EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);) V0 Z: g' m$ L. w. y2 z4 G1 {6 R
% g, k7 Q5 L; U# o. t* |
// 功能限定配置(输出引脚触发方式设定)$ @7 ]3 d' Z! f% f
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
0 w% c3 N8 g. o% a/ I1 z/ t EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
& E& v* r2 ~7 A8 w6 K/ { EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,3 c3 `7 o" ?: n0 t4 l& X0 f& D
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
5 B$ N+ l" ^) j: G- F' X2 X" k
( P0 B' Z$ T6 e // 禁用(旁路,信号直接输出到斩波子模块)死区模块
Q: W1 |6 B/ g EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);1 M+ O; w+ _3 v7 G; C T* S
& |: c& h7 j8 s+ M // 禁用斩波子模块
E: e% a. k* B; h; W EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
" h: N- l4 f5 x
* c( i2 p" B1 V0 t# x7 r // 禁用错误控制事件- Y, ^! c- R7 t& ~! i
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
& V2 q1 N" t; o Q; w EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
0 }( a& E: u3 a- m6 E; P& v/ p. X7 k/ e9 Z/ ^ |' S4 x m
// 事件触发配置
1 U0 f( y' n4 N M/ Z // 每三次事件发生产生中断
% T; v2 n* d6 I EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
X. k S( {* e4 B3 J // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
, u2 X# L, E2 E* }# t% ?" q0 G) U EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
9 p# n! p$ E0 f // 使能中断
* W% G% [) K& f4 U& F0 y EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);8 n* C, R( ] |" y
2 f7 T" K3 ?8 O; u" r; d+ {1 d // 禁用高精度子模块
3 J M, m* \2 ?5 v7 D+ [ EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
" j% }3 Y/ Y' c( V0 z" L
+ U1 L. ~4 P( C UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
, b' u% U- j' n}- D* P- }+ U( b8 b% k1 j
1 C$ z, `# J3 qvoid ChopperWaveform(void), z: {$ p. B) | R6 o y
{
- \+ _' s' X4 E. P+ b( x! U // 50% 占空比% c% u+ ]) X( |; R# d, X% G
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);) ^$ M, u4 \% { G* [
// 4 分频: Y! H8 @( L# n6 n' Q
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
" b5 t0 ?! N8 b! _; V( z // 单个脉冲宽度
+ I C/ M( F5 R- |6 P) l' P EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);4 ^; r( l, _ P2 p
// 使能斩波子模块) V" D4 F% m' I* ^" N) |1 g
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
; n; L/ {; }8 L}
9 E0 t- R1 o+ I* P
: T/ F& y: @1 v6 i/****************************************************************************/5 V- W! Q+ ]. b8 E( `' P
/* */" B- a7 C, \8 N8 j0 W
/* PWM 中断初始化 */
% J0 @( J- ^- r, |+ X/* */5 e% v6 E# T- j
/****************************************************************************/- Q1 S" [9 I: u
void PWMInterruptInit(void)/ J+ G& E% [9 ~8 e- i% d
{& [9 }" T- D u# y" H
// 注册中断服务函数
5 H" @ x) f- b$ |: Z, V. B) S( R IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
4 J$ d0 ]* I2 w8 f; h6 K IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);/ ^9 Z( b. ^- B8 F5 S) x5 I
) L, k. v2 N! L
// 映射中断
) o! O; f5 A0 j7 v- V IntChannelSet(SYS_INT_EHRPWM1, 2);5 q& R0 Q. ?2 W& t. C; g
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
( f Z! B8 { ~, w6 y1 v5 c5 @, R z
P5 @# \! q) G // 使能中断. A* |- ~' b+ n+ O. O
IntSystemEnable(SYS_INT_EHRPWM1);
. A2 V9 ?# l4 n2 M6 P' v6 z4 B. e IntSystemEnable(SYS_INT_EHRPWM1TZ);) Z" g- s, n! l
}
, I3 {- `; F8 _
5 H; o- M' ?! [0 H/****************************************************************************/& N5 ~# C3 F5 I+ m
/* */
- j% Q$ g0 F5 E. k) y, z+ ]/* ARM 中断初始化 */
8 j2 ^% t7 `: N* z/* */. f4 a- u. e* q k( o! Z0 I
/****************************************************************************/# [9 p" R, Y5 j0 _" y. E
void InterruptInit(void)$ w0 B0 R4 U7 ]' K9 `
{# }2 c; d) t( S" ?# `
// 初始化 ARM 中断控制器3 Q* D) S/ f* E$ m% b. d T6 W
IntAINTCInit();
+ Q$ \0 ~4 R M8 [* e% W+ I; K2 C( i/ Q( Y
// 使能 IRQ(CPSR)1 J8 ^7 a: ^8 x& \& @5 C+ X) P9 I2 r3 X
IntMasterIRQEnable();5 y7 _3 ~7 N8 a! o7 Y$ Q* }
$ l" f% Q6 l% c1 O# p- ~
// 使能中断(AINTC GER)( T$ O1 d6 Z4 Y- C, n0 b0 }
IntGlobalEnable();
$ v+ m) H4 y2 c9 i7 }
* i- V/ \$ G" F: i // 使能中断(AINTC HIER)
$ O; u g, z! T8 _. H0 d1 C IntIRQEnable();7 G+ B8 w v# X2 M/ a- a
}2 u1 `0 N) p; n
4 Z% k+ |" S7 _: G |
|