|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
S; N, T3 S6 [( O- s& V) I- J/* */
! ^, k* X' T* k+ l1 h, I/* 宏定义 */
8 `! z3 c9 E$ m% a5 b/* */
- P9 d( r: S9 f9 y$ [' B( d/****************************************************************************/
- u0 d3 c) P+ z2 J# B# m9 O// 软件断点* M. J' K1 k* W6 m( p6 P% L0 @: h0 r
#define SW_BREAKPOINT asm(" SWBP 0 ");
, C: o' ^1 b0 o2 s
6 a% W ]+ z3 r: Q* s// 时钟分频9 o! E0 B, t2 ^! e. b0 }4 j
#define CLOCK_DIV_VAL 228
! C8 y! t+ W4 U: g* N7 S4 Z6 O: w
; Q7 N K* f! I4 N/ H0 Q: C/****************************************************************************/
0 O: G2 K; O; E" R) v; i/* */' T% T; i, ]! x# x1 V8 A2 G7 G
/* 全局变量 */ H0 O" z" K2 X2 G% C* f
/* */
( N; o$ \' d* N q/****************************************************************************/
/ @# h+ f7 ~( S" a! ~6 F0 LECAPCONTEXT ECAPResult;! B3 A, a4 G% q- O3 `! S& E5 H7 K
9 [6 W% J9 Z! e+ x
/****************************************************************************/3 v; x* x0 F3 b
/* */& w; z+ R& J" o* T6 X8 @
/* 函数声明 */" [3 b% ^) h6 h" }7 t6 G: v, e' T5 y
/* */$ o$ l3 z& S9 u! }* z. w6 A
/****************************************************************************/' w% |- h" _, ^- P0 i4 F- r4 Y
// 外设使能配置
# T7 l: K/ q- yvoid PSCInit(void);# g) x) o: E3 o- Z. o
1 a! J" t5 M9 c1 v6 N1 K// GPIO 管脚复用配置
( u/ ]3 \* _0 k: ]( evoid GPIOBankPinMuxSet();3 T. y' {2 E! w4 E E0 g! ^
0 T% M4 ~0 F4 f: ?9 T- h; h// 产生波形6 C) i$ F, {3 Z8 I' [( O
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);" A& y/ \ q: p0 t) z) @& @5 R
void ChopperWaveform(void);; i7 o' S3 s6 ~
, Z) M; G$ G0 r// ECAP初始化和读函数
! d8 ?2 L9 Z9 J' g5 Q" fvoid ECAPInit(void);( B! S' f& N& j, L
unsigned int ECAPRead(void);9 A: [, V7 u9 Y! y3 X
8 z& p' Z+ n) g' P% d1 d0 o//ARM 中断初始化
3 X; N' `. r' l" W0 Y% `6 I& B8 `void InterruptInit(void);/ V& i" ?. ~- w2 d9 u) l. ~% S
# z1 ~; |( }9 R
// PWM 中断初始化
4 i) R1 A/ z0 V: jvoid PWMInterruptInit(void);
- o( ]) ~/ ]% C1 n3 j) F// 中断服务函数
5 v. H6 @9 d0 G// PWM 事件1 `. D7 V! ?0 U# I! T& Z+ }5 X
void PWMEventIsr(void);4 v5 N( [6 A/ x @2 `" P; j
// PWM 错误控制事件
+ b v3 n0 n! [void PWMTZIsr(void);
! Z1 |5 Q2 }4 x, D* a+ b
; g5 d5 V' m+ v" F9 I; b c7 f, m2 z/****************************************************************************/( ^; p# e- ?. O @
/* */
; E/ M" Y" M/ O$ V" ~4 `; t/* 主函数 */4 J$ D. `7 i! f
/* */+ p" x* p% p3 p. C6 K
/****************************************************************************/- X Y, z, F* D3 l/ S
int main(void)/ i J% \7 P s: {1 c
{7 r( G; l& R4 U/ a* `/ x# a- F' i
// 外设使能配置, t1 e* ] y4 b- B; g
PSCInit();- W0 h: K/ G4 H5 E3 D
" T1 P( h" P+ f& W
// 初始化串口终端 使用串口2
5 D- K$ F' N& V' i3 C UARTStdioInit();
; Y, o3 |& Z4 o L% ^' I
% p- p6 N. z/ ~ j7 L8 j0 c // GPIO 管脚复用配置& M7 \6 V5 c6 |
GPIOBankPinMuxSet();+ Y4 k; l, y U; X/ n: d# r
^; a+ |* q- y2 N# O. L" y // ARM 中断初始化
9 g$ j! E2 c F* P1 a5 I# I: @ InterruptInit();" r) P& K# } h7 d- D9 R% J
4 v# {3 r# r! i, W2 K' o // PWM 中断初始化( V7 g% t, D3 O1 {/ K
PWMInterruptInit();
/ r5 T- w! I0 ]% \
3 z" ?$ h4 a* V9 s. } unsigned char i;" U' ^% S, P: [
unsigned int j;! f$ F$ \# `5 l9 b& J$ I/ G9 B
' A2 Y8 f; R5 G0 _% B* N$ d
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
" W+ A8 r |- @: n8 X; ^5 B0 y UARTPuts("------------------------------------------------------------\r\n", -1);
% M3 q& l- N8 Q UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
* W4 @1 `' t3 D* \ // 产生波形6 Y1 ^- A6 d8 g' ?/ g: V
PWM1ABasic(25000,50);
$ V2 h6 h. g7 e5 c4 G3 ~$ `: ~* B
UARTPuts(" C6748 PWM Test Over!\r\n",-1);$ A; K- `9 b/ o& r0 g
UARTPuts("------------------------------------------------------------\r\n", -1);6 {4 ~+ `2 s! L; C! J, U' C
R( `- Q/ ^; Y! \
& D2 c- z6 }2 ]; q
4 P; e+ e4 ~. n2 j" u+ S1 T, E UARTPuts("------------------------------------------------------------\r\n", -1);
/ ] y2 I) k; ?) _- { UARTPuts(" C6748 ECAP Test\r\n", -1);
% V0 C$ Z& Z% a8 N1 {$ H // ECAP 捕获初始化" Q% [1 b5 z4 |5 v5 q
ECAPInit();8 y: B1 S/ m& W X, I4 ~" p- ~
UARTPuts("Initialize ECAP.......\r\n",-1);
! m7 }6 f! a. s- D* e q for(i=0;i<5;i++)
9 c1 M$ [ s! w, P F+ R {
3 [1 R3 C& h6 ^1 f" z for(j=0x00FFFFFF;j>0;j--); // 延时
: Z; V9 W; k* r% O& [( _ ECAPRead();
: ? d# n5 [( J. E( |" r$ S) x) Y: ] }
5 q2 l s9 h) {$ A UARTPuts("\r\n",-1);
8 Z: l5 k$ z r! B+ i UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
" b" b! q' \+ @) T. X* A UARTPuts("------------------------------------------------------------\r\n", -1);
, H2 J! M$ h1 z2 e1 X
+ s) C3 B# c, H6 L& j. d1 `6 @ // 主循环
, a0 C( z$ ?, ~! b, ?- I for(;;)
0 ^4 w# N5 e6 t/ v {
e5 {& c0 `6 U" k" T2 X" l: i$ E
% B, A: b) [% |- c }
. L; N8 e6 ^6 n3 t2 L}
- x1 ]' g( h+ n6 q2 i0 a$ Z C6 }) w, a% Q
/****************************************************************************/
- E. d4 }3 ?1 h' L/* *// y$ M* u* V" f$ R3 [6 i
/* PSC 初始化 */
$ b! x' D Q1 l2 B/* */1 b$ s1 u5 }+ D7 I1 M) F2 z
/****************************************************************************/
0 b0 s6 J0 E) Z' |void PSCInit(void)* Y P4 t+ D+ Q+ t' Q
{) X' y4 c: S/ {: B# P6 ^' l/ o
// 使能 EHRPWM 和 ECAP 模块6 j: \! `' ^$ u; B; l2 D
// 对相应外设模块的使能也可以在 BootLoader 中完成
- [0 l" |. P! _. E V PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);) y( R: I" q$ |% E/ T
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);, { B( ?5 Q+ }6 ~$ E ~1 u" y3 E
}: W' Z0 ]8 W8 Y5 V
. C' `; I4 W B& A; Z/****************************************************************************/- T+ \4 W6 Q, V G" \, C+ {
/* */; n) p- J) z5 [" R/ w" J
/* GPIO 管脚复用配置 */
0 {7 V1 q4 F: ?8 e) H- F+ b4 Q/* */
9 {3 T: a. g8 _0 x: I' D8 ]/****************************************************************************/
, ?% o$ [0 f3 c, hvoid GPIOBankPinMuxSet(void)
% r6 y- @6 B1 ]9 E: c1 r{
: h8 H/ a8 t8 i7 t% ?3 x# G: ] EHRPWM1PinMuxSetup();
6 L; V( Q/ V5 S& @/ q$ e
: W+ z' }8 ?) Y7 s6 b/ m" J. R8 | // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)6 u- L5 e: z9 G
// 作为捕获功能时管脚方向为输入* l$ v' W0 B6 t) f" o7 Y+ L
// 作为辅助脉宽调制时管脚方向为输出
7 J* E Y2 q. H7 y+ D2 S // ECAP2 / APWM2* W3 z v) {7 c' y5 P! g: y
ECAPPinMuxSetup(2);& M+ E( m0 `6 R7 ~9 K" s* E
* q4 m6 ^: F3 p3 a' L z4 i2 D
// ECAP2 / APWM2方向设置为输入 U( \ H$ |4 e" |. X* l
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]" V! p# ]& A" i: {9 S) q$ w9 X+ O9 d3 `
}
2 k1 v7 d+ p3 c9 @" c8 t* {9 j6 D3 \8 |
/****************************************************************************/
; Q# g% I3 u/ r( k/* */
. e/ ?- X: q7 L9 t/* PWM 输出波形 */+ [* u( _0 d3 M
/* */! A$ F2 A, e8 V
/****************************************************************************/
' B/ ^/ W: a# {+ Ovoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
* ^; }; w9 {. C; I* s7 M{8 Z7 Q* ]$ x! ?4 Y4 a2 e% r
// 时间基准配置! D( @, X" U5 }6 k; x& _: y6 ?/ l
// 时钟配置
/ q0 [- X n" w6 ] EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
- U/ Y& t; x( m' I6 e$ l$ a; J6 a y; B( B' M
// 配置周期7 Q1 b( E) Z% Q
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
`" O0 l6 ?7 Y8 q pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);- I/ c. X, Q: Y: a( k3 `" @+ @0 }
7 |; g$ v3 D; Q3 D* Z+ U // 禁用输入同步信号/ T& E k; z" q: A5 x" p
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
) I }% _- v: r. P' y+ G& m! m& D# N. n6 W4 E2 V
// 禁用输出同步信号
2 I# p) @! P$ k7 i3 f! i- P EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);, X( W% e: K" {- r3 ^
# p5 r" d# C1 O% |3 B A
// 仿真(DEBUG)模式行为配置- m" X; \( F% \7 l/ T$ m
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);+ b& z% D- M; d. d
: o: C/ c7 V. ^
// 配置计数比较器子模块8 q7 C' }& B: A% c% n) U
// 加载比较器 A 值* \. U, Y4 S* V/ q
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
/ H9 V( X* x. h7 [5 I, I2 Q EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
% M! m8 t. u9 Y% P# I) n4 J, F
/ c1 L( u: k4 B // 加载比较器 B 值
. p% Y' w3 n! m% K4 W0 P$ p EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,9 m5 X+ n% c t+ ~: ?: `
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
& ^- X% h3 P( k# A% ~$ q% K/ t- r) t9 C/ g" A. u
// 功能限定配置(输出引脚触发方式设定)
+ R& L E, y, V' Z& R! l // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出3 ]/ Y+ `! q' Y
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
6 u. c }0 y9 a+ {( c. n9 ^4 I EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE," t* d8 i' t3 j' x% X3 G
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
/ R+ `5 Z) i' {& g* I G, K8 b7 X9 E% K, U/ ?
// 禁用(旁路,信号直接输出到斩波子模块)死区模块: \1 W& N& _6 c
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
0 x' P1 P% p, r% d( o1 f
# [1 i& j# R+ {! r( L6 y // 禁用斩波子模块2 V& B- R, V' p+ A( j A& L8 K
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
I: u( i, g; h# M$ B2 x& o
9 J5 {7 G2 p1 a // 禁用错误控制事件0 D$ l, A, R3 U1 E8 K" Y( \, r- E
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
: E1 x% \, `. e EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);" e$ h3 Z- C7 ^& r, |& h( ~, I
# c6 }: G- P7 `# I6 \ // 事件触发配置
* D; {5 ^7 E# Y // 每三次事件发生产生中断
) T7 P4 b! \9 X: a EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);. b8 J( C2 p7 @" P
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
$ Q* L: K* `8 n' c& r+ o3 m: Z7 o EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);. z; i7 ]2 Q3 Z; X
// 使能中断: N( L. x' X# ^% `) M. Y& x
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);% d9 @+ @ r( E3 m2 X# h% e, A8 Q& c
% g$ M% ` J; b% B, ^( W! J // 禁用高精度子模块
. l3 I0 D4 T- q8 o) P3 g" g EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
. Z9 ? @9 A% M0 B* H" r
' g' _8 ~' `: i3 m k UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
- L8 V+ ?1 ?4 _1 B( L5 v}
/ i+ P O# t `+ Y& `
0 A% D N3 s9 f9 n' C+ s avoid ChopperWaveform(void); O0 Z! @3 h, c4 l- y# v
{& E9 }8 [% w( Q0 a5 z( H; @) [
// 50% 占空比
4 n9 z' a2 j' ^6 P4 d A ] EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
A6 R' P x) ?7 K // 4 分频; U% g+ W3 l8 U7 w9 n2 w
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
/ t% f/ P) h0 c" u# y- f1 P) d // 单个脉冲宽度
( [0 P; N0 }! `( E% M EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);" F6 d3 _% O2 _; c% R
// 使能斩波子模块( @8 d. j! ?6 b- O9 K
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
8 {8 K) b! e$ o* T. n9 ]& ?}; P* C: a. |* G3 _3 p) L
; b0 p y# U+ }7 `! m
/****************************************************************************/# Z9 @; c, z! z! S
/* */8 @2 I2 x1 t5 ~) a# b
/* PWM 中断初始化 */
% y4 Y; j5 k$ l/ K/* */& H# c* |4 Z! Q5 I2 S
/****************************************************************************/# q- w* |# V* }4 [7 y# x
void PWMInterruptInit(void)( p0 d/ D6 g l) e! u% ?
{, j* }& A8 e% f. ], R: X
// 注册中断服务函数
4 |' w. V' b8 B8 g IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);1 ? u5 B* G7 E3 _
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
3 r$ d9 q8 R0 b$ d6 t
6 x+ o1 I5 {( j1 N# @/ g" { // 映射中断
! i" W* b) e0 ]$ A: Q' r& W IntChannelSet(SYS_INT_EHRPWM1, 2);3 g' U- k; D/ e% y, r
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);2 v1 l( t! N% x& w; h) l
4 c( r) A3 U( y' o
// 使能中断2 i) ^* c0 B+ D& d, h9 O% T
IntSystemEnable(SYS_INT_EHRPWM1);# ]9 j4 |2 ^( z5 @
IntSystemEnable(SYS_INT_EHRPWM1TZ);
' Y0 i! |; E* c& p}
. S5 i w* i/ D8 j6 L& s& x
% a# g! U& H" ]7 m6 `- k/****************************************************************************/# l0 [/ t3 I b0 G
/* */3 @$ H. C. }6 ^% M9 o" V6 L* {
/* ARM 中断初始化 */) Z+ T/ q: L* B& }4 g
/* */
6 h8 ]0 O. m. ?, H" X; m, q/****************************************************************************/
+ i1 | d6 H/ q' t7 V+ q7 O/ ivoid InterruptInit(void)
& I/ |5 I7 B( |8 m+ x; h! W{
$ S" l- E! x- r // 初始化 ARM 中断控制器- Q, z% v: Q3 t! ?4 j; [
IntAINTCInit();
: N, P S& c f0 \* B, {. h- B6 \4 `/ \) L
// 使能 IRQ(CPSR)
2 k# r8 l) m* O- O) W; E IntMasterIRQEnable();3 V. B; n" H+ v, l9 y1 Y6 p
6 f1 g0 e5 z6 m- ~5 K8 [1 z0 F
// 使能中断(AINTC GER)6 B0 U! v+ P- o# Y/ |& D0 N
IntGlobalEnable();
5 _8 Y9 R9 ]9 d' d7 \; V' z- M* g; X% `4 m; N* k+ n
// 使能中断(AINTC HIER); v0 O: @1 l$ _4 |$ Q! Z0 O* J
IntIRQEnable();+ e8 }+ V0 j4 e8 S+ p
}. a( g/ a S2 V+ o6 X
8 ?4 S6 B) w. O* @$ f3 J
|
|