|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
^8 H0 J U3 M/* */
1 Y; N( [) n+ y* \9 q! @2 K/* 宏定义 */
2 [% P, ?: W6 M/ z/ J, N/* */- [2 K1 i% k7 q! m+ o9 A" l, I
/****************************************************************************/
P4 e* g5 |, u// 软件断点6 N' B/ C) r- ?0 v; U
#define SW_BREAKPOINT asm(" SWBP 0 ");1 ]( r: A# l: h( n* z4 I
. q0 b% A% S! e7 A' U, D: y5 q
// 时钟分频
# T* R: ~7 T* k7 `/ M# l#define CLOCK_DIV_VAL 2280 X- J, e; p) Q# i: Y3 g
$ |# s2 w/ A' h7 E2 Z+ B0 C
/****************************************************************************/
- B5 x" `7 r6 A0 K! L1 H( R/* */
8 C5 s' }% l j1 ~/* 全局变量 */
7 O* u# b8 z0 T: x8 ~" _/* */
1 z, b- q8 b+ ]& m+ T/****************************************************************************/
( Z- B: u+ `- y' Z& JECAPCONTEXT ECAPResult;
: O8 r( @' Z0 Q
, W: O. a+ K- {) C1 Q& Q( E/ k/****************************************************************************/
3 r: X% c4 ]$ j( b) |/* */; O& t/ I- a# W& Z W
/* 函数声明 */
, l& @ C: B6 _! ~/* */1 h" b5 Z( I X: l% u
/****************************************************************************/
" K7 ~# T: {' X* _9 u6 g// 外设使能配置
% O# v6 B- {) f. d& ?. J) g. \9 uvoid PSCInit(void);& k2 U _0 \3 w. c) q1 z& [
* U9 a' |3 F8 e3 h0 o// GPIO 管脚复用配置
- m' o* i, E( b: bvoid GPIOBankPinMuxSet();
/ P$ F, D& y& v5 a. J9 A0 L5 i* E7 u4 L( o/ t0 g
// 产生波形
. P0 Q; D, Z/ Xvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
# D0 o% o; T* b. N1 M. d* Bvoid ChopperWaveform(void);
1 z' y" }' u( t7 r2 j* w2 {
/ j" b( i6 k' s7 \* [( R// ECAP初始化和读函数
. o2 T+ w" a! p& o3 Vvoid ECAPInit(void);
7 d7 f! r' P; Funsigned int ECAPRead(void);; F3 A; o, y+ U4 ^, _
! f( l3 e. p9 P" Z+ }- m" E
//ARM 中断初始化2 e* G# G' F5 C j: ]) L8 q0 I' u& Z
void InterruptInit(void);
% {2 i* f3 t) p' v: S. I0 Z
$ s4 D% D; Y, H3 l; t// PWM 中断初始化1 \5 {) Q2 M: |9 S) e: D0 G
void PWMInterruptInit(void);
4 u" O1 L/ \5 x+ y// 中断服务函数
! T( M# z! F& L8 ^" g// PWM 事件
2 w) \! L9 w3 n6 x# Ovoid PWMEventIsr(void);
. S* e. A. E" H) m0 F// PWM 错误控制事件
. d7 a% B: i( K9 ~2 Bvoid PWMTZIsr(void);
+ A ~1 ]% f; i+ f8 v
+ o9 W* D/ m) ^2 m/****************************************************************************/
0 h4 n5 ]: l; l' s/* */# Y4 [; @% {! y, |
/* 主函数 */# ^! L8 S/ C- t" `/ e X* g
/* */6 `/ n/ @: v3 E6 e9 w* C
/****************************************************************************/
8 R( Z- Z0 C& t* @2 @int main(void)2 A q4 }" }8 `1 d- M
{! ~& _) y8 s5 l( E& B
// 外设使能配置+ H# h: v/ ^9 [
PSCInit();& }: S& Q9 A' O
$ g0 D# e& [, f // 初始化串口终端 使用串口2
; n: f0 S- g. Y. I+ E UARTStdioInit();
6 E; s- o" g$ ^8 B5 s
" J8 V1 b6 v+ `" Z; g: i // GPIO 管脚复用配置
! ^3 u: f1 E F, ^ GPIOBankPinMuxSet();
`% U) ~; f' E5 m! H
0 j" [& h# T# W# f z: j // ARM 中断初始化! m m8 K. o% \2 O2 n; [; V
InterruptInit();7 m4 W, O5 |1 J
- b$ G0 z1 D( X, t) B9 Y- i. G6 F% ~8 V$ u // PWM 中断初始化9 m/ d6 M4 J! |% ^7 A# v
PWMInterruptInit();+ R- l- ?( f$ j0 s6 ?; i6 U. N
8 f( r8 _. \/ U* F7 ?. q
unsigned char i;: H% O. K; M+ m& G4 T
unsigned int j;
' t2 i3 ?0 m7 |7 a6 c, N0 I( j r2 C8 \, o! D/ q6 Y
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);9 b- `; L1 K' o( X* W
UARTPuts("------------------------------------------------------------\r\n", -1);0 M9 G! } K1 `7 F# p# Q
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);1 F" n6 w/ B, G! v- \
// 产生波形
$ e* I0 Y8 y2 H$ e% i! S PWM1ABasic(25000,50);* |, q6 m1 u! W
% [, s" i; G- s6 d0 b0 _) `
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
8 Y7 m; @2 y2 L8 x$ ^ UARTPuts("------------------------------------------------------------\r\n", -1);( u8 Z3 G: Z* ~% D- ?. ?
& y4 p8 `: w0 f2 `; Z) m; M# S/ X- l& ?$ u! ~, P
/ k, g G0 |4 ^% b. t7 O
UARTPuts("------------------------------------------------------------\r\n", -1);6 b4 }0 q: Z b( m, O+ i+ d3 A8 @
UARTPuts(" C6748 ECAP Test\r\n", -1);
1 e( h$ S4 V2 R. B7 O w // ECAP 捕获初始化
' b( ~" w( r( @ b+ Z4 g: V) }; e7 X ECAPInit();0 M5 x2 | a$ |2 s. c
UARTPuts("Initialize ECAP.......\r\n",-1);
+ B* X1 \8 ?, @9 P! z' w for(i=0;i<5;i++)! O1 ]/ f& _9 M# {. O5 z5 [
{. J5 a5 D5 \8 ~( j* L( c
for(j=0x00FFFFFF;j>0;j--); // 延时
+ Y. D3 a$ Q, B! H1 k; y" M' Q ECAPRead();
`; c! m; `2 W8 f4 X7 |! ^) ] }6 A0 {/ V. X/ B' ^* w
UARTPuts("\r\n",-1);: b) ]8 l- U/ {: Z& g' d1 h
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);0 q8 U& k. Q0 _2 c' y. k
UARTPuts("------------------------------------------------------------\r\n", -1);
# k' D& U* L& G3 k5 l' C. t5 i, O3 z" @ t
// 主循环
! y5 U/ \2 Q) A! `6 @" A for(;;)& h2 u% j- i0 n9 R
{3 m/ ?* _# E8 l5 p
' e8 @4 _6 N& `8 U7 D9 G) c }5 I* E+ V- k' }
}9 {: F* g' `& ~6 O1 S& M ~
: G7 B- F$ w7 J& M% u1 T7 l/****************************************************************************/
) _0 S6 l' O6 v- i" y/* */: E' u0 [7 W* j9 H
/* PSC 初始化 */
_1 W5 j/ ]% j3 e& e; H Y$ Q- i/* */
9 i Q) ?% n' W0 N/****************************************************************************/4 N# F- P# Q9 [7 L) [
void PSCInit(void)
, d/ {# V! Y# R* k9 Z2 X: t{
- N* s& W# ~, S9 I X2 x2 P6 s // 使能 EHRPWM 和 ECAP 模块) b9 T" ]* D, j* E0 T. V) I
// 对相应外设模块的使能也可以在 BootLoader 中完成0 A) K" k3 w0 U/ g+ ? [7 P
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);6 E E2 F7 ?% x* Y5 u* m
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);+ E) O9 Q8 b; x: x5 X, }' W( Y
}
4 S3 W: z$ ^2 u: U O
% Y/ I5 R+ V- H8 R: r/****************************************************************************/# t3 q5 J2 y3 X. ^
/* */
2 a8 h9 F' R5 H$ k+ o' F, S/* GPIO 管脚复用配置 */1 b/ u6 S+ O* \$ J
/* */1 J+ ]3 J5 m; B2 r# {
/****************************************************************************/
" b `$ g7 T. x; X+ y Mvoid GPIOBankPinMuxSet(void)) T: V9 c$ e; r) [' m H- l
{+ g1 w- L$ t1 C: f' V
EHRPWM1PinMuxSetup(); L! r% I" P2 o1 z! k
; j; x d* N) R0 Q! \# V9 y // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)4 V2 d* L( s: m8 V2 _: x4 ?
// 作为捕获功能时管脚方向为输入
4 I8 j1 c7 {- d. q# |4 q5 d8 S // 作为辅助脉宽调制时管脚方向为输出
" F& @& _1 x+ n5 }3 y" ] // ECAP2 / APWM2
+ H5 q* g9 U# v: T8 n$ P3 \ ECAPPinMuxSetup(2);
: F+ K& y9 _# u1 P7 t- `& ^5 j7 A* P, Q0 g) L. x( C, t0 g9 B
// ECAP2 / APWM2方向设置为输入2 C0 _8 x+ t& w4 T
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
+ q( @# r, y& V9 k5 T}" C, a$ @6 K/ I+ |9 I3 I
$ n* V( f; `8 h1 H7 k# `/****************************************************************************/
2 j% v2 s' v) }9 {/* */
5 m* l2 @) s- Z1 V/* PWM 输出波形 */
% ]6 W- r r& u6 G( V# M5 q/* */( }; p- l6 y! i* B0 o& O& H
/****************************************************************************/
* g9 Z, h N' i" pvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)1 {/ g( u3 q9 A" O* _! m, v
{# \9 h# m, y! R: m; _2 o
// 时间基准配置
( W$ T" w E, f/ m& D // 时钟配置
9 _1 o" B* C) | EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
+ B/ T0 P. D. {4 Y- T/ F! v0 V* B$ `/ C1 \+ x
// 配置周期
: H) n9 [8 |/ E+ ?' l: M" H4 u! Y; K) T EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,% r t; c! z* @5 T: [+ ?2 Z
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
0 S W/ Y3 w$ }9 `. p8 j; }8 Z* ~, i
// 禁用输入同步信号
9 F( ?7 F# `9 N6 T5 ~ t6 y4 Q EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
1 p( o% _6 I: A( l/ h
3 C) D4 F; Q/ ?' ~6 f/ o // 禁用输出同步信号8 |! b! Y6 \9 E' y% u
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
8 N1 C$ k5 `: x3 s& i& f0 `' f* M6 h6 ~# I# A
// 仿真(DEBUG)模式行为配置5 Z6 I" S' }$ c8 T; L
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);: P( ^5 z7 u) @7 t. A
5 G V* ]# E# u p2 d7 u
// 配置计数比较器子模块7 f9 k4 U1 H7 ?% i' h7 V
// 加载比较器 A 值( a1 ~7 r" ]) I* {! e/ B) l
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
. e& u+ M* U' C+ F% p& v EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);. u2 ~+ [3 l, i1 z p% {0 U
6 J3 @. g2 N; b7 x" o // 加载比较器 B 值9 A( f' P2 D7 y' `, W' c9 |1 I
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,+ a! p, ~, d8 I
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
+ N* w' Z. ?5 ]+ ]7 S
7 Z$ |6 ?$ n: L6 m // 功能限定配置(输出引脚触发方式设定)' l& \6 Z" M5 S& ]6 m8 I5 f. B
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出& Q5 _6 _0 a: e5 x
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,& b1 X3 O* @ Y! C; V
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,7 l, S) }* Z H: L' Y4 Q1 u" L
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);, N$ G: A2 Y! ]4 C! f
3 B& s' S2 ~: n( y4 B3 h
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
6 K$ r$ Z6 e% q, {6 C w: U4 B EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
) F% L: @% I: D
% k, c7 `# p5 K( y9 r // 禁用斩波子模块
- p; e4 d1 q' [) ] EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
& S. P1 K% h2 g3 R8 y* N0 `2 t; i
// 禁用错误控制事件
; z3 H- V( `+ D6 E) |: p EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);3 [& D; m6 M3 ?/ [- j
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
+ W! l) b! a& E# E7 z* |4 n+ P. X. F& K; L
// 事件触发配置
: |9 j, s: s: Q // 每三次事件发生产生中断) x0 o8 b6 z! v. W9 ^
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);+ L) B( h/ R+ F
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件/ d4 C$ s* ^3 |( @4 P0 ]
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
' o# }9 ~; }* F* |$ e8 ]9 e // 使能中断* ~' Y$ s5 A! f
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);5 R: @4 `- \8 {7 [. h5 B
. u5 h. o) w# b/ B- e& T // 禁用高精度子模块
( j2 E0 C( ?6 o, {& M. V; q7 S EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
2 u4 a2 j5 s5 Z5 {3 B
/ i$ x$ f5 r; Y( y UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);/ N6 J/ \0 P- c9 z
}
( y4 _9 r$ ~$ b1 o, x3 _! g) A
2 `2 i; `' e( A+ @& Y4 Xvoid ChopperWaveform(void)
4 E) ?+ W6 q7 e# J# {{! g) p0 t8 B l* p# u: I0 F$ u
// 50% 占空比
( V/ s% ?7 R- j* q EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
* A; a8 Y* V* W( g, L! ? // 4 分频/ c) w; g- q4 Q& T; M: B
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);/ J5 V! u5 i5 w# o$ u0 l4 q
// 单个脉冲宽度
! T# y0 L; i! N: ` EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF); D& n: e `- J) l V1 y6 C3 ~( k
// 使能斩波子模块
0 v6 g- ?4 f0 P EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);0 G5 k4 s# V6 B! i( J$ g
}
. k4 c( X0 W4 I6 Z. [4 }6 [) M, p8 g6 }
/****************************************************************************/
' |& D; J- K! C; ?/* */+ \/ m" T$ _0 a; M
/* PWM 中断初始化 */
D! t& l7 C: c1 E) F6 @1 p: S/* */: l* w1 z9 r. g6 v/ Z/ s
/****************************************************************************/, X$ A2 z# l8 z& I6 k" I+ K
void PWMInterruptInit(void)
, I0 n# V' U. f9 ]" J. L{
# K8 S u! O& ?& b8 C) W* r // 注册中断服务函数1 X" f1 j4 g# {( @
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr); B( c! z$ {5 A$ B$ u4 X9 Q( Q4 p
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr); v+ ^9 [- M8 O
% m- N' {; A+ e; D; R // 映射中断
$ Y# Y, A5 b2 b6 x; | g IntChannelSet(SYS_INT_EHRPWM1, 2);, |/ w+ m; E/ ]. q
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);! U* m2 t. X, b) t/ b. c1 k7 T
/ q$ Y. u N! L9 J6 W* s& y. x8 \ // 使能中断
! K4 S+ _7 _! E4 A% n IntSystemEnable(SYS_INT_EHRPWM1);
# B- T3 j2 Q5 x2 k IntSystemEnable(SYS_INT_EHRPWM1TZ);7 R# E0 W8 _1 Y& D% O% v
}: p- O# [" o0 i, `4 ~ U6 I# C
a3 ?( j: a, R" @7 k! w$ d! B/****************************************************************************/2 D" o+ z" _ b1 g
/* */
# z4 g7 Q& D' x7 S$ f1 V, \# X/* ARM 中断初始化 */
% a5 a- H. H4 X! j5 \/* */2 v3 Y/ N& { b8 C% Q
/****************************************************************************/1 f W+ A/ ]4 e3 Z
void InterruptInit(void)
" R+ r' B y5 w{
- ~% M+ B% U6 S: p# T5 V // 初始化 ARM 中断控制器
4 H. F w# q4 r5 g: E7 L5 ^$ ^ IntAINTCInit();
) Y$ p: H' N; F3 Z4 Z3 c
: d4 |- U* y" C9 L // 使能 IRQ(CPSR)
4 W' u0 |! S1 m% r e, I6 L IntMasterIRQEnable();. u- ?* e2 y/ F- K
; z( a$ G# X. R# B6 X" [ // 使能中断(AINTC GER)4 f+ Y( g9 \8 G: H w
IntGlobalEnable();: P" ?4 Q* b0 o! `
! L& g* ~" f! l2 Q: ]9 f
// 使能中断(AINTC HIER), }5 S J7 x% D, X- \5 i$ W
IntIRQEnable();
6 ]6 O% T' H8 [' T. m}
5 }. c' U1 @/ ^, f
: g7 I% T7 ]9 ~+ c |
|