|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/4 a$ c: E w0 c
/* */5 T2 K8 O0 D0 U2 n6 V) J9 F$ [ |. v
/* 宏定义 */
. n, T5 i6 }* u7 A8 o1 _/* */
' j# R: A* |3 G/****************************************************************************/
; g- a9 q8 o2 i5 l1 p. |& e# k// 软件断点
' F7 {' D% a7 w8 v, u#define SW_BREAKPOINT asm(" SWBP 0 ");
- [# T$ H; z. j7 u( l: s: k7 f+ t8 h# o3 I; I
// 时钟分频
( y" I9 N& [+ g- K5 W4 |, z" [0 z#define CLOCK_DIV_VAL 228, |! o% f; B. `! ~) _( r' K
$ b0 m6 T7 U& ?8 u" h9 e, X; b0 I$ {/****************************************************************************/
) O$ M7 E( u: U* ^9 r2 T+ d+ C9 K' _3 J/* */9 |6 ?4 w( W" {5 l; l/ G
/* 全局变量 */0 {/ `3 [% T& h, G
/* */
( ~7 G, e8 W( y/****************************************************************************/
( j% x1 q4 E0 s5 r8 T4 V E! Q0 e9 lECAPCONTEXT ECAPResult;
- z( `3 L9 Q5 i
; l3 B! R/ j, L; W0 k/****************************************************************************/
$ l; f8 R" R& @" ?6 g7 A3 h: C/* */6 \4 R5 d$ o ], X
/* 函数声明 */8 x6 i3 b8 _- |
/* */
+ S! e* w ^) ~# j/****************************************************************************/4 S8 o* w# I* L: U2 N2 _' x
// 外设使能配置1 D9 n7 a9 x* c- U, K
void PSCInit(void);' H5 ~+ l# ~ e9 }
( b, a4 C9 ~+ f d
// GPIO 管脚复用配置
# U. A J/ Q. u2 w' ]5 |: Vvoid GPIOBankPinMuxSet();
, T- v% T) H& ^8 g; m: y% }, c# A
: o& H/ D2 T% Q1 k, h// 产生波形8 i# w K2 q4 y5 ^; [3 i; S
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);- W& b# O9 D8 [2 D, V! s2 `
void ChopperWaveform(void);) ^0 N4 T# \* d3 \
0 R& l% b* {5 c* p0 C6 q// ECAP初始化和读函数% Q m( b4 h0 I
void ECAPInit(void);( g9 q' @0 v! Z: u9 f1 V1 f+ J
unsigned int ECAPRead(void);8 d, Y" n% ]1 J( J R* a+ y+ p! A
1 F( V2 h, q/ V: p3 n( E/ N//ARM 中断初始化
* M# ~0 F6 @# Z! i) D4 k8 l6 ^; rvoid InterruptInit(void);
3 y D" U8 R. N% m3 N! s5 ]5 v2 _1 U, I: h. \
// PWM 中断初始化
/ J+ o3 i0 ^# Z! u& x- F. zvoid PWMInterruptInit(void);
( x2 Z& s( c9 b// 中断服务函数
7 E/ [% H8 H- N2 C1 d// PWM 事件3 M: E& e. V& H+ w
void PWMEventIsr(void);
; f { V. \& B$ p4 S: |( |// PWM 错误控制事件
B' y: g. t! V8 Rvoid PWMTZIsr(void);
! x* X# T: u- B/ R3 D
- ?4 f, L$ W5 G, j I2 n$ W/****************************************************************************/' I8 Y. E0 h2 w0 w
/* */; h8 k# x5 a3 W% q1 a4 S
/* 主函数 */
, u1 F$ @% U& C/* */
( S0 [ h8 w- p' p/****************************************************************************/ [3 `# Y( q" C, F# x q6 [& t
int main(void)
) w6 \, A0 m7 v* x' d' ]% r/ G{
0 H& C" @6 [4 E% k6 v$ B // 外设使能配置
6 @, l$ h H9 V8 ] PSCInit();
$ E$ N) Q# Z9 K0 C9 S6 [0 P, ], N6 e9 J9 d( C ` y+ e
// 初始化串口终端 使用串口2+ L9 l% b6 G5 q; ~9 E8 o
UARTStdioInit();
" g2 X2 I0 V' ^3 M, [- t$ Z# m
7 Q$ u% S1 U# ^& e X8 G; M8 [* D // GPIO 管脚复用配置
4 _ ~/ T" q, e- N% w GPIOBankPinMuxSet();" p: L1 o2 \* |" w
" p% _ k$ S% D# q3 x) L9 _/ {
// ARM 中断初始化
5 w1 Y- y/ o; ]% {8 p: g InterruptInit();4 X' `' G% K2 F
3 R" z3 y" Y" L2 d // PWM 中断初始化( _5 Z" F6 t4 W! ~' U' O. |
PWMInterruptInit();$ o7 s" ~" ]& H. I
5 f% r1 e4 H3 ~8 M. N
unsigned char i;
5 k. `6 q. n, I/ _ unsigned int j;: ?$ q8 N4 o% ]( p1 u& S
* n3 b1 q! }4 @# j6 T3 R5 h- k
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
2 c8 m; r. \& M1 d0 _ UARTPuts("------------------------------------------------------------\r\n", -1);
" o' z! b0 I$ c UARTPuts(" C6748 PWM Test\r\n\r\n", -1);( X; r" W, X. y6 R* J
// 产生波形5 l9 d( F; t) N
PWM1ABasic(25000,50);
; ?- R- {1 _- G0 H, N. W" Q
2 U$ j/ {; P0 \# | UARTPuts(" C6748 PWM Test Over!\r\n",-1);
& d4 V9 n- n4 Q1 u8 f UARTPuts("------------------------------------------------------------\r\n", -1);. e# n1 ?8 l+ g$ a/ H
$ |. ~! {, d6 H6 m, P7 X" K& t' X l' b; Z
4 F! ]* b2 f" f* F* M5 y+ j7 b$ ~$ h- B UARTPuts("------------------------------------------------------------\r\n", -1);7 A2 I* q, n: B$ c. F
UARTPuts(" C6748 ECAP Test\r\n", -1);0 q0 `# `# R3 ^& C8 h4 O- a
// ECAP 捕获初始化
0 H, t1 l' t2 Y$ w9 M ECAPInit();, H* t6 i+ k+ i% I; u
UARTPuts("Initialize ECAP.......\r\n",-1);
$ J! o( C2 H+ k* c for(i=0;i<5;i++)
6 l# l" W" l: U$ u% U( ` {
; t U8 t; Q& r8 E8 R for(j=0x00FFFFFF;j>0;j--); // 延时9 S0 w7 l3 Z ?% H& z
ECAPRead();
' z9 {3 `5 ~4 Z" Q/ U! A# F }8 a R F5 w6 p$ N' C$ {
UARTPuts("\r\n",-1);
6 v* G4 K% J2 z- {! [ UARTPuts(" C6748 ECAP Test Over!\r\n",-1);& g- o) G+ V* J( l! }4 o
UARTPuts("------------------------------------------------------------\r\n", -1);
# }9 Y( r* J# }; I% E- `) O, m; ?* w1 t; F' B
// 主循环7 @* @6 A- h7 J( i9 [5 L
for(;;)
- \4 B$ g6 S6 l" Q7 D) K. B {
/ q# ]& `9 u6 ~( U1 ~& t
! ]# B/ B" ?/ a" B0 D& ~' K9 \ }
( r; e& I4 A8 `: J# N}
$ U! h( y( V R+ o6 u8 v
1 ]& P% P" [$ g8 q& v: T) u/****************************************************************************/- q' P, W* W i! ~$ k/ b( k
/* */ k9 N. ]* F+ m- S" D; R
/* PSC 初始化 */1 l. P$ W4 d2 r" [
/* */* c# B& X' b) C( G5 F
/****************************************************************************/. _& Y" ?% S8 P1 }& e: u
void PSCInit(void)
" y$ }( U, [6 ?% j0 { O{
0 v6 H5 ~- A9 |( j& t8 N* W // 使能 EHRPWM 和 ECAP 模块% v0 P; K/ [$ i: b
// 对相应外设模块的使能也可以在 BootLoader 中完成
/ Q C* j3 r6 M+ {; O) z0 D PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
9 r: t, Z# r5 G$ d1 G# |+ Q PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);3 d( O1 ]9 i J- |
}
. Y1 ^! {( R+ \, L9 T! Q( D ?. @& @) Q
/****************************************************************************/
6 V- u9 n; r% G E7 s: t2 q R/* */& S* B' I* h- I" P: e8 U
/* GPIO 管脚复用配置 */
7 G( ^7 m4 B6 }0 y% e" j/* */
" m2 }5 d% ~; P/ v4 c/****************************************************************************/
% z7 i! g# w: A6 y3 N% Dvoid GPIOBankPinMuxSet(void)7 Z( T. V- `: U* S/ c9 k; U+ n
{
! f2 E" Z P) T7 T/ x+ p/ v: ` EHRPWM1PinMuxSetup();
0 [2 ]3 A6 |* R' y* F4 e5 W* O: Z% _
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
3 K4 v! S0 G1 ~( @& x // 作为捕获功能时管脚方向为输入! G* w( z. M* k3 b
// 作为辅助脉宽调制时管脚方向为输出
- e$ H E. e+ w7 I. M& L0 ?3 ^ // ECAP2 / APWM2
& w$ B; y& }2 H ECAPPinMuxSetup(2);- [4 z5 u) e- f. |, l
, i5 @$ m* [1 I% j6 @7 Z // ECAP2 / APWM2方向设置为输入
/ g* j' d3 s( ?& b' i5 h9 ?" l* a GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
( h5 b/ c+ ^+ P+ B( b9 V7 y}7 @& W5 G# t: y6 g
, c* q" M& U: W
/****************************************************************************/# L& f A+ u1 T: L$ m. B' D
/* */
4 b% @' t( K& f& e1 [/* PWM 输出波形 */( b- H5 P$ s8 R
/* */. n, H N. [8 ^$ F" U8 H
/****************************************************************************/4 e+ f; b! c$ R+ H: i
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
% }7 f/ W0 M! l0 g4 s+ V. U5 O! d{
! i0 m0 Y ]- B R s4 S // 时间基准配置, f& K O R& _
// 时钟配置: R' z# x Z6 j1 X
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
: P1 p. k( S+ _4 Y- B: {% E
U4 U4 G2 `+ H9 v# p# g // 配置周期
! w' z" l; O7 t: B2 s: i EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,( M$ b* i M- d& S u; A
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
+ Z: \; I. [+ V5 F% y! d8 r, d# D1 U- d1 P8 p
// 禁用输入同步信号4 B* D* }2 T" U$ u2 p8 @9 J7 y
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);' a, Q- _" i1 Y+ J5 g( [- c6 q) P
% Q9 \: w% O0 N3 O+ z0 _% }' T) \$ I/ Q
// 禁用输出同步信号: U6 [9 Z5 y7 b4 H1 R) R
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
+ e6 I `6 u. n( j! J1 u6 J
0 D' P9 N( E& Z0 g // 仿真(DEBUG)模式行为配置5 E" N& {1 i- m; y' b8 L
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
6 ?( c7 \3 s9 J& _! U
& W( e$ U: Y; m4 P, r) R // 配置计数比较器子模块( o: ]- I7 V; A! `( F
// 加载比较器 A 值2 V5 w& I% }$ i
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
9 w6 U* ^/ X; f9 h2 t S: g7 G8 I EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
% F+ v: J1 l# S7 H v; C6 r4 I2 h" g8 ]
// 加载比较器 B 值
f- q: W4 O' _6 [ EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
2 h1 [ {5 ^1 J* \4 l$ Y% V2 r EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
) {3 P) X3 b1 G# j* ?; k; t) r* E+ U1 X$ F% |8 a
// 功能限定配置(输出引脚触发方式设定)
. f3 _: a' q" f! { // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
( K; Z9 L! Y, d5 S EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING," o3 V3 K" v1 m
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
' J* n2 s- ?8 }9 w EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
2 _; P6 s- `; G; n4 K
% Y U" c4 A1 r2 y; B3 p // 禁用(旁路,信号直接输出到斩波子模块)死区模块. v3 B: P! d5 C( |
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);4 {7 }% A4 G3 ^: j& m1 S
3 X V7 a7 T5 h5 l1 H R) p5 h' | y* {+ [
// 禁用斩波子模块1 j, {" j! F" }7 |; n. P0 R, G
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
: d0 e) J7 s# ?& C% h3 f, S% u2 ~- z$ X( S3 N p" b8 n
// 禁用错误控制事件
+ j, {; ]; P) @4 g4 I EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
# O3 I2 W8 \4 z0 N: d4 Q6 ^% p EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);: U9 P) [; z' ~' F( K
6 U7 S' K I( L+ `1 ]0 X; R# | // 事件触发配置
% Y+ u' y" Q O# _ // 每三次事件发生产生中断
8 p* n5 l: x2 L0 |) H EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
7 M) l, H/ @* w* k9 h // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
& K4 X. v, n, a) {0 P; v& V, p EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);8 z( J! {4 O0 k, a3 C0 Q% I
// 使能中断. g" Q9 Z( a. K; N+ h* ~ y0 Q
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
& x% s0 N# J$ U" _' E# ~! y9 d2 {( _/ \$ j' c$ I; f( ^5 a
// 禁用高精度子模块
$ R# u( z6 w8 |( j EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
/ x4 B2 `% A! W, |5 f
/ ]7 i6 y/ G; l( ]% ?! H: x7 r UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);' a) S$ f) S) n+ E$ X
}
M( S3 Q; Q8 q$ e9 w W! u
$ Y% I. D; G% _5 T, Kvoid ChopperWaveform(void)
' `2 R6 f0 u7 _/ V6 m8 X{
0 ~, s( I6 M3 \2 H // 50% 占空比& S \) j3 v( @- s
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);3 W& e1 l0 i. l6 e8 W0 r; ?
// 4 分频
: f4 i9 w' I5 g# Q$ l) N* H7 @ EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
& L$ L* O8 n1 L5 o* ] ~, }2 w5 P( f // 单个脉冲宽度
8 ]2 x9 j4 ]; m! y: b! W; u EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
2 v* k$ n2 c: F* D( Y& m- B1 b9 b* r // 使能斩波子模块
$ [/ j' l& f& \) N5 Z+ n EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);: n+ A; W" d. |& x; u
}9 e# c' T8 L8 E5 |8 x; E2 k4 C! X
. N& {( E) I5 p( J
/****************************************************************************/- I- R; k: Q; ?' C( R" \/ K
/* */
/ ^2 N' Q$ Z; s0 t+ i! F4 [- r/* PWM 中断初始化 */* Y# v, O* {2 @2 A5 U: s$ R
/* */
) \# ?# g I9 ]8 l6 p/****************************************************************************/
; \+ w& g) X( G/ f' lvoid PWMInterruptInit(void)$ Y7 j" v) R% S- J
{0 H: T. \1 d4 i# [. B
// 注册中断服务函数8 P7 k5 r0 N; {/ I3 ?
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
1 ]: L' g' B6 _6 y4 A- b$ t' ?1 V IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
7 c, c7 l M) e+ A7 A8 W; b7 i$ b* U, A& y. N+ Q
// 映射中断9 q) N+ i8 H! m# ?( ?
IntChannelSet(SYS_INT_EHRPWM1, 2);
# C d: g2 B6 x6 t& ~ IntChannelSet(SYS_INT_EHRPWM1TZ, 3);$ ]* S2 \. {% R7 f/ l! z% C c
" U7 [9 k( `( q. a, q
// 使能中断( Y4 _. T$ c' ^6 _; \/ d6 U
IntSystemEnable(SYS_INT_EHRPWM1);0 i- A) ]- m% H3 F) _3 k' ^8 y
IntSystemEnable(SYS_INT_EHRPWM1TZ);
! I a0 T4 y9 c: D}
+ d) y0 K; ^4 `6 o. a
* a# g* E0 l. Q% f& H8 [, c1 ~! \/****************************************************************************/
* R$ t7 }/ {1 o6 g( D4 I/* */
( Y0 g q3 p/ z, x( G$ w9 x/* ARM 中断初始化 */
7 Z, C& {* Z: s5 r2 {/* */" P* [1 k/ z7 \5 B6 C
/****************************************************************************/
2 p$ n; v2 s: \( p( V. a: h4 mvoid InterruptInit(void)
- ?) K) s ^/ U2 ?3 R+ u{4 |& ^! v y! b- R8 z/ }
// 初始化 ARM 中断控制器5 J8 i/ p9 ]1 R1 v) e0 Z
IntAINTCInit();
+ K9 \ f6 e5 k5 r- K2 ~( X& }3 F) Q
7 O+ H& y0 m! u. |2 [$ C s* Y // 使能 IRQ(CPSR)1 @/ w7 W$ g8 v! P0 C3 F$ u% W
IntMasterIRQEnable();
% S: s& V2 Z, N+ u3 C2 h& V) ^0 Q$ P' g# v5 Y' p: l
// 使能中断(AINTC GER)
# U8 f9 R" l( O1 {9 W% P1 n IntGlobalEnable();7 M; V/ |; P/ ~. G/ r$ h3 ]
! W: ~) j7 H0 G" m8 l; E4 V# | // 使能中断(AINTC HIER)
1 u; L. p+ f* }. ? d IntIRQEnable();- M; D E! s8 q6 ?) T( [: c
}
- W% t8 e) Y0 w& u3 E7 a
) e: a+ ]: {: \ |
|