|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/5 z! r) a8 e! _* R" i3 ^
/* */% L) N% N+ Y: x! _7 m5 U
/* 宏定义 */
% P& c1 Z! Y6 N0 K+ L/* */
& ]5 Q f" v- u7 ]- g% h- t/ g/****************************************************************************/; Z$ m8 } u* w" B9 {3 p a
// 软件断点 [8 `) K% \- v e& F
#define SW_BREAKPOINT asm(" SWBP 0 ");
# c/ C3 h1 J+ H3 g B
) `! P8 v8 J* p* p8 ` ~1 y2 U// 时钟分频
( G: T! J! o L* j#define CLOCK_DIV_VAL 228 u/ z0 k6 F2 p1 x' D
" |8 y( _6 W3 @) R \2 c
/****************************************************************************/
2 Y* s n- o6 {. i) R3 }% Z f/* */; M! w% r. X, p: ^0 T' `' J5 r2 ? F
/* 全局变量 */
, L* a7 K+ L( N/* */4 ^3 d% O# I1 J L. m( `; @
/****************************************************************************/
( X: S4 Q" x' I6 fECAPCONTEXT ECAPResult;
! `; z/ G: F8 R8 u! ~# {
1 ?$ j* ?' ]/ A+ }( v8 _/****************************************************************************/
" I0 T4 i6 T' [+ @/* */* [/ X% a$ J# o! V
/* 函数声明 */2 O- {/ r3 U8 G. @( W _# H
/* */- }; I: T/ j1 c( x- o
/****************************************************************************/3 [9 x s: z) Y. ~) O3 ~
// 外设使能配置
2 `% y, l6 T+ O9 z2 A1 j' |void PSCInit(void);4 _) q W& o( U4 T5 [
5 V7 A$ M6 O1 e+ b// GPIO 管脚复用配置
+ G+ }# m9 Q; @) G* v3 ?void GPIOBankPinMuxSet();
8 N8 o5 h# | O- u
9 e: E* t% A5 D4 m1 G J// 产生波形
) X- z4 k& f: o" I) Svoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);( Z( Y. y, i1 x" C
void ChopperWaveform(void);
+ L% s! S( D. Q2 r, c- y0 c, n, e. k
// ECAP初始化和读函数
. N% @+ u% e5 S) r+ Dvoid ECAPInit(void);
# a4 }, V0 m& b+ D- yunsigned int ECAPRead(void);8 _+ T5 |* W6 Q1 e% a+ L9 |; \# S1 J
! W5 H: s& ]4 q& v: r/ f//ARM 中断初始化
( b. Q, s1 ^" o/ N7 P- @void InterruptInit(void);( Q- X- V f* W+ g/ @* ]
9 |! }' t W) @+ c// PWM 中断初始化
" k7 g# r2 W! u' r7 |void PWMInterruptInit(void);- j; [; H( `7 a2 ^& j( A7 V
// 中断服务函数, U* \/ V- K: [! f5 A
// PWM 事件
$ ^* x. Z9 g$ c: k- y4 gvoid PWMEventIsr(void);' U4 H C+ }+ X& i1 Z
// PWM 错误控制事件# Q' u' M& G) ]( |; W4 [
void PWMTZIsr(void);
, n* b/ y7 ]* Y s c: S! Z! W% d, r$ m3 n- E
/****************************************************************************/2 k" {' t7 ]# h( f* k# S
/* */' O! S, t6 [$ o* x1 M5 E
/* 主函数 */
* K& J+ _+ x1 y/* */
# P' s: n5 C# y, }/****************************************************************************/7 J# W+ s2 A2 l7 z0 B( t
int main(void)
; t" `3 z# x" L, B{- {8 O4 k) ]. j% Q2 D1 H
// 外设使能配置
# O9 G9 F q1 N9 ~7 [* b PSCInit();/ ]6 p# I( Z7 ]" K' _
9 v& K+ R- w; f' j6 o
// 初始化串口终端 使用串口2
( \, Q, Y1 D2 E0 x UARTStdioInit();4 m5 y; @& A. m3 G6 f) U) S
* N, o( W( w; N) V- [/ Z' J# l
// GPIO 管脚复用配置1 O3 M4 f3 P8 t6 F+ Q: _" X
GPIOBankPinMuxSet();
/ Z8 ^& l- v* F# X! { v$ K/ W! X v9 c3 B
// ARM 中断初始化7 ~' C' w. `* B
InterruptInit();3 ~! y, J1 m* t$ J
& T/ T8 P* ?9 E, G
// PWM 中断初始化
* j2 g1 X0 y5 c( r2 x. F) ~ PWMInterruptInit();
' S8 O/ @: Z5 c# G0 A
" P5 `9 X9 y2 N5 `% R unsigned char i;+ \& K* r" m: d/ X9 P
unsigned int j;
8 v0 [& o; F% l( X" _! U' ]6 u; j2 \: M( e( z3 k
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);* a* v7 U7 b5 h- m( I) @
UARTPuts("------------------------------------------------------------\r\n", -1);
. b9 `' A0 Y! ^2 l3 B5 e& ~ UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
+ z5 _- S$ w3 m6 N1 B4 B/ ~ // 产生波形* j5 q; p, M* I7 l! w& ^$ e
PWM1ABasic(25000,50);+ P, a) B2 J, f2 H5 S
$ I7 Q9 @2 p* g- ]: d, f3 I UARTPuts(" C6748 PWM Test Over!\r\n",-1);
% C; t* K3 u, ~. D; s. a UARTPuts("------------------------------------------------------------\r\n", -1);
: ]' H9 V: k/ ^5 `' ^9 L$ D- _9 o. L; |, t9 }) t
0 H1 m+ K5 ~5 a1 V# T* Z# N* J8 C
3 Y! ^8 R& e$ c9 p" u8 u' U+ L- V UARTPuts("------------------------------------------------------------\r\n", -1);
" r) `# i8 K, x* ]/ x9 z UARTPuts(" C6748 ECAP Test\r\n", -1);
. Z, y! } n( U // ECAP 捕获初始化; {' O! V8 g* x9 R. @
ECAPInit();
4 x! o. m. L# k UARTPuts("Initialize ECAP.......\r\n",-1);
" G1 Z; m. i/ _2 f+ I for(i=0;i<5;i++)( h' F7 \4 E- C
{
2 B; Q& w/ ~5 y. q7 ~' e for(j=0x00FFFFFF;j>0;j--); // 延时4 b6 L& e. s, a1 J
ECAPRead();
- G8 J+ U! a9 K E# h }
; K( H, H9 z) @. a UARTPuts("\r\n",-1);% [1 W0 Z' F7 g6 J0 P! M2 y
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
" s% o' S6 z$ \4 C. n* G- p UARTPuts("------------------------------------------------------------\r\n", -1);+ V! A: x) }) H5 e g: ^
) H2 p# F1 ?/ p2 A/ F3 w0 \8 x3 }6 ^: W7 Q // 主循环
6 c7 X& Z0 a3 I2 e for(;;)6 r* A1 I* N* S" ]" i
{
+ P! d8 _' r/ a2 l: ]4 Z& m% C' U8 Z# u
}
3 W. R3 ^- ?# |! h2 L}
( d6 a% y! i6 R" O y, o* L" O4 U- C* S/ o2 e X6 _3 Z
/****************************************************************************/
% w9 g5 F: L, M6 a: r/* */
7 m# O' e! P) B: f) Y7 h0 l* F3 U/* PSC 初始化 *// U% h f. l: }. }, V$ l
/* */2 ^/ R1 r% Y2 u4 Z. s4 C# h
/****************************************************************************/- o: z1 A9 C6 S C* t0 T, E
void PSCInit(void)
8 x7 H" h- g6 y. P. @{
9 R; ]9 g' j7 s0 y8 p // 使能 EHRPWM 和 ECAP 模块
1 n! J |6 x4 i; b S* G7 e) X // 对相应外设模块的使能也可以在 BootLoader 中完成8 F$ W: `1 ^% K: L3 {. H, F
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
, \5 p7 b9 {$ U9 t' [ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. v/ c- z! y$ f9 M+ X}
+ I/ M- Z$ W! K0 H7 U3 d
. t. G+ x# J2 O, M4 k3 z, F. w7 t0 y5 K/****************************************************************************// I7 k- Y4 L$ w! ?! l
/* */9 B5 D' V& l/ V. |3 q5 O) f
/* GPIO 管脚复用配置 */" u( r# G8 I0 o f7 R' c: m, }
/* */
0 C* _* L4 i; \7 V( B0 Y6 s/****************************************************************************/& ]) o/ Z" _' v
void GPIOBankPinMuxSet(void)! ?1 F) X' a( T( q
{0 U& D3 z! B( U7 k" r
EHRPWM1PinMuxSetup();
, ?7 }1 v2 Q" l* R/ P+ `8 Z
5 i. i6 n& G, n# m$ c% H // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)9 A: a5 ^- X& ^' Z
// 作为捕获功能时管脚方向为输入
6 i' R P6 e# o) h9 U: w7 [1 @9 S // 作为辅助脉宽调制时管脚方向为输出
; c- k+ s4 a9 i# L0 E // ECAP2 / APWM2# H N0 R4 {- C. A7 f; b
ECAPPinMuxSetup(2);
0 u% {3 w! D" V. ]
* b S6 G: A; H) R* l // ECAP2 / APWM2方向设置为输入
m/ M; P8 P+ v# r+ F1 V: Y GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]6 ~' b; a2 R( E
}
\2 q, {: w8 ]$ c9 N7 ~5 |+ S, z M0 _# F; ^& A
/****************************************************************************/8 |4 d' O8 X% m2 M
/* */3 O* y1 ]' @# W, U5 B
/* PWM 输出波形 */
0 A' V3 m3 c5 S% _5 a+ }/* */
3 G7 S0 d& ]6 Z7 F1 v/****************************************************************************/
% b( c7 p8 Q% O/ L4 Mvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
) M3 X: E* o9 J. x9 V% {{' n) s/ [" Z+ j) W$ _" E, y2 N
// 时间基准配置
* F" y% ?" O2 K$ ~+ |3 t // 时钟配置( a+ [7 T3 z& ~- k
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
+ S- R4 {# G$ n/ I& b. Y6 o
' p/ \: x4 r I // 配置周期
. ?5 x) c& B! L+ {2 A3 S3 { EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,7 s6 Y, M0 S i A
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);& G8 |( {% Z t2 T! S
( r& I% X& F4 v) T( M6 B
// 禁用输入同步信号$ w/ i) |/ w, i2 E2 s3 e
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
; H- U# [# M4 }/ k8 Z% F6 Q- k& L
// 禁用输出同步信号
2 b3 J" v4 D1 ? EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
8 s" A; f* X- P. T- M5 |5 j
: n9 @0 E% h" x" i7 a8 g1 C/ B // 仿真(DEBUG)模式行为配置# B6 v1 P# S; y% i
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
1 W* `: @! Q* {% c/ z# s2 z: ^2 W o
// 配置计数比较器子模块+ S0 H. f* E. M) z' j ]" I
// 加载比较器 A 值- v4 S1 G6 J6 J; t5 |
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
) S. e n! Y0 i5 D2 _7 h EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
0 ^8 [" A/ |: _, k" ^- Y+ Y# I& D0 }" ~2 o$ h/ ?
// 加载比较器 B 值% j, c8 p9 F8 \
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,2 Q1 ~6 w& P7 A+ u5 V" @
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);( b' M \) ]+ v; M2 e
" G8 ^7 ^1 s' l; c9 D3 Q( t! r% c // 功能限定配置(输出引脚触发方式设定), m4 W; m" l, K. D0 ~: x; s9 a9 E
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出& M& Y0 [4 J, }" O0 q
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,7 }3 `9 c- M" H! x, |+ o
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,# w/ r" s- x! w: N+ {- r
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);6 |' [# D& Z* F+ K
1 k: c$ @3 z. D3 S) |6 V // 禁用(旁路,信号直接输出到斩波子模块)死区模块& U3 o& `* z% _, `- W$ k
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
* Y! N" }2 F1 g" B o7 y" `5 [0 ~' o9 A# l9 N
// 禁用斩波子模块
# S7 K' }! `! L; H EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);. J( P# R4 k- n2 O" U' Y
7 T: B# g/ V5 L9 F9 y // 禁用错误控制事件
" z% _ v3 Z$ {: q EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
0 \2 |4 f9 y) g8 \" ~( q EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);; z& o X7 _/ |) y8 {7 D
8 w4 Y5 ^: g8 {7 p, }
// 事件触发配置9 F1 R& K a$ I3 i
// 每三次事件发生产生中断% t; Z# P: ^) a4 i. v
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
( _+ {6 X6 K4 |5 e- |0 ^ // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
) A, E2 x/ H7 A, U) z, O U EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
U) a; V H* r3 R' V- x // 使能中断- ^ \- r8 b, h8 Z, P9 P5 `
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);) D& m7 |* D9 x6 D
; c k* m7 g+ ?6 ^8 m // 禁用高精度子模块: N6 l% Q6 m$ a" E o4 g+ ^' Z
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
% G8 m' c# s l/ `" ^
. R- g/ ]1 i# _7 v+ L UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);4 W! A- `4 m- C, p0 }( Z u* y
}3 Q2 P6 }% r* p4 `& S5 G
6 Y6 i) k& g5 S3 d3 [void ChopperWaveform(void); v. J; }7 @- {) N0 P
{
2 f4 x9 [* h7 u- `* R // 50% 占空比
, q& `. D* p4 F: @2 L5 N0 C EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
4 d- ^3 W# t: \) l/ }: v9 e // 4 分频- E- H7 z# m# |3 ?6 _ E) o: s' Z8 m
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
7 r" q8 i, E3 D0 A7 R! m) N6 J- S // 单个脉冲宽度9 i. \# C# K) Q0 y1 q5 v
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
2 k% g: u" y/ T // 使能斩波子模块
5 p/ c4 ]) R$ A; ? EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);' n8 D/ S( d. P% t* j* L
}
4 f9 e2 J" p; B4 N: ~5 ]3 ^/ U: G& {3 S1 q
/****************************************************************************/
7 L3 J4 r' k! J# j+ l4 T/* */6 v v Y/ Z9 e( n) z8 w9 W) w/ E
/* PWM 中断初始化 */' T' s; r) D, u7 g" a$ F4 Y- v
/* */; ?. m5 N1 C8 p6 R9 `
/****************************************************************************/0 a/ i9 J, u4 V' O( O- o
void PWMInterruptInit(void)
k4 W; e8 b+ ^, l{0 z5 [9 K; Y/ T0 b0 M
// 注册中断服务函数/ }7 s3 w( {6 `4 c$ @: V
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);. b9 M) ?7 h" {! \: Q
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);9 i2 o! m# Z: H1 d
* Y* s! _6 R4 S) k" s2 a$ R& A // 映射中断' y$ Y& J' j4 R7 t: ^+ a
IntChannelSet(SYS_INT_EHRPWM1, 2);
$ s# t, S1 N. z& b& X IntChannelSet(SYS_INT_EHRPWM1TZ, 3);1 B+ e% K U: p+ s/ a
& L9 j/ g y- O6 B4 @, a$ h$ t
// 使能中断3 s3 O8 p+ o8 F: l1 L
IntSystemEnable(SYS_INT_EHRPWM1);
# H3 T5 Q, C% k" o IntSystemEnable(SYS_INT_EHRPWM1TZ);
) V, A" _, K4 Z8 J2 W- y}. M. U/ c; r0 e4 Y1 q- S3 ~; R
) k8 _+ T, m/ x- k, M2 ?
/****************************************************************************/
/ d. x E3 n& w. i/* *// p# C& {9 t, _& S
/* ARM 中断初始化 */
C1 i$ `3 B7 F: ]8 K9 Q/* */) R/ H! A% x3 S }$ B3 w6 D4 @
/****************************************************************************/
$ n$ P) A5 C& y6 \# Z/ kvoid InterruptInit(void)
/ P& A1 X2 u) G6 K `7 E{
+ ^- o+ l+ B) [; T/ V8 A) X // 初始化 ARM 中断控制器3 J! J5 [- g& ?* d
IntAINTCInit();
M( L6 h1 F" h9 Q1 n% h
, ]/ q; A- n6 \* Q7 X( f { // 使能 IRQ(CPSR)4 `3 \1 S0 w, y1 c! N
IntMasterIRQEnable();2 X3 @# p2 \" n! t1 `1 d8 D
' b6 [1 h k# g* r
// 使能中断(AINTC GER)
& ~: {! ~# Q( }; K" R IntGlobalEnable();
/ U) l1 H) K6 d8 q5 }
# p, g/ ~5 K+ }3 { // 使能中断(AINTC HIER)
1 Q' x! A6 Y7 N: k) A IntIRQEnable();
( b" U" Z. s+ d, b. U}
8 p2 ^0 v9 T8 v2 h, t5 b% @
3 R( @7 H, S: u$ k8 d7 K2 B |
|