|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/# p' I' W3 x- z# `0 k
/* */
+ P Q% G& s: E6 n: ?/* 宏定义 */
0 t' T$ z9 I+ A$ C0 K+ e8 W4 Q/* */
' n: o% A2 Q& |* `/****************************************************************************/0 U% u* I9 J# e' l
// 软件断点
, a7 H5 `, _( M#define SW_BREAKPOINT asm(" SWBP 0 ");& y1 [' C( X6 @% n4 Y
. G1 F) f# ?; Q& v/ A' ?8 `8 _8 H// 时钟分频
0 E6 ^9 _) J% V+ a5 P8 z1 @2 A+ S$ H#define CLOCK_DIV_VAL 228
4 k9 I7 L: L3 L7 V U" {6 z3 f4 n
; F) I9 }2 @* Q7 Q8 S0 r' g/****************************************************************************/
) [& g2 O8 |% \6 F# f* }, j' O4 D/* */
/ a' x/ G0 [4 ]! e' }5 r5 E/* 全局变量 */) C& d; [4 F8 M: a4 L" _7 G% K4 D
/* */
- j7 n4 o' w4 w/ Q/****************************************************************************/. }6 @* x! r2 ?: z0 o. ~) q
ECAPCONTEXT ECAPResult;/ ]6 ] }# H4 J, B1 h* |
9 D' v# B' G5 l# s/****************************************************************************/
$ ^. w7 Q8 p% ?/ X8 |. i. u- X/* */7 x9 w" E5 q3 y5 ~% K
/* 函数声明 */
7 r* L* R l& B/* */
5 w, B- C2 q# m3 Q/****************************************************************************/' B X9 M! }0 K0 j4 M! }$ t" a( g
// 外设使能配置1 B1 l: `3 D5 Y) `" F$ o
void PSCInit(void);
% M8 |+ K0 C4 ]3 A, E! m
) O8 P6 n! J; }4 D% A) n- e; L// GPIO 管脚复用配置! T; G: `* b. N2 n/ T, m3 S
void GPIOBankPinMuxSet();. {2 b$ i& k `7 J* l( X, E
8 j6 @! Q( Z& V
// 产生波形
9 f1 y4 u' Q* H1 C1 D0 vvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);/ D( s! V$ `9 _& k6 V) c. D
void ChopperWaveform(void);5 d- U; G) D' N* n% w, p/ D
: \1 m5 ^* |1 V* K0 x/ ~
// ECAP初始化和读函数( z8 B: V, ?) K( }5 M* g3 Z- Q
void ECAPInit(void);
( L5 Z! e8 z* y9 munsigned int ECAPRead(void);, p0 ]. ?5 ~/ ` P# h
. I( G; E; \/ V" x6 E& U6 C& t0 H
//ARM 中断初始化
) G& g8 l: r9 ~! zvoid InterruptInit(void);& o1 g2 J7 [% y
9 N& S8 [ Y" H
// PWM 中断初始化
. z9 c9 P- ?, W( s" e# U Gvoid PWMInterruptInit(void);
1 R4 x! M" y0 S+ I// 中断服务函数
) d' Z+ {: D. k- T: a) m// PWM 事件
; @" ` Y, g0 U4 G% e Uvoid PWMEventIsr(void);) w$ ~9 b4 u6 Y) n' w5 p, }
// PWM 错误控制事件" [: w7 [' b& w, F, Z) a4 u& J
void PWMTZIsr(void);& W' h- G) g2 \ C$ \. a. A
+ f) F: Z) l6 s/****************************************************************************/
% q. [5 s9 g) a2 c) @, e0 W7 @/* */+ D3 r) ^4 t {/ g* A
/* 主函数 */
1 g1 }5 j/ l5 ]* a: q4 d# `/* */9 J! l6 l/ N3 L: z, {7 ~
/****************************************************************************/* s+ u4 z0 U& v% K
int main(void)
9 z; a' r& z8 P' S# Z0 G- Y" ?/ T1 a{
2 H- E5 T: ]' W+ G3 W // 外设使能配置
$ L9 W7 j: p/ u0 _6 x PSCInit();
$ S: k( I! m* @' U/ ~" H2 J
% p& j0 A6 J |- T7 g // 初始化串口终端 使用串口2, T; s- {4 h. _6 N
UARTStdioInit();6 ?- q+ |1 h5 v9 H( v/ a( t
% Y0 d' l* {+ Y2 U) q+ I) ?# A8 I // GPIO 管脚复用配置# V( C0 D' t1 p5 Q* Q8 }
GPIOBankPinMuxSet();+ G2 v4 x7 F8 V9 l2 q6 G8 x
; Z' S* _& J- C
// ARM 中断初始化+ |) m4 y# e2 O V0 {. |$ s! |
InterruptInit();
: y: w" E! J5 `& b& v" K7 q0 P) J. ?) Z4 @4 j
// PWM 中断初始化
% }/ M' u3 G* W! J1 J PWMInterruptInit();
1 n- n$ c# k* v& ?# C* ^! `/ x9 o) v9 d* _2 v9 P
unsigned char i;
% ]* |% A/ N: K) q" f; d: H1 o unsigned int j;
$ n' k3 h' z6 h, @# N9 Q( D
8 Y* G L- F, C7 g UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
, K+ Y7 i9 F$ H/ g4 m4 w( P+ n UARTPuts("------------------------------------------------------------\r\n", -1);
% e; S/ @* V: g" l. ]( e* A. X! h( P UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
9 \4 P" c* v9 J8 v // 产生波形
B( `# s2 i4 j; ^. K0 [6 w PWM1ABasic(25000,50);
4 r$ X9 {/ y, S: P; M* m- o$ s, h9 \1 r8 ~# k( D/ i1 j
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
6 \& m# A( X9 ]1 Y- b. o c2 R/ h# m3 E UARTPuts("------------------------------------------------------------\r\n", -1);
- ]5 s: J( e: F
/ m- m; ?7 H/ N' b
+ g/ z3 G3 \, V. D- B( h
4 t% g1 I4 q: s& x$ Q0 y UARTPuts("------------------------------------------------------------\r\n", -1);" C" u- s8 n) s6 O6 a3 a2 ^2 k7 l ]
UARTPuts(" C6748 ECAP Test\r\n", -1);0 r2 w/ k# K J, w D# [. ^
// ECAP 捕获初始化1 ~( Z$ U# ?! d- F
ECAPInit();/ Z: d+ h4 T" L; r6 l% R* N7 X
UARTPuts("Initialize ECAP.......\r\n",-1);% c3 \: \7 `7 t8 v2 D" x2 V
for(i=0;i<5;i++)
u) o9 f+ B" |& l& u# O3 s2 w4 G. ?8 ?* [ {# H* X) k; h+ h/ L/ f, t
for(j=0x00FFFFFF;j>0;j--); // 延时
$ i4 {8 \+ n5 W5 q- T4 y ECAPRead();
- S! X, Z. q8 V: Z4 ]) c& q }. U* l5 `8 c+ a+ K$ W
UARTPuts("\r\n",-1);1 U* G# @. F( o( f, P7 h0 A
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
: P; S0 T, q: a4 s UARTPuts("------------------------------------------------------------\r\n", -1);% I, x2 _! C. i0 A& p/ N ]5 B \
. [+ u$ R" `: k# `4 Z/ A- ^& s4 I // 主循环
4 Y% c+ r+ X) b5 W for(;;)
: [1 b: A8 X4 A. E( C {
7 O; Z5 |: h7 w. N9 i! H$ E
! j: z T/ u/ b }* l, ~9 L; s1 F+ q2 \
}- N# w; o! d7 D5 x4 V. s
) n L3 J n" `" a1 A' c
/****************************************************************************/8 `$ D9 A9 v3 _" @0 z9 [1 \- O! k3 A/ c
/* */
& J# O' `# l/ V/* PSC 初始化 *// p, Y8 T( V. T
/* */) k* U. }! q9 t+ w$ I- c
/****************************************************************************/' x' y0 H( K8 k+ R3 Y$ L0 q
void PSCInit(void)/ Y0 k; Y$ D6 F' v" }- c% c
{; z: S% x# E+ U" h
// 使能 EHRPWM 和 ECAP 模块$ ^# U2 Z; e2 B1 r5 d
// 对相应外设模块的使能也可以在 BootLoader 中完成
2 G- I0 M6 s. w+ j' S PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- c" [& Y u. h- M# j% G PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);/ w: ~/ y6 I# o0 w- p, _
}
6 f8 l3 R! J4 j# C4 c- v' X0 x. G% n# R4 W* \! w6 P
/****************************************************************************/
D- t& i. i) f! s/* */$ `4 y0 [& |" N# M. k
/* GPIO 管脚复用配置 */
( m2 h) T; g' C3 q/* */
, E! x6 K; p) E; N/ B/****************************************************************************/
^8 X! _$ e* U5 c% T3 v% K, Lvoid GPIOBankPinMuxSet(void)# I3 c+ Z* R4 ]3 t$ x- }! j$ w
{9 t7 V# o8 z. p8 u9 c
EHRPWM1PinMuxSetup();5 |7 s- w: O4 L$ j
& W4 ~2 j6 ]& h5 e
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)# e& T/ j* c$ v, V0 k
// 作为捕获功能时管脚方向为输入8 S6 e7 L0 B m! L
// 作为辅助脉宽调制时管脚方向为输出
1 P7 m1 [! r! ~0 [- k9 S! y% ? // ECAP2 / APWM2" ^! v2 L f+ q: C
ECAPPinMuxSetup(2);7 `% J1 v: J* l# {
' l' m/ b8 m( p# h r/ h4 V // ECAP2 / APWM2方向设置为输入
, \2 D* {; P' u5 q1 m* y GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]4 H/ s( [( y- J
}
+ x3 t( d/ Q: D' ~) E$ o. J0 P9 A2 }) S! A6 e4 {
/****************************************************************************/" L5 _' E. D( F# p+ m3 l
/* */7 W" V% N: X1 |( o2 ^
/* PWM 输出波形 */
" P: _# Q/ Y8 R/* */0 Z4 Y& x7 J1 c4 j0 N; n* `
/****************************************************************************/
3 C) b. s6 i* }+ \void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)5 E _. ~, _5 o( ~1 ~2 b+ h
{* {- E" Y; q( [) J% v
// 时间基准配置
) ?. r6 C. k: v; g8 Y // 时钟配置
8 X. d8 i- Y: p N' L0 c( a EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);* Y# i8 `" d& L) z9 H
) ?! l" v! C! B // 配置周期
7 V8 ]1 W& X! b$ b! r- z EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,9 Y4 W2 P9 f; Z7 ^4 x
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
4 S9 X& ~! f9 t& K3 `9 O5 l% b4 }: n; p4 H* t
// 禁用输入同步信号
5 H3 H2 e+ A7 q9 Q EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
& J6 M! j) _! a) Z% l! ?2 V3 e& ?# o' o) g1 U7 b. I8 ^/ D4 i
// 禁用输出同步信号* f0 w' X: |# g5 j
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);# q( @6 r8 v& A' q: J1 v
& W& d% W) U8 `4 s% B$ x. O // 仿真(DEBUG)模式行为配置
/ l: c. N% b' v EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);6 @2 X, z+ W% }+ A
* I1 Z$ {: l7 H8 b6 c9 d5 j
// 配置计数比较器子模块
+ z6 I5 O# H. e" [1 Y( r/ E3 ~, o7 w9 n // 加载比较器 A 值
* i$ L9 i. o c6 ^) B$ E EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
7 F/ ^1 X3 _/ P6 `* J( \ EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
6 _3 ]+ a- H) h3 ^: f9 d9 w% J1 S0 h [2 J/ \5 A% p
// 加载比较器 B 值% `, J1 B$ t' w0 t" l
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
z/ q5 N7 h; }% P2 _8 u. U% _% T EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
# j0 a( d4 K1 F0 v9 h6 b1 p
9 F$ O3 o, t( O; V; Q // 功能限定配置(输出引脚触发方式设定)
4 c5 Z( O9 O8 @4 @$ k // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出- h- O* s- ]! [* t
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING, E5 i* [" Q9 R8 t# t8 M! K9 W
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
$ |, y2 F% X* A! R3 W! @2 v0 p EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
6 C6 L9 j4 K' o1 c: ?* m
8 W& G5 T/ n3 E! J+ H // 禁用(旁路,信号直接输出到斩波子模块)死区模块# Q/ m+ z- v& ?4 @( ?3 i' D; V
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
% K& t$ [& H' j, @ {
, ?0 o i3 z5 U0 b" S; i/ i // 禁用斩波子模块
* L) b& v% g7 U! e3 w EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);8 @' h9 i# W- z5 @2 @* N
- }4 P( u2 b* s" ` // 禁用错误控制事件& o$ q& M; z9 K' a
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);3 i. U, k& }+ X' S
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
: x- ?2 { b( \) @. w) X1 i/ W8 z4 [& W. R5 k- A5 T
// 事件触发配置& f, v6 `$ n+ [& h6 u1 c( S; o2 N& e
// 每三次事件发生产生中断' k1 q0 q9 @: ?* U
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
+ h1 G2 P' H4 H2 l% C+ p // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
' K! ~% d8 e2 z$ t6 U- U EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);- z9 S: v6 x R6 F
// 使能中断
' v: c C; l% U2 e8 I" I9 ? EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
# n5 [9 `+ k+ m2 W" X {+ y8 w! L4 M% x+ N0 k/ e" W
// 禁用高精度子模块7 [$ a& g! V0 H, a7 L
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);+ ~2 e7 N* \' |5 u( u
0 x( W0 s+ M; R% K5 G ^" R- c
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
2 I. d% }# c. N: J% h# d}6 |2 P6 Z" J2 F% `
: ?4 `0 E+ b0 l
void ChopperWaveform(void)
' ` i9 w$ W$ A+ [{! r8 H5 C z1 C4 `6 W2 m2 Y
// 50% 占空比
! g; {! p# q- }- B EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
1 ^- y' r( c& `2 _2 J8 h9 G( ^/ Y // 4 分频- B4 d. o \' @- n7 W% ]
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
% x! N$ z8 l0 Z2 L* Q // 单个脉冲宽度1 F$ h* B4 e# D2 L: h8 E7 t! `; W
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);! D& s1 B$ O, O! N
// 使能斩波子模块
" Z# c1 ?' h+ P7 R" V EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
/ u( F2 y& F7 G" V3 [& Y}
$ @" b( |( `) X: d t
" x% b' V: f$ E/****************************************************************************/
; f x: {2 ^ s/* */
' H) x; Y6 V/ v/* PWM 中断初始化 */6 l( G& ?& V8 a- Q, j( A
/* */
" S! r8 `' D- s! K4 u7 ^/****************************************************************************/
: M" b" J, T/ V6 k0 z6 d H1 _void PWMInterruptInit(void)
' \" C0 u. Y# E4 B) l1 m{
: q$ Z" q$ z% y3 R // 注册中断服务函数# x% S3 s* B/ a8 m7 o. b" l0 {1 n
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);9 L, Z9 [( H/ m2 E
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
9 h1 ~" \$ D& r8 i0 B' _: z; P3 w! d3 m% s7 e: R
// 映射中断
- l0 ?9 g& g/ L: t8 z$ y IntChannelSet(SYS_INT_EHRPWM1, 2);
) T+ m. P/ _ m! W0 R! g IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
& o' p# X& I. C& u2 O! A( z
, R2 n# k" J! p4 @( c/ f) q K$ Q // 使能中断
4 z; |9 {$ I- l$ H2 w8 T IntSystemEnable(SYS_INT_EHRPWM1);7 u' V- f; \; C M
IntSystemEnable(SYS_INT_EHRPWM1TZ);% [6 v9 [- @2 D. i
}
1 h6 ?( g: f: }. L3 T3 d1 g4 B* `( r( `
/****************************************************************************/
6 b: s( S3 m" }+ a1 {/* */& z1 Z/ z0 G: S1 c9 y I
/* ARM 中断初始化 */* z$ E' n1 V/ W
/* */
3 ?- W d0 A7 ^6 M3 k' _: a; p/ ]/****************************************************************************/
0 V9 _9 g1 L. j- [8 |void InterruptInit(void)$ A9 t# d3 {$ y$ D8 x2 c, M
{4 g6 K! z+ i% e3 p$ b% s. d4 \
// 初始化 ARM 中断控制器+ A; q3 N. c+ l5 b
IntAINTCInit();+ Y5 S" m& q: K3 c: {; Z% Q) M
8 ~8 b! y: P6 L, {( N! |2 J
// 使能 IRQ(CPSR)- D7 Z, x0 q* j
IntMasterIRQEnable();3 k+ N' {9 Q1 s% M0 k4 k% H
% ~; P% @2 m0 Y6 M$ I j
// 使能中断(AINTC GER)
% H$ n: e5 l* B" ]2 S& y# B IntGlobalEnable();
8 l# _; F3 V) h3 }( n/ z6 f J- j9 q
// 使能中断(AINTC HIER)2 w6 X/ \' W9 A. ~% o
IntIRQEnable();
0 f1 H( Z( ]: O}- Q& g8 O5 |% X7 W5 A
* R4 W0 W j6 `( b2 v6 j. q. b9 X5 s
|
|