|
楼主 |
发表于 2018-10-30 17:00:28
|
显示全部楼层
/****************************************************************************/
( ^8 d* @( i4 @5 z7 \! x/ U/* */, m7 m8 S2 N5 W, x+ o% C
/* 宏定义 */& W+ G7 }! U* D b6 u) A
/* */9 `9 L1 [9 b. Q7 E' h
/****************************************************************************/
0 A; j! |- A% m* r// 软件断点
9 n; }* V1 h# ?6 W3 J$ s#define SW_BREAKPOINT asm(" SWBP 0 ");2 v$ d( p( z9 E
$ `# \8 A+ I# a9 {1 F" `4 O0 o
// 时钟分频
0 \3 r& R1 [7 B" O! k#define CLOCK_DIV_VAL 228
' ]+ W7 V( S' s, k: b9 q" |' W$ w# L+ [
/****************************************************************************/
! e" U- i0 l: x2 S: I$ m/* */
2 n6 t1 j( M. O W/* 全局变量 */
9 F. ?$ M3 m5 h" |9 h* L/* */7 \7 q3 ^/ h1 v# K
/****************************************************************************/
2 s- _4 v4 L. r- F0 ]ECAPCONTEXT ECAPResult;
3 _/ l6 \6 G, `
7 U* Y( }( j) ~4 c/****************************************************************************/, i/ ~, ~0 i! K" s5 I
/* */
& Z. F2 g7 q3 v" c4 N/* 函数声明 */* }2 {9 [) ~* ^
/* */
1 {' a+ b7 ]( v: x* T/****************************************************************************/
8 x3 |. u0 }0 u' `// 外设使能配置$ O S) | B4 D8 X' o" |
void PSCInit(void);
+ F3 f7 Q/ Z2 H% T
" ^* W8 {4 k. X2 t( d0 n// GPIO 管脚复用配置' J1 U9 V; i$ _& j5 V; I6 [' M
void GPIOBankPinMuxSet();- w/ D; e/ m2 {3 n9 `1 x2 {
( e! {6 w- W! z& R7 l I
// 产生波形
$ y& h! V; S e- `& X* Jvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
: R2 `, W% X3 Hvoid ChopperWaveform(void);
$ ~" W3 R' h7 X6 I& s
( p9 h& M% Q+ b0 q) y" e// ECAP初始化和读函数. g z8 P$ l6 Y" `% o8 @
void ECAPInit(void);6 R& E& n( ^1 d4 i6 a
unsigned int ECAPRead(void);' X4 n. H- K5 q: k- y
' d' b" c4 u( L. N( `/ F
//ARM 中断初始化
( I2 {* k6 b8 i6 W4 C5 }void InterruptInit(void);$ g- O4 B* c% q6 C: v
6 D0 m+ B( j }- }1 H! q" f: Q// PWM 中断初始化
- A$ ]2 l- j3 `" @& `void PWMInterruptInit(void);
4 Y4 n6 `: V8 U8 ]5 V9 a t# b// 中断服务函数. h' g9 c, V: ` ~) `
// PWM 事件
* r5 v. ?: O/ ]; [void PWMEventIsr(void);8 n; ^! M1 S& P: {: u6 t
// PWM 错误控制事件
5 t2 u* z8 E& T! `void PWMTZIsr(void);- j7 s. B/ L0 X1 B( x/ L: m
9 Y& z) A( q8 @ ~' f
/****************************************************************************/
* O+ w/ o; R3 S0 Z' k. Y7 |/* */3 M1 d8 t, ]0 v) ~) ^$ j8 i
/* 主函数 */
, |2 m" l: j6 i6 Z" j, @# S: X/* */3 e7 g* H, o# Q/ L2 |, X0 `
/****************************************************************************/2 N4 z* X) u) o& F6 D
int main(void)' n R, Q4 y& I( D- x7 g8 X
{
; ]; V/ P) I5 o4 @) \ // 外设使能配置
& r$ q8 I5 z+ \) L& @ PSCInit();
- u% i7 o1 P- Z( y# i" K2 O' Y8 C1 U4 w- N5 Y! F: G
// 初始化串口终端 使用串口2
: Q, q# W# z/ O UARTStdioInit();2 d4 z8 ]1 P( P1 z
8 D/ D! g) ]" E4 k: v# O
// GPIO 管脚复用配置* S$ Q3 F, h q2 p) t3 I( a5 V# _7 X' e6 Q- s
GPIOBankPinMuxSet();
2 I7 K4 Z6 d& T; V1 k
) o x1 D9 \, O# V // ARM 中断初始化
4 E! e' B9 O" _8 H; |- h InterruptInit();$ z/ o, m( i7 h0 a
& [4 w7 m2 T) @6 L, |' i% f // PWM 中断初始化
5 P& Q$ i- n9 W0 J) z: \ PWMInterruptInit();
) P+ z/ ?% m6 ~( w
1 v0 ^8 A% z$ S: ]& E unsigned char i;
9 E1 e6 ^' c. E; P; E" m unsigned int j;; _3 T% X1 I# w
; d) k1 B4 K: C) b* R G0 t
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);5 j2 W: C( F) ]( l M2 a0 u
UARTPuts("------------------------------------------------------------\r\n", -1);! U2 D, {. d3 H( o% m; s2 d
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
7 g8 ]& p9 {5 k9 ~% w5 Z m // 产生波形# b- ]: K2 ^# e8 \, F0 w" {
PWM1ABasic(25000,50); R/ |# V& q, Q7 i- w- t
: x' X# w1 R1 U8 u! z UARTPuts(" C6748 PWM Test Over!\r\n",-1);4 z+ |9 n$ E6 ?: b
UARTPuts("------------------------------------------------------------\r\n", -1);
g; R5 C F# g
' l7 X% q# Q- O, u' O) ]
: n, c b, I( Z b2 F; \) R" l3 F2 l4 y$ n
UARTPuts("------------------------------------------------------------\r\n", -1);+ \+ n f- R1 V# s0 r6 o5 H1 }9 q
UARTPuts(" C6748 ECAP Test\r\n", -1);. n( |& P1 \: P
// ECAP 捕获初始化+ \) E5 R: u, z: ]' N/ ^! P5 a. R' X- }
ECAPInit();
; Y' m" [% I3 E* _' _ UARTPuts("Initialize ECAP.......\r\n",-1);' f$ \$ g" z1 v/ X; X1 H
for(i=0;i<5;i++)
& `3 |# ^3 i6 \! j) \. e) U8 w {( W5 l/ I+ L$ W0 ^ S( z4 [; M
for(j=0x00FFFFFF;j>0;j--); // 延时
! {* Z+ G3 J9 J6 e# v* d0 N) | ECAPRead();
& _& ]7 W& T# y. y8 _$ l$ f }7 f, J# j1 h4 _0 n1 l4 ]
UARTPuts("\r\n",-1);2 l2 O# F9 V0 m N% A
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);/ u( u, u/ P3 L2 h5 B6 q0 d& A2 e# p
UARTPuts("------------------------------------------------------------\r\n", -1);
( l& `, S! c9 S( E
0 S% j( l" c2 [/ G, j( } // 主循环 G% O! F- G' q- @
for(;;)
/ F" x( p! F7 z4 c2 t: A {% K2 O! ]0 }4 p( T, W
9 V* ]# T/ [* }$ ?' K# M. {4 J
}
6 G. D1 V. X% t}
$ w4 [, d Z+ C {+ @4 v- y4 f% _& [* x
/****************************************************************************/
- E9 c! ]1 Y2 w* _; I# R1 S/* */! U" _7 x- i0 z2 f3 h
/* PSC 初始化 */( K7 p3 z% E5 L0 k* {
/* */' I$ z& d3 Z) D- M* g
/****************************************************************************/" r0 e3 G& F9 f# x& s. M; M
void PSCInit(void): \6 g/ P4 d* K, A0 U$ l
{
. \& k5 \9 h$ v# P& R // 使能 EHRPWM 和 ECAP 模块; ?9 O, T3 y9 r. n+ g% @
// 对相应外设模块的使能也可以在 BootLoader 中完成
; I9 c0 E0 d! ^4 t; M# F V PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
( l. w" m8 {3 L3 L3 O# j1 C PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
, q' o3 d& M" B: K" v}& [0 T, T8 w8 E Z+ Y
9 }( u3 b" B4 ]& F3 N3 D9 x
/****************************************************************************/9 G2 w+ L/ n# x5 ?9 P
/* */
% M0 C( k2 P( E, [/* GPIO 管脚复用配置 */) Y, g& ^& ^0 I2 z6 Y
/* */
1 d- T' T0 a1 W7 k/****************************************************************************/
+ m8 k& Z4 C% q" Mvoid GPIOBankPinMuxSet(void)
0 X! G7 v ]8 v, \* s$ `- o$ \7 {7 V{1 R, t" T9 ^' l, [
EHRPWM1PinMuxSetup();
; k3 ^3 b2 W/ t5 y2 M( P5 G
' H6 C U6 J" P3 g // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
% J; T6 n- G% r: {% | // 作为捕获功能时管脚方向为输入
' Y6 a1 t# E: z7 Q // 作为辅助脉宽调制时管脚方向为输出( o( _ O3 N* ]
// ECAP2 / APWM2+ |9 _2 v+ V- B
ECAPPinMuxSetup(2);4 x6 b% n ^) O8 z/ i
7 {0 k) ? m X6 Y. K. Y
// ECAP2 / APWM2方向设置为输入8 Q* h+ l# y* g7 j$ t; h
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
$ c4 p* A y2 z- N}3 B6 o9 o) h8 |/ u2 Q* x
( X0 G; G' v# D/****************************************************************************/
' E, P5 f* A6 d) x6 {" B; D/* */8 v% G; X3 S2 o, }$ r- T. @
/* PWM 输出波形 */% G5 k' D3 U F9 W' K
/* */
. R! f% i" R Y# K/****************************************************************************/% o7 h9 f: ^: }! b1 G, T" C- ], L2 l9 ?
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
. Z G* ?( y4 n$ r{
4 V1 B( g" e' q# S: C( F // 时间基准配置% z/ O. e9 _/ S5 j5 t
// 时钟配置
2 g3 v, u% ]% e9 u EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);. c( d+ a' Z) u1 S- E
1 f6 D. v ~- G% T3 Y i, N+ ~ // 配置周期# m3 ?3 [' ~0 g7 e A
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,9 ? N, w, ^, M8 V7 F' G
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);, u8 U. q6 Q' u
+ F& v( @# ]+ e. d( X. |7 F // 禁用输入同步信号; ]. Z! v, h3 U2 a! }5 m
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
' j x# d ?0 r$ m7 a, g9 [
1 q' [$ f4 G9 t( C. N // 禁用输出同步信号, f) j5 m# s# {+ K5 c
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
. G' X# g7 g7 _" _! ?0 G- Q
: c- r W' G; T% Z C, X // 仿真(DEBUG)模式行为配置
/ T f e8 ` ^+ }6 y EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
0 @9 x d, u- e: f% Z/ N& |* _% N6 P7 U2 U& M* t" z" s s$ b
// 配置计数比较器子模块+ B, b. j& d N8 c7 j. x$ F7 B
// 加载比较器 A 值/ t& u6 A5 W4 |) ~; d
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,) S& {# w7 c9 W$ }2 }
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
; g. w: n# l( Q& h0 Y
( I; \% z1 m+ Z) x# R+ c1 h // 加载比较器 B 值8 ^% U S3 y6 K' F0 w [9 [0 u
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,: [) k- F' a: k, M# @. c
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);, ]/ C* r% B, p- R
; w& ~6 f r+ w# S' ^& F
// 功能限定配置(输出引脚触发方式设定)
* t+ J3 a# N& J- } // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
) g) z" Y6 `6 M& P8 b EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,- G7 _9 M: d) n0 C* ^
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,1 ]0 e. @( U4 O7 `9 m, i0 w! O9 E
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
$ Z3 P; V4 b# ^9 G. [7 ~
* x: h) a0 p7 {1 o( t* C // 禁用(旁路,信号直接输出到斩波子模块)死区模块
* e4 x8 v' \+ v) j* Y. G" F7 W6 B EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
$ K( o8 S. x: Y: i3 X+ P+ T k. [7 Z. [
// 禁用斩波子模块0 p! p1 S$ y- q T2 P
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);! z! T! r: R. f
( i( ^0 @9 D) y- J& R // 禁用错误控制事件
: K, A( [% @+ J EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);% J z; S# C' ?; s9 r" t
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
7 s) k+ O7 ? o' x) j( ]$ _4 h8 h# b
// 事件触发配置
4 O/ Y _2 }. r( }" g$ k // 每三次事件发生产生中断+ z5 [1 K' h. O9 v/ D& Z
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);) `3 B, P3 ]4 ?6 k" `$ l( a
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
2 A/ f/ C, _/ W# t8 b8 A2 d EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
/ y P0 k3 |* m: j& e8 j& W5 X // 使能中断% I0 p7 L" D) p) y& J: {7 I5 e4 B
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
0 c$ n7 j$ y( M/ u6 z$ P: x3 t3 W6 d; l3 |1 T) ~
// 禁用高精度子模块
; a' j2 b: O' J1 S) K3 w6 ] EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
1 L, x; ^! }5 E' M6 H0 n1 e! U- P# E$ [ F& z$ b; E
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);4 m" Q/ z6 \' h5 ?9 R! _/ t
}
. W8 T1 Q- D* R& k* {& c2 I4 `0 [1 d- t R5 V% R0 N9 _" ^3 {
void ChopperWaveform(void)$ x" Y9 T6 X, B/ V8 a
{
! h- Y/ _# F6 c1 ~+ }: g // 50% 占空比
! k6 M: O+ M+ f. w EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);- K" L. W* v: E
// 4 分频
. n$ n6 e$ e. M+ O9 |* @ EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
1 L6 \; z& T& n6 c' _6 [) u // 单个脉冲宽度
8 t8 O4 z- d2 {# T: u3 L EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
- C2 y) M5 T+ o$ M# w6 h // 使能斩波子模块
& W5 L, H* g j; c EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
& Z% H2 }# Z& D n# { C' x, Z}
' o: i( s) D8 Z) i1 W- k
) d1 z# P5 f* B/****************************************************************************/
: {1 M: M& B3 G4 R4 z: i/ r/* */3 T5 e, Z/ F. p6 e$ H" y
/* PWM 中断初始化 */
+ L2 W2 R2 h$ I/ } n5 X/* */
0 v" u+ v3 Q' s" q& K/****************************************************************************/
' d2 G: I4 A9 u; d/ Avoid PWMInterruptInit(void)
& P) d% E/ D- b9 A" r( O- P1 S, g% m6 d{4 l" \* ~7 o# l- X- ]
// 注册中断服务函数5 x4 M3 W L: O0 s" K' @& c; ?
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
! B6 F+ r X$ l8 k& M. e IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
+ R1 T* h+ x% G; _& b( f. }" w4 \# ?1 U$ W- O3 f5 d$ ]
// 映射中断# w" \. `- a, Z: h7 ]. Q
IntChannelSet(SYS_INT_EHRPWM1, 2);/ X6 i+ @# @8 w; p7 r) Z# I+ O
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);6 e; \# n6 ~( o/ @8 b
' m. k8 X: G3 d/ f; Q
// 使能中断$ \, Z% E1 N! O" d2 S( }' j1 ?
IntSystemEnable(SYS_INT_EHRPWM1);- B" a: F' ~) }
IntSystemEnable(SYS_INT_EHRPWM1TZ);
8 J& ]# T/ ]. x' c}- ^' \7 G% v) _& x7 G
: f; s# ]' n* s! k% d4 R
/****************************************************************************/; @( Q3 o- ?+ ^
/* */9 v3 t+ l5 J3 q" P) d, C
/* ARM 中断初始化 */
/ H4 U& {, u# x, h, B% m5 S/* */
) B: K- h6 ? e/****************************************************************************/2 G, y( U$ n, b" Y& B
void InterruptInit(void)
$ n3 @+ ~7 D% R) c7 ]" ~# \{
3 M$ K- l* A* Z. i: q6 N- Z& N // 初始化 ARM 中断控制器4 Y* d' |; a6 d" v0 _
IntAINTCInit();. l9 H' ]5 w' C5 T. [4 j/ d
/ C' J" O& Q0 `5 P0 k; X" I
// 使能 IRQ(CPSR)
+ b9 [( k4 a0 _, a5 _/ i& k IntMasterIRQEnable();# `6 f& U, r3 U9 x5 \/ l0 c8 u9 G
" y$ `8 m, o& B! @6 A4 D // 使能中断(AINTC GER)
, ?1 `4 l+ p( f% h7 f2 G7 Q3 J5 P IntGlobalEnable();
0 _! O" R, q* ~4 W1 ^0 q/ y
- S W% V2 j$ c0 f$ F6 q* J4 x // 使能中断(AINTC HIER)" x! y9 j' g. C
IntIRQEnable();
8 N4 [. M3 P. c7 ^3 D% Z9 m}
" p: F4 z* P, H( ~" K0 c s6 J2 z) h+ a( y0 o" s I# q
|
|