|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/2 T4 o& C# k% M% p
/* */
! r9 Z$ Q6 ]% A% B$ o/* 宏定义 */
G9 d8 d, w) c, C/* */
2 }* x' n) g" ^8 }' f/****************************************************************************/
: ]; k Q, ]5 t0 b3 C3 I) o4 R0 n// 软件断点1 M( V/ ^" x) P
#define SW_BREAKPOINT asm(" SWBP 0 ");/ k3 N8 r: H# q1 {! y6 F
}; @" C b( ^, _
// 时钟分频8 ^! M' H$ ~- V" s% w
#define CLOCK_DIV_VAL 2284 M% c8 f0 D8 e8 D3 X: V
' F( r! H j( q) o# g( `, g N/****************************************************************************/ g9 d. j! m b8 B0 G6 A
/* */
8 i6 d; s, z& e8 b/* 全局变量 */
; _0 x' m# t1 X3 h. \; K% O/* */
" x4 w9 p; A) h/ M- \* }/****************************************************************************/
# _2 o4 @4 C' r% v( |0 Q# `8 @" CECAPCONTEXT ECAPResult;7 W; L- }5 o5 M
$ d5 ?* h& l( O$ C$ u/****************************************************************************/
4 l4 x, \% N! p/* */
8 a. O8 ^$ o( G: x; w) V/* 函数声明 */
5 j8 c: s P5 w' g) R1 A, ^/* */
( O, ^2 v3 U# r- s$ f/****************************************************************************/
6 O1 r2 a. q8 R( I8 ~$ z! r4 _// 外设使能配置; A3 | q0 t3 U5 p8 P S& `
void PSCInit(void);
0 ^" ]. i5 L4 Z+ a$ R: |
0 ~, [! w9 L9 l& B4 l// GPIO 管脚复用配置
N8 K0 j5 T4 E0 |5 gvoid GPIOBankPinMuxSet();
- I3 s/ Z5 d- I( W
* n e6 k$ z1 k' m- K% K// 产生波形4 Y0 d* H6 q8 a. a
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);9 W7 o/ s% e$ y% c: b
void ChopperWaveform(void);9 G1 d/ h. d) E/ O4 @; }6 Y
2 f% t4 T- F" F3 b5 f+ ~- i// ECAP初始化和读函数8 ]! a/ i8 e3 n7 q$ ~
void ECAPInit(void);, q6 k6 l; g1 _
unsigned int ECAPRead(void);' m0 e' K# ~! C6 `
) o* v% W1 k; ~) J+ Y
//ARM 中断初始化
# o' Y4 I; T* y# Kvoid InterruptInit(void);6 k% a4 Y" M) k3 n' f
5 h& C" W3 `( }3 e" N8 S, J
// PWM 中断初始化
6 R, D! y3 D5 j( v# P0 Y7 t; a" e: ~void PWMInterruptInit(void);( L: ^+ l% @& ^0 }. R
// 中断服务函数
' u, i3 Z1 j+ A+ l# n// PWM 事件
^' m( t' N$ _' b, Jvoid PWMEventIsr(void);3 u* N( k3 c, q- l+ h4 e6 y
// PWM 错误控制事件
& o. }' u. W. f+ |5 Z2 I4 |% Pvoid PWMTZIsr(void);; w Y; B( \" n* N4 [0 s1 s6 L7 x2 i/ ^
8 z( q# i2 w: V3 ^! w1 d1 o/****************************************************************************/2 R- ^ h7 Y% V
/* */
\3 y. O1 Q, D; A8 A( x/* 主函数 */
) M8 P% d( i* p! P3 r/* */
( a0 J3 l( Y- k/****************************************************************************/
I- f- J) ^8 k& m) [int main(void)
. E* N9 L7 B0 B# T; B{
0 R4 x$ }. z8 J, F; u. p" u1 s) P // 外设使能配置, W7 {5 ^) I% l1 L+ A8 q* d) z7 \4 ~
PSCInit();
/ G/ O! N- R* d3 i" p' X: O3 a
4 X( T9 v9 e7 p, y2 P // 初始化串口终端 使用串口2
% H- i$ V3 p4 }# M+ {' S UARTStdioInit();, G* V" ~8 ~3 O# y t2 F% e
6 k$ @. A0 {' K1 H$ T4 U; U
// GPIO 管脚复用配置
8 `# D* N, \" _$ `4 U( T8 J. \; Y7 S# m GPIOBankPinMuxSet();
2 s- g( n: g' c g _1 r, y9 E3 ~, D9 h% o& |3 P
// ARM 中断初始化2 e1 G: I1 i1 O
InterruptInit();* J0 F$ [8 Q0 f7 T
& `- }+ l& r) M2 g1 s# R // PWM 中断初始化$ O) [7 Q5 _+ G$ ]! y
PWMInterruptInit();: ^3 O: N9 I6 `) S5 X
. D$ w4 t0 Y' r; Q- q7 b" v8 A
unsigned char i;
; M7 z D2 f$ j+ t5 F% B/ N% h4 k unsigned int j;
2 N: G) [& ^& F3 S4 }7 i5 c2 m3 ~9 {6 c" X! I9 g
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);5 ^4 `' R8 `! J
UARTPuts("------------------------------------------------------------\r\n", -1);
* p/ _8 T" E) V- w UARTPuts(" C6748 PWM Test\r\n\r\n", -1);1 n: x. ^7 J- i- Z9 L& W) R4 K
// 产生波形
( m# D( o4 N2 P/ {1 r$ k PWM1ABasic(25000,50);8 c7 l* E7 w% R, ?" c) X
$ F! m$ k |) @& H& x8 h* p UARTPuts(" C6748 PWM Test Over!\r\n",-1);
8 t n8 M3 @; t' S/ Q; s UARTPuts("------------------------------------------------------------\r\n", -1);3 I" \" B* [; ?2 \, f
9 l& r1 o! A' ]( w- t* V
' _9 [- M" J. i# d
9 d! T- } b4 w8 g+ i UARTPuts("------------------------------------------------------------\r\n", -1);
0 _ ^/ k: ^: g UARTPuts(" C6748 ECAP Test\r\n", -1);" T7 R: t; f5 z" w* p& h
// ECAP 捕获初始化
3 @+ A/ e+ H+ K! W, Q ECAPInit();
8 D9 o6 F5 b5 m- {. z UARTPuts("Initialize ECAP.......\r\n",-1);6 D$ Y1 f" E2 P: u9 v7 x( i
for(i=0;i<5;i++)
8 }* o- p3 g3 Q- ? {
+ ^1 {# T0 B+ W5 ~! V for(j=0x00FFFFFF;j>0;j--); // 延时
G: T2 X: m. t" Y1 Z5 q' z2 l/ t% U ECAPRead(); I# F X& v9 N! K- v
}* M4 M, g9 @2 a
UARTPuts("\r\n",-1);
8 U& k# H3 c8 `' g: \( v8 j UARTPuts(" C6748 ECAP Test Over!\r\n",-1);+ D6 Y/ V1 l) l# v
UARTPuts("------------------------------------------------------------\r\n", -1);* I ^( O# I4 i m; Q
2 L5 [. F( I: U // 主循环
4 I: f9 ~4 W2 \ for(;;)
, k0 Y2 k7 g J) b4 b7 I {" ~5 }# B! A. ~1 h
& g3 S; C3 C: h }5 S3 f0 }4 P. _) _* a& U! T
}
, P5 H- |- h. D: D; N5 X$ G0 ^+ _2 g# ^' g7 e
/****************************************************************************/) M5 X6 r" i6 f
/* */7 y: M( O/ K' S& j$ O7 l7 x
/* PSC 初始化 */
# o4 k; C- T; \% \# T/* */1 ^- f4 F5 w) c* T
/****************************************************************************/
1 i# U9 O5 z4 n E( I# Evoid PSCInit(void)
4 d: K- e \$ J! q{
6 i! H' B: U/ m" p // 使能 EHRPWM 和 ECAP 模块
# a8 k' e& ]# X$ J8 p: N // 对相应外设模块的使能也可以在 BootLoader 中完成
1 s) T$ O& n- l8 {8 {: ]. @ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);5 E) w8 u6 b9 ^6 X2 x# e# }
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);% E7 S; I; @' ^3 J5 y
}
9 A& c m6 I- @" g+ U) e: d0 L; ] e1 e% P# s }) u( P
/****************************************************************************/
# e: C/ T2 Z. m' [6 u# G/* */
& U; d- i6 w2 Z: v; B; ?/* GPIO 管脚复用配置 */
3 h. F6 J& \( F( x/ J6 C1 E/* */
a$ s4 ^9 [0 H8 e5 Z/****************************************************************************/
0 V d& o5 m4 r% kvoid GPIOBankPinMuxSet(void)/ p/ B+ z# L) m% X
{ Y: F K- b- y1 p
EHRPWM1PinMuxSetup();
) e5 L: P S& G: a6 M$ S
& W2 W% m9 f! J$ W // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)2 I/ P( U$ W- c( _( H; K9 \+ F
// 作为捕获功能时管脚方向为输入
1 j" F3 Y' a+ H) u2 q // 作为辅助脉宽调制时管脚方向为输出' v) W7 I% p4 v) t! a5 T( n+ _
// ECAP2 / APWM2$ o5 b6 q+ {9 W* H! C3 L, c, J- B: v% s& p
ECAPPinMuxSetup(2);
5 \, F7 o" q2 E' F. Q, A i- u
r6 s; ?6 l# {: K // ECAP2 / APWM2方向设置为输入
6 B; k- i: p( V9 ?, G6 V GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
/ _' Y# S7 W% i* H/ W$ \5 Y P}( F! H+ w; b% V
6 J4 a7 {8 F [1 r- [! N7 X
/****************************************************************************/
8 M. M M" |% R! M" g( X/* */ T. X6 w* r* @# R3 b8 Y* i
/* PWM 输出波形 */
% L- \7 h w9 \6 @/ _) I- `/* */$ }' s. c" Q$ @8 C9 U
/****************************************************************************/4 L- r: f$ j/ d8 a' w2 u
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio) q0 }8 v7 \- G2 h) [4 t6 ]
{9 C0 @* E( C8 y& g
// 时间基准配置
0 h4 E2 L8 K4 ^8 q# ] // 时钟配置
* [7 s6 r' S; e! ` EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
/ T9 `5 Z- P. w- b S: N5 g6 {) r- e; q
// 配置周期
1 e3 y" D! V- q9 H0 `/ E& f; } EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
! H( L) p$ g/ x2 J4 f! _: Z pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
l' _5 [' U9 E" } c
X& b' a. U* \$ R( ~ // 禁用输入同步信号& Q5 |( H' L" I2 d. |2 m% A
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
) H; ^- j* S8 t, Q# P5 Y
3 s( D- Z" e/ o5 h8 R0 l! _1 k/ q, D/ l // 禁用输出同步信号2 n7 H# o) O [/ u- i
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);; C ~: s& n1 U# I. h3 {
/ o. [* m& z9 I# N$ z! ]1 G // 仿真(DEBUG)模式行为配置: u. B# ?3 g8 I: w0 M
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);/ N1 K2 W7 A, K
/ i1 k$ m5 [5 j0 F // 配置计数比较器子模块: R% D& m% I4 c
// 加载比较器 A 值
. D4 K5 y @0 U) R& \6 e EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
1 u. V1 E: B1 V. V6 k2 o EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);3 @% _$ V; Q2 O2 o
( w( q- g3 f9 j9 H/ }& K" Q // 加载比较器 B 值( P" n, w2 B6 s$ \' W7 O- s: F2 _" j
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,5 o3 e$ M& F" L7 _% j2 K
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
' m1 A' W U' z; f) d9 I4 }6 a
" | B2 g- g s% ^ // 功能限定配置(输出引脚触发方式设定)" A. l# ~9 u$ A z9 m$ [! w
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
* T4 _+ ?3 `1 l4 ?/ D* j7 L f EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,' [! O; g. A( K" O0 I- L
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,- U H3 O; [$ t
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);# L8 S* V7 D ^
5 t; u D2 m: T& P' L% z
// 禁用(旁路,信号直接输出到斩波子模块)死区模块" T9 w { E% H% k8 W8 n
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);$ V. U# f! y5 H! `1 X
- x x1 \& g3 U$ C) E2 J
// 禁用斩波子模块
: L) k3 |7 T$ L$ s' _ EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);/ V) z r5 n/ B
8 |9 c: n4 d: ?' v- p1 |% P8 e7 `! {9 a // 禁用错误控制事件
& e7 s/ Z2 B: I3 O8 f8 Y2 l EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);2 [3 i, u2 I3 k: T
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
& i+ U9 W% z: p2 P7 s6 ~/ L7 @% ?" M+ ^2 v/ E
// 事件触发配置
3 X5 F2 R1 Y# M // 每三次事件发生产生中断
6 z$ v9 k c' e) G9 I. @3 C+ x EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);8 I3 `; V6 N' w# M1 U
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件 J2 p& |$ [ ?# i7 b4 f4 Y3 Y# q
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);. d' e1 A4 |3 t
// 使能中断2 v- a# d: R9 b: J! n& Y
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
, V/ _8 Y7 G) [: S" Y8 ]
1 E/ h& z. P; R // 禁用高精度子模块
. ]7 e) O$ E+ z# y EHRPWMHRDisable(SOC_EHRPWM_1_REGS);2 F$ ?4 I& }0 C/ ^
: [4 i' c$ U& a- u% W* l5 Q UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);! B. \- p- x3 P, e9 a5 Z+ e% G! X
}" n8 J2 i8 ~6 r" k
% B& _8 c$ W4 t- K& t, w4 F3 t# w3 U. W1 [void ChopperWaveform(void)0 ~5 W- W u9 s8 N- m
{
4 k6 f% u4 ^2 s' @! M( u# n! G; k // 50% 占空比
& g* ^1 O1 S2 F) V EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
( s* N5 {) N g8 |: c) Z // 4 分频; ^4 J/ Z: f: s1 V
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
: Q( {1 l" q5 ^3 Q0 q6 X2 E // 单个脉冲宽度' y0 ^' l: b1 D) Q/ d- a. w8 B
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
6 h$ |# r% A3 w: J4 l: M // 使能斩波子模块
7 C& \7 f3 Y# r. S3 ^! e EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
% E, [# A7 |8 Y% Q2 Z8 e* o}. N$ M+ @* x9 ]# s" f
( N N" }# }; X/****************************************************************************/& d/ p" N0 N( T2 l* Q% c
/* */0 {2 L& U: @8 z/ F; z
/* PWM 中断初始化 */. K! R. q/ ?4 m! K
/* */0 a2 ]/ G+ D' |3 @. d( A$ W
/****************************************************************************/5 J- `( N, c/ q1 ?( W5 m, j
void PWMInterruptInit(void)
: l1 o$ z, E, Z! B( Q& I{, H' V; N- W) g, [3 @
// 注册中断服务函数
% T7 Z. `9 z' F) P: m% o' u IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
) Y' i- g7 d* b/ R IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);, v) \% o! k9 f( Q' Q f# a
) c3 O; B) x0 t% ]
// 映射中断
2 W% d" c" p4 E1 U6 M9 @3 z IntChannelSet(SYS_INT_EHRPWM1, 2);1 N- E+ U' z0 u
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
9 N! S; J. e) C3 D1 c7 V2 x* u/ M5 }6 V' y6 `
// 使能中断 n6 R# S9 G3 ]/ W
IntSystemEnable(SYS_INT_EHRPWM1);0 x9 @: C' c, ~& N# i, d
IntSystemEnable(SYS_INT_EHRPWM1TZ);
% \+ v5 ~ Z: b' M* Z$ V& C4 h}1 N3 `: T) D4 y' F( c+ _+ d/ Q
! X- P% G; A$ P! _0 `( w; t' f
/****************************************************************************/
8 `0 t" @6 ?2 B, E) y/* */
! _! x+ o( ~2 S$ |/* ARM 中断初始化 */
* K* T7 O$ |- C1 E* u9 b3 Y/* */
0 S% P0 m# S! U0 s! U. A/****************************************************************************/8 p! F# C3 C6 L, K; M
void InterruptInit(void)
0 L5 ?- C! r0 P& L{
* @% J$ y3 D+ d9 R0 c5 Y' E // 初始化 ARM 中断控制器
# D1 w' i& J$ u2 I6 g, A IntAINTCInit();. H6 o/ o0 r0 ]" [9 o! h
/ Y I) p2 I4 R4 X; M4 C2 @- U' [4 t- F
// 使能 IRQ(CPSR)) }" n% @" b% l
IntMasterIRQEnable();+ [ m2 U3 W( {+ [' a& K% j6 o, p
; K5 w7 R0 k c# z3 g& W
// 使能中断(AINTC GER)
( S# b! j/ ?6 V1 K IntGlobalEnable();
9 V& Y. F/ z8 ]! O; K. W' }
, R* G" w% _8 r, F, t0 c/ [4 I // 使能中断(AINTC HIER)4 H% o @+ t# K' } C4 L9 n
IntIRQEnable();
; D9 \5 E: |; b1 j* F$ ^) b}
9 m! b) r$ \- s# E o9 o, U# z' l' T3 n' p6 x
|
|