|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
; e' K) K; s% v- h/ |" u0 x/* */
& \/ Z2 f- {% m1 m% x5 [/ L/* 宏定义 */
$ M* w* V& n* {% [0 _/* */; Y5 O! Q. X& d) Q1 s8 E2 Z4 @3 H
/****************************************************************************/' t! f# K% J+ \3 s5 @6 L. f) c
// 软件断点
6 e# {1 H0 `8 a4 t#define SW_BREAKPOINT asm(" SWBP 0 ");
# J- _' S- \' A8 W' H0 I4 H% @- S7 {& o* h, D
// 时钟分频' S& S1 q# h6 n- c2 ^/ b
#define CLOCK_DIV_VAL 228
; G/ @( B6 C0 i M0 G# S
' w" `; c Q9 w5 D5 v# [/****************************************************************************/
- e. E& _* a' _ M- u6 q; K/* */. {$ A7 L- e+ O6 A1 i
/* 全局变量 */- k- m" p3 Y1 X- C w) T5 y
/* */
. U5 w& c* ^9 m% i: y/****************************************************************************/ X4 _! b& c8 r0 F: h( [6 E
ECAPCONTEXT ECAPResult;$ L2 Q% I( y2 K2 N) G! }# e
/ z0 W8 g+ u f; E1 e% C7 E- o- s
/****************************************************************************/# s6 X% C" E2 C2 ^
/* */0 m! n" r9 `% A% L
/* 函数声明 */& L# f$ [; b; k5 O5 s, v M
/* */# t* D7 c3 |5 ]
/****************************************************************************/
7 Y' P4 W4 z ~0 O( E7 W// 外设使能配置
# c+ p4 t) p* E: Bvoid PSCInit(void);7 c t4 h( b9 `/ d! h
$ c3 e8 t1 u* r+ l" h
// GPIO 管脚复用配置
' s t/ r; U) P2 e& Tvoid GPIOBankPinMuxSet();
: e5 T% y6 b) L5 w/ H8 u- L# H; x6 j; j9 x7 I
// 产生波形, P3 q8 {7 m8 e2 Y- D
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);, B0 ~7 M: j, t; Y) l
void ChopperWaveform(void); B4 Z+ _+ y+ p
3 }7 u$ J8 F. N, V1 F6 m
// ECAP初始化和读函数
) y9 j! x) r9 X" }% Jvoid ECAPInit(void); }9 ~' Y6 T2 u
unsigned int ECAPRead(void);
1 R: p1 X; ]7 y, Z( J6 U7 J; D6 G9 P
//ARM 中断初始化
% z ?5 T1 N& M& R2 W& C3 jvoid InterruptInit(void);
: W6 L7 U$ m' P% `+ ]0 D* V7 L
0 C/ d+ V4 K- v: e \0 g9 }9 q// PWM 中断初始化
- }* Q) |6 q8 P5 Y( ]7 K: uvoid PWMInterruptInit(void);' E; Q* y/ @# ^1 L8 t
// 中断服务函数: T9 V" _2 t* {- d( W* c& {
// PWM 事件
3 d- M2 u' H- ~, ]0 S! X! c9 S: rvoid PWMEventIsr(void);
- }7 O+ _4 b) J! s: F; O// PWM 错误控制事件
2 \ ~# u) T1 E, T |void PWMTZIsr(void);
# a' [# O' R! p5 O. g% y, H, h& S; N+ w' `
/****************************************************************************/
% |+ n5 M3 z4 j2 {/* */( U6 l2 m( s. h* B, m: n1 S) M
/* 主函数 */
: a J7 m4 ]. i6 S! y9 }/* */
+ V0 y- B. {; Z" |( l/****************************************************************************/
' e3 v) R1 t" vint main(void)
- w& O t3 p' x* ?" a& y H n; X4 O{
! C- v* {) Y3 j; B, ]7 y4 ] // 外设使能配置- X; o0 H5 y% l( S# Z% ~% m
PSCInit();% H& P6 s* l2 `
8 L9 ?5 K0 L% z* K+ @1 \
// 初始化串口终端 使用串口29 f2 K' L8 e! {
UARTStdioInit();6 y; W: S) L* b& \3 z
' Y3 y; p( v% Y. X // GPIO 管脚复用配置
- W6 `8 A' _9 G, |$ f GPIOBankPinMuxSet();
; J s& j. M1 h7 b8 }6 V' ?# Y6 m- O' G% T# q$ M- s* @
// ARM 中断初始化
/ {1 I; I3 H3 m* i! r. c J InterruptInit();
) D7 G: k8 f1 U: r" }; P
+ r5 D8 J" k1 q // PWM 中断初始化
% a5 A3 Z) p, A5 Q# b5 n8 u8 H PWMInterruptInit();% i3 M+ S. R5 D4 H0 I# {
$ r% S7 h& P9 R
unsigned char i;
! V1 m( J$ a, H0 J4 T& J- G4 G unsigned int j;
, B) R" ], D, A# B
6 ?0 i/ }7 ?) P* b) T! [9 O$ @ UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);; H) m) ?4 a0 s1 e- A
UARTPuts("------------------------------------------------------------\r\n", -1);& I1 n1 ?7 r3 u/ r& x
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);+ `5 @- p, ^% V; @* l! w
// 产生波形/ r6 }# y- `( W7 ?9 q0 T
PWM1ABasic(25000,50);: B! I; \+ r2 [3 N4 w
1 i( b* K& x6 o) d' H# O4 e- J3 F UARTPuts(" C6748 PWM Test Over!\r\n",-1);
& h# n" H' {3 G# E2 N UARTPuts("------------------------------------------------------------\r\n", -1);7 f; \- Y: s2 D* [3 c% C
, I0 k* l2 h3 H0 @
# j6 e# X$ ^. z, b
, C$ Z. C3 ~ }0 V% p: p1 W9 f
UARTPuts("------------------------------------------------------------\r\n", -1);
2 J- @2 f7 ~1 `( g- i+ \ UARTPuts(" C6748 ECAP Test\r\n", -1);
7 v% x7 H5 n- O$ V9 x; H // ECAP 捕获初始化' K( E0 s" _% {' Q& `! T: X5 U5 t
ECAPInit();
5 g6 Q; r$ X+ {# a UARTPuts("Initialize ECAP.......\r\n",-1);( D1 g2 P. ]* X/ T+ Z
for(i=0;i<5;i++)
8 Y/ d5 H0 P1 w- T- L0 a {
W4 ^+ T8 e' g- f" Q3 D4 j for(j=0x00FFFFFF;j>0;j--); // 延时2 k2 u2 D4 _/ t$ b; b1 u0 D- P
ECAPRead(); Q: E5 F. s# ?$ E+ ], U4 l& f
}2 C6 O* V7 b. H! L8 R
UARTPuts("\r\n",-1);5 z }! }3 d5 T- ^. q9 R1 C
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
9 f5 y6 Z! C/ j9 M5 }; B: ~ UARTPuts("------------------------------------------------------------\r\n", -1); }- \; `+ u/ P5 [+ G0 L
4 \4 [/ I) D. F, ~+ O8 x8 b: s
// 主循环; I: F4 J. X5 N: m0 k
for(;;)
_9 [/ M6 Y* z4 q& g {; z" l! y" W- S# J1 w
9 w' I4 T# p' t! x/ E9 f: T }
, B( i% h5 S/ P) ^0 p# i6 I1 S}
; b' o O2 T, l' b: q
& t# N8 J& F1 w0 G! e% S9 r+ i5 T- u/****************************************************************************/
( U+ @- F& D7 I/* */
}! {4 c, A' h/* PSC 初始化 */3 B/ h# k2 b3 P& [4 N: x9 U, `
/* */: @) G P' d b# k
/****************************************************************************/% }' _. N, j# a5 P
void PSCInit(void)
/ y, R' m; |, b0 F7 ~1 s{. U6 ^( b; `) A1 I9 o& ?
// 使能 EHRPWM 和 ECAP 模块
# N" G- A" X; L1 E // 对相应外设模块的使能也可以在 BootLoader 中完成
' c& q$ z* `5 |# }" p PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); w! N1 i6 I. h. W: W4 ^& f( }
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);6 V* `5 E5 b9 ^1 m9 w" F) V
}1 q; {( X- a. P
# b# l5 }! v, U! ^1 k [
/****************************************************************************/' W2 P1 z0 U( {8 Q$ m% E
/* */
- u8 @4 q, i/ k4 X/* GPIO 管脚复用配置 */; O5 i1 V* j7 r
/* */
! |( p7 ?/ W1 F; j/****************************************************************************/
' W5 r* T$ I0 ivoid GPIOBankPinMuxSet(void)
, w' p! D. V3 G! Y) v4 {, S( c{
1 m# h' O, Q" T9 P1 a EHRPWM1PinMuxSetup();" ^7 p, P: e/ _7 W& ^2 U
8 A( F2 U: z# E+ O9 I+ ^! C // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
) V! G9 C- R# t& a2 B5 z8 Z' \ // 作为捕获功能时管脚方向为输入
1 W! F4 t8 F. ^& N* x // 作为辅助脉宽调制时管脚方向为输出
6 B1 S! l( _6 x3 `) G: x // ECAP2 / APWM2
# U* \/ _- g9 `, [3 M- z7 k ECAPPinMuxSetup(2);
. d- |2 r ^9 l7 ?: t! G- F! [2 j# y" K3 G0 f; M( L3 E; x
// ECAP2 / APWM2方向设置为输入- d& {5 v& n* i: x& H( h1 W4 I5 M
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]5 M( e) b7 g8 _7 P
}
, V$ m( h) W* Y) ?4 {& W' x0 }9 H7 l
/****************************************************************************/+ ~/ {# s: g5 C6 W+ c9 @5 @
/* */
~! b l) D) K5 ]7 o) x/* PWM 输出波形 */; u1 L/ H" B8 O8 ^) {- c2 V
/* */3 [1 B- d+ n2 @/ J4 c7 }
/****************************************************************************// ^3 J5 ~. ^, t6 g' s
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio) ]/ v) c) W9 A! j5 G- f
{
7 C# H! i3 ~. v; ?* r! v // 时间基准配置/ Q. M* s3 e" X0 `8 ^8 k- t
// 时钟配置
/ Z' e- A: v& w! d EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
e1 t! s1 O, [. i( v M6 i3 Y& h5 q3 d
// 配置周期
- \" d! j/ J# J; W EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,# s3 Y- V" B e) a% A, E
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
* \" S) m% \, L" o0 l3 c# X
2 L0 ^5 O+ }/ c' b% Q // 禁用输入同步信号
' O; P2 i0 _1 j) ^- a EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);' [ F) D( Y% k; F5 `4 Q7 {7 S3 m
; I1 y1 D5 z1 j S+ B! k) {# L
// 禁用输出同步信号' o8 q, o: d& ?; |& @
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);5 e8 b% D2 Z- k* ~
" X- U& ?* c8 u4 a
// 仿真(DEBUG)模式行为配置
5 c, {2 `2 O/ q' ]% ]: T EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
& Z7 m" J6 }. |" h% K1 \6 d9 Z, u" H7 R# s$ V4 ?
// 配置计数比较器子模块
2 [" @9 H2 Z, H# k // 加载比较器 A 值" g9 |5 E, p' M* b, i
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,6 K: H0 m, l+ m" G5 y3 v
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
& e+ y/ X! H. e6 D
# A( _4 a5 m0 ~6 r+ m // 加载比较器 B 值 Q, ~: a; E* m; b/ g
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,! B; r$ T# ], f9 @. v( }+ S M
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);+ m( r; h1 Y( I: ]
3 _9 M4 D- C/ N+ r) f
// 功能限定配置(输出引脚触发方式设定)
+ |2 f. s! N: R // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出6 L( h, \- l. w. W7 A
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
; W; Y; A! E3 l: u EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
* |- {' C! j. Q. f" }( B. ? EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
8 ]1 [0 @- {( }# |7 \. Q! T4 j3 U7 j: d1 {7 g, p2 q; o+ ?
// 禁用(旁路,信号直接输出到斩波子模块)死区模块& `% |( ]& p% D4 n
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);1 t1 z4 }2 i3 C0 @
4 O9 X' r: x2 R% ]$ K) Z+ w
// 禁用斩波子模块
8 D1 A+ B" ?: d5 [9 t EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);1 `! f4 f% J! n- \& J: ~
! q& F- L( p& I // 禁用错误控制事件, w/ \7 y5 W5 I1 j
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);1 ?5 i! j `; R: i" d5 u
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
1 _+ R* d. M/ Z' x
/ }7 [. ]4 o! Z0 x // 事件触发配置0 { ~( l2 u$ }% k2 c" H7 `
// 每三次事件发生产生中断
5 R; z! O5 d7 e3 U EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);* X; G- {% x7 b: l0 [
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
0 U4 M8 g1 S' q _ EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);3 i' Q. S; y Q: f
// 使能中断# Q. q/ R" [7 A. v! i4 j
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);* F: M* P0 o. b4 L, f) X
$ F3 \7 i7 N7 [% R0 u
// 禁用高精度子模块* ]3 g" K" W! C
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);( R& c& m& Y& @( F# y
- K3 h) Z/ y# D
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
" j/ w" G% K1 f8 \}% L K1 k8 K% s! o B. I
1 `4 s' `( q1 l: \. w3 n9 v
void ChopperWaveform(void)! k0 E4 u0 k+ T$ j* ~4 o* T( {
{) Z1 ]4 s7 J1 F" |8 x8 V! I' E7 m
// 50% 占空比
5 A9 J1 o0 S* c3 C5 Y EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
# ]; q9 r' z. d9 ~ // 4 分频* m6 F3 N" R# G* k6 u# y
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);' g# w) P+ S V
// 单个脉冲宽度
" |) h F) z3 O% k, k2 A EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
, F" ]! }- E4 Q- S% z' \* ? // 使能斩波子模块
. w% K" f( z7 T- L EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
; d! Y ~7 X% \% y5 b' u}5 @. y7 W. B) V b7 q/ `( t
. j( b" N6 ]# H) |' ^* b/****************************************************************************/
: X$ z0 p/ F/ _2 s/* */! S& D3 Q2 D, P- R9 A# M
/* PWM 中断初始化 */) c; F7 j, F3 ~0 ~9 S$ K' ?- O
/* */3 ^! j& h" R+ c" k8 V/ K' {
/****************************************************************************/
5 M1 u5 u2 w( g4 W$ }void PWMInterruptInit(void)7 Z6 C7 m( w( V+ ]
{
( c; y2 P# d( m/ v K% y* M" n // 注册中断服务函数$ O F/ r |" R7 K4 b
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
( |5 F* I+ n8 h6 m IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
. N8 P3 T0 \4 R- S- n( @9 G: p# A
// 映射中断
V5 E: P; E7 |: C6 `. | IntChannelSet(SYS_INT_EHRPWM1, 2);
9 a0 I! i4 }3 @8 B% B7 P& `6 K IntChannelSet(SYS_INT_EHRPWM1TZ, 3);3 |3 s4 O T: I( I
- T$ N9 x0 z) r/ w% C
// 使能中断7 G- _4 D6 Y! ~5 W D
IntSystemEnable(SYS_INT_EHRPWM1);
: k) q3 F* W" \( \' n; |% Y IntSystemEnable(SYS_INT_EHRPWM1TZ);) e; J5 [" H; j( H7 ~
}
" Q A3 e, M8 J; R* _! p; O+ R; n8 h8 r$ H. E
/****************************************************************************/7 ?. I- J8 o: ?: A
/* */6 C n2 [0 n* n# R2 R* E
/* ARM 中断初始化 */9 b+ _' Z$ b2 Q/ [, b7 \) ?, h7 m
/* */
; n! N4 p- A; n/ }( X m6 y/****************************************************************************/
7 p" N! W# w, O+ \& Bvoid InterruptInit(void)
" {' B J4 j$ ~+ k{. o1 s- g8 D# @4 \
// 初始化 ARM 中断控制器$ o5 R3 H$ r/ a# p) C
IntAINTCInit();' `5 ]1 S/ P. \ I
& y A* M$ |7 I) R4 e; w
// 使能 IRQ(CPSR)
6 ~7 U+ |1 r% W4 J4 S9 ~ IntMasterIRQEnable();3 x9 v* F, Z/ M( N& z b8 G
( Z' \& [7 ?6 g. ?. u- | // 使能中断(AINTC GER)
! n/ N3 P& l* g( z( Q- d: Z IntGlobalEnable();7 V/ m# l$ V) n7 M# N0 P" | W8 s
; F5 v8 j, r `! t1 `3 q+ L
// 使能中断(AINTC HIER)
' a; `% l' r" k; F0 a9 [$ Y$ L; { IntIRQEnable();
7 Y! k* H& M+ s$ p}% l8 ?2 {) @+ Y r$ H' {8 v5 ]
9 u7 j" H c- X+ p |
|