|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
) {% z! z1 i; Q2 b$ @& j8 F) m; y/* */
' f1 u6 x# u4 c0 v7 F8 H! D2 b8 f/* 宏定义 */
: d3 K7 ^, E" N* n1 `+ N h6 W/* */
$ u( |9 N5 H2 J5 o1 H Y/****************************************************************************/) H n) j4 ~& z# h% b+ Y9 K
// 软件断点3 h) U7 m1 e5 S& |5 A
#define SW_BREAKPOINT asm(" SWBP 0 ");
2 g- g& E- ?( D# M0 I. J# N, ` F3 O6 A4 v( v8 p( d6 H
// 时钟分频
0 v2 d. A& B: d6 B% m1 ]#define CLOCK_DIV_VAL 228
9 T. H ^4 m2 H& i# \% |+ B: J
& ~; J% |, L7 m ~/****************************************************************************/
1 s: b) g4 Z, b! r- O1 P/* */. j! K# N: z$ p% q
/* 全局变量 */: P& |5 U" w8 e- v5 N5 B% m
/* */
9 B( q) x Z! d2 X& w% v/****************************************************************************/
" }5 T7 r& l7 @. t% @: TECAPCONTEXT ECAPResult;
) X# P0 Q, [7 y; I/ ]; r
; e; }$ R- d: E6 p' G/****************************************************************************/( G7 Y ^3 N! z4 T6 H
/* */& w6 ~7 {: M( M4 U
/* 函数声明 */
3 S2 T% U& y0 }- C# f/* */3 L( c8 Y/ w% n2 N
/****************************************************************************/
& ?7 t- ^" K* ?5 V4 C. D, \; r// 外设使能配置
' R/ u! Z) f! D; B2 Q* F8 Pvoid PSCInit(void);0 S, e8 M4 D4 R2 k& S* O1 h
6 _2 Q* V' P( A- s// GPIO 管脚复用配置
5 _& Q' ?% |: l9 W4 Mvoid GPIOBankPinMuxSet();$ Z1 e' Y4 a& P' B4 v+ }3 n
) F1 u7 [5 t7 |; }
// 产生波形+ k6 O$ G* l7 {
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);- p% ?' Y1 X# _- x4 }& i
void ChopperWaveform(void);/ E& S) w' H$ |+ k/ O! n5 t
" R1 R6 K2 |" f. W; I/ J( T, T// ECAP初始化和读函数9 E8 t5 G/ P4 `- ~
void ECAPInit(void);, S$ L! ^1 |5 {& i2 J% m' W
unsigned int ECAPRead(void);) O+ G7 N4 n4 k
; P. y/ A5 [: m; r! U
//ARM 中断初始化
7 T0 Q9 x* o4 g$ F( b) u0 Dvoid InterruptInit(void);
4 t0 y5 @0 i( A1 X% K3 S( @+ ]' M* @$ j9 `! q
// PWM 中断初始化
3 o/ u/ H$ K; @+ e- x+ X' f! |void PWMInterruptInit(void);8 N, Q3 ?1 R; _, r* X
// 中断服务函数* {$ ~! A- N& o i4 l
// PWM 事件
- h, U+ ^& c6 dvoid PWMEventIsr(void);3 c, x" L/ l2 Q" x
// PWM 错误控制事件' P; P3 y% K0 N. m5 @/ N5 K
void PWMTZIsr(void);
# n2 f: r2 x6 R+ u, k4 H x& q/ m. [3 Q. M/ F! }$ j
/****************************************************************************/
1 k4 Z) F- u2 F* S/ q% \$ o4 X& T# x/* */6 o& H+ a( }7 L) c
/* 主函数 */
5 ?7 R- R! s4 C+ @/* */1 v! U: T8 U, V4 h
/****************************************************************************/; \- K0 w* s& U; Q% m5 k
int main(void)
9 Y( e" Z$ W2 |{
; a8 _% j" X' C, O! M // 外设使能配置- W6 j5 ~# j. f4 E$ B% W
PSCInit();
) T5 D* ~; l% w2 g
- @7 a+ i; @1 N // 初始化串口终端 使用串口2
- n; ]/ i, A5 h UARTStdioInit();
. {/ y$ e! D$ E& s& w l* V " x) m* h A/ ~* e
// GPIO 管脚复用配置
! z: L6 D" v4 P* y; j# O4 z GPIOBankPinMuxSet();
p; I! C' h X
0 V, I1 f; h# a: `1 v) O // ARM 中断初始化- T D3 L4 V/ M% c. F& q
InterruptInit();
) J! N7 ^7 Q& k) H* _5 Y6 O9 |" K: ?* |2 y1 x$ e9 r
// PWM 中断初始化
: l; W. Q3 M1 X7 e PWMInterruptInit();6 k3 h9 Q# b/ y# K* Q3 W
# ]. [) {, i/ h$ L8 J unsigned char i;
' I _; {& L4 v% ` unsigned int j;
5 P4 J$ @7 A+ d, A0 A, Y% K/ g; V* C1 x7 R0 {4 L
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
, x# F N2 m# F' N! \" J3 c UARTPuts("------------------------------------------------------------\r\n", -1);
+ A1 Q+ |- @* R/ Z! n2 x/ y UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
9 p$ Q, g7 g# P ^) f // 产生波形
& Z5 i% E( A8 N- A: Z1 _ PWM1ABasic(25000,50);' t; Q* Q) d4 y
3 G; c# s4 G2 n% B UARTPuts(" C6748 PWM Test Over!\r\n",-1);
2 O/ q# {7 }$ n. A, o UARTPuts("------------------------------------------------------------\r\n", -1);) y# U: |1 [( f
9 S, Y: ]5 Z" Q6 r* G! q# |0 b+ v
0 m( k1 c' N* ^4 y3 k( D$ F6 S
, D! x+ N9 k9 ?8 |0 X UARTPuts("------------------------------------------------------------\r\n", -1);
4 T6 B- m* t* S6 ~& p% a6 G, L UARTPuts(" C6748 ECAP Test\r\n", -1);6 x( e# M. `0 i' w* N
// ECAP 捕获初始化
2 Z( T2 ?: b& Y9 ^4 H ECAPInit();
1 f$ S% A% J0 f3 x# l! r! [( A" a UARTPuts("Initialize ECAP.......\r\n",-1);
' C! u) H0 h# q6 Y for(i=0;i<5;i++)
0 A( l& M) e' P% T4 C" |0 a4 [7 K {
. ]) S! o; Z; t, R3 z7 Y: w for(j=0x00FFFFFF;j>0;j--); // 延时
2 Y7 W. W3 ]8 V/ t7 U& y4 P ECAPRead();
# V! [9 a- o& b! s }5 v# q- X1 B8 f
UARTPuts("\r\n",-1);7 [ u' u: s7 f$ L5 x$ B
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
4 }5 ?: o. D( `9 S UARTPuts("------------------------------------------------------------\r\n", -1);
9 V0 j# [4 c) w+ S+ o$ G: a5 f+ x* ^$ J v: h' x. a' {
// 主循环
# x$ j% B' i7 j9 s T4 ~; a for(;;). S/ R& p$ l6 {4 f4 U
{
" A; G- H5 Q& i, E# r7 {1 q+ X! ]/ U+ K9 N A
}0 ]3 [( L0 |: l7 r+ ^0 w# ~+ t
}& S6 e, ~/ a/ q9 S# ?$ k( I$ |
' G3 \. g. U! G- h8 p/****************************************************************************/, k7 j! a% I9 l% `- Q9 i: g6 P
/* */3 W3 M+ E' h% A+ v* f
/* PSC 初始化 */# a: s& r& c8 K, s
/* */( `5 m/ b5 W) i" |
/****************************************************************************/7 U2 Q1 b8 K9 H0 ?& v2 Z- q7 {1 Y. j
void PSCInit(void)
0 t" }! q" P3 Z5 ]# S+ H2 v{
- \% ~7 b& {( K6 N* O // 使能 EHRPWM 和 ECAP 模块
- ?+ P% S; |" T& L // 对相应外设模块的使能也可以在 BootLoader 中完成 a- N/ J! b4 Y$ b
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);( S8 ]2 U/ p8 C# {+ x' q
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
* _5 a7 y: I+ {5 t: p( Q: s}- G, O4 G- }2 _ `
' W1 Q. ~! o8 H- N( J/****************************************************************************/
! U: m; P& `2 Y7 l. |/* */
& W8 u6 K6 W: d& g# ~3 D/* GPIO 管脚复用配置 */$ l; O+ i* [ v m+ E( I7 Q
/* */
' H7 k) R& p; z; `- Y/****************************************************************************/' n7 F# ?7 R2 U0 c
void GPIOBankPinMuxSet(void)- y/ o$ P1 X7 e7 B
{2 ^) ?4 R- @( M' ?) B1 _' k& t2 Z
EHRPWM1PinMuxSetup();' w; C7 v- ^' s: j b9 n
6 H( C! g" J8 ]* H. n // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)1 R, y: i# r% P5 U3 D+ y( [
// 作为捕获功能时管脚方向为输入
. q! _7 Y# c# M. Y# i, s q // 作为辅助脉宽调制时管脚方向为输出. `* l7 B/ b: b% P: ?. h* D
// ECAP2 / APWM2/ i5 B* {, J+ N1 Q5 N; r; t" J I
ECAPPinMuxSetup(2);( Q/ i1 o% U* N7 V, H
. x# ^: ]8 J G7 [- q" I% t0 B2 w L
// ECAP2 / APWM2方向设置为输入
) X0 Z6 c6 O5 b0 m GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]$ W, y, w1 F ]! Y7 ?
}
`2 f2 L2 _) ?
7 ~% k G2 [" d& E/****************************************************************************/
, {' [2 V- F5 I; }' @* M/* */# v7 u3 S% A4 u8 q @) s- n$ W
/* PWM 输出波形 */
$ ] A3 E- \! `1 T/* */
3 i; M9 {, h. N' B0 T/****************************************************************************/8 P3 N& R$ B5 J. `2 d$ t
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)8 Y* E9 z" p+ T s0 n
{
8 `, r5 _ \3 [! K, x+ Y' W // 时间基准配置! `9 \: X7 F" B }
// 时钟配置
. j3 V7 @8 d& a& Z EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);0 d/ l; _* Z% c* [- ?. W$ w) k
3 f& b T0 v0 e; N& r8 D% J" }; O
// 配置周期
0 k; y% ~* J/ C EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,5 m! x8 m1 N9 S' d$ E% _/ u4 d
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
7 D [1 v, J |6 I3 ]" f7 E5 @6 w$ \. M5 K/ K( w7 V- _& L% S
// 禁用输入同步信号; {( \1 A) p3 P
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
$ Q# c/ O) k1 Z: W0 j$ m h I6 j: Q* q5 x# |) O& A% E- ?4 d5 t9 O j
// 禁用输出同步信号
' }" Q' M# \, X* b3 U& ~, i% E# ~ EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
1 |4 [" e, j) ~- G# \4 r ~, w$ }, \# z1 A2 ^" l$ e& c4 o7 ^: W% u( o& f
// 仿真(DEBUG)模式行为配置
% S7 A5 p) \& k, Y EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
' [$ A, ^0 F. o9 P* i8 Z$ B6 `, \) y0 N% B% V* n; B7 t4 y: ^
// 配置计数比较器子模块
0 P6 |% ~9 o# ?4 H {1 R( L2 k: N/ G J // 加载比较器 A 值3 j; N$ {% @4 H5 |7 z% i
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
4 B! S$ t8 e" ?+ \4 M% v' A EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
6 P3 c* ?* ~; V7 o& p/ S+ x( E) u( r, b$ k3 Z, B
// 加载比较器 B 值
2 I1 S, t; J: V) r* m7 ^8 @ EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,$ g) l! U- V: ^! a% q( d" A
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
) W* c+ s2 j( E2 c3 D3 R5 f7 @# b. l2 R# v- G4 Z$ n( j `
// 功能限定配置(输出引脚触发方式设定)
4 R& R1 o! O# [& w6 u // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出 n# H0 Q( U- H0 h
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
5 m: x i1 W" ? n6 g EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
3 x$ |$ L5 f$ j6 j& i& p( P# x- P0 H EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
3 |, v* v! E1 k/ O6 N* X/ A, `7 Z# U9 y9 w9 g. T
// 禁用(旁路,信号直接输出到斩波子模块)死区模块& x& f. _, N( ?) X. m- Y
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
* k; |0 n! O2 x6 H* F( S% K$ ~2 `1 B/ S! z2 u H
// 禁用斩波子模块
) H) N# n% O! x9 \/ W; S EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);# D4 j# i, |% o
: M' B f/ {2 m0 T) L& f. F2 y
// 禁用错误控制事件
, w2 }* m5 n* a6 b9 S EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
7 b& b( Q# g- X' U6 P EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
/ H2 _1 A% b$ I* V- ~4 `) S. M
; z5 U0 Y$ L- H // 事件触发配置
1 i" P+ N" r# j) g9 }9 R // 每三次事件发生产生中断" s, o% X9 k0 M4 B7 e9 w9 s( Q
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
+ n ]( [7 U/ A* H) Z // 时间基准计数等于有效计数比较寄存器 B 值 产生事件8 [- U/ n. ^/ z. Z. c! H- W+ C5 ^
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);! }3 h6 j# T: a4 U7 R
// 使能中断
9 v* I# Q! d3 s6 I6 Y/ J EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);3 [, t8 o) C! t
; N3 ?" k$ T; `7 P9 N( k8 j // 禁用高精度子模块% ~$ G6 Z0 u5 t1 s" v
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);0 Q, J# z' D- Q
7 ^; P$ M! T& M) Z/ i! }4 p7 ?
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
3 r1 @2 b) P- }" M4 [& o3 N}7 R0 c( C, p' H( m" Y
^8 ]7 `* }( j7 A9 R, ~5 Lvoid ChopperWaveform(void)$ Z @1 N% f$ l7 s) e9 Z& y2 ?8 r
{
0 ~, S; f: }1 }% z // 50% 占空比, m) h( E9 h& E; n+ C: S
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);9 |; @: y {8 W8 c9 B
// 4 分频
* w- m& @, j) `* b EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
$ V$ v. M v, h/ V( z5 K // 单个脉冲宽度
" t& P: \# N0 [; S8 s& g8 b3 b7 W+ w EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);% F6 p: I# ]. |5 Z% I
// 使能斩波子模块
- z! k8 w3 x* ]$ |- u7 M+ L1 u EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
5 ^% J$ i3 F. F: u& M}2 w; h0 H4 {, f! P3 \3 y
5 U+ i( _- b2 P! Z
/****************************************************************************/
# J2 `6 [* D3 \/* */: V5 M9 @5 V% `2 s+ J
/* PWM 中断初始化 */) c% @5 J% ?4 S( O% O
/* */
* E& y8 r3 U6 H; @* a5 i/****************************************************************************/1 Y& ?% {( Q: w9 M
void PWMInterruptInit(void)
5 N; d) P$ |: C" y. }# E9 f{
$ s0 o2 H7 h: o5 j& ~/ o) e // 注册中断服务函数
7 F5 N2 u- ?4 a0 B IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);9 N3 \4 ?2 ^- ^; A% G: ^: j; B
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
4 }8 p) l! `6 b
, c7 _/ u4 m( L8 g9 S; |; j2 z // 映射中断8 [4 l$ t( {* L: D6 G, j9 @
IntChannelSet(SYS_INT_EHRPWM1, 2);
- }; ^( B6 m0 {) w$ P# e. T, d IntChannelSet(SYS_INT_EHRPWM1TZ, 3);5 i3 g' }* { Y) ~+ x
/ J6 O6 R- z6 D0 C3 x' d
// 使能中断0 M1 W' P: ?7 C. I3 y; t
IntSystemEnable(SYS_INT_EHRPWM1);4 J. \8 C) w( y- d) q) ^
IntSystemEnable(SYS_INT_EHRPWM1TZ);
x; t$ H& H1 S$ \) N" H- {}
4 y; s- Z4 [. J7 M1 [/ W6 z5 `3 c4 V/ |9 k' K
/****************************************************************************/
! T4 y* G4 J# I; i/* *// P8 y$ O+ U# r: [) ~4 W
/* ARM 中断初始化 */. j3 ^7 N& `# T$ }
/* */
: Q4 G5 A5 Q* s9 W3 y: W/****************************************************************************/
' a: Z/ `* \; }- zvoid InterruptInit(void)9 v' X" F* [6 m! v6 {8 @
{# C3 s. c7 X& u# A: p1 {
// 初始化 ARM 中断控制器
2 m7 A9 U4 a/ d y" u IntAINTCInit();
8 W( u$ @8 F/ Q1 Z: f# w7 r6 T3 i: f7 A
// 使能 IRQ(CPSR)
7 L& ], j- c& j: [7 Q IntMasterIRQEnable();
0 T8 T7 Y9 ~/ P+ ?# T$ O3 [5 U2 s# ~: d7 t5 h- U
// 使能中断(AINTC GER)
1 D7 ] l& b Y IntGlobalEnable();$ \3 v8 T) e! E$ a2 Y
% t4 ~, L% y9 R; t- Y // 使能中断(AINTC HIER)
" U! j/ o7 R- r3 T" K IntIRQEnable();
' m. ?( x! d1 K# A2 m$ H}
5 d7 a* D0 l: {$ e9 J0 i4 H) ? n! ?* k, ~! w* V
|
|