|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/" Y' s: J6 n! J+ `! m; |$ J5 ~
/* */
& X8 I/ [) Y# ?0 B* n$ [/* 宏定义 */( P/ [) A/ h _
/* */ E, n! X" v5 s/ E- B, W
/****************************************************************************/5 s" _4 J$ O8 W0 j! e: a
// 软件断点
" m% X6 d- F( N+ n#define SW_BREAKPOINT asm(" SWBP 0 ");
) S0 c9 r7 [: ?5 _% i2 j
+ x! R! k0 i/ |4 @4 M* n8 `// 时钟分频9 ?% O2 T' U$ w* h' J& L: R8 Y
#define CLOCK_DIV_VAL 228, Q/ ?8 e0 u* q: d" J
9 {8 Y5 `9 s N/ {+ C* _. l. K/****************************************************************************/
: i" J q* e+ _& Q1 M& i* g- ~8 `5 N3 N/* */3 S$ h7 J m$ y7 S% p2 i- w. G$ R
/* 全局变量 */
; y: H }, X/ h8 `/* */
7 c! ^! g' E( ?& }1 _' B/ r/****************************************************************************/8 N& i+ z9 u) c
ECAPCONTEXT ECAPResult;
# |% g& ?2 P) C- o/ x! S7 _! G
5 M! R1 p; E5 e1 m5 y! _: l/****************************************************************************/" @+ w3 T, C5 C) l: F, l
/* */* ?: R |: o2 W6 W
/* 函数声明 */
$ X6 Q! n% p) P" j G/* */" Z8 G; z0 z/ i
/****************************************************************************/
9 h$ I/ u, P/ r// 外设使能配置# F% H! Y( a6 n
void PSCInit(void);3 R! _# f7 s! F8 a6 x1 n$ J
+ R# v2 h4 U8 j- L( U
// GPIO 管脚复用配置2 }: G, \- m# n) X4 p" x$ W
void GPIOBankPinMuxSet();# W2 j: ?( w! S
' ^; U' F- s! I- Z7 D; z0 Y$ a9 }// 产生波形
: r2 E6 l( g4 a4 H3 R" Evoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);) Z/ H% U1 @9 l" h+ i
void ChopperWaveform(void);
; n) S; c, n! f: p; ]- D2 L) Q/ T. _
// ECAP初始化和读函数
3 @0 g* T1 W3 s" _. f3 {; x: vvoid ECAPInit(void);# p2 ^3 H B1 m% E) E8 X
unsigned int ECAPRead(void);
4 D: Z! i! t6 H- o3 o& h. F! D J( z v$ ^
//ARM 中断初始化
& C/ N0 \9 K& svoid InterruptInit(void);
. S/ z" O$ m/ ^( [+ W- h# o8 o) C% O. ?% s" {5 d+ W$ S
// PWM 中断初始化- n3 a" }/ q; p. {
void PWMInterruptInit(void);
% d; I( @. h m- N// 中断服务函数' b# X: \9 ^5 H% U9 d
// PWM 事件0 z- V$ [% x: Y. e+ j% X- O# Y
void PWMEventIsr(void);# J4 Z) N( ^4 @9 l1 v* H
// PWM 错误控制事件5 q5 X& Y1 `7 U$ k/ z& b( D
void PWMTZIsr(void);+ s0 N- A# H! s0 ~" D
0 }/ w/ Z% h: `/****************************************************************************/
" S6 n" f6 C+ r/* */
: P7 y f* y1 E3 Q' ^' b/ O, T/* 主函数 */# z! S8 \' ^/ m# d: o% ^, X: T
/* */. I }2 M) u) q
/****************************************************************************/6 e# W. B6 E" {
int main(void)9 A, K Z( @2 T C# n8 q
{
& }, {; h4 {7 S. r, H/ H5 Z+ E // 外设使能配置
; ~; e2 X0 R3 J% S5 b8 `. q9 C* T! y PSCInit();. i: {/ A5 r/ w" ~, F' O
9 C$ ?1 ?* v3 w% S
// 初始化串口终端 使用串口2! s% l( S, O1 M( O2 p5 e
UARTStdioInit();4 X8 O; \( I M, r0 \3 N0 P* ]) q
" r+ A2 o; V+ q( q: t/ z
// GPIO 管脚复用配置
' D2 `% f0 V, f1 X( P GPIOBankPinMuxSet();! N+ j+ l% Z) a: V
g. L6 d/ z0 K) b% w: ^, ~
// ARM 中断初始化' U# ?7 }5 I9 W
InterruptInit();
* F$ R' P+ b+ e1 A/ z# }* t9 e) n# k3 P/ {# [2 C& y# P S
// PWM 中断初始化
* r& z; X* g2 O3 ~4 Z PWMInterruptInit();. V9 t- h- Y t( e9 l: g: {* C
! y5 P; e/ e" Z: @
unsigned char i;
4 e( S9 A" k9 ?& F unsigned int j;
/ [* v- l! ]8 E4 \( K
3 _% a( p7 s, }$ B4 T' W. s" V% ? UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);7 Y: D3 j6 i% h2 ~. G3 x' L( [
UARTPuts("------------------------------------------------------------\r\n", -1);! T( `, f$ o( Q. e4 {/ W5 w
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);& u* C7 G& J H1 H
// 产生波形
" m# W9 i/ z3 ^ PWM1ABasic(25000,50);
! _( Z) V, j3 Y5 v, B% c) u5 Z% l5 d) Q/ X! u; }7 K
UARTPuts(" C6748 PWM Test Over!\r\n",-1);3 r( d2 r% A, o; b# y) y( p
UARTPuts("------------------------------------------------------------\r\n", -1); ^# y* w" H$ Y: h6 b9 ^0 \" l/ @
( P: e& h: Z. r& d+ N+ d" u/ {" Z6 G3 A. _# O6 H( e2 G
, n( U0 p6 \9 Z3 ?9 Q6 e/ G
UARTPuts("------------------------------------------------------------\r\n", -1);3 \4 L( L: \7 _, k
UARTPuts(" C6748 ECAP Test\r\n", -1);; p0 [! ~0 x9 K' \* n% s( u6 K
// ECAP 捕获初始化) M" d6 Q1 g3 p7 O3 r: q
ECAPInit();- [' P$ N6 e: ~$ H+ {7 Z: \
UARTPuts("Initialize ECAP.......\r\n",-1);
2 v6 O# m& |! P$ `2 N- P for(i=0;i<5;i++)
4 w2 @& q+ ]0 D1 S+ h0 O6 M4 J& {5 E {8 I4 [; u: A3 `
for(j=0x00FFFFFF;j>0;j--); // 延时
0 q4 ^% i v/ e2 ` ECAPRead();# c4 I# |9 v( m% ?
}
& N' R* E' H; K* P UARTPuts("\r\n",-1);
3 D: V6 X2 ~6 y4 X; z UARTPuts(" C6748 ECAP Test Over!\r\n",-1);4 S% n" ^9 m& n% T
UARTPuts("------------------------------------------------------------\r\n", -1);, _* r0 S2 S: `. |" R% N) R) m" P
2 o: x- b& j7 Z9 X: O: j2 V. _
// 主循环
$ I( T6 M9 I6 S* E8 b for(;;)" y: J9 O+ T) m7 q
{
% q( Y% C) q6 [& o/ p4 \( M4 F& T" s. V9 z: {9 Q% C; w9 a
}
7 V* U2 [: f, @0 w, {. i}! ]/ }+ ?4 R, o. B) v, G2 S
R3 C( Q8 d- ^7 A/ p7 }/****************************************************************************/) L2 q3 O. X- h U
/* */
/ D4 Q0 ]2 o2 c8 y/* PSC 初始化 */
0 n" h# l, c9 l! p# t) z4 M3 i/* */
" X1 @ }* a% b) y/ T( d0 k/****************************************************************************/- X! @ E1 n( u0 S( B
void PSCInit(void)& g( Z# h: I7 b/ G9 n* C
{$ R8 c1 |/ a) O
// 使能 EHRPWM 和 ECAP 模块
2 M# i8 M( W( j+ l // 对相应外设模块的使能也可以在 BootLoader 中完成
; }3 P7 s/ B6 ^ R6 y$ [ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ o8 n, g* ]! R PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
+ M$ v0 s8 D) T5 c/ X+ c}
2 v& ]0 Z# { V0 j7 @1 f' t& l+ G& {( _4 f& K8 |1 f& W1 u) F
/****************************************************************************/7 i# i. y: [( X2 l
/* */
. V5 k+ R6 N4 D7 W3 {& s/ Y9 h/* GPIO 管脚复用配置 */# B: v% x: I# k9 l6 V
/* */% S. E5 U$ G3 _/ {/ E8 U& O* ?3 P
/****************************************************************************/
+ y3 b+ u% X2 T3 Q/ L Avoid GPIOBankPinMuxSet(void)
% m. U: Q5 h' d( P{9 i9 X" C E) N: S# h$ N3 M
EHRPWM1PinMuxSetup();
; ]2 l- g! J* X3 O' A
* }" X4 D; Y) [( P$ O7 z d8 W // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
@) B- ~ y% s. P9 L: q; i3 o // 作为捕获功能时管脚方向为输入
6 r- x4 d) S1 z( {+ ]7 U; { // 作为辅助脉宽调制时管脚方向为输出% w! ^# N8 U& u$ ` K6 x
// ECAP2 / APWM2
$ A/ l# {! Y+ u5 ~ ECAPPinMuxSetup(2);
. E, p! x: ~ ~* y2 }$ a' ]. J3 M' D; s6 ]9 @
// ECAP2 / APWM2方向设置为输入
3 N9 _ a; o% r/ K- r1 ~ GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]1 R( }; ?* _8 k3 k/ @) j) v
}
. u5 `' r# a. m* L* y4 D; C) A; x1 t$ U! H6 f$ t7 o" q( ~. ]2 _
/****************************************************************************/9 c; g( r$ w7 a. {2 r
/* */
9 t! m* h3 A' i! W/* PWM 输出波形 */
/ |5 c( q* R0 Q# d/* */
k0 t: \! U* E/****************************************************************************/6 t" S' U* r3 e: G# g; q) a
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)! }- }$ V* e& \& K+ m0 _+ k, E
{
& D# M( s- S* }% T. `6 p // 时间基准配置5 \! n% Q/ K9 F; D" N
// 时钟配置
2 v! {, U0 n2 P EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);1 D# a$ X' G8 e; c8 A8 ~- h
) R2 L3 A. O# a' Z6 F
// 配置周期 J- [6 k1 ^3 K! ^% X# t
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,) W" V f' x' r$ a
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
) c; v8 ]6 u7 ~& J% }$ G; q. o2 k( x1 Z2 |% ^" y
// 禁用输入同步信号0 q& h; `; M8 [, C# `5 E
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
6 q( `: c, S( E: P+ x/ {% v' J: D I' M, G: T% J
// 禁用输出同步信号' V! ]# o1 J M9 ^
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
) ^* p; o2 Y9 U8 ~, X* t) @
" D$ T+ T _6 [1 K- K // 仿真(DEBUG)模式行为配置
* Y0 V: c& `- [2 _ ~! X EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);( u. |" |; o1 Q: F+ N4 Z% `
5 [/ V; C! h% q' Z1 u9 F // 配置计数比较器子模块
8 A# O9 c: J7 I // 加载比较器 A 值
/ @. E7 I5 K% z8 N$ [ EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
2 I2 V+ v7 f9 R Z+ `: }/ Z3 P: z EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);3 C1 [2 A+ X, X# Y1 X1 z
' K2 M& F# G# `5 g% O; j, K+ ]
// 加载比较器 B 值
6 R* j* q* @# t EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
+ y8 x% l& j$ ]# y9 z EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);% Q: r! e7 |0 \# b* f( L7 r
: F$ @" [' |7 z* A& u
// 功能限定配置(输出引脚触发方式设定)+ s+ f: N: e" w$ Y4 ]2 W
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出/ P- ]9 s# Y+ `8 X: f$ l
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING, S8 F; Z& a4 d! F7 W. ~
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,2 j7 x/ e1 Q! r* m
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);: Q! M0 f( a# H, z" ~/ Q8 k. w2 U
% V7 l; N T7 E: J7 h // 禁用(旁路,信号直接输出到斩波子模块)死区模块/ Y& ]4 k8 y# F1 e/ I1 h# F I* l
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
/ T/ G2 u9 c0 L; C4 k
& K: L3 E% \5 o7 @& x# Z // 禁用斩波子模块+ S/ X+ q9 k( o. @3 `) v, i* s
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
. o0 u5 z# C9 @7 j0 I1 U
: B! p( r. f) K2 K$ R7 L: d // 禁用错误控制事件
( D0 @5 M+ w9 R EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
% o& H( @: V1 Z0 z' B. j EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);- M% l% b7 p7 h9 g& v4 e
: q% ?7 @. O1 L! }7 F
// 事件触发配置3 R- k: G: g& V; E, P; a/ u [; D9 Y
// 每三次事件发生产生中断4 K/ }1 T' ?% s5 A4 ?) R
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);" t, d" T, k' @+ O% z% h) m+ R3 _
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
( V" S5 d' N& d+ t" E+ d0 \9 l EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
. t* k% E# a6 U& t // 使能中断
, {6 t7 T% Q: ~+ F; F EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);- O, ~; d2 A @0 B. @, @
U {+ Q; J& g // 禁用高精度子模块% D9 t2 q8 T7 Q( A; |. g! n8 h l5 Q1 X
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
. B1 T6 N) d$ L0 [, u3 T4 L7 M( O3 O: e& i
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
8 @ ]# v1 }: T+ o5 q) B! J}
- }; s7 E' }7 |- t Z1 I7 T+ T" h1 F+ E4 n/ l
void ChopperWaveform(void)
9 J, P: `& A9 p, L{0 p9 Z: j% ^) f7 h+ r
// 50% 占空比
5 l3 m9 k. V9 \( D EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);0 X. f2 j8 D8 |( _8 |0 e
// 4 分频
8 u: Q0 z- W* A0 ^6 U& c3 x EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
3 a3 z& N6 G( b H o, r2 R7 G // 单个脉冲宽度$ z' s$ ~) n- Q
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);( z3 e7 C4 C3 Y0 |. k: H6 a
// 使能斩波子模块
4 B0 K0 `: N/ T) t" o4 T EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
0 Q1 Y. ~8 n* K& S& J}4 T0 n$ q" a1 |- w0 b
8 N; Y7 J% K6 d4 |9 `
/****************************************************************************/% z2 O& f/ \. ~9 \
/* */
# ]5 j2 [2 h" W8 i/* PWM 中断初始化 *// a+ K2 G7 r" c# V* M m
/* */
6 e3 q$ P" h: T0 ] w% \/****************************************************************************/
4 b6 n" z& I* [! r" ~' e8 ^" tvoid PWMInterruptInit(void)
) q6 h9 r- Z9 I' O- {{ e/ \& }% h, {$ f) O
// 注册中断服务函数0 X3 C# O/ t- [( u
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);. q$ k! j1 g- |: c
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);, A* }' v; h" z( p% a7 G3 P
( L7 q4 b! \. V+ |; `8 d // 映射中断% q9 R8 n2 C2 z S
IntChannelSet(SYS_INT_EHRPWM1, 2);
% n, x# ?: l6 ? IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
7 Q8 s" u( i4 b/ }( P, _: n4 |/ o6 `3 G% x: Z0 u
// 使能中断4 Y9 R; Z* |" ^3 k/ d+ Z' S+ o
IntSystemEnable(SYS_INT_EHRPWM1);% G7 T; [5 \% U7 `. N3 v
IntSystemEnable(SYS_INT_EHRPWM1TZ);/ p* H: I1 v( F8 U; f! i
}* u7 N' ]4 P/ m! L* p
6 Z B$ }, G% o5 {
/****************************************************************************/
* `* E5 e B) h f8 C; L/* */
9 g- R4 a) n0 A. P/* ARM 中断初始化 */1 o8 P: ^ m E2 O* R
/* */* v# g" I" v- G. n! i
/****************************************************************************/0 D% {+ h! w" ~& D) e
void InterruptInit(void)
; Y4 ?8 F5 S; z1 l3 y{
/ D. g% A/ I3 d1 R // 初始化 ARM 中断控制器
" w; Q1 X w! I IntAINTCInit();
A. x9 t r+ R% \, R, d7 I7 u F/ Y6 A0 K# r
// 使能 IRQ(CPSR)& ]4 V0 ?+ O8 k% c% K+ t" h' d. z
IntMasterIRQEnable();
: b' c' J$ s4 }2 M% Q+ Z1 C, S1 b8 r# x3 P
// 使能中断(AINTC GER)
$ {, \' d0 @( g% L4 o4 x IntGlobalEnable();5 `: u. C: L t6 n4 O- z
6 q3 D6 B4 k/ Q) T- [2 {
// 使能中断(AINTC HIER)& g( w5 r# F/ H6 H8 i' [+ a
IntIRQEnable();
F4 m( K( w2 g}
4 i+ r7 A) U' I! h9 H& Q* Z2 @( A$ T' _+ [& ^' p/ [' e
|
|