|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
4 U% q% Q! |& `0 Z4 R/* */
/ z) A9 Y5 i. y5 L/* 宏定义 */
0 D2 \: ^8 V/ w; }- H1 z: P8 q4 A/* */3 P' D9 W* q- B
/****************************************************************************/
- \- u% \7 k8 T/ S// 软件断点 v* `( Q6 v0 f( X: i# e L
#define SW_BREAKPOINT asm(" SWBP 0 ");$ i2 D1 a& v# o. Z* A3 i. e: I
" w2 G0 B2 C* Z9 m' G3 t: L
// 时钟分频
3 c, R; ?5 N/ }9 _ |2 _4 i#define CLOCK_DIV_VAL 228
& f& r" D' N+ @0 t, X5 j
& [# F. K- s6 @; S& p6 k/****************************************************************************/
% t9 G. k' a7 |( u2 w/* *// ?1 v* y1 V8 Y, I( @4 ~" q4 \
/* 全局变量 */9 }8 `/ R& a% C% ]' o% K
/* */
, y$ a# Z7 Q7 Y' S/****************************************************************************/
0 v% G6 |- @( l4 f7 K$ mECAPCONTEXT ECAPResult;* [5 T$ N1 K1 U# ]- N$ z# y- R
1 k: I' R4 e, @) Q# [6 b$ g/****************************************************************************/
8 r. D; E! Y7 O6 K2 s3 W( c/* */
, u9 P. Z+ j# @1 Z% J+ i: j- R/* 函数声明 */
2 Y* u2 H7 F! w' S/ _% H/* */- r' X6 @4 K4 p" V, Q/ D/ D8 L& K
/****************************************************************************/3 a) T5 a5 F6 o* O3 v/ C
// 外设使能配置
' W& {$ J E. t* |2 jvoid PSCInit(void);$ a6 b: x" @' N$ L8 H% e5 x& M
9 W+ O. g$ J2 o
// GPIO 管脚复用配置5 E* F6 h) b# J% l" W3 d
void GPIOBankPinMuxSet();, M% ~9 V/ n8 R$ [3 m2 s# ~
% T, r" g2 F3 ~8 j1 r( r// 产生波形
- v8 j& e9 Z4 _3 T& g% Z. Svoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
# L8 T% }$ s6 cvoid ChopperWaveform(void);
: f q. v4 j6 s. x, \1 t5 E
& K) B6 h0 F( }0 C( X3 v+ d// ECAP初始化和读函数4 d3 C) z" N" ~, z1 w
void ECAPInit(void);: c) u5 q( d0 u8 |7 U: z( e, U
unsigned int ECAPRead(void);/ x5 k9 A; S" V. y- o* t
* x( U/ D0 B' e' |0 _//ARM 中断初始化6 _0 r4 P' i. {$ J a( m3 b8 v
void InterruptInit(void);; K7 h: {' ^1 _
% n4 }8 K& S, e$ y# U// PWM 中断初始化% {: e5 w5 |# C6 V+ y, f5 S
void PWMInterruptInit(void);! M& G& T. H& {
// 中断服务函数
; }4 f0 [3 L; J1 g// PWM 事件- N U7 h# Z2 `
void PWMEventIsr(void);) z0 l6 }- Q% N4 i, R6 ?$ [
// PWM 错误控制事件( f1 f3 l( @$ } R O
void PWMTZIsr(void);/ y$ U) ^* W' y7 [; K* K: p/ ^
/ ~9 Q/ I2 c4 {) `1 J
/****************************************************************************/$ ?5 B" ?: x3 h3 a7 p
/* */; m9 d# K4 C+ n. ^3 \6 S
/* 主函数 */
7 ]. M7 p0 t1 N8 H" v7 m/* */
* Z7 ^8 n5 Q9 p, g/****************************************************************************/
( e8 x: X; t4 i+ }9 tint main(void)
! U/ n' K M6 m6 W6 [{# R% _2 o6 p p6 i
// 外设使能配置
% b# j' t5 {, [ v" K( e PSCInit();
; D$ x2 j, h- r/ r! R( ?; { ^3 A* I1 M
// 初始化串口终端 使用串口2& N" `& [$ N, V& D$ D8 j7 Y% v/ H
UARTStdioInit();
: Q- a9 x( U' p4 S* Y$ [* p) C
3 P# j0 u+ a6 a" |5 h // GPIO 管脚复用配置- t; i: V0 T4 H! x7 R
GPIOBankPinMuxSet();; p' Q# n$ t3 n; P6 p& G
5 f ~% r* y; O
// ARM 中断初始化7 t9 ?. n+ t7 P/ `
InterruptInit();
0 u+ j/ R. X; G5 H" {( f( E) D8 N/ ~" p
// PWM 中断初始化
. E# s" x: z2 W* M; p/ r6 C PWMInterruptInit();
4 [! L2 s' I6 V* {! x6 ^/ F' g7 g% f. _7 r9 N1 x) ?% l8 G* G
unsigned char i;
3 @! U( Y0 l; R+ a9 n/ X7 W$ N unsigned int j;& \6 F0 U k8 l4 z
6 ?/ A5 S) u6 _$ U8 j- Z, `% H
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
' B$ N7 g, z# I UARTPuts("------------------------------------------------------------\r\n", -1);
* ~; X5 O) G1 M' E9 c+ S% M6 y UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
6 W5 l3 X, ?5 f' q // 产生波形
5 [: D# |2 q, t: ] PWM1ABasic(25000,50);0 Z0 b) |" J% ~4 p9 G# t1 k. k
3 t6 T1 J( F$ v8 P UARTPuts(" C6748 PWM Test Over!\r\n",-1);
& d' O, B* `/ _ J* m! N UARTPuts("------------------------------------------------------------\r\n", -1);5 Y! a8 z+ G9 ~4 C
6 p2 |2 { k* R- |
. Z/ a0 ~' }! j: ?) ~+ b
3 C, \6 P2 F: i' \+ U* Q# `
UARTPuts("------------------------------------------------------------\r\n", -1);
/ t* Z3 @1 i: E% X: |1 ^ UARTPuts(" C6748 ECAP Test\r\n", -1);( [( s$ ^+ r: h. j# B' x
// ECAP 捕获初始化
! N8 v% F% o; h ECAPInit();9 w9 L' H/ c8 d8 w! x2 T
UARTPuts("Initialize ECAP.......\r\n",-1);
/ ~9 S" a3 D7 Z% q0 N for(i=0;i<5;i++)6 e: \! D# d8 h$ o# ~# S; @' ?
{
' L }7 n, c" h1 \ for(j=0x00FFFFFF;j>0;j--); // 延时
* q# T; u/ T! Z% { ECAPRead();
- k. A- P" s; y: ^" _ }8 w' X! R) N$ [- x2 R
UARTPuts("\r\n",-1);8 N% T) z+ D4 z- U) |) c3 ^& z+ W
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);7 A8 y: a! }5 ]2 x" O5 \% K
UARTPuts("------------------------------------------------------------\r\n", -1);
8 ]( A* `' R6 R4 y1 [* W
3 a. e1 u" \' o+ `. u e // 主循环$ l; e) l/ c8 O+ I
for(;;)' P z7 B- x I) f/ O5 j
{
d5 ?$ F+ ^8 A/ @6 T' R2 W
" t, b0 o/ x& ]" m0 y+ Q& n: h }3 ], {( B# h7 Q; |4 |7 z# X5 M
}
' b+ k8 Z3 ~3 G* j1 d! I1 c
; E8 u1 R' C' y6 u/ K/****************************************************************************/8 q, j( R( A5 h6 v+ o! F3 V7 Z& J
/* */! l$ D) u. p9 Y
/* PSC 初始化 */
) N7 P8 q, Y$ d/* */
/ i7 P, F- L6 _ M% j/****************************************************************************/+ m; ~3 R/ T% H
void PSCInit(void)
/ h7 D0 t% O" Y{
6 `7 x+ u' U/ |2 l! s) H% o* t // 使能 EHRPWM 和 ECAP 模块# g4 b4 {% ^: e$ m/ P* _4 m; C5 M
// 对相应外设模块的使能也可以在 BootLoader 中完成- D p: E! O Z$ x4 G* W3 i
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
! e7 _/ Z& o0 c4 ~1 i1 A# R; s3 N; ~ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);. l2 z. P, }& ?) o8 T+ q9 r
}
) K6 r2 N" j; L& a2 e4 E9 |5 r' h; y! s! k5 X+ s5 W2 w1 C& l* Z
/****************************************************************************/
. Z3 i- U2 {! |3 x! Y; m/* */
7 l: R! o O9 r6 c1 b' K) e/* GPIO 管脚复用配置 */
0 |( v5 _0 t/ b$ n4 q' B/* */
$ {1 k, A1 U6 l2 ]: }/****************************************************************************// w$ b6 p: k* `8 Y1 g
void GPIOBankPinMuxSet(void), Q/ O9 q9 P; B
{
" C1 i% N2 q1 i: L% G5 B* M EHRPWM1PinMuxSetup();
$ v+ F7 ?5 R/ @. [0 |. B
1 ~2 N& [. {* j! {; I0 @ _: G // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)/ M* w. |& X ^7 s
// 作为捕获功能时管脚方向为输入6 {% p8 i+ C! W% U
// 作为辅助脉宽调制时管脚方向为输出$ U" w3 q, l) r+ ], ?
// ECAP2 / APWM2' X# [4 T" O6 E) t
ECAPPinMuxSetup(2);
8 e" A ^$ g. j2 M9 N
7 h! u& J9 l% p( s0 P // ECAP2 / APWM2方向设置为输入5 u _3 e& P( p! x
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
& \* J1 o5 G5 U2 x8 {# x6 E" h7 P}4 S8 V5 e/ {! G* y$ K2 q
: a. q' F6 X7 [/****************************************************************************/4 x' ]" C% X' @; H! l
/* */0 [0 W- L( f0 B0 L% a9 s
/* PWM 输出波形 */
* Q! P$ T3 E# e B, Y2 ~* w& J/* */1 A* F! X, y& X7 \6 ?
/****************************************************************************/& i* g! V$ L9 F1 E8 y7 X
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)+ ~8 x/ l4 U- f- Q' K
{. [' y6 O, c" X% w) e3 ^
// 时间基准配置
3 m4 h1 V G6 P) p# L& q // 时钟配置
2 X) g S! V1 A6 K1 u' G1 F EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);. F6 d5 N: q) F' b' K9 O* i
1 C' _0 G0 R% q7 ~* B- c
// 配置周期6 L) p' A1 O2 x; x4 z) N
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
4 l' v. `* m4 \ O pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
, Q# k: {( U4 c/ ]) d
0 k; }) p) F4 T; f V // 禁用输入同步信号( Q s2 o2 m; }4 U& @
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS); D( \* f: d K" a" a/ r3 H! l8 `8 N
3 T! ~0 g. R, X) _2 } // 禁用输出同步信号8 q% T- @( Z8 F! W+ W5 O
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
4 W, x0 d5 L1 p3 r7 I
, ?3 p W- X- v# u" W! N6 | // 仿真(DEBUG)模式行为配置
8 h# s+ A e: l0 V EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);4 d5 l6 N) u9 f( ], U0 F
8 p% l) E, Y6 o! d6 I7 u& B
// 配置计数比较器子模块
/ `! A- r* d# V6 l3 G // 加载比较器 A 值
8 k$ K8 i8 ?' ^, ?& E1 ~ o EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
C& I% E% P, i' Z* [1 D* J EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
A c* M: Y& ^" M4 j1 K6 u
6 T/ z" K0 w. Y$ Y a6 i4 m- t // 加载比较器 B 值
7 D5 ^7 ^% q" X- n% P4 k EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,7 v% \5 Z# D4 X* l
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
' Y; s+ r, q2 c. b- a3 }
1 }: `$ a; S; h' A: W7 b, n; t+ @% Y // 功能限定配置(输出引脚触发方式设定), h9 ?: ^" @+ y+ Y8 ]8 N
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
* b! d! R$ y: N EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
+ \1 a, h6 q, u( x4 b- G, g EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,4 k. [& z5 u3 ]+ H9 \
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
6 Z0 h) p, G2 w" b. M" I
+ e4 O* E; ?1 W% j9 ^! ? // 禁用(旁路,信号直接输出到斩波子模块)死区模块
9 X8 U# P$ _/ P! W* k EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);; B3 R9 v1 b$ n @* V- L
0 V( G9 L* [. Q // 禁用斩波子模块
! b0 H `* i A EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);! {4 ?9 N! A8 K' K- c: q. m/ q4 F
9 p, [! _0 [; R+ t5 l+ M5 B
// 禁用错误控制事件
3 M0 s! n) B$ ~8 x EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
' j% n4 D( r0 p4 r3 S. G- d; J$ ^+ |5 x EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
$ n0 n+ I3 X* t0 ^& c; D( y% g7 }( g, X5 e: f" ~
// 事件触发配置
( ^( `" W: z! u6 x // 每三次事件发生产生中断
5 Y# h( N/ W. f( F$ N: e EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);! o, e& d* p; {9 N% a
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件* W6 Q8 k8 ^% M
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);; q+ M8 h( r3 t2 k% V: Y
// 使能中断4 e: g" N ?. \
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
0 x8 d. u {4 V9 p8 M a, S
9 w, n9 t% o* ^+ H // 禁用高精度子模块9 u: n* q- b) l
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
) b4 s: w8 X9 z' X; l
" R" B! _9 J/ ~. a: j+ P( M+ h% l& f* a4 n UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);3 x7 @, H6 E+ |% c0 ]9 E, v- ^& y1 s5 I
}' f: C* l4 x) }9 Z+ j" y
6 y7 @8 U6 b# e t3 x" I) }7 qvoid ChopperWaveform(void)( v" w/ C( @8 T2 i' r( e: W& ?2 |
{5 i1 o$ F. }# j- T/ u7 K9 J% Q m
// 50% 占空比
. r5 k W) h8 G: T EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
5 v: `9 Y) T% n // 4 分频
( ]2 d I+ t+ _, ] EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);, c/ v$ ^& y9 Y3 I! y* s# f
// 单个脉冲宽度0 v6 Y; e% d- `( s
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
1 M4 _2 g. F( n" _, R; ` // 使能斩波子模块
) `/ B" J& b* ?( {1 [+ s EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
7 D" J! p0 G8 `}" F5 L9 _7 g; C9 w. q+ m s. F
. @7 k: _2 W8 y! D, R
/****************************************************************************/9 t x2 B& d% T) K9 r
/* */
+ t$ _$ m( E& y, f/* PWM 中断初始化 */
4 e# X- h( u8 y$ M/* */
5 g* z, H, ]9 g/****************************************************************************/
5 j* t& q/ ^, {4 N7 Tvoid PWMInterruptInit(void): B9 v) g# g5 L
{
) h! C% G0 X- k+ O# Z // 注册中断服务函数/ K0 q8 ~5 N9 X- F+ l% i3 F
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
. v y/ a1 p! P" g1 b# v; { IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
$ n* @, D. b2 w. P/ |4 D& U$ E) Z7 ~
// 映射中断- g w/ l, q( \0 r; D8 c
IntChannelSet(SYS_INT_EHRPWM1, 2);3 u7 a$ V% }+ V
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);& Y5 q4 ]# u8 n; m0 d; _% ~+ [! y( a
- y7 [# F. Z: R3 i // 使能中断
& }/ s! f! p) E0 u/ g" k IntSystemEnable(SYS_INT_EHRPWM1);) g+ {$ M: x# l1 h& \3 |
IntSystemEnable(SYS_INT_EHRPWM1TZ);
* M: O0 |) @7 x }$ r, E}
9 Y, v' S- m5 j& U3 Q( Y( o' |% ?2 \7 p3 v& ]$ f+ O. d
/****************************************************************************/" N2 n8 m& f/ c+ s$ d
/* */
' u# d8 j5 D) M; S% E/* ARM 中断初始化 */
) n. n) c& H9 t4 d/* */6 c/ g/ C5 L; s7 A1 t
/****************************************************************************/
C$ w1 k1 d" ^: {void InterruptInit(void)" b. S5 T. W/ g1 W8 ?" O
{
' ~# \. i7 b. {+ m" n; x* {: X // 初始化 ARM 中断控制器
7 P& R+ H# b s0 j+ E7 f# S IntAINTCInit();+ n5 I" }. a, [5 [( Y9 ~; Z
& ? `' ]. [. s5 l5 ^7 j // 使能 IRQ(CPSR)5 s3 C G3 _( _7 ^2 X. @1 f
IntMasterIRQEnable();7 c p9 W$ M7 @' U' c% T, T" |) E
0 i& U. H5 `; O3 W; H // 使能中断(AINTC GER)1 A6 N d3 i o) Z
IntGlobalEnable();: @ M J: t# [4 m/ U
; w7 B3 s% H4 W // 使能中断(AINTC HIER)
0 Q+ j! ?1 O7 [$ u1 k( l5 I2 q IntIRQEnable();/ d4 d1 m5 V2 n* J
}/ s0 a) x* a. l0 ?. i9 X
# K" m. ]7 J& ^ A
|
|