|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
# x5 ?' S( R& u+ w. r/* */) k$ x2 d0 Z/ r7 A, [- U8 K% l
/* 宏定义 */
/ s1 K$ X, j- E/* */+ d3 K3 k6 w* Z' e# m/ ]
/****************************************************************************/
, I3 o) ^4 L- g9 W0 v1 ~// 软件断点
# T- E7 X& [: x t1 a0 [# F#define SW_BREAKPOINT asm(" SWBP 0 ");( K0 B( H+ k/ B) s8 @
3 j b5 e+ v0 Y; z2 M, A// 时钟分频% {; R- N1 ~! s( q* @6 J0 e
#define CLOCK_DIV_VAL 228( @$ \2 J; }. S, @0 r$ e, o( X; U
( h2 x0 m6 l1 N( M) e6 `* J; Q3 l
/****************************************************************************/
' i: y7 K% s8 ~0 L8 G/* */8 d# v0 X) `" B! L& G
/* 全局变量 */
8 y! p+ x8 L$ C( e4 C' E/* */
1 @8 ^+ v0 H5 _/ `* S" Q- I/****************************************************************************/
" I; Y) c2 B$ F$ ^) k( W3 SECAPCONTEXT ECAPResult;! \8 a% y- ^; H
+ z* ?$ |" ^1 l$ `% l/****************************************************************************/0 ?% S) p+ {& t
/* */
6 o) [* Q8 U7 L' n/* 函数声明 */
5 {! N; l2 y) X# e! Q" I/* */
5 w1 {3 o/ Q4 \1 S/****************************************************************************/7 \1 B- ~* ~& d n. |( O8 B
// 外设使能配置1 Z0 h0 a' h, @8 A, ?3 i1 _- Z9 X _& @
void PSCInit(void);
' X+ v7 g z( i; \' \5 h( s4 f4 U0 H. D: a
// GPIO 管脚复用配置1 b/ O4 E9 f) t/ I! T
void GPIOBankPinMuxSet();
8 R, q# ~- ]0 t a2 o" p+ b4 S3 \- Y. I# }" O5 |
// 产生波形
5 z0 h) d/ i" n. N8 ]# f7 h5 O8 t& Rvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
& H( V) A6 W4 Z& r1 F1 `1 l7 lvoid ChopperWaveform(void);
& G3 K9 T/ u8 ^+ ~
8 \2 i$ W$ H0 Z2 b9 ~7 f// ECAP初始化和读函数: }' X: b1 ~/ g& K
void ECAPInit(void);
. s+ `3 x' [- Hunsigned int ECAPRead(void);! D. L- H& d' t- M; Z0 K
3 X3 Y+ k: z5 P1 n0 \1 c//ARM 中断初始化( y4 Z9 @+ e. v, @) g7 Y8 M
void InterruptInit(void);" @7 T) h6 W0 h5 e6 R
$ S1 C; q# h" H7 G* K
// PWM 中断初始化
; _* ^) W) c9 Y# O2 G) o8 hvoid PWMInterruptInit(void);! {8 J$ p* S2 a0 {- {) I- i
// 中断服务函数
. a0 Y( p2 [) H! f1 ^2 s0 `0 Q// PWM 事件
/ @0 q% q3 H; [void PWMEventIsr(void); @" F4 I3 _* N/ D! l5 I9 F
// PWM 错误控制事件
! n7 A1 R( u1 y# yvoid PWMTZIsr(void);
# p/ }+ S" i7 {) I. t. ~& F
. t0 ~/ Y' i% `' `7 n/****************************************************************************/: z" f- a! a: |4 K# B" h' @
/* */2 r$ N- ~+ d( l; o- O
/* 主函数 */# l' Y4 u! U9 x1 ?# {
/* */
) q/ l! n2 b0 X, f: r7 k/****************************************************************************/
0 ?3 B2 [( f$ p9 wint main(void)
! @* ^" m6 _5 x{
: K0 K$ J1 |5 W2 e8 a. X // 外设使能配置8 Z; c. Y. f7 g+ E4 c) P- [" ~
PSCInit();
% b% o0 m0 z" T) ]* i( S3 ?- ^- I% @9 }) @- h
// 初始化串口终端 使用串口2
" t* u! {: N' ^6 U UARTStdioInit();$ ]- I* e- a& D8 v: |
2 F% m' z8 y# c
// GPIO 管脚复用配置 p" @4 ~' g0 r- G
GPIOBankPinMuxSet();
8 `+ I# {* }2 @6 U2 z3 y
6 [' ?* b, I- O // ARM 中断初始化
) O7 D2 R X. U: @ InterruptInit();
4 V) r; H9 H' \/ L& D0 _; W8 K
7 b9 A# Z: @$ P: l8 [, O // PWM 中断初始化
1 Y- G" R3 C, E. @$ N PWMInterruptInit();0 b+ f. b+ i2 Y# o: T: _: Y
3 P" f% g' i1 a* f unsigned char i;/ }$ K- K1 P7 \& \* H% |
unsigned int j;
4 ?# U" ~( V: F& T5 n% @6 {% n: Q& E
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
3 N8 m! t G3 N Y/ @$ I UARTPuts("------------------------------------------------------------\r\n", -1);$ K! ]! ?0 ^' Z c. N
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);3 R! c5 Z5 k8 o- m
// 产生波形2 z( F% s D! F/ u0 U
PWM1ABasic(25000,50);$ S; q. u; g& s; E0 C7 P
x4 E$ T+ ^3 Y0 D2 a UARTPuts(" C6748 PWM Test Over!\r\n",-1);
: h: z, I1 z# X& E0 A UARTPuts("------------------------------------------------------------\r\n", -1);! x3 M0 N8 _" I
1 e% F6 q$ ]0 j
8 s3 q0 O* C- P
w- Q# s( T) b4 k" T' ~
UARTPuts("------------------------------------------------------------\r\n", -1);: m% E1 o/ Q4 a8 c
UARTPuts(" C6748 ECAP Test\r\n", -1); ^& ]0 f# b- \ ]
// ECAP 捕获初始化
* b% e& w; h9 E4 |2 d( o3 o ECAPInit();
/ C9 }+ o. A; O$ |: S UARTPuts("Initialize ECAP.......\r\n",-1);
! k& {. z% t! _5 {- N/ i for(i=0;i<5;i++)% V; c8 H; B& J* t
{
# [% E1 R- m" q( V1 O" Z for(j=0x00FFFFFF;j>0;j--); // 延时
. I$ {& J# U; Z2 b: y ECAPRead();0 }, L7 S. e$ ^0 O( N5 G
}! |' A$ S6 ?" }6 j
UARTPuts("\r\n",-1);# l3 j# W: W$ q7 w) J& e
UARTPuts(" C6748 ECAP Test Over!\r\n",-1); B4 l4 S9 {, r. w0 X7 \8 }
UARTPuts("------------------------------------------------------------\r\n", -1);
/ O, i8 I$ `& b0 x* ~, g3 a" c, E7 R: K: C/ F1 Y0 f3 r
// 主循环
3 K7 G6 r% z4 D5 e for(;;)
- u# W0 c( e) D {
4 q _! u: Q3 y" p p2 c& N: L* R+ ~2 ]
}* x$ ~/ _8 ^( C: h4 P& x
}* N5 y* ]5 O3 v- p: G% w2 A
/ e$ [& A( p$ F
/****************************************************************************/
$ U' ]$ n2 [. j+ Q5 [/* */5 \% o1 j9 h. S- c' s4 i
/* PSC 初始化 */
- X) b$ {2 ~! t+ q+ E# R/* */) J/ r% o8 A; ?; m$ y
/****************************************************************************/
1 ` a! x5 `, ]6 M0 evoid PSCInit(void)
" _' K8 X, i$ J4 Y& n' u{
5 L5 f X4 W( I // 使能 EHRPWM 和 ECAP 模块9 L: ~& K2 S+ u7 L) x
// 对相应外设模块的使能也可以在 BootLoader 中完成
& E* x, z( u; {, s PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
$ E9 d' S* c) T" \6 A5 n5 R) J PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
' y) R! \ f4 M' |* ~: s) G# d% C d}" f, ? q) ~* a
8 U$ _* P2 ^" r2 h T% |3 T I$ ~3 G/****************************************************************************/. r9 ?/ w/ S8 q
/* */
! `; s1 r* b g/ I3 Y/* GPIO 管脚复用配置 */3 ]( { D3 M; s( ?! q
/* */
6 y l* u; [5 X5 A' \: l0 K* ?/****************************************************************************/! f g" N, H0 T
void GPIOBankPinMuxSet(void)" d2 c/ n% h: M# r
{
& k# ~: N3 k- e2 c EHRPWM1PinMuxSetup();& I! }" p P+ n) v. @) N
/ r& ~; c* I) ? a% T4 f' D
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP). u) {; \0 y% b8 L' N: [. w
// 作为捕获功能时管脚方向为输入
# i$ R/ C5 l& {, r3 B+ i* T9 U // 作为辅助脉宽调制时管脚方向为输出
3 C! t9 r+ b, B' w, t# M E // ECAP2 / APWM2
$ i( `6 k& \ W7 q. r ECAPPinMuxSetup(2);
# Z6 y5 e- }) _/ B C$ p% o/ @
/ K$ H2 x2 `! ?% Y1 H // ECAP2 / APWM2方向设置为输入$ F- M4 e# \8 E8 T
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
, m( O( }1 q1 J$ \, B/ b) M; e" O}3 C/ w0 i+ b% C
/ a5 `4 D7 B1 [0 Y$ D _
/****************************************************************************/: {$ X$ h+ d$ ~* t2 @
/* */
; [7 X5 ?( Y( U3 L4 H. y; A) ]/* PWM 输出波形 */
' j; @; E# R4 o6 k6 Z) T/* */9 b' x7 H" W3 w, u+ N6 c0 \ t8 s
/****************************************************************************/
9 c2 l& w. o) U) X H, k$ gvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)- d7 u, @ d% }, h4 B% F6 |
{
* n& B9 ^+ ]. G' Y // 时间基准配置
. r/ s1 [2 ?2 l& h! Q // 时钟配置
) D% R# N1 ^9 D3 ~* |% k EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);3 }' h, J: p3 w3 V5 S6 |9 Q1 ]" H
0 K" o# x' [4 i+ w // 配置周期
h" B! ~7 }% @) T x8 |8 h* c EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL, w% A! u7 f# X- A
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
6 I% t& [$ c! `7 B
' T1 ?+ v1 p5 L // 禁用输入同步信号7 v5 {2 p W; M) G7 @
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
( q6 @- _& L; m9 i$ _4 w$ M# b1 X2 {; z3 {9 H: j) o# G
// 禁用输出同步信号
7 G4 n( e' v. v3 l- ] EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);& k2 ?5 G/ x: E9 L# F% D
7 N% Z1 s2 y N& ]$ W, t' Q* v1 s0 Z2 h0 T // 仿真(DEBUG)模式行为配置
% e3 W6 w- z2 o5 o0 z1 V EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);4 t& i% T( g1 \2 D5 b
$ H" h/ E; {% p) J // 配置计数比较器子模块
# i3 E8 |3 G: B/ c // 加载比较器 A 值
# n; P( s5 c v& Y EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,* V' v5 D" K% m2 J2 t
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);$ |$ L; Y# ]" u
# C/ j) B- ]- T5 x
// 加载比较器 B 值
* ?' a; d: T' z- _ EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
9 P) _7 j+ A, u( a0 `7 f EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);4 [) q$ P2 d( s+ m: L
# w3 h% e2 q/ U# a
// 功能限定配置(输出引脚触发方式设定)( }( p+ f+ A) y' k3 M: q
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
3 D7 E) B5 c# [. Z3 ] EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
! ~/ w. l. n$ w EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,( ]8 _4 [ y5 N/ o
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);# j P; F3 |6 t- g# m
/ }6 }2 O+ [' A5 T' b7 F // 禁用(旁路,信号直接输出到斩波子模块)死区模块3 ]! ]# ^0 s; O) G \
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
( ]- |6 {! m- `& B" i) M" Q w" {& K' n6 C* _, ] R$ m
// 禁用斩波子模块, }2 a, A5 F8 F- ^
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
5 x' e# v( V' X) {
) r" ~! |% o( u6 K$ _3 |- u7 a // 禁用错误控制事件/ d* M" G$ l+ B, B! k* L$ C
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
8 e; g) Q; J0 D; f5 c( [ EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);+ _, m. _* @8 ~- c4 ]
! B# v" N% H5 K+ w# U' I // 事件触发配置
5 y/ y; `1 N0 @1 u8 H, O // 每三次事件发生产生中断
7 F. S, {6 f; M9 |( }1 {2 B EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
: a: J7 ~% F$ W3 G // 时间基准计数等于有效计数比较寄存器 B 值 产生事件4 B- x& e" K D1 v4 A$ _
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
+ E. I$ d8 t, o6 M. ~: c2 w, H // 使能中断
. l |2 y/ S- C- f8 U8 b EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
1 r7 \/ T9 }/ U9 {0 B& p
; U e( q0 k. X // 禁用高精度子模块' L+ H0 R+ j! t$ `
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);, \! _) e1 E% {2 z3 D2 J' V+ Z& K
& h9 D; c! C1 _2 Y UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
9 W r6 T$ a; v1 W; P8 {}3 b. u( x% k( o" r3 a# f
9 m% Q2 q7 W, k7 z
void ChopperWaveform(void)
" z9 J5 @2 n9 J* f7 v& j( o{* y3 \% u: ^5 S; E( Z! \
// 50% 占空比
4 j: v: N9 J& X( `- y Y; J6 K+ ]# } EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
9 i/ Q# X; @% W0 K( x // 4 分频0 n1 E# Z5 x% \7 j
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);1 [$ s/ ?+ B6 U5 q% k7 H
// 单个脉冲宽度
8 A; ?$ q0 w; U' P: W EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
8 ?# d' Q1 v' U. | // 使能斩波子模块
8 v( R$ \# ], w; U, ]0 F- t, u EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);, I1 j D* i+ G/ @3 R! G+ D
}' h8 q$ z: C, x* A6 d
8 w. c2 A9 D8 U/****************************************************************************// t+ q; f5 F! N7 Q8 Y
/* */& T, J9 ]# o6 X1 \; q
/* PWM 中断初始化 */ w7 E* L& `+ u* v" `
/* */- Q* w6 ^8 [# a* T# W ?
/****************************************************************************/7 {* ^: Z( G) v2 G- T
void PWMInterruptInit(void)" T- w" u6 k' n: l5 \5 P
{) d' @+ [0 p5 m% q0 I/ l0 O
// 注册中断服务函数
! l. M% {( o. j w4 o6 L IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);0 A7 i+ s8 F% [9 M) H6 h8 x7 \" {
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);: U7 Z$ i4 C3 [4 X$ [& m; r/ G/ w
7 d. E3 v' V$ U# K% t, [3 g+ I // 映射中断1 F: W2 Y& P2 G. e6 B+ v
IntChannelSet(SYS_INT_EHRPWM1, 2);
K& L5 S, }/ |' C IntChannelSet(SYS_INT_EHRPWM1TZ, 3);& A2 Y1 ~" Q. \
5 T9 k7 D! D2 T0 D9 e8 r& Z // 使能中断
! E3 x1 ]& i9 q4 a% s7 ^ IntSystemEnable(SYS_INT_EHRPWM1);
) M, { T7 d( _4 v8 ?+ Z IntSystemEnable(SYS_INT_EHRPWM1TZ);! G9 E1 k) S2 e% x
}
+ [- H- E7 H: f+ [
3 c, p5 K, H- }/****************************************************************************/% S5 u: u0 p) K) |! d
/* */4 H, D# c) e# B) f2 W" h8 e
/* ARM 中断初始化 */
3 r& F2 Y7 ~# F, w/* *// k/ E3 @5 C/ O9 _) F* ~
/****************************************************************************/( i: b/ Q0 a( L0 O0 N7 U
void InterruptInit(void)
& Q' }( s8 g4 d{
" S) v/ C3 j. ~2 h. [4 o" J // 初始化 ARM 中断控制器
' q' ]0 |! \( J- j( Q! W: p8 \, \ IntAINTCInit();; U, r: ?; ~9 u- @: M0 X% J
7 w* _% `1 W# {1 T) L# h0 Z // 使能 IRQ(CPSR)0 f% L K/ K- K
IntMasterIRQEnable();% q: V/ \. |, o U! M' C) w9 v1 q
; e* b a$ h& m
// 使能中断(AINTC GER)
! U' F3 O- H* U9 ^" ] IntGlobalEnable();
" M* y# ^( m1 L& ?1 |' @
: w+ u& n9 i* U3 j$ i# ] // 使能中断(AINTC HIER)
1 H: f: w4 i) h) L4 X C& F IntIRQEnable();* d) k8 R- V* o. ~$ H
}- o, A5 M6 Z/ s) y# \
! \6 O& X4 ^' n7 x; r! Q) O |
|