|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
# { y; @, s* ?/* */
8 a0 ?. \: \* m; b$ W/* 宏定义 */
s, ~8 n, w; `5 Q/* */! @; b I. r1 m! X+ ^5 l, l
/****************************************************************************/
; k# K& n1 v9 ^' C: e// 软件断点
( H+ Q3 @2 }# N9 @# v+ s#define SW_BREAKPOINT asm(" SWBP 0 ");9 Z+ o0 d& H2 W9 J, E5 q5 Z
: W9 y9 ^6 b6 U* ^) A- W# a: X
// 时钟分频0 B$ M. E4 b8 M9 x5 @* L
#define CLOCK_DIV_VAL 228$ s9 o* U! H% F6 z
9 D& b# g8 A0 r% Q: j
/****************************************************************************/! `/ ^9 ?5 ~) v7 L; l ?( N. y( k7 m
/* */! g9 k3 ^) X: t7 M! m4 [& I
/* 全局变量 */
7 x0 S4 N- Z$ N# @9 Y/* */6 \! M* a' o+ x( U2 v" n+ }
/****************************************************************************/
- Q# z; R& e0 }' c8 ~$ a: }. l9 PECAPCONTEXT ECAPResult;
1 d) n- @) G7 `( O2 n* n' W! B' D( O. `8 x" f2 f9 e' M
/****************************************************************************/5 Q4 \0 c: P W$ M. K
/* */
6 G" C4 ]4 n9 k) P( Q/* 函数声明 */
' |7 x- ?0 j* y+ D7 H2 {: c/* */% _' I7 j0 ^$ S% f1 O
/****************************************************************************/
& y+ q/ u) S7 P$ F6 k* n; T0 ^$ @1 S// 外设使能配置
2 i7 z( _8 |' ]9 ?, Yvoid PSCInit(void);( ^7 o3 K. P0 T
4 w8 U4 |, G; h+ B// GPIO 管脚复用配置5 z. M* K& ^% T
void GPIOBankPinMuxSet();0 [9 E) S9 q& s& K# f, T
/ d. f1 h5 z7 b9 }) F1 j// 产生波形+ r& P4 \ s& h# b r
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);1 j2 s+ _3 J! d. c; @, W* h
void ChopperWaveform(void);. U. c; [8 l2 n( L
( p$ `2 Z+ t3 S% ?4 Z1 r// ECAP初始化和读函数
7 q% j% A) U) L0 R: a" u5 svoid ECAPInit(void);
3 j9 p8 U' Q! aunsigned int ECAPRead(void); a# K0 Y7 R* z9 }
5 c6 P+ ^5 k* J; s. z' E+ i//ARM 中断初始化4 B+ e9 O9 o0 b h! i6 F: h
void InterruptInit(void);
n v( _& E X3 I4 J+ W. m; c: c8 l- B! H8 Z1 @
// PWM 中断初始化2 x$ k; ~8 v; d. i8 ?
void PWMInterruptInit(void);% \0 G8 g5 B1 ^3 l- G# n
// 中断服务函数
- r8 V! G0 L. B. P// PWM 事件
# d, j+ J" L" c. o/ Kvoid PWMEventIsr(void);
+ {' Q1 A5 B1 y4 ~7 Y1 y y// PWM 错误控制事件$ U5 x! u/ C* A
void PWMTZIsr(void);
2 V* p- p& f' p/ ]
, G/ i& |) [% L4 v' V/ B' k/****************************************************************************/" d' I( g' U2 J
/* */6 W2 N2 M" q- B3 E' M7 k3 }1 v
/* 主函数 */
& ?$ p6 J, g' \; B' I0 b/* */, x5 H6 Y! N: h+ p$ u1 f9 _: f
/****************************************************************************/
$ J! i8 Y9 m2 H7 `: Lint main(void)7 S$ w9 }9 Z' W+ f
{
4 Z4 w- }0 H% h0 Z9 p4 } // 外设使能配置
4 x' e r9 m2 M PSCInit();
9 k3 v6 D% d+ g$ C- E: z/ `4 N; I2 |) J4 J1 W" {* v
// 初始化串口终端 使用串口2
# j0 A2 v z' R3 t8 q UARTStdioInit();( D; e! Y9 b1 u* @
2 l" Q9 ~. t9 N" v& `5 S4 u. X$ e
// GPIO 管脚复用配置
9 w0 L- a# w7 \ { GPIOBankPinMuxSet();" Q$ N9 J* q5 {" B
+ q, z) p7 e: g // ARM 中断初始化
. _4 l: u) o4 c; @4 \% j5 c! ^ InterruptInit();: w; T; |7 j9 j" ^' ]3 e- c4 m
4 T+ D# \- Q, Q! `8 z! p // PWM 中断初始化) j, G. G9 u+ H& h* L' N* {
PWMInterruptInit();
+ m1 O) u. k$ W$ X( B- M
& R; e+ C( q& N9 Y+ M unsigned char i;
. m6 L4 M( ^+ S( y unsigned int j;6 C7 z' c* X9 f
2 u5 e+ d2 E7 _, I5 W
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
6 i5 z- b) U( g9 n( j UARTPuts("------------------------------------------------------------\r\n", -1);! U) S) k S$ p) I$ I9 T* j4 ?9 B
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);8 J* K: C; Z2 U$ ?* B% W
// 产生波形
) T& |! ~3 k o5 ?* C/ i7 w PWM1ABasic(25000,50);2 Q* C( c e7 u [- w
3 Y7 l' a- v0 ?$ I$ ` | UARTPuts(" C6748 PWM Test Over!\r\n",-1);
1 y" _6 S+ Q4 T UARTPuts("------------------------------------------------------------\r\n", -1);
$ y8 g( y8 Z# k0 j U p- H5 V" n: f4 n) u. j0 b' U
. h8 h3 E H: e2 L) E+ V
@3 ?4 Y8 U& u
UARTPuts("------------------------------------------------------------\r\n", -1);
3 _4 a; D; O [8 X, j UARTPuts(" C6748 ECAP Test\r\n", -1);5 Z7 L" a3 n8 L. U
// ECAP 捕获初始化
' |2 }: s2 k! U7 E! x! e# X% V3 f/ T ECAPInit();% g. y' Y6 h. K- W: t% h2 L% @
UARTPuts("Initialize ECAP.......\r\n",-1);+ x% n5 n/ M6 I$ }7 W) b9 @$ B/ }
for(i=0;i<5;i++)
9 ?" l/ N0 ?4 ^" H4 A0 O/ s {* k7 V5 l6 @- H. E# p3 t
for(j=0x00FFFFFF;j>0;j--); // 延时( B4 |2 J S3 `' ]% v# Z
ECAPRead();
0 Q4 m/ I3 P) l8 z* r }
w, u; O) r& e- {" ^9 F UARTPuts("\r\n",-1);9 C4 ^1 _, A/ w- Y4 o5 G6 a& I, C
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
) l7 a7 a. P3 _2 F9 U9 m. ^/ H UARTPuts("------------------------------------------------------------\r\n", -1);; p( X8 h; V: k% p, @4 r
/ l9 h* D- x$ R
// 主循环
& G7 n' _/ p: r$ ]" Y2 | for(;;)7 }* M* y2 |0 n% T! \3 P: ?
{8 r3 h2 U2 L$ h+ j" N1 @' V! t. W
! O/ J: z3 u' N; z: u1 S0 | }8 K* B% Q5 ~6 J+ _
}' G: Y/ |8 Q- z0 c
0 _9 L0 G9 S, |& n8 {3 J5 W: @/****************************************************************************/
1 ^% {! v8 D2 t) U* u4 ?5 Y( X/* */
; k$ C2 R' z% _) x/ m! |/* PSC 初始化 */5 J( U+ i% g% i
/* */
+ |. a+ v9 U7 q T8 K/****************************************************************************/
$ q- H0 S6 B' ]void PSCInit(void)
7 K. E7 w9 \. V{. A1 h! X, i3 B9 K: [/ D8 A
// 使能 EHRPWM 和 ECAP 模块
# r3 ~5 D, z: Q m4 O: n6 e u2 x // 对相应外设模块的使能也可以在 BootLoader 中完成
7 C; U3 e2 e% u0 t) d% L) K PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
9 [0 H$ \3 s; m( c PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);7 k/ w7 J6 ]4 p6 Q. G6 {& Z
}
5 D0 k4 _, P G0 s$ E
4 U# J1 }: h: ^" g* V/****************************************************************************/ J' g. x& W6 C! O' l! F0 j' P
/* */
2 L) A' o$ p& C( l/* GPIO 管脚复用配置 */3 ]* X5 M/ n3 F8 i/ C2 V+ @" X
/* */
6 h+ l, f9 n) v- ]/****************************************************************************/' A$ @0 F2 {9 r7 B9 X# A' @9 m' S
void GPIOBankPinMuxSet(void)
. A, \. X ^+ I: ]4 v) q{
8 S b$ a- H% w$ A4 r EHRPWM1PinMuxSetup();7 Y% B( v+ y7 S' T. U
8 P+ O+ H" m. x! v
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP); U. b. ~2 _' p# d
// 作为捕获功能时管脚方向为输入
' f& |2 }+ N1 b1 Z( [% D // 作为辅助脉宽调制时管脚方向为输出
; ], P5 ~5 L# a: W4 G+ P( A // ECAP2 / APWM2
2 c8 D( H2 _6 n7 s, b ECAPPinMuxSetup(2);9 C/ C- y4 l1 P* F: b
z f$ b8 m! o* k // ECAP2 / APWM2方向设置为输入7 g# [ C" b/ B4 C
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]9 C M8 O5 Q5 e7 q* F2 O/ L
} P4 j6 }& C0 C& x* i* q
2 A9 O/ a7 g3 W5 {; L% Z
/****************************************************************************/
# |7 v% p5 P' D' L0 x* }* X' @/* */, d7 Z. e3 E0 S% ^8 U2 ~. D
/* PWM 输出波形 *// Y1 n, \7 A0 z
/* */; f3 a/ O5 R2 a$ Z
/****************************************************************************/
( p5 f0 z2 g- y/ Z' O) z( Hvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
; P: E/ `! s5 t1 p- A: x+ _{
+ {, I2 D8 a2 \7 P // 时间基准配置
. i( O9 I* \& |7 B" s G // 时钟配置
) [3 ]& l& _: s; ]* _+ ^ EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);1 z6 }4 B! D1 q4 w0 Q
) |% t( t1 f, L; q8 F! t# G0 g1 B
// 配置周期
- _6 u4 p) o$ {2 n. B EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,- S, ~! w0 r( _- |
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);2 n. U, G* F* Z* ~) E" C! }
- }8 H( r+ `9 v* r& e: f# } // 禁用输入同步信号
, {; R2 `8 @, Y EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
5 l. n/ a, F- q* C# ~
* O T' Y$ e7 x: l) F! t" O // 禁用输出同步信号8 K' K* w3 M! H. c' {; j8 Z
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
( w2 M- Q' F& m5 m2 R6 o; B+ O( [
: l# x& a5 A! t2 V* v. }5 F // 仿真(DEBUG)模式行为配置
$ j% |8 ]) b$ {3 j b1 M) w EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
9 t3 n1 l& K% | @8 W& o0 M2 M- E+ v4 R, I# F# h8 W- }/ S
// 配置计数比较器子模块1 m& H9 C' m! ~& A) m& ?0 p& b8 E e
// 加载比较器 A 值. _+ Y- ^& y, \! S! q
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
3 l$ s6 A) o8 o: T EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);4 h$ h$ I4 V- r1 w. b' P) l0 e
% p7 l4 X1 c6 E+ t# P6 t3 w& w; e- D
// 加载比较器 B 值
1 ]- s; ]0 t& F: x EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
: h; E! i5 L# h% I EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
! a, g7 p. c, j4 v5 l/ z2 N% ~7 ?
// 功能限定配置(输出引脚触发方式设定)" T6 W6 B3 u2 v3 [8 g
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
- h( ?! W0 ]. p$ n. s% ~- o" ^ EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
' |; U' _; y# H# d) A EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,& W; b, i( w- P5 k! W9 X. X6 Y J
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
4 F% H4 E) _9 o8 F' n4 ^
$ z" ~) @4 E* r' ]1 `$ w" I6 D // 禁用(旁路,信号直接输出到斩波子模块)死区模块5 F" ?, h6 o! }5 ]
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);' [ c9 x9 D$ s$ R
* Y5 l G& V& n! o5 U) Z4 w* r: A# i$ B // 禁用斩波子模块" z0 L, N% l3 M: Q5 j
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);$ U) q( E0 c3 G1 @) E' J7 k4 [1 i
/ J6 T f% l" Q9 p2 T( v: d4 C
// 禁用错误控制事件
& ^/ p9 C4 [; P) g4 ?+ A0 u+ X7 P EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);6 X2 e& l0 w1 @
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
+ f0 g! u6 ~1 z5 q" c4 j `0 `4 ?# M3 L# m& M
// 事件触发配置
1 `, h5 o0 e8 y2 z( B5 I7 Z) m // 每三次事件发生产生中断1 y) h- i2 p% d1 a7 Z
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);+ J7 d/ J+ ]- C0 @5 E' D7 ]; |- n
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件. s3 |9 O; }% F
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);( U+ m0 I% c; Y7 x
// 使能中断3 O4 i" T; D7 c6 |
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);" n8 [# f+ w7 t2 f2 d
+ A' r1 g$ ~: |- z% ~9 l$ z' R7 l
// 禁用高精度子模块& l& m- \# g6 q9 j
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);) R8 m- e3 X8 {4 _6 ]
* O1 ^2 `- ~- L$ l9 U
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
" [) ^- w2 y& o: r$ c; I7 G* o}
2 Z9 M" G+ ?$ ?4 I- ~' W) v. [8 L% Z: d
void ChopperWaveform(void)$ Q4 f4 F% Y" h; p
{
: Y# n2 J0 }) d( k& ]4 h N5 J // 50% 占空比
# Z* w" ^2 X$ d; U EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);) k; w# _8 k! |+ `
// 4 分频4 F @& Q5 ]: L$ o* k: I \
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
. G+ Y1 `) E6 Q9 T% @+ L // 单个脉冲宽度
( o& ]1 s6 M* Y* |0 a EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);% V/ J' c: q) |: `! s) L
// 使能斩波子模块
+ G0 B$ N" N/ \5 D9 A7 Q EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
) T, \: @* V* N' ~}# k: D$ Z# ~9 {0 e; H
+ e: p$ P7 J7 m* i/ [# }3 d
/****************************************************************************/
4 w# q! ?3 D0 C4 J$ H/* */
1 F8 @9 U E% d/* PWM 中断初始化 */$ q0 V8 s1 R8 n) H
/* */
, y# b; L# C, D& o" V. _6 |/ W/****************************************************************************/
5 ~( K6 B; O4 Bvoid PWMInterruptInit(void)
% b; u( o6 C. k) }( s1 c{
" e( a* a D o+ w' F4 ` // 注册中断服务函数0 p, l9 z- @' p& g2 J2 r8 n
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
2 N: Y- R# p( {6 r IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);8 c3 I8 ?. u/ ^3 b3 O' B) ?
# D$ D& j9 Z. }5 Y3 P% i# L // 映射中断/ x, {: N) q7 _$ f+ }; R
IntChannelSet(SYS_INT_EHRPWM1, 2);+ Z" y1 O5 Z! k5 _- s$ j, }/ n+ {
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);5 ]' d$ O7 c7 Y9 A, ^
9 T9 n M5 X% L! E2 O
// 使能中断# F) w4 H3 `; a0 n' v* E/ f4 s
IntSystemEnable(SYS_INT_EHRPWM1);. S) Y$ v% C" }8 b
IntSystemEnable(SYS_INT_EHRPWM1TZ);- `$ ~3 v5 D+ B6 I# V, e6 J
}
- U& X* L6 f. T: k/ D& @. H: m2 u7 H6 a$ @
/****************************************************************************/2 z2 _/ Y+ M B# N+ k0 x& Y: E7 O
/* */ K* R1 H ^7 M7 I2 c+ K E
/* ARM 中断初始化 */
5 v" ^8 f" x2 m7 d/* */
. q0 p& P" a9 b/****************************************************************************/$ E5 W8 L% e2 c8 ~) f! {$ t- v9 o
void InterruptInit(void)
5 `, c, c ?9 P$ C# M7 S{% N5 _8 v7 L9 E2 u* o& Q
// 初始化 ARM 中断控制器
: x1 ^1 l3 x" j# u IntAINTCInit();
2 j5 f/ d5 e5 I2 ~. t+ y5 }* k: m- V; X% a
// 使能 IRQ(CPSR)
0 x4 l' H' t; ~, b5 X( O% b3 W4 ? IntMasterIRQEnable();
3 |$ Q" q( p) X5 ?3 D
" D, R- m/ {' I1 j // 使能中断(AINTC GER)+ r' L, L# ^% y" c: P
IntGlobalEnable();# C: v9 @4 d( `( {
2 F" [, U( a% t! y // 使能中断(AINTC HIER)
0 i* }# ?: U9 o& ^1 ~ IntIRQEnable();) r3 B8 {2 }% y$ t2 V* j
}8 e: B0 r$ h J: C
( t# U* Z" \# Q/ [ |
|