|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
& O: y a6 H% L" J4 A* D/* */4 f1 t! m( m8 [- T9 [' Y8 n# {
/* 宏定义 */% d# }* a: c4 d7 W2 z8 p
/* */* T/ M9 {" Z3 x. Q
/****************************************************************************/: [( ]& p" v( a/ Y
// 软件断点! F) D7 _% o' ]! y# N! m( o. ?$ O. d
#define SW_BREAKPOINT asm(" SWBP 0 ");
, c# o- ?3 g$ W) ` L5 b" I: ]5 V0 Z
// 时钟分频
1 ^2 g& ?: ?/ D% C#define CLOCK_DIV_VAL 228
) a+ T$ K) u0 D! B# b5 W) C3 f
4 p- j: d7 a) P/****************************************************************************/. R7 O9 x- _$ F4 U+ u7 l
/* */ E( ^5 u+ ^7 }# D% f* f
/* 全局变量 */
$ ^1 Q( z$ F [- | m/* */& A# A$ T V0 V4 A u
/****************************************************************************/
! {* e7 c6 J7 j& i! aECAPCONTEXT ECAPResult;
! C: J( t) O7 I2 P0 D
- z2 n. X% q! l& X' L/****************************************************************************/; z+ h# _0 x" ?0 ]8 i1 X
/* */; S# `8 c% [6 N% [' B
/* 函数声明 */
+ z; o5 O- ^9 o- Z7 m9 Y/* */4 n0 M" r- W! P/ G3 K+ V, p
/****************************************************************************/
% U+ Z9 A% b4 L0 \// 外设使能配置5 A+ s, ]& J7 q/ H; e+ X; c5 c
void PSCInit(void);5 q0 n' q0 u0 i/ f( c& S8 [
' Y, M1 r u |- S$ B V3 T
// GPIO 管脚复用配置: q9 A# A3 A- y1 H. \! t/ {
void GPIOBankPinMuxSet();' v" e& e! M) p# n4 n& O
8 |2 l6 A) F# m3 Y& Q& i$ m
// 产生波形# ^( v! P2 d1 ^$ y! g7 F
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);9 O& b$ W0 @2 _% ?3 U
void ChopperWaveform(void);$ a# @6 o2 b, x$ w+ e; }6 p4 X7 L/ W
2 |- G. Z9 L8 z- V7 c- _// ECAP初始化和读函数5 o+ ^8 J+ f' S4 R( R6 O3 O
void ECAPInit(void);. Q' u, T0 J X6 w) j$ u( y. W
unsigned int ECAPRead(void);- f1 I1 c4 O, W; |6 U" p2 ?
7 o ?% V! [9 }1 Z/ v. Y* O//ARM 中断初始化! a9 u' w5 B8 M& a+ X* T; z6 I
void InterruptInit(void);
8 o' l3 ?' g: q$ m) o8 ~) }4 h( ^; e& V
// PWM 中断初始化
- n8 H! r% A c0 X7 D ivoid PWMInterruptInit(void);
" D0 V- S5 X: o8 j# Q// 中断服务函数
1 N/ u' C6 ?+ B: e; y: j, E2 k// PWM 事件
! A8 ]! u$ P( v0 u6 a6 g6 {void PWMEventIsr(void);& G8 D h) p% e7 \
// PWM 错误控制事件
- t# t( C* I7 A& Y. z7 d/ ?void PWMTZIsr(void);
# I9 h5 T3 E- x; G3 l# L
]; }' Y' H7 _! R! h# E4 A& y/****************************************************************************/% M* @% G+ ]( v$ r$ w; `
/* */
1 _; {+ R( `" x' M( K/* 主函数 */) D# Y) c8 d0 e4 n& f/ |2 C
/* */
; r/ v5 v; b& w6 z( T/****************************************************************************/4 L3 ?8 {" x% T* F0 i4 h) t
int main(void)
2 ?+ b- u+ B _/ r{
6 H# x* Y. U$ l // 外设使能配置
1 P3 m0 b' }. G0 R PSCInit();' g1 W& C7 A' b
) K/ z: ?9 S, s+ M% x. M
// 初始化串口终端 使用串口2% O. I4 N* C4 i' w! ^: M: Z
UARTStdioInit();
: C! ~; ^8 z( c! P4 Q3 R3 e6 { ; Y' z/ f/ y2 E* j, f% [; [6 ~" R
// GPIO 管脚复用配置
3 R( l* C2 h' S GPIOBankPinMuxSet();( K: r3 G* {1 M
0 `3 ]- g, }% t/ W+ l9 v! l$ Z
// ARM 中断初始化0 F* p) s) t7 i }/ d5 W5 V0 f
InterruptInit();! ]) y3 ~- u' _* J
7 s2 q) d( w1 P // PWM 中断初始化
3 ]6 d4 o, v1 r1 w" g6 Z1 N. p PWMInterruptInit();3 p- A: a/ H! p4 P! u, p7 I' k7 X
7 n( x- L ?2 H. v. j$ a( @ unsigned char i;
4 B$ [' L V/ ~0 ?3 a% u* H" t! O- s unsigned int j;! J. k6 p! w9 [
[; X. N" x: I! C UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);% b0 |! b C7 x$ V
UARTPuts("------------------------------------------------------------\r\n", -1);- P1 s3 u7 B5 f$ t1 N' G7 I
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
) E4 A& f& n0 f. Q // 产生波形* [# Z' [) s- a0 r# N p* p7 ?
PWM1ABasic(25000,50);$ d( J: Z+ i8 Z2 S6 v, l
. S/ S3 u# X2 P( a0 y h4 W9 N
UARTPuts(" C6748 PWM Test Over!\r\n",-1);% V" g# f+ Q$ e7 b
UARTPuts("------------------------------------------------------------\r\n", -1);) C; Z& m- R& Y) F) n9 a
; K: {, P0 |$ g: f0 s- F1 L1 e
0 p, `5 z4 u+ Q: R% c1 j& ], I4 S1 O% |+ `) e
UARTPuts("------------------------------------------------------------\r\n", -1);
- @( n# m* J0 W$ Z* P& ~, m UARTPuts(" C6748 ECAP Test\r\n", -1);3 k8 P6 }" C, V$ _
// ECAP 捕获初始化
# }9 K5 A7 M G9 `3 D" [ ECAPInit();
! d1 B% Z1 ~0 t$ l0 b UARTPuts("Initialize ECAP.......\r\n",-1);
, y" o' x X; T( g2 E" [* A) J1 c for(i=0;i<5;i++); i' s$ B* |3 ?
{$ [, J/ B1 O! s: T0 S; t- c
for(j=0x00FFFFFF;j>0;j--); // 延时
. ?. J+ V9 w5 y: t6 \ ECAPRead();
! y' [2 t- J3 h4 d }% n+ F$ [% ^* L8 h0 F2 M
UARTPuts("\r\n",-1);
' {8 Z3 p2 x7 C# c4 ~/ @- R, A, t UARTPuts(" C6748 ECAP Test Over!\r\n",-1);& ?* f4 H% v4 N2 h" D; z2 N# r
UARTPuts("------------------------------------------------------------\r\n", -1);) O6 I( Z" i( z& e; _ W
- h* A3 R( ]6 d" s // 主循环, u0 }! P& g; J4 m \* Q$ v
for(;;)* u2 A; Z3 ^5 }% s! I6 F
{
$ B4 J5 l4 a3 n7 C! d7 i( j3 \7 Q0 d& T# D0 t
}
8 x7 f0 K( t- U& n. a& k) l, z/ q}
}5 Q6 b' C; w) M
( b3 |! n3 f; z! V8 x# k2 K; N/ n/ l/****************************************************************************/ G4 c+ J3 |6 g+ r9 C
/* */
0 B; r. u8 g3 L: B. N/* PSC 初始化 */
% z2 G5 }% `- b+ y: ~3 f" w/* */; w! E0 {# o0 ?& L
/****************************************************************************/
" r3 }" u* l5 B x& ` k( Ivoid PSCInit(void)
/ J$ K7 ~' N( k5 e0 |* m+ q{
; N9 D Q# {# w // 使能 EHRPWM 和 ECAP 模块
5 f( v/ p ~. `+ s // 对相应外设模块的使能也可以在 BootLoader 中完成' Y! x, U( d) d- ~; ?7 g3 u7 ^
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
, G/ Y7 v }3 P) P3 ? PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); W7 ?7 r% x5 Y# C
}
) n8 Q/ s$ n! S* X7 M
# c3 V$ j0 h) S+ s/ k# J% z/****************************************************************************/
/ V$ ~' q+ E" B$ c/* */
# F3 m5 ^3 @8 Y- `: V/* GPIO 管脚复用配置 */
3 {5 s; ]& [5 m/ @/* */& o7 O! a1 A" D4 a7 f' V
/****************************************************************************/; V, w# m$ M( X& L, m$ o
void GPIOBankPinMuxSet(void): Y5 W) r% F( s+ g8 [! ?
{' Q E" E' [! }5 n% k
EHRPWM1PinMuxSetup();: W' e/ m3 S% r( g+ S4 z
- g) Y% U/ `3 E! r // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP) `9 w' I# \3 [* m5 J/ \
// 作为捕获功能时管脚方向为输入. I4 C" a4 Y* H7 u
// 作为辅助脉宽调制时管脚方向为输出4 N3 o# ~9 M2 y. l* {9 d
// ECAP2 / APWM2- N: o$ m. p0 H$ E
ECAPPinMuxSetup(2);
# G1 `" P" k9 P2 P* b
k8 i0 [" `' \1 F. V+ x // ECAP2 / APWM2方向设置为输入( R K+ P: h# i' g1 X
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]' ~: P& a2 t; J. w$ e2 A
}2 g* u2 A; k7 _" c. ^7 u2 q
+ ~- w6 g) D X3 A. V4 |2 I& F, j/****************************************************************************/
8 k* U) y1 O- j9 }* _0 O/* */' t% H1 v2 A( M
/* PWM 输出波形 */
: W. c. [4 Y& u& M+ w/* */' D6 \; M" T; v* r1 f; `
/****************************************************************************/
8 c& h. e( Q+ E) I5 i* t* h5 j2 wvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
' C- K' t5 P5 F{
0 @: r( ~! O: u, y5 o // 时间基准配置
7 l. i! a/ Z# c9 g! Q1 ~( l // 时钟配置
/ E p4 G0 J% {, F# Y EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);5 K! \( H, n9 N: l: ?5 _) v
: t8 P; G4 n: l2 a) \! c3 e
// 配置周期 V6 _5 m( z- M/ L+ I
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
; @$ i, G9 o* l" E/ l4 e pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);" L- V- `; }7 D; r
' S) P- S( A$ g$ D
// 禁用输入同步信号
2 Q, e5 T# p% ?+ g0 R% P# k EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);8 U9 e7 ?2 }' @' I
* T& L- \3 K' x/ g0 h // 禁用输出同步信号
1 k6 g' T) V# h0 O# Z; i7 s$ c EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);. D6 L6 x" B `2 U
7 ^ m2 h; m! i
// 仿真(DEBUG)模式行为配置" c3 ~6 s' ?2 \) A Y
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
4 x. X" r K. k5 w" S+ V& s2 e' u# `6 C* m
// 配置计数比较器子模块( ~& e2 q h- J- M8 s, l
// 加载比较器 A 值
& N z; Z! L: `5 \& Z* Z* _1 j& y EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
5 y0 S! c/ R3 g9 W8 V EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
, v+ ~( O9 Y( U8 O! K
3 R; N) W3 m6 g5 h // 加载比较器 B 值+ Y( ]9 N& @- `9 C( u, Q; F7 \
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE, g# U5 ?- ]9 ]& r+ G, X
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);$ a* n+ r7 m. `, L/ A* k, u
+ |+ v4 Q5 T5 w# l* i( Z
// 功能限定配置(输出引脚触发方式设定)$ Y3 M: G( S2 A2 w# U/ ^' v6 e ]; G
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
9 a- @# d+ ~+ P* o EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
& a8 ]0 r5 ?3 D EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
8 v3 \2 u$ X9 K& W EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
9 S. e) L$ y3 H! q$ J0 a$ j& e( ?6 p6 `* Z
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
7 ]2 B1 l l5 p! A8 A. V EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
$ ~, A; }3 Y# h* ~+ O) }0 v6 l5 h0 V
% K* k8 M- M/ y4 Z: ^2 v/ { // 禁用斩波子模块
1 \* G% W5 v+ X$ _1 x EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
! ?( ~1 Z3 m; S; P0 y
& p1 H- M t D. Y3 @ // 禁用错误控制事件& g3 O8 _! K+ a
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
2 H1 W3 s" ]" G4 v EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
. A2 i2 I% A9 H7 ?. c# T5 w7 `
& M- ]3 E" w1 R$ c& }8 v( H9 z // 事件触发配置
" s! [+ z* I/ d2 L // 每三次事件发生产生中断' C/ H% A/ d' ^; @! o( ?
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
* v; R% x# a3 P: \( D" C1 @ // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
' Q, V; s, y2 y, u5 s EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);% u4 `' a- ~ O9 G# W7 {
// 使能中断
8 N8 w4 U* ?( y+ f EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
9 e+ r" X- b! ]0 t7 S* r" Q
1 `: {! J; d. I. N, R8 ~1 g // 禁用高精度子模块
4 a. ~/ C* l' h+ u4 @* n! A EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
* Y/ \0 g$ C& j r# S) W! {% N0 W" N" @+ P+ K% ~& l) b
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
@7 F1 H- K' T; ?}+ ?7 F1 l% n- P* e! ~* i
5 p3 E% u5 ~% D$ M+ M+ lvoid ChopperWaveform(void)# B+ D6 g# }$ q" M4 l( x6 q: I3 E
{
5 d+ X7 ^: j1 {) A/ u1 {8 P9 _ // 50% 占空比2 L# }& u7 T9 Z. ]
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);. f4 C0 U( ^, y
// 4 分频
5 K/ K2 J" a+ { EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4); I% S0 H# T2 v6 D z( _2 C! T$ D2 @
// 单个脉冲宽度
9 K6 ]3 g2 z$ q+ ]9 k EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
0 v; L9 a6 Z. D+ y1 ? // 使能斩波子模块
" ?3 D5 G) l ~; e EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);3 I9 b1 u- X" ` E( m
}
7 h) Q+ g! U, Y, Z0 |! y
: ]# e& {9 m& i5 w/ Z/****************************************************************************// [0 S$ W# A/ A
/* */( ?( f/ z; ^: Y; ^- j: j
/* PWM 中断初始化 */ [0 a% D) T9 ]# {& k+ j
/* */: l2 ^) [8 t# N
/****************************************************************************/
- _6 E; n2 j4 z/ r& Gvoid PWMInterruptInit(void)
, G7 K G7 ^% F, L$ C" o{8 |0 _5 l5 D( I+ I% i
// 注册中断服务函数3 y% t4 U$ k, Z* B( ?
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);! O; Y+ ?7 A" E: i' u# j
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);0 l2 R' H- S9 \ N5 N$ {+ b
' l. {6 ~5 I2 o# ]4 q // 映射中断
" e& v# G8 u! m3 P IntChannelSet(SYS_INT_EHRPWM1, 2);4 G2 _- E( t$ p1 d" l& l
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
$ K& g6 c! s% c( b+ V! _, D& d$ |1 {9 b9 @; t$ O
// 使能中断7 u2 G3 f! b/ E' v8 s
IntSystemEnable(SYS_INT_EHRPWM1);
5 c% D& X5 V) K3 |# Q Q IntSystemEnable(SYS_INT_EHRPWM1TZ);
, Z9 ]* Y- _% ^* m# R! A}4 S0 _6 q, f& i# ^
# M% v" j; c6 z4 G4 S
/****************************************************************************/
& U! Q" |( m2 }1 r* U9 N/* */
$ T! k$ J* i, C0 T5 P/* ARM 中断初始化 */
% }" t5 I5 f7 i3 B F5 k/* */4 @ r8 O9 e' n: {8 J/ e3 ?
/****************************************************************************/
) B2 v& {. [% a4 B& Evoid InterruptInit(void)+ ^4 ^/ \5 W1 y( c: E3 ]5 w
{2 C# q: K, e! [: ?: ~) i
// 初始化 ARM 中断控制器
! F( X) }: E% y; ?& `1 m IntAINTCInit();
* Y6 }. L! d+ Q k/ ^# e
7 d% J2 B5 L' a" ^3 }8 t& g // 使能 IRQ(CPSR)5 Z; B4 V, j! R" A" e) }
IntMasterIRQEnable();0 I' n- j( e/ p
0 s/ Z: K$ K3 u7 F* A+ N6 O% ]( s // 使能中断(AINTC GER)+ i$ {: b3 ^" F7 w
IntGlobalEnable();) H3 t5 H( A4 `& [* l( h: u6 ^% S( E
+ I8 ]' }7 e3 U$ ` // 使能中断(AINTC HIER)8 `! j( i, T1 _% I/ A% ]& Q
IntIRQEnable();
4 Z% Q6 `' z' D}8 H0 N6 k2 i) v/ V' X
( M5 a# P. \/ {. S |
|