|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/, z& E) F% q4 }4 W* e
/* */( e0 r0 ^( p/ A! o2 Y" T$ {+ C5 h+ g+ y
/* 宏定义 */! v& ~7 [8 q, T/ l3 p1 d
/* */
' K2 V& x2 f9 B/****************************************************************************/$ I/ C' d7 M# |
// 软件断点( r3 J* a. L9 i$ Z" L2 H
#define SW_BREAKPOINT asm(" SWBP 0 ");
' ?5 j8 r: y B6 R7 |
% C' [8 d- [9 @( }7 X// 时钟分频
0 i# r! T4 b! h E* ?#define CLOCK_DIV_VAL 228" K6 U& C3 {- e
" _9 S. |7 Q' H# v; ^. b4 h
/****************************************************************************/
- j4 G. e! j1 {, k% F) J& }/* */2 f; M( }! a# q0 W3 V, E- R
/* 全局变量 */
* G/ H$ f1 u+ t2 f' Z \/* */
& B+ s# [3 D6 s; t3 V2 x# x. X% Z& l5 C/****************************************************************************/
! P" O; k8 ?" [' K* w+ rECAPCONTEXT ECAPResult;
( r6 T6 C5 K* T5 c$ V1 R' g8 d
0 e' a9 o1 i6 C/****************************************************************************/: S4 m2 H' ?! F. L- _# f. D7 c
/* */' h9 x: Q& U- t, S' S
/* 函数声明 */1 \& ?" t4 ]) ?* V7 t1 p
/* */
: [: G! Y* J7 ^ C/****************************************************************************/ ^6 v% Y Y! K: u: c
// 外设使能配置# N+ X2 Z& \* A& y% O' V$ _
void PSCInit(void);! ^( \% t3 S6 N6 Q9 c
$ w! |( t5 S8 K$ h `; J// GPIO 管脚复用配置
' H. _6 F$ Q. k \* [8 A" Lvoid GPIOBankPinMuxSet(); {( v. o! Y8 U9 @2 _
% i. R( K$ |: n( A2 { p// 产生波形
$ i2 B& F% L. z4 u7 H( _ Hvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
9 a% f- V p- k. n Nvoid ChopperWaveform(void);
) Z: V' k6 U% k9 n. O9 m
% S! l& b8 Y k9 e( q5 }8 ^// ECAP初始化和读函数
3 X% K p6 J9 h2 e W, ivoid ECAPInit(void);) i) ]6 ?5 @9 i! c% a6 Y1 m: J
unsigned int ECAPRead(void); E- _' e2 l, @: _/ Y9 n, p2 q3 [/ m
# N7 U, W Z5 k" Q3 N& y( ^//ARM 中断初始化! F; \5 e; a# t; W: [1 K2 B8 n6 w
void InterruptInit(void);
0 i0 e* X+ `% V9 p
5 ^7 B1 \& q8 o0 c3 C J6 S3 n// PWM 中断初始化, J6 I7 `/ ]% E1 ^4 a3 R) F
void PWMInterruptInit(void);
; ]# j% H }) U* w) y// 中断服务函数
& E2 P: Z: N0 F4 ]: N. ?5 P// PWM 事件
% R/ k1 e8 F1 w. z" B; e) pvoid PWMEventIsr(void);: ?) M& c7 b* I( T4 j. Q
// PWM 错误控制事件
) [# b/ r* I: ^' evoid PWMTZIsr(void);& j+ ^- w: e* V8 C
/ F* {+ [ r. Q* I' d, J/****************************************************************************/, r# Y1 {0 D/ g& H1 j
/* */
2 ]+ a$ h5 ^' g" I/* 主函数 */9 J5 y$ N; s9 F) K
/* */
3 X# ]8 n' }! o6 L" z/****************************************************************************/6 b9 ~4 E8 v6 O" T3 O6 P' u5 O) _
int main(void)
4 R# {! a8 v+ `" k6 r3 Z) q5 \6 H{
: P7 h3 s" \3 W* n" E( F0 U: b // 外设使能配置
/ G5 b$ ^# j/ U! v4 S; f/ Z1 n* N PSCInit();
9 e( T! f# }4 Y! N0 K
* o1 J$ p: o s# r3 g# K+ U: X9 e // 初始化串口终端 使用串口2
( a1 _$ G2 K% j7 N+ b UARTStdioInit();
( ^& q$ Q9 F4 T6 r) ?( C1 E
! I5 D4 l7 M9 o7 L$ p8 p# @* c- b& } // GPIO 管脚复用配置! @" u' Y' {5 W, z* ^' t4 m
GPIOBankPinMuxSet();4 x5 w c+ E' k: A5 e2 n2 Z
: d" a4 d r: P // ARM 中断初始化$ m# C; V$ j+ T! S& i. [2 L
InterruptInit();
- Y" F( f9 \% V+ U, q0 ?( M: `( n( e8 L O5 K4 i
// PWM 中断初始化: q# ?7 c6 o) }
PWMInterruptInit();% R' d# N+ ^, S; `
) M$ P# u4 C7 b5 E7 B
unsigned char i;, { a3 p+ A' E7 C" L/ c' Y
unsigned int j;
0 u4 I+ X i( }4 V2 A5 E- p/ Q; [) c" M: Y& k3 P
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);5 g' b6 D8 L5 t) [5 q
UARTPuts("------------------------------------------------------------\r\n", -1);
9 g+ @, W3 H+ m4 v' E7 i! F$ l7 F! k UARTPuts(" C6748 PWM Test\r\n\r\n", -1); L7 u3 e0 Y9 C$ J |
// 产生波形
# O' R- Q& H* U( E$ z( w PWM1ABasic(25000,50);
, u# q i+ C$ Q( j/ ]) l" \. c6 k
+ c# H$ o9 C9 h1 U" y% V5 [ UARTPuts(" C6748 PWM Test Over!\r\n",-1);0 w! P: ^9 Y0 K" C0 b1 Z
UARTPuts("------------------------------------------------------------\r\n", -1);# m) F) v7 p m. K
* u4 O: q! X% g+ E4 ~: c
* L0 D- t, |5 f: k1 V' t/ w' n" p* O& y
UARTPuts("------------------------------------------------------------\r\n", -1);
* O. T/ \( A. \4 ]9 h8 y% ?4 o' ? UARTPuts(" C6748 ECAP Test\r\n", -1);
& o: k: t. u9 o // ECAP 捕获初始化
% w* h( L$ h4 ?; n; w( ]" P ECAPInit();
' l) k6 `/ _2 t' u6 S/ z/ r! t" X UARTPuts("Initialize ECAP.......\r\n",-1);
. d) j! \( ~7 y' H for(i=0;i<5;i++)) h0 J3 H8 g1 w8 F5 N
{
* ?- D1 r# D, d! N# w1 f for(j=0x00FFFFFF;j>0;j--); // 延时
+ c2 l5 l$ h. ?& N ECAPRead();
7 ~, {% X F9 J( o2 i/ W# F5 a% W }
. r/ y6 q$ Q! @5 [, V UARTPuts("\r\n",-1);
/ i v% ]% z* g4 o UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
7 |/ S( ?9 D7 B) |2 p. o3 U UARTPuts("------------------------------------------------------------\r\n", -1);
; Q0 E7 r( `7 }8 c7 R! y5 l$ G0 F( J9 t ?1 m1 I
// 主循环# D. ~' B) J3 b) @1 [: Q$ V3 W
for(;;)( Q. I: C, a# u" y
{) [1 m1 O% Y; |( B3 ~
/ t0 g" }: J# `! @6 d8 I }8 ^# R8 _; h) v, y) S2 n; t
}
1 x. f) \+ j$ P5 ~
& w {- l5 f1 g1 u2 l/****************************************************************************/
$ e" b8 v/ i5 f4 t: o- a8 J/* */
# C( ` l' ~8 I( J/* PSC 初始化 */8 b- w& f7 E+ T( o% P
/* */0 z, _' l' P+ s5 p
/****************************************************************************/
# R0 B+ |: r# L* [3 q* y( Cvoid PSCInit(void)1 [8 p' V' @5 X, f/ H+ o2 H
{
3 l j+ Q& e2 @0 N9 Z // 使能 EHRPWM 和 ECAP 模块
8 x- r1 t3 U4 W- I1 S3 f // 对相应外设模块的使能也可以在 BootLoader 中完成0 r: }; e/ l( E0 ? S9 S- c3 u1 V( @$ T
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);2 B7 b7 @) ?, v. u3 w
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);: q% |& A5 z" B* w
}2 Y- `, n4 S" U
: \% l& U- {$ O V- m/****************************************************************************/
- P: x } V' b! n8 L8 r/* */" l; P6 L% h! A3 x' D! Q% `
/* GPIO 管脚复用配置 */
1 y: X& N/ v, G g) J: a/* */9 E, K7 F, p' r7 G; e6 b
/****************************************************************************/ m2 Y# q: f2 l- B8 j, E
void GPIOBankPinMuxSet(void)
! ?5 O! G( D0 Y2 D/ b9 Y0 X4 b{
K- r4 N6 f( }2 l, q EHRPWM1PinMuxSetup();8 X1 G, X0 X- v7 ^( d h/ V
4 O* g3 r, S6 s/ b; U* Q: s // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)# T# W p6 j0 @" i1 [
// 作为捕获功能时管脚方向为输入; P. P3 V1 }, G1 {1 D
// 作为辅助脉宽调制时管脚方向为输出
- n! J+ E; s8 f% X) e9 i" O // ECAP2 / APWM2# w5 m- {2 b1 E) v4 v' W
ECAPPinMuxSetup(2);
, N+ `. V9 M7 R- o" S; \' F& T) i0 P5 r
// ECAP2 / APWM2方向设置为输入0 G8 y$ I- k9 ~5 C2 I4 \( X* Y
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]* Y% h# Q9 X3 W, M1 b) f# x
}& R" \# S2 ]7 A J& I% V/ i
8 @0 T* s: F g0 G8 T- c/****************************************************************************/
2 `; u9 a ~ w( n5 t: r7 [/* */
! K; h+ N" i$ f5 m& a" b, u$ _3 y/* PWM 输出波形 */
0 H6 V6 j. Y! a, [5 M/* *// B: n# G8 E' Z
/****************************************************************************/
; s/ e: J# C) u) F# v5 N6 y* lvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)# B) u* {6 F- k( P# i) Y7 r
{
a3 m$ n& q$ g' F2 Z // 时间基准配置
) i3 T5 S# d5 ^, | // 时钟配置 ~" |- d2 b' l8 @
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
( Z. i( X! \/ J9 G7 I& ^: S" v( M& G' z) @: ]; A
// 配置周期+ I' E* j8 e4 L9 o2 L
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
4 S" z7 h; s& k/ b7 Y, s pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
$ v* M7 u$ u2 j9 ?1 G0 P# s% Y# x. h1 C- g2 O; g* ?4 ?
// 禁用输入同步信号# `. {$ Z. [" w/ b" ~
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
; T$ E+ V% \( v. X' N) j
+ a, V2 P& G' y, S; h% F // 禁用输出同步信号4 {) [3 Y3 s) ?- J- m2 ]) N: e
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);# x) X, \! e. h! i" ^# h# A
5 ~! Z5 L9 z/ x8 B // 仿真(DEBUG)模式行为配置
' F) N* w; [; `/ f4 c" Q EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);( @! z* R- K5 U8 m2 C
/ U8 ^9 h: w( O // 配置计数比较器子模块$ L- Q! a4 `% v6 t
// 加载比较器 A 值
4 J* o/ T1 c* M/ w- y) a% N- H+ o( [ EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
# t' O0 m, E5 ]4 w- \. F0 K3 y/ L EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
* v, p$ B) ~% z+ P R' @% f- D
) `2 p& y( G1 T* V5 v* P // 加载比较器 B 值
& b( U: n& x( O' x EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,, }1 W. e% v( Q% r- f+ k9 y
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);; ^8 G+ t& j* z8 T: W: R" k
# ]/ F) b' {* J$ H! M
// 功能限定配置(输出引脚触发方式设定)
/ B; B0 Z7 s3 d, j7 D% r8 @& ?0 O // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出6 v; x# b% x- P7 f! O% T
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
* \& c8 f7 a: l) i/ B# F' S2 ~ EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,8 Q- }5 R; J+ S6 X' R4 \- O: ^
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
/ R. Z" |- M' K3 l6 H/ b3 O; W) M9 q( U/ }) Y3 H9 l( f
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
8 v" R0 V# q* [( H$ @3 t% E; T* e& a EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);9 {2 [2 D8 {. e- q
3 D1 X7 J" x, t' L+ a8 l // 禁用斩波子模块
6 `% t, A' Z* B8 y; t# `+ `( w EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
- U! O3 K' x/ e3 q- @# F
1 [. K$ |- v( K // 禁用错误控制事件$ Q2 C; ?. R/ A! {6 l7 U
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);6 L4 l' P) _. V8 Q4 y5 o* C- m
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);3 n, y! Q: p3 d" n! } V( _& A
- L4 O' M7 k0 l- J: N // 事件触发配置) @( k3 A$ T$ }
// 每三次事件发生产生中断
: P9 H% n/ q! d7 O7 N( A3 ] EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
1 w: W% A& E% W* M( K // 时间基准计数等于有效计数比较寄存器 B 值 产生事件' D- F, g% S# J2 _' G& C; ^0 d
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);% X# v* t6 i, n L6 p |4 \! t
// 使能中断4 l) N/ |# F; g' e* J; T+ w4 l
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);7 Q% @" w+ i% j7 ^/ ^
7 J9 Y( i" R! v1 m5 E
// 禁用高精度子模块
* o9 S) k, }% h; N3 A3 ] EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
1 t# s. S( ]% a7 ^; O! O. d* l; G
% b0 Y+ W1 _0 R! v n8 K UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
8 L; ]1 a4 p3 b0 v}3 ]$ x3 N) l4 n8 b, Z
+ T( q2 v, G0 mvoid ChopperWaveform(void)
* c- N- c7 ?, v8 m- H{
9 d( Y: V8 g+ [ k |7 i // 50% 占空比/ n( ~) M4 M) ]- J. k
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);3 n) u5 Z8 @6 j3 h4 C' M8 O
// 4 分频
* R! J4 f: ?- ? EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
- T. u8 x1 j; Z1 E4 M# R' s# E5 F T // 单个脉冲宽度4 S) J: t0 Y7 I6 F; R! C$ R- e( J$ q
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);! b. W1 f% [+ ?5 L% E- c; b+ R0 y
// 使能斩波子模块& h8 g# M" I/ n6 w
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);7 \8 j$ N- `! ]! Y
}
* @' p8 E/ W5 U Q& z% [4 G! R U& V- p* j$ ~0 X
/****************************************************************************/
' A2 e: ] n8 ?. m/* */5 J9 v5 [7 W/ a( ~9 C }: Z5 n
/* PWM 中断初始化 */" c* a. \) w5 f! E0 d
/* */) _2 Z, p4 e3 I* f( [* s
/****************************************************************************/
7 D S2 r# ]. Pvoid PWMInterruptInit(void)4 S/ V/ U& P$ w+ A' j/ i% J
{
' J: M, A8 v, I% S% { // 注册中断服务函数. M% i# X/ ~ g3 x
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);" n0 E8 Y/ ]- c7 r3 b1 I6 c* \
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
. C8 {5 N% F; l. n6 }, t* }% |6 E: R/ @' {) \$ o5 s5 f" F
// 映射中断
1 h5 X! i6 E( n' |! c% B IntChannelSet(SYS_INT_EHRPWM1, 2);: A2 S# E* I# b8 [# P$ Z7 U
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);6 ~+ g. E3 }% B; A" w$ s% S# x2 N
% l7 a1 m1 @" H7 b // 使能中断- P3 D( Q* }' Y5 o! D; @: P& z
IntSystemEnable(SYS_INT_EHRPWM1);
+ N0 R; @7 k& S! O: w+ R IntSystemEnable(SYS_INT_EHRPWM1TZ);! o h+ }" D( o! F6 Y* r; G
}4 y9 a) @9 G c1 n" E2 s
$ C, @8 ~4 _4 R' j
/****************************************************************************/' R9 E+ F5 B5 h/ G7 s
/* */
, e! y9 C$ [ Y* A- j. _/* ARM 中断初始化 */ U1 x0 P. V+ y5 n8 B; k
/* */
" C: h: c8 N" I8 ^* ~4 E4 t/****************************************************************************/+ S a4 ~) T6 o1 e+ Y
void InterruptInit(void)8 W1 } X: Q2 E) B" G: ?* `. g
{
* r. }" F3 z0 Q1 M" S& W. Y // 初始化 ARM 中断控制器8 Y" }3 H' i. V
IntAINTCInit();. C3 y" z% s8 [7 Y7 I
: h3 P$ ^2 a3 N( m // 使能 IRQ(CPSR)5 Z3 z, H( j! p- R u' c# x4 A+ r; o/ _
IntMasterIRQEnable();' _. K* e+ b9 ~
4 B9 G# j4 ]% g0 [0 d$ v // 使能中断(AINTC GER)
& I4 A1 g; Z1 c0 e0 d IntGlobalEnable();5 x- S. I4 ]4 ^
/ N2 j6 H3 W0 l P
// 使能中断(AINTC HIER)' u: b! o p1 C0 [9 Y% f- {* J& J
IntIRQEnable();- A# O3 }' n) f9 E1 a$ b
}
5 ^$ I B( N7 l4 g3 t& i7 h
. Y/ I; [* f6 E% S2 D |
|