|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
! q) U' T8 R, h- f3 a/* */
3 ?0 q) h) }4 z- |, q/* 宏定义 */6 t; z; V: Q. X4 V' g4 o- ]
/* */
0 @9 i Y6 z/ Y! _% }4 n( K9 y* t/****************************************************************************/+ s% V# k3 K, h: K$ w3 a
// 软件断点
: ?) s7 i2 f' e9 D; W% m#define SW_BREAKPOINT asm(" SWBP 0 ");: D+ }2 G3 S' p v' k# k; O0 h5 Q
: _) U x! e( e4 j6 m( Z8 Z: F/ t// 时钟分频" F/ \. R$ O6 P$ q, a3 M D
#define CLOCK_DIV_VAL 228- f( J+ N$ h* H
) V, Y5 ]0 r" h7 D; o- F" z2 t/****************************************************************************/
) m" c& t `, v: w U1 K; x5 K5 |/* */. r7 ~8 R, z" @ t+ r6 h% H
/* 全局变量 */- C8 o: Z& L3 T" I
/* */
9 G5 j! Y% C% J7 D+ m! o5 P/****************************************************************************/3 j# _6 h1 S/ j; s- j
ECAPCONTEXT ECAPResult;
I* J6 m8 D* Z" C, J, ]8 K. P
3 t/ k% `4 ]; x$ N/****************************************************************************/
2 e' R& ?6 A q( Z7 c) E) {) \/* */' I' D( B+ R$ X3 e9 B$ b5 r' x# I% i
/* 函数声明 */
& n- w, S: N2 O( u" o; ]/* */8 e; r3 h& f) z6 ^- {( P
/****************************************************************************/
% W! V- ]5 x& @6 t9 p# M$ s// 外设使能配置
2 Z& R' Q: A0 F5 j r* Mvoid PSCInit(void);) y7 G2 a2 ?- ^
& w" Q3 B4 W/ a+ _1 a3 L0 s6 p
// GPIO 管脚复用配置
( n5 u! H& f2 O$ Evoid GPIOBankPinMuxSet();
! q) o# j. g1 h' S5 H, z( p8 M" h* U( D5 d, V1 v) X) o* C' Y
// 产生波形
: A2 u2 J ^ q/ evoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);; C: p# x$ X R0 k$ B) K6 o1 k8 u
void ChopperWaveform(void);+ X' v0 y- i: @/ x& k4 {
! v3 w2 b2 W2 |2 F7 w/ p
// ECAP初始化和读函数
* _9 Q; H& j6 M% y2 gvoid ECAPInit(void);3 w6 ` S# X/ a) ]6 k) S
unsigned int ECAPRead(void);: n4 j* ~2 n5 |4 `" t( U2 f
6 T" o, B" k+ {1 \
//ARM 中断初始化
" L k; J$ V1 a2 `" N; lvoid InterruptInit(void);
3 Q3 ? ]: S3 ~2 V2 b, K3 E5 u4 h! w' X" W( T+ t' F0 k
// PWM 中断初始化
. j" F# A% |1 t& y$ S' Jvoid PWMInterruptInit(void);& \7 A- Q# f- F; n; S. Y
// 中断服务函数9 Y" Y @/ E2 D
// PWM 事件
# |- J# g. \% Z/ m8 Ivoid PWMEventIsr(void);; m. \: ?" @/ G1 C& ~# _
// PWM 错误控制事件0 y2 s$ u4 c! t/ l+ z
void PWMTZIsr(void);
6 {! i# A: p. Q2 ]: |, K$ c+ f `: e
# R6 q: k) F! y6 {/****************************************************************************/, f- {% F; |$ B5 g8 n9 u
/* */
" g+ p/ P( x6 Q ~/* 主函数 */* w4 S9 p6 |/ y" ?4 @$ x/ J& n- p& y
/* */
; Z; s7 {) A) b/****************************************************************************/; h* }4 c8 Z5 _* O& S/ I
int main(void)7 c# |0 a- I" s
{' F g, C1 K- u- U( B8 N
// 外设使能配置. u8 i" N1 g6 W6 |0 J& a, @8 _! L
PSCInit();' ^. H. d- U" v3 ]. A, s
b D' |3 H5 g // 初始化串口终端 使用串口2
3 f7 K( |/ k% r* B* c7 h" K UARTStdioInit(); n8 M* y0 i9 [+ W$ u7 ]
! y0 v {: n }. U. f // GPIO 管脚复用配置
( E8 I: B& r; C5 s& V8 L GPIOBankPinMuxSet();# W- j# V8 K& u e: O4 D1 P
' a3 g7 {4 D3 x8 h# L& p // ARM 中断初始化# I4 x4 u: v2 V2 Q& E5 V6 _
InterruptInit();' |; ]' G" D$ L5 r& W% i* _
7 U0 K9 ~" ~4 Y# C
// PWM 中断初始化
0 k7 t# }7 Y; E8 \/ t) a3 A PWMInterruptInit();* V6 t: ~# ]/ B) B
6 z0 O9 Y t2 c y5 I! k' B unsigned char i;( s1 a. `5 g" c( @9 M! X& d
unsigned int j;
3 d3 D' B/ z) f/ T0 g6 r5 H9 p% h) A* S: K4 e9 A9 l: ?
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);# Z9 {& R9 D" s X* c$ j3 M# `: H
UARTPuts("------------------------------------------------------------\r\n", -1);
% R, _" l+ i: I" f2 g UARTPuts(" C6748 PWM Test\r\n\r\n", -1);/ L) i6 v8 V" E9 @: U+ \# x
// 产生波形- C+ `) D9 ~( \+ Q% l6 c% e
PWM1ABasic(25000,50);
& O7 C: E8 E+ G% Q8 y
+ U' {! d; H+ W7 { UARTPuts(" C6748 PWM Test Over!\r\n",-1);1 X% k( M i$ w7 F0 o: H: S% h* _
UARTPuts("------------------------------------------------------------\r\n", -1);
9 n7 Q6 v0 r; R# v5 l, ~& w& j5 S8 e8 r! V& X( n+ {* B8 n% T4 Q
9 p% C4 U$ M/ c3 ^. b+ B% d( F" D& h( X
UARTPuts("------------------------------------------------------------\r\n", -1);) A+ `9 S9 r8 d
UARTPuts(" C6748 ECAP Test\r\n", -1);. z! S( {* Q9 \6 j9 U/ h6 _1 x
// ECAP 捕获初始化% H% V( m) Q: C1 Z1 l) Z ~8 ?: U
ECAPInit();- y8 ~' o9 K2 ~/ f
UARTPuts("Initialize ECAP.......\r\n",-1);
% {5 @! d3 f/ `% _ for(i=0;i<5;i++)
; C: g8 ~4 t- K% G5 G7 ] {5 e) z# r' C, Y) S
for(j=0x00FFFFFF;j>0;j--); // 延时- C9 q/ T6 g- P6 g3 Y/ i' y4 g
ECAPRead();* V3 ~4 @ X; K8 U P
}
% \1 N1 m" d# Y UARTPuts("\r\n",-1);
7 u( L& g% I6 s9 f UARTPuts(" C6748 ECAP Test Over!\r\n",-1);$ B) o" \2 ~3 H+ J
UARTPuts("------------------------------------------------------------\r\n", -1);5 }1 q6 x2 M+ d
K& P( C! v6 x( A5 j! z* ~0 a
// 主循环1 L! ?- r1 o. ?. z! u
for(;;)
, P8 S9 u8 ^* W) `% P- { {
% v/ C, k' o4 _2 M
! D$ B* K+ d' f8 S j, v% q }
1 }8 k- |+ I. r8 @" Y6 {}5 @0 {' _2 G k* Z
: Q& n. _/ s) k5 A9 `' P% E/****************************************************************************/
/ r! d/ Y, O/ m/ K/* */1 b9 h/ D$ j1 _" u# j% c/ l
/* PSC 初始化 */
* E }. _2 u6 B, D$ k( c! S' U/* */
: W5 C( `4 d) O3 i. @/****************************************************************************/
' C4 c. [- f: ^ d" V4 kvoid PSCInit(void)2 s* H: g! m! n( @. m5 P0 v2 j
{" c5 W: }0 T O& g( ?" s& L0 @
// 使能 EHRPWM 和 ECAP 模块& L! }! G4 H5 y+ B7 y: h/ q
// 对相应外设模块的使能也可以在 BootLoader 中完成; p8 r3 A6 w9 I6 r. J# j/ f
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 z! J6 C3 T5 e5 J PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
2 D, p- p9 `* P5 Q}3 f6 Q$ A+ V4 C+ b( `. u# x
# I. A. l, u8 F: C8 ]# b/****************************************************************************/
, [1 w3 s6 ~& v3 \* n( W! K6 N/* */& Q1 g j0 W; K7 }2 `1 ~; f
/* GPIO 管脚复用配置 */' L$ q* ]0 y# ]8 v
/* */
( d- a- y) z, T/****************************************************************************/
$ E0 Q9 l$ @6 C) E% Vvoid GPIOBankPinMuxSet(void)
w+ ?6 B- g) @{7 f- ~) I/ b0 C! ?% I9 S
EHRPWM1PinMuxSetup();+ Z! X9 E; F3 q* |3 U+ U9 z
' Y# ^9 y7 S* s" j // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)# S! e& J7 q9 [
// 作为捕获功能时管脚方向为输入5 c/ W" ?; V9 R- z, ^1 d
// 作为辅助脉宽调制时管脚方向为输出' n$ U; u, V8 g
// ECAP2 / APWM2& X& L2 _ G! S4 ~6 Q( t- }3 F
ECAPPinMuxSetup(2);
. z9 I! `4 p* g/ a4 A1 j/ r1 `2 Z3 z* E& |9 c) j7 x0 i0 S
// ECAP2 / APWM2方向设置为输入
& ?5 f% j3 n- `# B7 O: Z2 b# p GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
! ~7 |0 I' A9 o- |) A% \$ s}
# `5 f- r. C3 w0 T: o4 x* k; @8 `+ f- e1 H& m e+ M
/****************************************************************************/
4 P$ v' h9 y' X( K. W" q/* */# d1 @% B1 {; c7 q
/* PWM 输出波形 */8 B% n: z/ @9 J- A6 \5 [, [
/* */
2 r! y: ~* d0 i0 J4 G) q/****************************************************************************/
- v ^4 [4 D$ S& C- R( K8 bvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
6 V( E4 R7 P" \7 c{
6 L' C9 M; Z1 G. ]5 s Y+ }& t' K // 时间基准配置
9 K# v* `' v% \0 G: q% [ // 时钟配置
9 A2 N' s! p$ U4 s7 J EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
2 t: G! `# o d, j0 v* B8 d9 I( e
; ^* Y* z# ?( g7 l$ ]8 D1 ` // 配置周期
% X( s- Z9 Y9 W: Z* o EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
; j% i" Y# |2 D+ e pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
2 W- G, G1 h5 ~ R6 D7 ^/ t6 X Z2 _: b* W
// 禁用输入同步信号
6 m9 t# a5 P8 A EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);" C8 [3 z" B0 }
0 Q# o9 ?# Q/ h* q' I1 P- o$ w
// 禁用输出同步信号
4 {7 J6 ~# Z3 U EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);3 A- {- Y+ Z' e# F, ~5 [9 V6 Y
' r: |# W4 ^" m: o
// 仿真(DEBUG)模式行为配置6 e& p( e8 i/ E- ?' t6 W6 W
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
- @/ m, P6 C" Q& M* `! V
1 O1 d; ]9 x' P5 q: ?, I // 配置计数比较器子模块
# k2 j1 a( n. Y- `9 L8 {7 e // 加载比较器 A 值) A% n% X! H; |5 _3 ^& |* w. M
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,% w, L+ A) A$ A' M' H5 X
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);' P2 x3 E7 d; \( M7 X
$ `$ `5 y+ S9 r2 Q( p. m
// 加载比较器 B 值6 h5 b3 M6 E! k, y5 i! h& u
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
1 R: X% C+ v1 K/ P: q/ v EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
, i) q2 d" h; ~2 Q% E1 a# ?: `2 U
// 功能限定配置(输出引脚触发方式设定)' Y6 D) {- L2 m5 z) V
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出 I7 V9 ?: U; n8 w1 \2 H. l
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,8 o4 s1 F5 @% h* }: C
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,, `) Z5 S7 H5 m) O9 _# A3 O# K# ]
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
0 m3 J( V8 W d% t) ~3 l, V! ~8 P7 n
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
; L% D+ }: i6 R0 O* h. E- ^3 P EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
# c! L5 z' s. `: t3 ?8 Q: F1 u; [* _* S6 s- n
// 禁用斩波子模块& w, J3 R2 R: x0 [, }8 d
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
! J: L$ V$ d8 }: W" A) S+ d$ s3 v! o8 ]/ s* l! M; q
// 禁用错误控制事件
' D# t( d4 K! ]7 P" D% C EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);2 S' R$ g6 k4 P" l- g2 m6 z
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
8 P. R4 B9 w; M: P/ {- O( C9 m4 _
// 事件触发配置
9 j' e: t4 C! V1 {, @. U6 r0 E& N4 _ // 每三次事件发生产生中断$ A0 U3 O% R7 V. O2 a( N6 `0 s
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
% F3 Q+ T4 d8 q, t$ o% c1 y6 \" P // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
& q+ `8 a) Z: ~( e; M3 H/ K5 L) q7 x: h/ K EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);* N4 y( P: f3 i3 p/ T3 W
// 使能中断7 X& H _+ d$ }, X0 j( W
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);8 x I$ U8 c3 s; G; }3 ], f
! z' b4 g5 A5 Y8 f5 ` // 禁用高精度子模块
- T9 O, o/ S) o i6 @5 R EHRPWMHRDisable(SOC_EHRPWM_1_REGS);3 G2 w' q3 \( P- E2 y; W3 |
+ I4 ^1 W" A+ ^ @' z# ~+ F @
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);! y, J* c) ?# H" ]
}
3 }6 f( _- z8 U9 a. J& T/ J% O) Q5 R' ^/ o. A8 {; Z3 p' u
void ChopperWaveform(void)% M7 c5 @# l* W5 y
{
$ G- D) U! r" ?, U8 s // 50% 占空比( [8 J' r- I1 U: S" t
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
7 }+ O* | O, e6 q+ w: V // 4 分频. m& Z' J8 [% H+ n
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);7 r+ P( h; G; |: H
// 单个脉冲宽度- k# N0 O! Z% |0 j1 k
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF); M R, k# l% a- l( K; ]( v
// 使能斩波子模块7 M- y7 J- x% L" K4 g$ v! `. X
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
/ R; S- k4 A2 O' z" [, F" a}
8 i* j$ _6 O( \1 y" f
; Y8 S( s( Y. l. h/****************************************************************************/# f H5 V- l# Q5 ]: @8 s
/* */4 d' p* x% U! @ b& q# Q* ~7 u
/* PWM 中断初始化 *// H: b7 E) L9 j! u3 ~" {& e
/* */
0 Y% D( a1 w& `0 G3 O' J/****************************************************************************/! g6 A8 {. X$ W, {/ l
void PWMInterruptInit(void)7 Q( x2 U' L2 }# R+ @
{
6 | p' \& y/ Y$ m& N // 注册中断服务函数
" B4 U5 m9 ~4 U( l# g4 x IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);! b; l6 \+ J6 l% D! C
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);5 j- r3 e$ G7 C6 @
. t6 |9 E# x1 r% V
// 映射中断7 ^# V& x* j- E
IntChannelSet(SYS_INT_EHRPWM1, 2);$ X- T; d; S& L0 M
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
, \% |2 u) @, n" [2 U, J
4 {. f/ F2 l" H3 I0 v% Q; Q" z2 { // 使能中断7 ]' d. T1 V+ C* N
IntSystemEnable(SYS_INT_EHRPWM1);8 S$ z$ P, O1 h9 L4 j" P
IntSystemEnable(SYS_INT_EHRPWM1TZ);
- ~( R9 J8 d/ |+ l}
, R, P# i7 W4 l/ I& q- q
8 W, L: y. r( |: l N5 H* X/****************************************************************************/
$ J# M& B9 E) V3 x/* */% S2 h, A" a9 F. e7 W9 c% r
/* ARM 中断初始化 */
" z& G, d9 L+ j/* */5 }0 U- i4 f. T" O
/****************************************************************************// D( l G* L- h5 a$ d
void InterruptInit(void)1 [2 N9 \2 E, Q7 p' X7 V: Q7 n" K. X7 [
{8 V1 `- n' |% R9 A& F# F: }
// 初始化 ARM 中断控制器
* R |- e, l7 \4 S IntAINTCInit();" B% ~/ C9 y# C6 q7 w2 p' l
+ u0 m/ w7 L/ D8 Q% q, E. O
// 使能 IRQ(CPSR); y: C g$ n: q! l
IntMasterIRQEnable();+ S% `: X+ C6 b0 {/ p. C/ h
& D& e9 \; w- D; G8 y // 使能中断(AINTC GER)5 V9 T, g9 @* w- `. l5 G- o- K
IntGlobalEnable();
7 q9 Z% z4 g2 i8 L! ], @! S9 ^' F& R4 j- u9 Y$ A
// 使能中断(AINTC HIER)
3 f3 o0 R2 d, e) j IntIRQEnable();
, |8 V$ y& z: Z0 A3 ^+ M}* [3 B/ T0 y' t( D- b; N6 e
0 \+ n7 y6 q) B, |- c# @ |
|