|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
+ p) }; d- Z, ~. ~- ^7 g3 V. i/* */
" _+ Q+ ^' r6 X/* 宏定义 */0 _/ [( D3 z* x. F+ j
/* */ ~3 x& J4 g7 w( E. |" H
/****************************************************************************/+ G+ {) Z- m0 s' ]8 K% p2 N. v* D
// 软件断点# J- n) ?2 m& e9 p) W
#define SW_BREAKPOINT asm(" SWBP 0 ");
! F2 O5 k: q) M9 K. o( A6 B, N2 G) L7 @5 `4 m
// 时钟分频& z+ t7 p9 g0 M; ~
#define CLOCK_DIV_VAL 228
3 k! U5 x6 }. e* M0 N+ k9 e% v9 ^7 X) }
/****************************************************************************/- s+ S" ?, p1 L; Y1 d, w' b
/* */( `# j8 \& w! i( s! q5 G
/* 全局变量 */( n/ m3 ]6 D; w- H2 G4 J
/* */8 K' O6 i9 P G- j7 h
/****************************************************************************/ N) r& ^" N0 E
ECAPCONTEXT ECAPResult;
# F& }* ]2 _6 t9 F6 o+ T/ ]2 `6 P4 c( }# y, ^" Z5 I- e; _0 H
/****************************************************************************/
. d$ _( t% T, G# P& L' i+ x& u/* */" K& ?) w$ o0 i+ c2 G
/* 函数声明 */$ w# f# s/ K6 R
/* */
( P6 ^! ?8 N1 N/ X4 ^' P/****************************************************************************/( L: r; W3 e" @# o" Y O
// 外设使能配置
& D" }0 b. Y6 R9 w% I3 Bvoid PSCInit(void);8 q8 u& v8 y+ o) _; @: F9 o) j
) d/ p9 F2 E+ ~+ A5 ]2 V7 I
// GPIO 管脚复用配置# H& [; b. o0 q* ?3 q
void GPIOBankPinMuxSet();' b* ]8 [' p5 y5 v
0 ?. i/ U3 e& l8 E7 V, J! L0 J// 产生波形
. ~ _8 T% p2 ~, p% nvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);3 m$ h5 L8 e' w5 x; Y1 T$ m6 g
void ChopperWaveform(void);. P+ E! h' s* a/ o
6 P! H: h8 ?& d+ l9 A! v- n// ECAP初始化和读函数
4 f! @3 G3 s: xvoid ECAPInit(void);
! T, q# x9 m9 ?6 T6 A' D& A. Funsigned int ECAPRead(void);! x `- X T9 B9 f2 ]; Q" \" c+ X' i
: O& O- p( e$ U4 U7 k- Y5 A1 O& u//ARM 中断初始化+ t. Y; s4 n2 v9 g7 m
void InterruptInit(void);
: w V0 w! a! Q, r0 @: S7 s% J5 S- Z+ b5 U; ?; R
// PWM 中断初始化6 }7 ~" H. M6 p- @6 p$ c8 ~$ L
void PWMInterruptInit(void); p, b2 Y: J. F
// 中断服务函数
+ }) N- {. M. h; U; f& v7 h// PWM 事件9 W1 X* y3 O; M. q8 C4 p0 s+ E
void PWMEventIsr(void);8 Q( k* s7 s5 }& g9 S
// PWM 错误控制事件
5 g7 c" }/ S: u) a% J- ?void PWMTZIsr(void);" Y& b7 N5 E" s# g) s# B: Z) m
1 {6 _9 U, h/ D0 T$ f& j& t/****************************************************************************/) S& s, V0 Z9 K7 T" _! `1 `
/* */
) Y' u" @+ G& p! L! _' E/* 主函数 */7 ~7 r e+ Y* i, x4 Q
/* */
2 H0 F9 Q# z) H7 B/****************************************************************************/0 v/ C5 x+ c; L0 F5 O7 S
int main(void)
1 v! B9 p: ?1 D1 ~7 v, }, \{+ f5 F2 ]; `1 \0 H& L
// 外设使能配置( r' F( S. u: \/ V( m" ?
PSCInit();& A$ d1 X9 {- L2 D0 A& h
2 R& G7 |7 H) Y // 初始化串口终端 使用串口2
7 x; O8 W& v2 M0 D; d' N UARTStdioInit();
" e% M' e- ^: l+ w5 m9 i8 [ 0 k9 k! O8 E( q; c" V$ O
// GPIO 管脚复用配置
) p& P/ Y2 c, z. v Y1 z: V GPIOBankPinMuxSet();, t: @9 K: C* ~1 z- w
5 I# k+ H2 ?" q# s, Z* Q8 X6 x
// ARM 中断初始化- R, [1 X7 C$ ^, b
InterruptInit();
+ }5 `5 G+ s& A3 @4 w0 a7 r8 I# s5 d
// PWM 中断初始化" a: c. X* b6 L6 I7 O2 V! e% Z
PWMInterruptInit();0 F) D, P# j- p% ^# X) n
* H- r* z( _! R1 `. b: ?- y5 ? unsigned char i;
, V/ \4 q t. V1 D9 |$ K unsigned int j;
: M s) M4 ~* N+ F- A
* G. u7 P$ F, L/ D6 A, U. ?; R UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
7 ^" s: `1 K- ^4 z' w UARTPuts("------------------------------------------------------------\r\n", -1);; p- y; g4 `. ~' K
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
9 R+ q$ A# t1 @' D9 Q% [ // 产生波形! Y3 x& X6 U ]4 t
PWM1ABasic(25000,50);0 a/ J$ z: e8 P! e2 @" M8 F) {
3 K; S% D% g& p6 v" J& z" Q
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
4 }* p' r0 _) `8 n' } r, j UARTPuts("------------------------------------------------------------\r\n", -1);
' s/ }3 k' O6 C# @
. q# v. ^& [4 A6 W" x
7 j+ s# D# I4 V6 W6 @# a( l/ L" {; T' U+ a/ l7 g
UARTPuts("------------------------------------------------------------\r\n", -1);& q# o6 N3 ~0 l6 o3 V4 Q6 P
UARTPuts(" C6748 ECAP Test\r\n", -1);
3 x7 @! M3 y- Q$ _( u // ECAP 捕获初始化
' [1 Y/ t: ^/ X7 x" s4 J9 h# H' a ECAPInit();
; {+ S" P7 M y" `3 b# ` UARTPuts("Initialize ECAP.......\r\n",-1);
5 r6 c7 S$ f6 \4 b( l for(i=0;i<5;i++)
8 I" S2 {" }& G. G {8 W' N" n/ }5 Y0 M$ Z/ k# k$ _9 u
for(j=0x00FFFFFF;j>0;j--); // 延时
% h. p7 i- }# e9 g( i- X2 [ ECAPRead();, O5 c2 R+ r8 F$ `7 p
}
1 J( q! C+ x& J: c# C UARTPuts("\r\n",-1);- v. K# n! A/ a3 h4 Q6 p
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
0 j' L+ v/ _3 c UARTPuts("------------------------------------------------------------\r\n", -1);. V: H! N$ H- A- {5 k
" `6 R4 \! m/ {& k // 主循环
, Z; t" E# u+ w& w3 _5 A: X# p: W for(;;)( d+ W+ F. n- N9 G
{
1 d* U" T V* o2 u9 i" c H | r0 g; Q4 e
}; u6 | K1 B. e: z- n3 i
}
0 L* D. _+ _+ z6 K% c9 {- l8 h
, @$ {3 g# B, {. h/****************************************************************************/: Z0 X1 v) ^6 a+ D
/* */
* C6 [* v7 ?/ [3 v/* PSC 初始化 */, s6 A% G% d' F: Y# c2 [! N& Y
/* */. ~, [: F" g+ x# y8 Q$ T
/****************************************************************************/: W4 u$ W& {: F8 S
void PSCInit(void)3 U6 l) T: |) c( x, b1 @1 v' M
{
) X' C0 \1 U% w5 v // 使能 EHRPWM 和 ECAP 模块
( c" w7 [) M4 y: @ // 对相应外设模块的使能也可以在 BootLoader 中完成: B& b# u1 c' n. [; U: o- J
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);* u( _9 a8 X$ K
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ ]: Y! f. J/ ~- k}
6 w& p' o- N' q/ N" V" M! M( g; Z) L0 t. J1 `% B
/****************************************************************************/
& @$ N K6 m1 w0 @( Y5 \/* */- s6 b& S& ^. T" ]) O5 W$ k
/* GPIO 管脚复用配置 */
4 R' t: h! Z8 A3 a& k0 ]/* */
: ^9 Q$ ~9 Y, T8 k5 C% M( c0 F/****************************************************************************/3 u9 N* h2 w$ @& E/ W
void GPIOBankPinMuxSet(void)+ @7 B9 J3 L( D; R* ]
{
5 l$ P9 S' F3 ~2 I Y) T EHRPWM1PinMuxSetup();1 I, ^3 ?" }( s9 a- }" r' K8 A
. ~/ }; s6 X, _! Z% f // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
% s8 o/ u" w7 }+ v4 K- s1 Q // 作为捕获功能时管脚方向为输入
8 b; N9 L6 b @) s; q1 X R# Q; ~ // 作为辅助脉宽调制时管脚方向为输出
0 p8 g$ W' {( t% m // ECAP2 / APWM2; Z+ Z, H$ A; n& g" ]! b
ECAPPinMuxSetup(2);. A* `* ~3 v4 v" p
4 b6 L0 U# w0 p) ~8 l7 K // ECAP2 / APWM2方向设置为输入
4 m' m. @& A" c. H: \ GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
6 @3 i! C9 S" T+ I1 P}
3 {9 P# M5 W) M6 W0 k, o7 v
" V+ R- d1 | x% F( Y/****************************************************************************/3 G9 Y; J+ ~" K) Z' {
/* */
7 r1 W1 M2 _* F+ C# l/* PWM 输出波形 */
/ i; p3 u4 X! {5 |# {/* */% o: r2 \5 [+ T" z5 b
/****************************************************************************/% M$ y6 N9 D0 K: }& P* }. j( Z T
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
5 E2 i% J1 P( N% c+ C{, B2 r; x2 Q3 ^( O, Z
// 时间基准配置
1 S! }3 M0 J5 @ // 时钟配置
; g$ |# u/ M% V/ O EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);8 Z; ^* _9 A; V x4 d
. ]9 j6 Y, y4 L8 _9 m1 r
// 配置周期, y0 _+ H; l; g' `
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
% O6 N2 J1 `( y! R. \ pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
. O. z- p F; S; b' ]! {# z6 C1 @# \# l. W2 c0 |8 x" L9 S$ ^
// 禁用输入同步信号$ U, m1 I' o" G
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);; E5 I3 l) o& z+ r
& c! J! N+ T) o( O2 t
// 禁用输出同步信号1 |3 f1 h/ X; P
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
) Y2 p; ~2 P1 [/ W
) F1 \2 p/ K4 t5 F0 x( q // 仿真(DEBUG)模式行为配置
3 {* r' Q4 I7 b' E: G EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
! ]; ]) Y9 e8 ^( {- ?
8 g1 W: S9 Y m2 g+ P( u A // 配置计数比较器子模块
# M$ f t! A2 g; l$ k3 [ // 加载比较器 A 值( ~& ]- F/ J$ k9 Z; z
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE," t. M; E @, W) B
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
: T! _8 |- Z" C4 l' C0 u" F" E9 H. T! s( e
// 加载比较器 B 值) s4 j& t7 b; f# L9 N2 N
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,( d2 ?$ `: q7 s9 S5 J+ m
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);! U8 @. B9 G" D. D) q
* d. `) e+ s' C' N // 功能限定配置(输出引脚触发方式设定)
; T. I9 B* c& t+ \/ g; A' l // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出! {) a6 k9 F' p$ N# a- s
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,6 m0 ~. }% X& _! M5 D' T
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,* }# a/ J* {; }( Y/ z
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);6 r' i3 s4 f% M. K1 @; @, p5 u7 W
# r- A. d6 A8 f9 ]2 Y! n2 q9 D5 P // 禁用(旁路,信号直接输出到斩波子模块)死区模块
! ], h$ p& b `! j# ` EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
( n7 n/ @2 Y3 E9 X( D* V; [& E
5 E C8 N& E/ A: R0 c D // 禁用斩波子模块4 A7 l3 J* t; T5 b
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
( ]8 ~% ?3 Q; v1 y' F6 j5 R2 q- W0 j. A
// 禁用错误控制事件7 O4 Y# a# z( M& m
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);2 G# B" G. a. _+ p% s- }4 A( ~
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);2 L' l3 `# }$ ^1 @
. E/ B. d v- r! D$ `) n, R3 ] // 事件触发配置
, t6 S( P r K // 每三次事件发生产生中断8 C0 ]1 E% B. x0 C
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);: |* k# G4 |, {2 j7 j
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
( g7 z3 J2 S9 k) s. v EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
3 ^6 J5 Y% \9 t // 使能中断
) j& k9 k9 g4 t" i/ f; ` EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
8 Y! Z; T/ s+ v( s B4 i
0 |2 [. a! R8 _7 u5 J- _9 B // 禁用高精度子模块
5 c% y R3 v! r0 R4 Y% [$ L- j$ E EHRPWMHRDisable(SOC_EHRPWM_1_REGS);8 ?9 R; w2 {- s/ P
8 M. N) Q! J; L$ G UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);8 B5 m3 u9 l% B& o5 N' w
}7 a# w# o* }7 K3 x2 G6 m
9 `% ^) J. j+ h" b8 r
void ChopperWaveform(void)1 O4 H5 ~; Q4 O
{
" k) S, h6 T( q) |$ G1 l+ ? // 50% 占空比* ^6 I4 h1 T1 P' `- E. Z* _
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);: S2 e a" Q9 C0 u' c+ v( T8 E6 |
// 4 分频
h3 _, c/ Z) J J. J' w' n EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);6 t( T# Y6 @0 i3 _0 X: n
// 单个脉冲宽度- l' x3 |! v8 t. R
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
7 V6 ]+ e; d" T$ Y9 M/ F // 使能斩波子模块
; C8 Z0 L9 I& F' X0 Y8 P1 u EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
+ x+ |( N e1 r3 k, B}% ~! R. z8 B7 g& S
+ j7 R2 w) N, Z! r6 r
/****************************************************************************/
0 k" T# F$ {- q+ T4 n/* */# [4 [. p) L2 A) Z; A
/* PWM 中断初始化 */
' J9 r3 y( k V) G" u/* */
/ t# y: a+ T) v/****************************************************************************/0 I- R) F4 D) {$ N
void PWMInterruptInit(void)+ ^3 s- ^% D' `4 W+ c2 ^
{
) t `$ P9 Q8 D- a# e; } // 注册中断服务函数+ R& p2 o& N- C6 M. r
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);6 a! @' S1 {1 {' D
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);0 f9 @/ ~ t8 w& k9 L7 f9 @
9 T1 g( y, y0 Q6 Z/ Z7 O- Y
// 映射中断
9 ?. j5 @/ M* E IntChannelSet(SYS_INT_EHRPWM1, 2);
! M8 ?; s# N& T5 {: [ IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
3 G( p0 ~+ D4 S) C; b
; ?' Q! j# o2 Z* x4 M, \" U% P // 使能中断
% o& w) k8 {" s3 t IntSystemEnable(SYS_INT_EHRPWM1);
* H2 `1 C9 W- g0 V# T IntSystemEnable(SYS_INT_EHRPWM1TZ);/ L" a0 {- H$ G \: N8 ^
}
# i* L v$ B" \ K( |- C3 E) O" s+ [7 o5 X+ _% }: |
/****************************************************************************/
$ B3 z+ F$ p Q# k' P6 U9 O/* */
, A2 |& W! A. [. G% m* _; ?/* ARM 中断初始化 */
1 p; C. c" a0 h) v( t' G8 g/* */
. u# h }( g7 U/****************************************************************************/+ Q6 {4 T1 T8 H: o/ n
void InterruptInit(void)
$ F& X$ _* S; |! l{
) n& b! r( j. |" R7 o$ O! x // 初始化 ARM 中断控制器1 z }# t5 K3 o J6 u: B" J" p0 N5 c0 S
IntAINTCInit();
6 Z1 K6 O- Q& y0 e+ v. C6 `" w: Q: W z$ r' l( k& `
// 使能 IRQ(CPSR)
7 g* P9 W3 r4 b2 o z4 o9 {6 j IntMasterIRQEnable();
& ~" p' x, g; ~7 ~/ R3 @( O9 C7 C, v
// 使能中断(AINTC GER)$ r/ x% J0 w, S, i
IntGlobalEnable();
) z# U) O( r. K i
: U6 e: o- ]% Y6 `8 J, C& A k9 \ // 使能中断(AINTC HIER)' v: k! P% y; J% ~& m3 o+ f
IntIRQEnable();
( n$ {3 q% S k! p9 p4 N- t$ x}
) C% }$ p. }- y8 i; I* l
% ^: I* C8 j! `' m# |! {% z9 B3 ^ |
|