|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/1 v/ A' k7 t \6 A. s5 T* ?& c
/* */
; z" J% ?9 J8 i- ^/* 宏定义 */% [9 F$ `; \* }5 i, A
/* */
% x- T4 `) @$ \* ~: I/****************************************************************************/
6 ?, B# ?0 w E: }// 软件断点# Y; k+ T8 T& u
#define SW_BREAKPOINT asm(" SWBP 0 ");5 c \+ ~# s' p# L
+ Q! x1 s( `2 }9 n3 j. ^
// 时钟分频
) t# E2 g1 u! T I, G$ ~#define CLOCK_DIV_VAL 2283 Y& O8 m# Z0 R/ p) H4 w
( T8 W; y) V- C; ~/****************************************************************************/7 M4 F% G2 O* U$ Y5 t
/* */
/ s. e- g4 A- {3 R/* 全局变量 */8 b- D y f0 b0 t
/* */ d% V, M" m8 L& \' ~, D
/****************************************************************************/
, m1 k1 |2 Y* h2 u9 cECAPCONTEXT ECAPResult;
) N# s: C9 `7 P9 p _7 D" h6 \
/****************************************************************************/
1 {: P* n5 ?0 H0 I7 J/* */7 G* o c7 T) O0 v$ ]* i
/* 函数声明 */
* w& W8 n- {" @6 G d+ J/* */
2 d3 J/ B- c* D0 b7 ]0 }/ z/****************************************************************************/
! d: h- |7 [* X( C+ F7 ~// 外设使能配置$ k( G! I; i/ O' S) e- `
void PSCInit(void);
2 B0 c& q7 b0 m, W+ _! n$ X2 g- F3 @4 `# e) S3 {
// GPIO 管脚复用配置9 d: s. r4 q' S8 B3 S
void GPIOBankPinMuxSet();: v9 X( I C; s" v/ X$ Q6 u
2 d+ E! h. v( r) _4 k' F0 r// 产生波形0 {$ ?% B+ ^/ v% C3 R6 X
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
. Z# S# y( C# `void ChopperWaveform(void);
+ g$ t o# E9 R; D0 V( s8 h5 l- ?) d' m i% O6 `% x/ M
// ECAP初始化和读函数
5 N2 i3 | [+ {' E$ ~5 Z" K) p- pvoid ECAPInit(void);
' i5 }5 ?' a9 `0 d: e! [* G: zunsigned int ECAPRead(void);
' g ]; G* Z$ Z& V4 j/ |( k
9 ?- R1 Q5 ^9 |1 J: u7 J2 R: T//ARM 中断初始化
1 f" Z2 `; [0 u+ zvoid InterruptInit(void);
. J+ @" m6 b# \* b
5 i( C/ N8 x2 ~. U3 `$ a// PWM 中断初始化5 _( \" E0 Z5 g3 _/ y, L# D4 [) W- R& x
void PWMInterruptInit(void);$ t. \; f4 C! ?* o$ W
// 中断服务函数
. z, z7 M, c" D8 A: e: D t// PWM 事件
/ c b# x* m( d! z0 O4 ^void PWMEventIsr(void);
) X/ D- c# Z; ~6 @3 Q// PWM 错误控制事件
' W5 Y- m7 P& r- w# E6 Qvoid PWMTZIsr(void);
6 q8 q1 o: j( s7 S: k) {! J1 [9 v& G1 B
/****************************************************************************/+ P$ i4 U1 X: }
/* */9 }0 e1 x9 g# U! x$ e& H( \
/* 主函数 */& W6 E7 F. ~( F9 {
/* */( Z5 o3 N% F5 ~3 r
/****************************************************************************/6 R7 v& W) ?7 R2 t2 O" p+ I9 C$ C
int main(void)
; r0 ^! X0 k+ F! k7 u9 @{
- i5 I: P0 C+ e, x4 ?2 T, _ // 外设使能配置4 T8 I. B# s3 f
PSCInit();1 {+ A0 B$ W3 D' d* A! ]2 _4 [+ Y
5 y& {2 B$ u8 T' t$ b& y // 初始化串口终端 使用串口25 d3 j! H8 \& k
UARTStdioInit();4 G5 O, _% P$ z3 K4 }
$ h1 B$ q% U8 o' l: r8 t // GPIO 管脚复用配置. H1 v; L' X }0 ~
GPIOBankPinMuxSet();
& p& H* i2 `& @- x- U2 _1 q- l, |9 d, h% J+ c' |) T# f. g
// ARM 中断初始化7 ?3 D4 f/ q4 m2 W
InterruptInit();
" z9 u# L0 }4 W4 F/ `
) \3 S, [# N, p% l // PWM 中断初始化6 J+ ~8 a8 b$ U z) S7 r7 N
PWMInterruptInit();/ ~ O5 w! I) ?! `
2 }2 b( e2 m! v+ c) p
unsigned char i;
8 ~* t9 t! S2 t+ T1 P" r unsigned int j;) l0 I9 ~# K' T# }* ]6 @/ y
4 `' I# T" k) F' n! M* v" Y
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);0 X% C: S( v Y- I' }$ I: K
UARTPuts("------------------------------------------------------------\r\n", -1);
& P6 m9 K- Z8 B: S K UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
1 w3 T: m3 X+ b; |: h // 产生波形
! N+ g" a5 {4 I2 g2 h- p" R- o PWM1ABasic(25000,50);
" ]3 u- i2 P; A" n0 l/ {1 t
" `3 h6 W* N5 ^5 Z& `7 Q UARTPuts(" C6748 PWM Test Over!\r\n",-1);& x9 t z; \& e1 T$ ?
UARTPuts("------------------------------------------------------------\r\n", -1);
. o1 A5 E" [+ I9 L' f
7 A0 P* k4 u+ Y$ g! e
" j/ h. @+ ~# \ H0 F# {, k0 X- ~, Z% s$ c2 V9 G+ o2 W2 C- {
UARTPuts("------------------------------------------------------------\r\n", -1);$ l% W ^4 p# r- {+ z) B. e
UARTPuts(" C6748 ECAP Test\r\n", -1);
, c# q/ v9 J u" ^* B' i/ b // ECAP 捕获初始化' [& I8 N2 u5 M* w H" R$ {$ L! N
ECAPInit();
3 ]+ U0 }: y" d UARTPuts("Initialize ECAP.......\r\n",-1);
# P, V; @8 Q" q( a/ K for(i=0;i<5;i++)1 C3 U: P* r: {$ E
{) r1 `" G- L+ ^9 U: N
for(j=0x00FFFFFF;j>0;j--); // 延时( C' ]9 u# `5 o7 g+ N
ECAPRead();( t9 n( E8 @# {0 m/ l
}
: ?5 i/ j' F2 @' W. ^, {8 f1 e UARTPuts("\r\n",-1);
" N5 s# k3 L) A UARTPuts(" C6748 ECAP Test Over!\r\n",-1);9 e" v, K' d$ s1 r: ^* Y; z
UARTPuts("------------------------------------------------------------\r\n", -1);1 e$ f2 ?$ P) k" B# N( o% V
5 e# x( C! b, ~$ H% v9 L // 主循环
% y+ B- L. D- L/ y2 f- S3 T for(;;)
" t B p' e R$ { {2 {# O/ t7 f; u2 Y+ m) x
; w* f! \$ q. e! I: K/ s
}# I! b! w8 C2 }3 R. X7 w1 f
}
$ z4 O" c6 S8 I9 N5 s. G T |) I4 V' i: R$ n- N% F) A; W( ?2 ~
/****************************************************************************/
8 g0 A. z4 G. y4 h9 O x- r) }/* */
. \" k4 M _& A5 E/* PSC 初始化 */
3 n0 S! G8 D: J$ }/* */2 ]4 s- c8 |$ N2 {$ {/ l
/****************************************************************************/
7 f- I* k' f) t; I, W4 N; K3 Xvoid PSCInit(void). i3 b( Z3 {8 W7 N& N
{3 W4 {4 P- y3 N- E* D4 G+ f4 `
// 使能 EHRPWM 和 ECAP 模块
8 S+ A; {1 ?1 c // 对相应外设模块的使能也可以在 BootLoader 中完成- {2 Z1 p9 G* b, {) S! \2 N9 R
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ a: O2 W: e7 Z$ G; p PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. ~" f! f4 w% y}' T. O8 N) F7 P* d, d. F7 k
( q' E+ q- v, u6 v) c+ ^
/****************************************************************************/
) Y" w5 G: Z) s; c) V x/* */
% a% c( G# B! q' B/* GPIO 管脚复用配置 */7 Z4 _- {6 K% C7 Z3 A
/* */: J$ p3 ?+ b, d& Z! R6 p h
/****************************************************************************/
7 ~! N2 N6 B, \: j0 mvoid GPIOBankPinMuxSet(void)
% U7 n7 V; v8 `4 P0 q9 [+ F) {- T{: u8 Q9 S8 E. U$ x. Q) D$ i
EHRPWM1PinMuxSetup();
( B- w3 T+ A4 ~8 z) {, M; o2 y1 B8 y2 G" C" \& Q6 J+ {$ j
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
; i) G( b& W; O) A1 b // 作为捕获功能时管脚方向为输入
4 p$ t+ p k8 a( r // 作为辅助脉宽调制时管脚方向为输出( e8 l: Q" a2 u0 w
// ECAP2 / APWM2: P: ?$ A; `- \! q, t
ECAPPinMuxSetup(2);+ f- n8 v. v& ^! c, {. Y
4 W8 ~4 f& T& `3 y2 v% K% i3 F // ECAP2 / APWM2方向设置为输入
& l3 U' H9 U0 l/ A( c GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]3 J: @ i- d1 O; W+ ?% A6 a
}+ X, f+ e& E, f( I
* m4 f4 i$ l% |, |& s, H
/****************************************************************************/1 z/ \, R' O W: C, _$ `
/* */
: n1 q" V' o2 X4 f/* PWM 输出波形 */
5 W4 w; \7 L' {/* */
* X$ N \+ n" e& v+ v6 T, I/****************************************************************************/( F- Z$ U( P. F$ x
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)0 ?& M. j2 E9 a' l
{; B! m6 c* M2 K7 e/ b3 }
// 时间基准配置3 B$ T+ f% \+ |: d
// 时钟配置
3 V/ H i" d4 }6 a4 x/ ] EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
* j9 {+ Z7 S9 W" L2 s; p! P
) F$ Q4 L6 F' _6 V // 配置周期
3 t2 Y( ]/ D; p$ m- { EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,# j+ {0 X S8 u+ J% X5 Y
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);/ i6 K8 q( k8 I9 P: t* ^
* W- v7 ]; c- M6 n' g // 禁用输入同步信号
0 ]4 \7 O4 P7 c- E( q( I EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
: F# t+ X& h' g: U; N
" d2 q/ C; ]; b // 禁用输出同步信号6 b7 W' d- A1 s* S0 Y, s( m1 k
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
2 C0 G: i6 e1 w/ C& i5 C" j7 b) N: v" C
// 仿真(DEBUG)模式行为配置
( u; E& v0 M0 x( u6 E& q* P EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);. L1 Y2 h; X" _' b$ u
" |7 C1 L% h; ^
// 配置计数比较器子模块
6 n+ [. a6 H: D // 加载比较器 A 值
& l: ]+ e! ]0 k- U EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
; u7 T* Y! X2 E EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
9 P' B( { q* L3 p; T+ h# z4 S5 L- d- Z; |6 s6 u+ x Y8 h: m
// 加载比较器 B 值, t1 j& `4 U4 n8 N1 F4 @! A
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
/ f: W! Q+ G% h2 _, s. U0 ]2 m2 e' l EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
+ z0 e1 N3 j3 E( O& L* i5 C6 ~# R9 {& {3 }- ~2 |
// 功能限定配置(输出引脚触发方式设定)
2 e: d3 }( ?$ y, \: P z$ E // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
' _7 ^6 g: h" e% p- r; o k2 Q# k EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,/ @/ i8 c. }2 h9 ~
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
( E& M" [0 P1 V9 U: e EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
6 u; p: j# z! ~
( ]) }& ?7 r$ \ }3 k) F; Z3 n // 禁用(旁路,信号直接输出到斩波子模块)死区模块
8 s: A; n5 k' T3 g$ S$ Z EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
, d& y, I3 a7 `2 S1 G3 \* C& h' g. K2 }. F+ u+ F w/ [
// 禁用斩波子模块! P' ~) A$ n3 R5 G4 S& l" C" d
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
$ O F) V9 _2 v, t. [
0 T9 |' y3 l i. U, B! e/ A* o: i& ^ // 禁用错误控制事件" ]) {# ` N: L7 F6 n2 Y0 o0 M
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);1 G) t, @* r; {1 r# v( m( i
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);( t* v: O G, g, Z2 w+ s& p5 @
) A% C' n) s2 _- N( R4 |
// 事件触发配置
. s3 v2 j# E {! [ // 每三次事件发生产生中断
% e7 M6 B6 u* S. n EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);0 k7 z1 S* N9 g# i, ^* d5 t
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件# |4 Y7 R) q7 I4 u/ B4 y
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
. {7 F' u0 h6 T' @7 } // 使能中断
* ?: w8 B! f: H; i/ [3 b: q EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
1 S5 D+ h7 f q. |0 a9 b, `; G0 X
// 禁用高精度子模块
% C. S! w' B* E5 k1 @/ Y EHRPWMHRDisable(SOC_EHRPWM_1_REGS);$ K7 j/ B7 m& P5 f
! X+ v2 s# r: m& x- n9 b' d1 J; K UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
5 C9 q3 I) Z- ~+ U}/ \7 r) s0 V. k8 y
$ V' `5 P& P' d" w! z5 `: }# T
void ChopperWaveform(void)9 A. l8 d t, u+ m: w
{
( w& P3 E6 H7 C3 h- l // 50% 占空比
" v, u' T+ b, s. T3 a+ d8 { EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);$ w* W' W6 [) q. M
// 4 分频
, ^- L) n0 |. i! E/ W0 c EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
0 C- ^/ U+ U' T* ~* f/ q. R' a // 单个脉冲宽度
6 _( D8 n$ c& P( w! u! \1 x EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
9 d) S( D& @& x5 D // 使能斩波子模块
& G, x9 i; ~# V% } EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);' v- F# u- j' R- w* {4 ?
}9 M! r2 i! }' P9 v: [* f3 ~8 L
9 K% D- y0 c3 T/ d/****************************************************************************/
- b' J$ T0 n. Q3 L3 Y/* */# Q' }6 R1 U; }0 Q8 I. L% I- t
/* PWM 中断初始化 */, P4 Z/ R+ h& S, Z7 g
/* */
4 g: ~, s1 c* c( K+ V9 s/****************************************************************************/8 d# \; p/ b" A
void PWMInterruptInit(void)6 |3 r4 J3 U: ~6 ^9 W
{' Q: U4 w' A/ v a! |- y4 K
// 注册中断服务函数
8 l* g, m& U6 F6 _4 b IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
) Y& u6 K8 [6 t X+ E9 C7 Z IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);$ x: A% h% r; K4 \2 P+ I! o- P9 Y( l
" g7 A/ R3 L$ l' S
// 映射中断
2 a% D0 M9 o. f8 \ IntChannelSet(SYS_INT_EHRPWM1, 2);' A7 c; R2 ^7 O+ J a* n
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
" {- Q5 Z7 M1 Y; }
6 l6 r$ J9 D: G5 I. L // 使能中断
& `2 @9 o" Y: x5 n: K) | IntSystemEnable(SYS_INT_EHRPWM1);
6 @$ v6 {, H4 D) v8 n0 E IntSystemEnable(SYS_INT_EHRPWM1TZ);# d6 }* _: @' m @6 [$ @0 d
}+ a k4 t* M; B* A
4 o9 |8 |% h9 f, j
/****************************************************************************/! {: i, E' w; z3 _
/* */
3 b7 h/ @9 a- e8 O8 @: @/* ARM 中断初始化 */
, G6 P$ V9 x% M, E% c. _/ x+ G% b, q/* */
0 r) l# }* W. A( N/****************************************************************************/
6 }) Q8 H2 `' [8 Z7 Bvoid InterruptInit(void)4 d7 h: C' h: W Y4 c
{
8 G) k" D4 h9 z# g& o // 初始化 ARM 中断控制器. P! C' d2 W. }' u* O
IntAINTCInit();+ u" a5 V0 K' J. B/ r l. ~0 B6 g% ~4 Q
( M/ u' j% q( ?
// 使能 IRQ(CPSR)- i, _9 I: c0 w' h5 W
IntMasterIRQEnable();8 u8 ?; v5 D' o4 }0 k8 p
- l% d# t; K. F0 k // 使能中断(AINTC GER). J' y& `- @) {* M9 @' m
IntGlobalEnable();# t, u2 D, R/ Q3 ]
# a' b s+ s4 S& @; {$ Q
// 使能中断(AINTC HIER)
' I, K* [7 r: d. C: f IntIRQEnable();
0 A, S4 O5 }/ B' p! i+ H}
( F8 ]& o* m- V+ r. S) d2 Z1 q
9 P+ ^' c4 E* o; ]) m! o |
|