|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/# l# x" a. I+ _2 H: g2 A! O
/* */
* H8 |" w- L0 r/ V/* 宏定义 */
5 b! B$ I* X# {* u: E7 ~5 [: K9 Z/* */) E! P; J$ A1 c
/****************************************************************************/
# D! V6 K* ^$ ~. j// 软件断点
& w: [/ K) x. d#define SW_BREAKPOINT asm(" SWBP 0 ");) L( v/ I' ]2 p8 ^+ ~' G+ }4 Z
0 |* J4 W; ]/ K7 t, Q// 时钟分频0 k! ^- l1 g) S) X) |) J; x
#define CLOCK_DIV_VAL 2286 s, |) ^, Y* D
' S! r4 s5 b' S! j, s$ G. @
/****************************************************************************/+ J) H* P: U$ P; L. {- C1 k
/* */! x6 ?) Y1 p5 y+ e
/* 全局变量 */
7 H" n' A- z/ H0 L9 o) x( l- D) Z/* */& N: C1 X. r7 P, H Q1 `/ K! Q
/****************************************************************************/
) r; p! z, k* D( O* B# P8 eECAPCONTEXT ECAPResult;: X% Z# Y* j+ ?0 T# ]! y
. {" t3 q1 N9 _7 B. x& t
/****************************************************************************/ t) _& c+ T+ N! Q
/* */
: [0 ]" W1 k# j7 X$ S/* 函数声明 */
) L/ m7 J8 G1 S* d/* */
$ H9 F" O5 \, B; l) R2 L; f" X/****************************************************************************/. W \- J. c! ]/ W% n
// 外设使能配置/ Y- X3 A- d0 j
void PSCInit(void);$ L6 b2 t: |2 t1 A, K- M
$ c8 H* ~* y$ [) S4 H// GPIO 管脚复用配置
% b, y: Y$ X3 D$ O: d$ qvoid GPIOBankPinMuxSet();7 m T4 W0 r& ~9 g
+ S" x& f5 a! X9 ` r) I// 产生波形
9 L* n& q) Y' p rvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio); Z# A: l4 }1 g3 \" E( \9 o
void ChopperWaveform(void);' p. n1 I" B. C% ~: D8 Y
# [: g7 T6 v+ i' X M' _// ECAP初始化和读函数0 r; \: N; L# p7 w0 |9 ^6 G7 v
void ECAPInit(void);1 i z5 j o9 G( w8 C+ ]7 C) y; m
unsigned int ECAPRead(void);
' c) B7 ?7 Z3 c4 y0 b0 c5 w
9 H3 Q$ j/ K ~6 u& h. Y* v//ARM 中断初始化
: Z0 W" F h; Cvoid InterruptInit(void); n* v9 n! I4 V
1 a/ d4 ^* U; U* t: [2 J. E// PWM 中断初始化
6 F9 N& Q$ H: n# H9 _void PWMInterruptInit(void);
+ Z" g" v5 v" t# @6 s// 中断服务函数
8 p! c# V2 v, Q/ }0 d+ b; Z// PWM 事件
6 d/ t! |1 l2 n$ ^4 L# Z) d; X; uvoid PWMEventIsr(void);
# C& N, W! ^ Q) Q// PWM 错误控制事件
/ l( l. p6 `4 F: Mvoid PWMTZIsr(void);1 h' r6 ?, i @& i
& H& z. R; |& _: [( ]- s( T/****************************************************************************/
* ^ R, F- S) K4 ]0 q6 g! Z1 G/* */6 h' w# [# R4 U$ o0 o
/* 主函数 */; n9 s6 Q1 C1 a' B3 t
/* */
: `% D2 b$ J. D' q( `8 L/****************************************************************************/
; b# O; K8 r( \$ ^( e6 [int main(void)( m# V) k5 e0 w
{
2 c" |! Z$ |' Q# H$ m: h // 外设使能配置
, g0 \- h3 a# I0 w PSCInit();
/ \. G; K2 B- H. m$ _+ ^3 d! J( W
// 初始化串口终端 使用串口2$ R6 C6 `. H6 N4 i% b
UARTStdioInit();
/ A+ @* g8 |+ H# ]# |
; p, V8 {& w9 X4 W. y1 Z3 M // GPIO 管脚复用配置
2 Z- O+ |! ?" k) C" G GPIOBankPinMuxSet();
) `. v$ A: X& p& q3 a7 a& y$ F
// ARM 中断初始化6 h4 J2 d/ k# Z# M1 @) k6 W
InterruptInit();- l* J0 ^5 v* A
2 n: V# ^7 }0 E# D3 h
// PWM 中断初始化
8 h: t/ v: w1 E# k5 W PWMInterruptInit();
3 T. h1 e( A% n0 I
3 ~0 p/ s' o+ G' j unsigned char i;
3 ~; ?2 g; q, J unsigned int j;
/ p. X7 ^ Q9 `# A5 x9 M% Z* h* v9 G0 ?8 F) c/ j
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);. D& X- U6 x: d& X
UARTPuts("------------------------------------------------------------\r\n", -1);2 v: P' Y! b% v; o( {
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
1 x( n; j: \. p" D; R$ [ // 产生波形- \" \7 N9 L7 i2 c
PWM1ABasic(25000,50);
( S: k; _4 l" E" J+ |, a; d$ s) \) z- W8 e4 R
UARTPuts(" C6748 PWM Test Over!\r\n",-1);4 h: p# M3 K/ p+ V ]8 J% ]
UARTPuts("------------------------------------------------------------\r\n", -1);0 y3 o+ p) ~* \% ^/ I$ u) e ]* G
0 D0 p* T6 }. `) W' G5 K
* \" r$ W& A0 W% b3 O `. l
z5 d) s0 {( A f& E: q UARTPuts("------------------------------------------------------------\r\n", -1);2 t1 D1 I# v5 v
UARTPuts(" C6748 ECAP Test\r\n", -1);
( n2 ?4 m- J' q* [# ~2 T' K // ECAP 捕获初始化( y1 B8 c7 X! Q3 K4 N1 ?
ECAPInit();
! o h& |3 c+ N2 I UARTPuts("Initialize ECAP.......\r\n",-1);
/ Z! `2 l# P( Y1 q for(i=0;i<5;i++)2 i/ d! ]: _4 a* ~8 Y
{$ l! l. ~9 d: J" E$ P9 F/ p% @
for(j=0x00FFFFFF;j>0;j--); // 延时
& F% `5 ?: K7 v1 k6 N ECAPRead(); J6 b+ A; E. n3 r) C( z4 I
}% u* U7 ?6 H# O/ U
UARTPuts("\r\n",-1);# g$ K w% n# Q9 B; l! Q8 T
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
5 ]6 p, T" j+ \9 e/ `1 @. A UARTPuts("------------------------------------------------------------\r\n", -1);$ r |: G! G: m8 G
, R& s2 p6 t1 g$ O4 F8 u5 D
// 主循环
9 N" ]6 V' x4 J" Z for(;;)- g# Y ]( I/ v+ ~
{# a8 ?# Y' L" E1 m/ K
8 s* a) `6 C, e& R0 ~8 v
}* U- o' q; e8 i' L) e
}
4 V- f. Z) O: Y( O6 B" ~8 p! { \1 i$ X) {
/****************************************************************************/) o: I( g8 }$ S* [( d! E/ U# U1 @
/* */
0 @8 h( d* w- ^9 B: ^ W+ t/* PSC 初始化 */) M- A- P m" S( r
/* */; b* {# S. Q. h- l
/****************************************************************************/
: J! Y# b& f3 A0 C: R3 a+ yvoid PSCInit(void)% t9 C& G& N" J7 E. R
{! i* A0 l# T4 E; y4 m
// 使能 EHRPWM 和 ECAP 模块" y5 I8 \0 w ^0 r5 j
// 对相应外设模块的使能也可以在 BootLoader 中完成
6 p/ b7 L& M! t: G8 y4 R6 n PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);/ \% k: D! h b \, q
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
( p$ |$ V7 D+ `& R O}5 d) Y# n& z% Y& Z6 ^) w' Q
+ s$ \' N2 p7 A# B) N" q/****************************************************************************/ k6 b5 \. }# y* d4 {& G
/* */% T B$ Y F: h( _# _
/* GPIO 管脚复用配置 */) z- F5 t4 t- J) j$ h, ?! G
/* *// ?- m: m' ?, `9 A- w6 J
/****************************************************************************/2 o6 j0 _% S; O7 _; `$ y; v
void GPIOBankPinMuxSet(void)4 g( Y; d/ m, E2 ?5 y9 N
{
% k( P" ^& T2 s& p) b$ Q, X! ]9 ` EHRPWM1PinMuxSetup();: ?; ?; M% x& z# g$ W+ N8 O
$ m) E4 w6 X- u& L6 q5 ~6 W0 y
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)$ R/ O1 @+ V# b
// 作为捕获功能时管脚方向为输入
1 g2 B- F5 G: C; ~ // 作为辅助脉宽调制时管脚方向为输出
) n. \3 b# t u // ECAP2 / APWM2
- ]# p( z4 Q5 b( J: v) f ECAPPinMuxSetup(2);
) |# b" [$ s( g, g" ` d7 }. S& {9 H( V0 g) q3 g
// ECAP2 / APWM2方向设置为输入
8 k) U8 L/ c" |% f/ f GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
" a( y8 U1 J x}
' K/ U" o6 x& z! L% q3 @) c
% n5 ^# n, D# l4 s% U* I8 Q/****************************************************************************/
4 m7 d& J! d! u6 d) F4 K4 K" C, `/* */
+ @# o7 z! a' Q$ v7 n/* PWM 输出波形 */4 C' K9 h4 \, L" R
/* */6 O( ? T2 o0 o3 Q! K
/****************************************************************************/
1 A% k( i# D1 f, A* fvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
) b* E0 F* {* ~- [{
) Y, X- q4 ~3 T) E' K // 时间基准配置
6 v7 ]# F$ T; ^4 t3 R! ` // 时钟配置( J; l, ^; q8 d: [) {2 C2 S
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
! A% R9 ?# g! k3 V& c, ?, \% z
8 K" x* x- N& O7 o // 配置周期- A9 q: D2 M% O, u" P5 v
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,' O' K* G6 n2 \8 Q; @0 q3 K! c
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
2 B0 G. a Q* ~; c `5 E6 v
& F! l2 A2 G* V! Q // 禁用输入同步信号9 I2 P8 V, r7 N" b
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
& t7 M( I% ~: b/ M: P/ U: } F9 J1 w& u3 r: e3 ]
// 禁用输出同步信号
) ?% T6 H4 f U* M3 W3 U EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);# ^. M9 _* O$ `9 {% \/ U; u7 W% ]) { o4 M
* P$ B ~/ y: n( i8 D: U
// 仿真(DEBUG)模式行为配置$ A; f! ~% z9 A, n$ N( G
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);% F0 v% p, Z0 k2 G3 h' ^) s8 @' m0 T1 |
" k5 ~* {( N' F) j; Z( K- u // 配置计数比较器子模块" e1 N3 A O4 c' {4 u' s
// 加载比较器 A 值
, }- N) w2 m1 |. V8 j: Z) F8 x0 f EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
; `: U% W4 F# C# a* x1 Y0 ~& `8 M3 N EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
; M3 j% |, ^5 \: h( B \9 J( I# C! D
5 U o1 w: I0 }* f( g9 D // 加载比较器 B 值
4 n, X! t8 Z y6 y5 a EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
3 `% P R0 b; S- G- I+ d EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
7 _% F* y# D. r9 r7 y: V
7 c, H* r! K) t% z* W5 e- O // 功能限定配置(输出引脚触发方式设定)
4 Q0 ?1 i8 v5 g! m // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出0 J3 L: y- \% x# N
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,4 w$ R+ `+ Q! |% `
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
$ u5 q% X) {" }. r EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);; q: N0 m1 S; g' x6 l
5 J9 P7 D5 ~. Z9 S4 J+ g5 ?
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
4 g& i6 M- n2 h0 d/ i, h O EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
% x9 ^+ g8 X2 ?/ B. [% ?# u6 ?" v3 H7 X
// 禁用斩波子模块) w9 i/ O. l- X
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);4 m# y9 @6 `2 a
/ @9 r2 _' Z! P! X
// 禁用错误控制事件
0 P' V/ t, {8 p; D, A, N) G EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
9 |& }& ]- S9 I, ~/ R EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);6 s: ]; A6 D% M& N/ h& J
9 |- g9 } P( M4 G4 d
// 事件触发配置7 O* k+ f* m t/ @: }
// 每三次事件发生产生中断1 v1 _1 ~0 g5 y1 ]9 U
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
# W+ S" x. J- t // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
1 f4 J" L( c8 T4 S EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
) r* e$ J, R# d/ x' y- p // 使能中断0 W D+ x- U; a: x! {: T
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);- d$ l" p& V1 W- k
1 Y. l4 t1 z) T' L
// 禁用高精度子模块& i8 K& g3 @" v+ ]/ ?
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
+ J8 G) [6 e4 H$ H9 i3 D2 z( d) Z- b$ O: B7 S, ^/ X
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
1 j" x0 D( d& `' X# e% S}
$ Z9 W3 x- H: D) L3 G* M# o" R! ?, I# s! f( x7 k
void ChopperWaveform(void)
' H8 }, k9 ^& s{
' q6 M7 F5 C4 W2 k7 ^; y/ T // 50% 占空比
8 h6 I; p/ u& W7 p: u EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
1 C0 ^7 o# ?& p0 `; ~( j // 4 分频% b, f \& H4 U& u- G3 |
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);. \3 _; p) {5 ]$ c3 O f: L, P
// 单个脉冲宽度
! L: I4 R: |8 i3 q EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);% U. E9 ^3 E$ q% L
// 使能斩波子模块
! g0 O! n. b2 g EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
5 w$ @/ G# d2 x7 O g}: E- W+ H' e9 l" F9 m) I7 K
- o* D0 d1 I( u. `
/****************************************************************************/0 r. p `9 J4 y
/* */0 d7 ]1 O! Q6 Z/ C
/* PWM 中断初始化 */$ R! T: ]! b9 ~3 _: Y4 C% v3 q& [
/* *// q: M6 c) N+ y' h. o8 \) y; r( Z
/****************************************************************************/
( B. B$ Y+ {* c% h( Cvoid PWMInterruptInit(void)* j2 c7 w- m% | b. y. Q$ @
{
, F/ e" t8 q+ m( v2 g4 x, x // 注册中断服务函数4 S3 F* d9 x" F: n8 ~
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);2 s$ D/ \( o4 d9 W& c3 J. y* k2 m
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
5 b4 M" Q5 o& O z
$ d+ R) d! b" i7 u/ L // 映射中断
5 C: X$ k, |& b0 K IntChannelSet(SYS_INT_EHRPWM1, 2);
5 H* N) Y/ F2 g1 q IntChannelSet(SYS_INT_EHRPWM1TZ, 3);( q( o, ~' j* O' Z' b9 P
; A* S, Q% J6 p0 k7 x // 使能中断
. d6 s6 \$ f& }+ v* O8 N IntSystemEnable(SYS_INT_EHRPWM1);
, W7 v. V2 Q' h2 ~6 j* U" B; g( F IntSystemEnable(SYS_INT_EHRPWM1TZ);
+ u% w! Z0 ~4 s}
' q+ F! F9 G" i6 D6 Q! y
# }) E! B6 g' t; j. j0 N% q, d/****************************************************************************/
6 @0 s; ` {% q/* */( ~ m! M. k7 S+ J
/* ARM 中断初始化 */
% Z) r# ]0 ^% ^, z0 S/* */) F# O/ G3 m" D3 c5 I+ ~ E
/****************************************************************************/
7 E5 i' e v) K) \ Avoid InterruptInit(void)
, n5 _8 z2 @" Y/ I+ V: w7 j3 I# B5 H& K. E{6 y% X/ I$ O$ C% {
// 初始化 ARM 中断控制器# ~4 X9 ~) e# T4 o
IntAINTCInit();
4 `6 b) L! m" X/ Z4 M# H9 k0 L' e% X+ ^ [4 G/ ^
// 使能 IRQ(CPSR)
, F9 e) {: m4 k# Z) X" M( ? IntMasterIRQEnable();
# S* {( ]& @; H9 T; v: s
2 B6 `- o& s5 o" U; p; F& z // 使能中断(AINTC GER)% s8 V- K7 |7 Y. a7 Y( |
IntGlobalEnable();
) O U* S; k' {9 N) B$ j' ]) F* `% F4 D
// 使能中断(AINTC HIER)1 [! y- j A! ~
IntIRQEnable();9 t" f& {: c+ {" D
}# [ x: O. M9 V8 v1 Q3 w* _
# a2 t: o* `$ }
|
|