|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/) }9 M" _; C; F! O4 ~+ ^
/* */
# a9 |1 M2 v9 d2 u( X/* 宏定义 */( u; l, x7 {# \8 M
/* */
6 Q5 z7 P. r; \+ |/****************************************************************************/
Q9 Q3 N* v1 K" c" v// 软件断点
4 ?% f T, S' W#define SW_BREAKPOINT asm(" SWBP 0 ");
' o& a3 H+ S, p* ~2 A' v$ W' j) _: n% _4 n0 B
// 时钟分频 @0 O+ F- E4 y4 P
#define CLOCK_DIV_VAL 228- b5 a2 X- q7 j( h2 a+ W$ y
3 p: A% K5 }+ {: |3 }& g5 }* z/ y
/****************************************************************************/" f+ o" f/ c. g: o) ? ^
/* */
) l8 A0 C, c/ L I$ n; V/* 全局变量 */
# P% o% k* L2 ~$ R2 y) G! W/* */
[# H/ Z6 E h: v6 t Z/****************************************************************************/
" ]8 [5 C* _4 m/ s+ ]5 O/ k/ rECAPCONTEXT ECAPResult;
7 B9 ?: l" b) ?, O7 b s' Z. j
% S, X3 ~$ Z5 h; G/****************************************************************************/
! M; z0 B3 w4 u6 r) r F# `9 k( ?/* */
) \3 F- L& Y1 [8 K, ~3 W1 O" p/ M/* 函数声明 */5 e& {! Q7 @# ]8 [: [9 K c
/* */
+ F/ k- h6 h5 W' k) Q q A/****************************************************************************/
. s( G' y* [1 C9 U// 外设使能配置
6 w% q2 Z, l- z, ]8 p6 `9 uvoid PSCInit(void);
4 C2 C! F8 m) C* v2 Y
/ M5 t6 K' t3 a S// GPIO 管脚复用配置
, C' M; F6 _% _) _, v6 l$ n" Q3 Mvoid GPIOBankPinMuxSet();
4 W4 i7 f9 i* q: `2 } S& i$ u9 ?; x" ~
// 产生波形
$ f: O6 d4 r- Yvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
5 ^$ f) A8 b$ Q1 l4 kvoid ChopperWaveform(void);
5 j. E9 T, V* R: V( d9 B& o9 m: U2 O9 _" ?
// ECAP初始化和读函数
& B* x: H" a% U% v# O. O5 S% o" tvoid ECAPInit(void);4 a! ~9 C F5 C$ c. @# S2 ]( y
unsigned int ECAPRead(void);, K3 ? t* u2 f) ^3 G
" c4 a8 C. _* g U6 q- l
//ARM 中断初始化/ L# l2 c* Z% g8 A8 _- }0 x5 r
void InterruptInit(void);
_( D% f8 c4 N) N3 P+ Z& T* I" O5 z' P
// PWM 中断初始化
) o3 z8 c' h* p. Y! cvoid PWMInterruptInit(void);
q4 ^% k' g: y% X: [9 b/ A// 中断服务函数
5 {+ j' b+ c9 o* k/ Z, v, k// PWM 事件
7 S; h7 L& E! {1 e9 D- J/ Evoid PWMEventIsr(void);5 H/ m0 n$ z* `4 o4 T) c E
// PWM 错误控制事件4 U( z+ q) K" p' e
void PWMTZIsr(void);# ^9 d& b+ d( B
6 n& ^' w2 ~( n8 S3 Q
/****************************************************************************/& R- t1 V& l( L
/* */' {- r5 X# F& k# e1 P1 i: J: h
/* 主函数 */
& i, b# x1 b, }/* */
$ f, o1 x3 M& o3 b5 U* k2 n/****************************************************************************/. G( R- \5 [; i( t2 g
int main(void)
+ \2 j8 J6 B: r# _3 N{; h- T# u3 F( p) L& B7 }% t5 y
// 外设使能配置9 D0 p6 ]* [# | D0 {$ z
PSCInit();* m6 |5 s) R) p9 ^! ~. G, E
. m; A6 w: G/ Z% G0 R' q // 初始化串口终端 使用串口2' X& N! y F) |" s6 V5 b, O
UARTStdioInit();
+ ^1 F) d8 p. }2 U0 v' [, e
; @$ c3 V* d8 |3 z7 ?8 z. Z // GPIO 管脚复用配置1 ]2 C: S5 M$ N" J6 Q& P/ r* x
GPIOBankPinMuxSet();, R6 M* q0 p( {* e; C
0 s: Y, d8 m0 s) L9 V! @ // ARM 中断初始化
) M' h7 l/ e7 i% ] W InterruptInit();
0 b1 j4 i' f. e' {) m8 b0 b' W9 X9 J. x) m" O7 i/ U: `5 h9 {
// PWM 中断初始化
, E* [7 _. m: w) V+ I$ \" R) n PWMInterruptInit();, J" Q f1 ^4 e& {
) U# M! j: J& q
unsigned char i;7 g4 y* F$ B4 ~8 t: m; j0 D
unsigned int j;1 p* v, y/ ]$ k/ n& q1 G
8 L/ J ~" @1 s$ z' B
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
* x% p0 a" |# l" T0 U" W UARTPuts("------------------------------------------------------------\r\n", -1);
, D* ~$ x$ R: H5 x8 x& `% M UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
+ N& L" W. X& x% K$ p. s // 产生波形+ N/ J- d: ^- T- F! J' }
PWM1ABasic(25000,50);
6 X) |/ U5 Y2 u3 v6 {3 H! w, ]* z% y, {+ N( c" `7 y
UARTPuts(" C6748 PWM Test Over!\r\n",-1);3 j9 N. W& A/ u, {- ? @# _
UARTPuts("------------------------------------------------------------\r\n", -1);
' }4 _, T( u$ ^7 u
' r" l6 R, D7 E7 C" Z. P* w% c2 s$ f, q
$ L5 R; ` B9 \2 ^$ T, a
UARTPuts("------------------------------------------------------------\r\n", -1);
% s# v9 l$ U$ L4 k UARTPuts(" C6748 ECAP Test\r\n", -1);
$ P5 q! ~- g# j // ECAP 捕获初始化$ W5 r- N$ l$ I' G
ECAPInit();8 _5 Q3 ~, a$ X, o
UARTPuts("Initialize ECAP.......\r\n",-1);
5 v. g, t# o }6 @$ w7 `6 Q3 Q8 B for(i=0;i<5;i++)8 d: q/ U. b U, F
{3 L' J0 g8 v+ K9 C- d+ X5 P
for(j=0x00FFFFFF;j>0;j--); // 延时: q" D. t( a3 \& U3 m0 [
ECAPRead();, X' g& x+ i6 M* Z9 D
}
( v* E, ^6 ^# F1 x; B0 y UARTPuts("\r\n",-1);7 W! A2 E/ l/ o1 `- S3 I- Z- M
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);1 ?" }+ Y Z) J% v5 m9 F0 N3 H* X% N! o
UARTPuts("------------------------------------------------------------\r\n", -1);
, Z+ }+ q3 s& H
/ |/ p6 O& F( h \+ Y0 [ // 主循环: n! }/ A8 ^3 k; Q
for(;;)
* u+ P6 ]; ~& X; A! v$ U {( J# y$ k N" O0 i
) ?" ^: e0 R* P: @# U; G
}
8 I5 ^- L4 k/ b/ t) b0 d}
" i& ^9 |7 J; b4 [7 i* {4 |3 l4 V+ l( a1 J
/****************************************************************************/
' p' v- n/ U+ |/* */
! o1 g5 P( j E# H0 \1 x2 W/* PSC 初始化 */
/ W% ]8 D) z+ Y, n' S5 C9 ^7 G) t( _/* */4 s9 G/ W2 G8 B0 a
/****************************************************************************/8 T# E* _( Q. X& a: [
void PSCInit(void)
- ?2 [) f3 @$ {; X{/ Y5 P. s. G" K5 G9 r
// 使能 EHRPWM 和 ECAP 模块# f* ~1 r" G7 e- z0 @( N
// 对相应外设模块的使能也可以在 BootLoader 中完成
4 A4 { z9 r2 T PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ Z3 @1 q& @6 r$ i PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 @7 U- e) }6 E0 r4 H- q) j7 T}
2 l. r3 v1 F+ g& `
" w/ C) k9 B( {/****************************************************************************/8 U/ A1 _; w+ _7 A6 C
/* */0 o5 u6 G4 Q8 c5 m5 d+ v7 U* G) I
/* GPIO 管脚复用配置 */
% y) _& K5 e/ j/* */# t: c4 l) h( }* C1 x" D
/****************************************************************************/6 S* U# m1 @0 A. z+ m
void GPIOBankPinMuxSet(void)* G" j' m3 C! K# B K1 k
{* @7 o3 C4 |, n2 X* `- V
EHRPWM1PinMuxSetup();0 m' X: |# M" O/ ^4 |
* u/ N8 H/ B% a) o( z // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
# A: n U# Y1 @/ } // 作为捕获功能时管脚方向为输入8 [# M, W* j4 s: k9 [& E
// 作为辅助脉宽调制时管脚方向为输出! g ]7 x. m C. p8 z
// ECAP2 / APWM2
; F7 d+ f/ |8 ]8 e ECAPPinMuxSetup(2);
2 m; P2 [( z3 }' ]" z
& j3 z; ^ J3 M6 v // ECAP2 / APWM2方向设置为输入6 G+ U4 W- d3 t5 M$ Y. T) u
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
H; s1 d0 l+ G5 x3 R/ @}9 i/ m0 E( F# ]
3 ~. s& n0 r1 b p7 m' r" k
/****************************************************************************/+ A% Q% Z" j1 s
/* */
5 u* z5 Z) n- q% O& t* X u/* PWM 输出波形 */
( b$ X6 q' H& ~' q/* */6 X: p( _; U" e: S, `9 D2 N3 Y9 J- `
/****************************************************************************/( R, {- O1 {6 a6 `
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)5 C* C6 o2 {: m1 f% j( V" Y& n
{
$ X0 A0 a6 Q) m; X# g* v* q // 时间基准配置. ?) k0 t1 Y& J' p6 X3 q
// 时钟配置
: V# I2 V& |5 z- I1 J8 y- d4 f* L EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);3 }- I1 E1 k* ?& n# s) M# c7 Z3 [
9 h( D1 W- C1 C // 配置周期
/ X% p9 k" K+ n& Z9 x EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
" p' v. W7 L( H& W% K' c, z pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
+ ^ v* x6 i5 B; j4 P! Z7 V; X+ K3 O! S6 M( R' Y
// 禁用输入同步信号8 p" Z, o% z/ _/ F
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);% | f# X2 ?, H
Q7 Z. K7 _( f3 m0 h7 `* y% D7 x
// 禁用输出同步信号
3 G* o% R+ x% `$ r1 J( M EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
^* v; g8 S5 k- k/ E- z3 ?5 n; x2 W7 C1 g. @" }
// 仿真(DEBUG)模式行为配置
* A- w: v# n' G EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
0 f) M0 ^9 l4 A$ J' d- v& |2 S% u9 Y. M( q& m# t9 V
// 配置计数比较器子模块) u! S- Z1 S" J; A) S
// 加载比较器 A 值
9 h; t. U7 t/ C7 k# Z: D. E! k9 l EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,0 I" }% {! `* z; X9 ^1 E
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
+ D! l. q5 {/ Y/ e/ M5 z' Z7 V2 z
0 |5 [/ G$ a7 g. x0 N // 加载比较器 B 值# T# h ?: }7 `. b
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
: L* X* f) t: u4 E/ K EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
+ m$ X; o2 D" K P% X- m
$ \4 R* S7 k$ w& H3 w0 q. j5 s // 功能限定配置(输出引脚触发方式设定)0 e7 `, s# Y+ R! w/ c1 d
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
R9 H6 Y& K' z7 j EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
7 t$ n; s2 E. T3 X0 P f# k EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,/ T8 H% M( m% d1 s7 W
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);9 e h1 q! y+ V V8 u
0 r2 t g5 S; S1 h1 @ // 禁用(旁路,信号直接输出到斩波子模块)死区模块
5 J0 k1 ]1 n* ^ K4 ?4 H EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
; k* }$ P4 `9 U% b8 y
9 A$ {7 r% K R! u9 A // 禁用斩波子模块
& |+ K* l4 p. x; ~7 \ EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
. l, r/ V. T: g" F
( t6 c( ?; s. m% l' X$ A' |8 @ // 禁用错误控制事件8 K$ d, y; a2 @; _
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);. |0 Q+ }: n2 r; c* l! t7 Q# R" B& c# |
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);" M& k' f2 \6 E: A _$ Y. D
* D' B0 ]( L+ s0 |$ Z // 事件触发配置
8 ~: r- V$ j8 L% j2 t) f* M' v // 每三次事件发生产生中断 s3 s5 C" T; I9 \- z. B+ X
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
( ], k+ A+ F. Z$ I4 N& m // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
# \) s) Z" t" H2 w: p$ }) v. r EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);1 [) O; G1 K% T% T0 q0 n
// 使能中断
, }; M; M) G% }4 c7 g6 V! ` EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
; m& o2 o3 J% b0 Y
. S6 S$ V3 p8 V; ]) J // 禁用高精度子模块
9 y5 m: L/ }6 J& Z, y EHRPWMHRDisable(SOC_EHRPWM_1_REGS);' U% f, |( `$ x
. @. [) [( K1 M* u3 m9 W6 Z
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
( U; }3 L0 o* [6 ~- q}
7 ]* {( O8 b6 F6 F
& g) u Y$ |& M: U4 v1 E5 Yvoid ChopperWaveform(void)1 {/ N. W* |: \# E8 g2 q
{4 j; G+ E7 S. i: t5 ^5 V
// 50% 占空比
: l J- r- b! J% A, s EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
8 _4 U. s2 `/ {" j- @ // 4 分频- z6 B) P6 ^1 [7 A) a: u
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
) n1 v' v" h6 P! W* `5 Q/ a3 u# y // 单个脉冲宽度, [" U7 y d g( Q. U3 F5 Z1 U
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
0 o% N9 I7 d0 H# X // 使能斩波子模块5 g5 i, @; ~& |3 }1 B8 m6 k
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);( E0 {! n a5 ]* k; v+ l6 {5 p: b$ n
}* W0 f5 z2 F6 v1 X5 `1 q: ~& T
" O4 v! M T& ~9 [: J/****************************************************************************/
* |; m! W! O) A- p/* */1 i/ R g$ C: W- V
/* PWM 中断初始化 */+ j6 H6 M/ A/ F0 u% @
/* */
9 ~) N9 i+ O. x( h" u3 ?/****************************************************************************/7 {+ E) p! S/ n$ s) ^1 I/ S( _
void PWMInterruptInit(void)
0 }( }/ I* r" H/ w5 X7 ~, L. u{. Y- X% R# E! y7 c% R! y
// 注册中断服务函数
' ?. s6 K6 R& \0 X5 v& c+ | IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);/ C: X/ l. C0 D( g' u
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
5 ^/ S6 l2 ]0 Z4 [* p8 v
5 C( @ Z) } }2 | // 映射中断
7 [) n i8 j9 R' K% i2 K4 @ IntChannelSet(SYS_INT_EHRPWM1, 2);
5 V" B2 E8 _- {2 z, Q IntChannelSet(SYS_INT_EHRPWM1TZ, 3);1 G4 D- H6 Y1 n5 d: A2 n+ V' @: p) {
- }6 Q$ w- [- o+ C5 K# e // 使能中断
3 O& m6 p# Z9 o' Y0 b IntSystemEnable(SYS_INT_EHRPWM1);4 t/ n/ n; L2 N& t8 T p0 S
IntSystemEnable(SYS_INT_EHRPWM1TZ);
8 O; s. q/ U; u7 `}: f* g" V; e6 q3 {) R
0 F' G' S. \8 O( Z) i( s" t) ^/****************************************************************************/
' N' Z1 L5 @9 Y; _/* */
4 f( h! I- I& g5 }0 Z/* ARM 中断初始化 */
p, X/ ]6 {) i8 @( S6 I6 N+ ^/* *// a7 f) Q* c, t; @
/****************************************************************************/
1 ~! x- ]7 m$ c2 e; Ivoid InterruptInit(void)6 @" F0 K$ R' C) R" Z
{
" G9 z8 p+ z9 k // 初始化 ARM 中断控制器
4 I! b& T3 {! x4 o5 C: h IntAINTCInit();
& b, Y8 t2 M _' Q; T9 C5 G; l; P3 S( \0 n0 ~
// 使能 IRQ(CPSR)% j4 ]$ T/ r0 J! L5 s" _9 d/ o0 g
IntMasterIRQEnable();- i' D: X" D- R, L
8 d/ z3 o3 H% N" R7 t) X/ b
// 使能中断(AINTC GER)* v' J7 S, n' Z- u4 c
IntGlobalEnable();
* J4 j3 E. {& `
( u9 ` n* x& b# a0 P3 N# a: ]% k // 使能中断(AINTC HIER)
, h2 m/ x0 }- S8 O. A IntIRQEnable();* m5 Y5 e1 L' p: d5 {' c
}
1 D Y3 z8 T( }; \4 }' H& x
1 k) v" E# Y3 @( f/ m% w |
|