|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/# @: O3 v9 Z E1 H [) H! j1 N3 h) T
/* */
9 D1 R) E+ ^) U/* 宏定义 */% t8 {; |3 h9 G! z4 r2 T u- A
/* */
3 M, @6 |% P; F2 x! ?5 l/****************************************************************************/
& Z q0 G6 G4 o0 K& h// 软件断点
- S4 }9 H) h; U+ l, _9 V+ r& V#define SW_BREAKPOINT asm(" SWBP 0 ");8 i3 t; `9 N* ]0 M1 c
2 \ k# a. e& n( G0 t
// 时钟分频, N( W. A" [0 N0 y" |- S t: g
#define CLOCK_DIV_VAL 228
& t+ o2 h( G/ S! L+ ^
6 T3 a- L0 f6 P4 |& a/****************************************************************************/
7 z7 j B- A7 X; X/* */
7 F" k7 f; ^; R8 K* @5 y/* 全局变量 */
- o) f' c' t( y3 T/* *// S) L0 c! q& k5 _" N0 d! |# l
/****************************************************************************/- C0 K g8 e: _" Y! g$ ?
ECAPCONTEXT ECAPResult;
& K* i. L8 z1 H- |' S! n
& W A* n6 x2 C3 \/****************************************************************************/
, B6 D- ]0 m5 n: X5 O/* */8 ]( d; M( u1 M
/* 函数声明 */
/ _8 S( B$ d. [, w' h/* */
' U% |3 l, q. [. ~1 x6 G) p+ ~/****************************************************************************/
4 d. L: M% r, \! `$ M# S// 外设使能配置
4 U" X6 q5 ?9 T3 G5 {4 P- Ovoid PSCInit(void);
5 H# q( r r5 g; g2 ^2 `. n8 e9 a5 O1 U; ~ T) I& I* {0 J
// GPIO 管脚复用配置6 O8 E* D: A/ g; f" e: ^- J
void GPIOBankPinMuxSet();
$ R+ E" f& @' e# g' T w" p& \! k; y7 R7 a' ~8 k
// 产生波形5 V4 V$ k9 c- E" S' s+ p' I
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
4 j. U1 @- q, ~( v6 lvoid ChopperWaveform(void);
( P2 M- t8 n. p. s% A
' p7 C7 `3 t/ W; P& {4 r. C4 y+ W// ECAP初始化和读函数
7 ^9 m; B% t! M8 ^$ N3 Ivoid ECAPInit(void); |$ G- a9 g t: ` S
unsigned int ECAPRead(void);3 a0 j: r, x; T7 t: V8 Y Y9 ?! h/ p
4 m* _) r# z: y& v& X//ARM 中断初始化
# @6 x ?% T/ R; v$ svoid InterruptInit(void);
; m2 ]/ M* V- A4 e" |$ e: U
% L: N7 H9 D# G1 \// PWM 中断初始化
* ~2 v y! n8 a. Vvoid PWMInterruptInit(void);
* c U2 l i6 Q) i( S// 中断服务函数
9 J/ N, y- F1 x& E, C+ M9 ?# B. o1 v// PWM 事件 E# f: |7 G$ p9 ^
void PWMEventIsr(void);
# X. u6 X: D8 H* `0 F X// PWM 错误控制事件
% U. f1 k) s' I6 Kvoid PWMTZIsr(void);3 e3 `5 r5 t+ ~; z& `
+ q1 J$ T) H/ s4 i: A5 U
/****************************************************************************/
* a3 R" n7 w! q, y% Q; b! z) U/* */! ~& ~3 ~% W- F* P5 L/ M
/* 主函数 */
( }' |' e: n& ]' g# I/* */
. Y- a' j6 L+ m* I. U/****************************************************************************/3 p7 @; G$ |2 v# h$ ~
int main(void)/ e7 R5 j* v9 ~3 A" M
{
$ R4 I" G0 ^) H5 | // 外设使能配置" G) w8 v- h/ Y8 V$ U4 y4 M
PSCInit();6 n5 I% c2 M/ J3 Z+ G
! W' A( E8 }( K0 _7 a" G" s& P // 初始化串口终端 使用串口2+ c3 j5 ]. w/ _6 o
UARTStdioInit();' r* @/ j7 i# W2 O8 f) o4 J( v9 n
' Y( z( l( i( I8 m5 K
// GPIO 管脚复用配置 _) d" H5 ~& k: Z e5 [
GPIOBankPinMuxSet();
: Q2 S# J- @4 r! q* B; v% N" R5 i0 y+ P8 b
// ARM 中断初始化, r& p [; j! H7 L" o) G
InterruptInit();
% n8 ~4 i; S/ t a* g) x4 W' \* E+ I7 N- n! y3 y
// PWM 中断初始化; y+ z& {7 ^; J9 ^* |
PWMInterruptInit();7 c( y! K) t3 h( b3 r
% f" c0 a. n$ k
unsigned char i;! f- E" A) J2 z
unsigned int j;
1 b3 u7 L2 W) y+ B9 K; ~* w) k7 ], q7 s3 ~0 M! r+ U
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);) j: C. S1 O8 N9 V) T: z3 s
UARTPuts("------------------------------------------------------------\r\n", -1);
/ e, a9 p' r+ z1 l' M$ W UARTPuts(" C6748 PWM Test\r\n\r\n", -1);# Z/ _, F/ ~ u4 m
// 产生波形# I, M% z$ T7 _$ }# S$ g6 l
PWM1ABasic(25000,50);
& T+ H6 F v% B U; J8 t. f. u% C2 e: d$ B8 A) o8 E- c% r& w
UARTPuts(" C6748 PWM Test Over!\r\n",-1);1 A- q& x+ S; r b2 q4 N
UARTPuts("------------------------------------------------------------\r\n", -1);
: U9 U9 a7 n# B" R: X
+ t/ |. x- t. G9 R
; n1 j; O( x3 l: l/ H+ X" T
7 f0 s+ H5 n: u- r; O UARTPuts("------------------------------------------------------------\r\n", -1);& \7 L6 Y/ M$ R: }
UARTPuts(" C6748 ECAP Test\r\n", -1);$ ~+ r1 }2 Z F* R* e- U
// ECAP 捕获初始化. k( Z, l* l3 t
ECAPInit();" e3 d# q# e9 T9 t+ T
UARTPuts("Initialize ECAP.......\r\n",-1);* F5 V- J* \$ a8 w2 a
for(i=0;i<5;i++), s% w y7 C2 F5 X- v( X1 _
{
' l; l* K( n9 r9 O1 p' K for(j=0x00FFFFFF;j>0;j--); // 延时
3 ?5 t {1 ?1 Y ECAPRead();' g( O, ?, _: C6 R' ]+ S) r" x" K' m
}) N1 k6 s* P7 z3 A
UARTPuts("\r\n",-1);1 n" v0 E( i; {; s+ B/ H o: `7 N
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
, d* o/ @/ k3 U2 C1 F1 o( z G UARTPuts("------------------------------------------------------------\r\n", -1);) ]. z$ H( ] W! {: s5 U7 R
7 s- ?# Z8 t9 O8 q9 s7 S
// 主循环
* D: e2 r1 _* C) z1 O( A" |6 m for(;;)
* k1 w; x3 o8 @- w4 N {; ]5 N R4 t7 j. X, }
- ? E+ V& ]7 c- Q8 E S* n }2 r5 @4 Z# h3 Y8 I$ I! [
}
1 {- M7 \5 J N \0 |& I- Q8 {+ l# A) ?5 _: K1 @
/****************************************************************************/
2 ~6 b3 \2 W7 @/ d3 P" ?4 ~5 ?/* */
$ z W; x& f- n$ ?% S( Q/* PSC 初始化 */, \8 M7 F8 |. K" R+ S1 l- h' ?
/* */% v( |, K% I" G# ?
/****************************************************************************/! ^( q+ B" }; }) m, c1 Q
void PSCInit(void)$ z, i" P/ y3 h* {
{& Y! e( c9 n7 D S+ d
// 使能 EHRPWM 和 ECAP 模块4 V6 Z; E. N( E% @# Z2 H8 ^
// 对相应外设模块的使能也可以在 BootLoader 中完成
# H7 b7 H. F* q! N% j) R' k PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);7 Z1 V9 P$ V" e6 A7 T
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);' d. }4 l! l- k) [" R
}
; m) [7 n2 q: S" t
! K( t/ ]( i0 w: i6 ]/****************************************************************************/# Y( j0 u- E) b% X) O! i
/* */
3 M8 f4 M2 ?, T* q. j: U/* GPIO 管脚复用配置 */: i7 [' z; ?5 |2 `
/* */
6 X- [+ D' R7 `; Z( C1 m/****************************************************************************// F q5 K4 ^& {/ F( h
void GPIOBankPinMuxSet(void)* n7 w1 V( ]4 O# b0 H( j5 w
{, x. C; n; W' c$ q, l
EHRPWM1PinMuxSetup();" ^, _ J7 d1 T5 X+ K/ t
; n+ O0 ^4 E3 s // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)% }% Q# {- J x
// 作为捕获功能时管脚方向为输入& i, B) w/ n& f/ b1 w
// 作为辅助脉宽调制时管脚方向为输出& p) ]. q0 K; I2 L* p
// ECAP2 / APWM2+ N: D/ l9 f: k% @! ~+ f
ECAPPinMuxSetup(2);& h' Y- }1 e' C( P
* r) q' X. f+ N$ H% G* r/ R
// ECAP2 / APWM2方向设置为输入
8 T5 F, y" [' X" k1 S! e GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
1 y2 }8 V2 l) \" z, ^}
4 i+ N' X& y# `8 Q6 w# M0 h/ G7 B5 x+ |2 e
/****************************************************************************/
/ k+ t& x5 B) Q" R# b' l/* */
( l, ^) D3 a4 X+ D8 v/ N; H/* PWM 输出波形 */8 o7 K" H4 k) f; {
/* */, C+ g& F- `, K
/****************************************************************************/
$ d/ o; ?% m5 g4 L& Xvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
5 |6 J& w$ E* Y L7 m% f{
% T1 W9 ^3 \; S" }+ y+ q8 | // 时间基准配置
# l2 ?% c0 a q. k$ v // 时钟配置
8 A0 d. B$ l0 V1 q: v; b EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
; `/ `9 I$ P5 F: D# K5 X5 H4 e: v8 P2 h7 o1 o3 u) O! i
// 配置周期2 b) M) |2 {7 \4 F
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,3 m+ h$ k% I8 F. v& d
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
! H3 o1 t" f! a8 W3 h" f0 f( C" |6 i8 T! l
// 禁用输入同步信号
9 Y) k; G, N7 h1 d1 y EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);+ g% j' |5 H/ r, p- {' ?
2 ]* x4 E# l( r4 y+ R: I, X4 L
// 禁用输出同步信号! R0 C2 Y% v4 m2 Q: ?
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);7 k; R8 N2 {5 K
- {4 V V k2 M9 x V, b // 仿真(DEBUG)模式行为配置: B) @. C( b( |9 L: @* A: w
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
8 S, f! F( D' {) c5 { l& J% n& D Z" ~5 G6 a
// 配置计数比较器子模块
; v! L. G5 C3 M% L: x; I" f+ q // 加载比较器 A 值/ o0 D! K% d. G5 s" O) z
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
2 v7 b# v- M: T8 N5 \ EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
/ I' {& s/ r5 e, P2 Z2 E: f/ g& ?; } y1 Z$ N3 ^% Z% f( s( [
// 加载比较器 B 值6 h/ g5 P& R Q1 Q- r) A
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
% J& ]; v1 \3 V# F; a3 ^7 t EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);* J$ L3 p9 Y) R! G! Z8 }
4 W1 j: A7 T1 A3 `" N2 _4 p4 A" ~2 o // 功能限定配置(输出引脚触发方式设定)
; \5 K+ _) h& | // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
8 z! a1 r3 f; i$ c EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
9 a! @' L& |/ Z2 v4 d: T a2 K0 K7 {. q EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,' b/ r9 c6 I3 b% L" g ^2 Y
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
3 o O$ V# x6 S# y4 x
" G. _1 W" T$ x // 禁用(旁路,信号直接输出到斩波子模块)死区模块
2 M( m" G$ B _1 X# j% L& E EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);( Z- U) Q, O& Z7 q
+ m- Z: }9 O7 Z8 t
// 禁用斩波子模块
, W) U4 \6 R, m EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);! Q/ L& r" w. q% `1 r* X8 [
8 t# q5 o- Q+ b
// 禁用错误控制事件& e. @0 \" n; u. x3 O
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);6 K4 o( y5 p: m# h1 M
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);. D( k& L6 b$ D4 ~; T$ J* b% M1 o4 M
' d) }% s+ S5 c! t( c% b; x4 u // 事件触发配置* F& F5 ~3 J' ]9 H! ]
// 每三次事件发生产生中断% x* `1 G& l7 d$ e5 h
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
8 ?* D; P0 T/ }$ v9 h2 ? // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
) @+ Y j# l0 G# H2 E EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);# p9 f6 D! j S4 L4 G
// 使能中断
! e3 M$ Z8 o1 ? EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
& R/ j$ f5 h0 B, O$ o1 l3 R( w7 H
// 禁用高精度子模块$ s) B/ {- q/ @( ]1 l0 b% c
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);) V4 f5 Z/ k$ Y
, K( b0 Z. z, ?+ N
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
; ?- U8 [" l" q0 b: O/ I}$ L5 ^$ ]/ h( Y! u" a" L
: G+ M! B8 Q5 P6 K; K& Svoid ChopperWaveform(void)
( V# {4 E! p* t- j{
1 O9 k! Y1 I- y/ [$ Z // 50% 占空比
& M i* x" L) b5 r/ } EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);+ s& j; |5 C2 m/ o5 ^) u
// 4 分频4 M3 {4 X. s$ W
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
& R$ O" ], x1 ^" X( b // 单个脉冲宽度- X! ^& k1 c/ x
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
2 @6 M0 O' s, T; I // 使能斩波子模块% ~. |, {; `- r+ n, c- [
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
7 z2 u; R5 m2 }, z& R3 C8 L' S}
3 `( {% g# x0 H5 V2 f0 p ]
4 m5 e, |7 E9 Y7 p2 V: t/****************************************************************************/# u) G: ~( r. q2 J
/* */4 a. V" P) x9 W! f
/* PWM 中断初始化 */
: E3 A' C8 t1 p( L! L# k( D" D/* */: w! i2 z1 G" _4 g" p J
/****************************************************************************/' i2 s2 Y/ ?. h7 z: Y% `4 j* a
void PWMInterruptInit(void)
8 Q) g0 N3 t- C. ~# V/ S{
, ~ S1 x6 p$ T9 T [ // 注册中断服务函数
7 i- k5 A: b7 G0 a IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
9 ~3 g0 Z& ^8 c) H/ x: L, Z4 |0 i IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
9 ~& A) g; \) N& d0 ^6 d! |0 A; y4 b2 `7 e4 V
// 映射中断: E2 p5 |% E- a( q& }
IntChannelSet(SYS_INT_EHRPWM1, 2);: J* y$ V9 V) l- |& u; c
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);7 g n8 l/ X v( c1 R* |
0 `0 d- z( y0 I( ^& u1 K
// 使能中断
/ f/ [0 |0 V# J% b! x IntSystemEnable(SYS_INT_EHRPWM1);
& d8 L8 H/ G, R! D2 a4 u2 W IntSystemEnable(SYS_INT_EHRPWM1TZ);
1 q: }$ X! t. s, v) M7 t}
& D+ A z4 {+ L1 K8 M* a" \6 a: w
; `7 k+ K; G# B" z5 o' M/ R/****************************************************************************/$ P# u) {) e5 z/ }8 f4 n
/* */
( w" J, h% O( A$ K" }& Q/* ARM 中断初始化 */- `) e' m4 |2 f
/* */
9 [4 i+ d, a. ]' n" c; ]# G/****************************************************************************/
9 ?1 j$ n( ?; f0 G* Uvoid InterruptInit(void)
' `4 R+ X7 h! k* |# {' k* F{) ~2 N, w! |! q9 H7 `, x$ T1 M- P7 z
// 初始化 ARM 中断控制器- @2 o" h: f; e' l/ n% M
IntAINTCInit();
7 L1 N; g& n; o, B+ i, a* f$ g! `( C$ i) M5 I
// 使能 IRQ(CPSR)! U8 B; J& Z7 c' j7 i8 r
IntMasterIRQEnable();7 v5 Z& t1 _, ~2 K, s! B
9 N1 ]9 `8 C* D' n' `
// 使能中断(AINTC GER)
8 j/ K$ }- d+ b! a IntGlobalEnable();6 F3 @7 v2 Q( ?& r% J% B
6 m# h! ?( n: n, m. i( h! ^- p
// 使能中断(AINTC HIER)
) [6 J6 _# O5 D( m; _8 ^& }( [9 A IntIRQEnable();
( E0 O0 g( `% y5 I: M}
" X0 [% j5 P) l; `7 t
6 Q) @; h p- J8 i' `- u; j7 s) V |
|