|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
9 `3 @ l5 s! P/* */! |$ |3 m9 Q' c* B+ |5 _
/* 宏定义 */
y' }- |. a2 }, F/* */
6 G3 N) h7 C& u9 S- B7 o$ S. e( K/****************************************************************************/
( {! q5 k+ S1 F+ Y// 软件断点
7 g- p% @4 X- ^& l#define SW_BREAKPOINT asm(" SWBP 0 ");
+ ~4 O. P5 Q6 ~1 K5 W
c. a5 h( V! q: Q; ]// 时钟分频
& i' i, |/ @/ J: a6 {+ U/ M#define CLOCK_DIV_VAL 228. l! W) f* t# C3 i
# K, J% @% B4 m. g
/****************************************************************************/
$ z0 D' |) Q+ P- W% Q/* */
6 s+ l, H3 v( _9 j" P n/* 全局变量 */
0 {5 R& l+ v) L1 E/* */$ A% P5 w. y- f9 J
/****************************************************************************/* f" t o! @ ^8 L
ECAPCONTEXT ECAPResult; K1 r: {) n4 s! j) G" a1 u
* [& Y5 B! G8 e! u, {/ t
/****************************************************************************/
8 ?. d2 C. D! |7 z. q/* */: ^7 a9 J$ J) }/ M0 e
/* 函数声明 */
4 d' {& q c0 [* D/* */3 W5 i& O3 a }7 ~6 u( y
/****************************************************************************/
, W" g- g% _5 f) L- U// 外设使能配置4 ?" M" y6 u( j, l9 t: m
void PSCInit(void);$ j4 v+ C* q, m4 X5 ~: Q9 O& D
' Q* Q6 ]! p8 M7 P( O N// GPIO 管脚复用配置9 }& k+ S1 l# o6 N7 `5 L! ^/ E9 L
void GPIOBankPinMuxSet();
. F7 h- `2 V8 K, g- ]' {
' _, D3 B: Z' O6 ~ c3 j4 \0 ]& q// 产生波形
5 X1 @; p/ v/ Q) a2 ]0 x& V: }void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);) Y+ \3 n5 J/ k; Z
void ChopperWaveform(void);
- }7 P! d( |& U. T s
( `! O# x, j- j- `: y$ v// ECAP初始化和读函数
- t& H) c. p& B, _6 j( h5 Yvoid ECAPInit(void);: j/ z) G! z' l$ {; K
unsigned int ECAPRead(void);, S6 t* x6 r- p) {* O- O4 T3 p. D4 I2 F
5 A( }- j: j: W5 r, g//ARM 中断初始化6 q) Q. Z' k4 Z; X$ F
void InterruptInit(void);
* z9 K; P* U( Q/ C
$ t- q' ]* |) k// PWM 中断初始化
% i0 x, M% U( [' Q* C; evoid PWMInterruptInit(void);
$ B; u# [* b& v# s% n8 |// 中断服务函数
9 q8 `0 G6 ^( _// PWM 事件: X' w) q0 ^# ^- h
void PWMEventIsr(void);
! F) I C' w0 Y9 c" _// PWM 错误控制事件
. L6 i7 }# \& l* ]' Avoid PWMTZIsr(void);! d1 @* X' n- `* }, V
* H7 \9 ~ n* a H! K* U
/****************************************************************************/; x" h/ \( n: c. L
/* */% y u# W6 e& P9 R& j
/* 主函数 */* U3 v) g# y2 h4 b! x
/* */
" E% x9 i; \8 ]; e' M/****************************************************************************/7 Z: P8 `% n+ r
int main(void)
( \5 ?7 T- \7 E2 m{
; A2 W. ]1 c* R5 ?. t+ X. P" F% ^ // 外设使能配置
( W; T l' l2 I) k4 J! d1 R- H$ V PSCInit();
) i4 V, K' M" x4 [* z( E, A
3 ~* q9 H- l Y* ], R9 b5 Q // 初始化串口终端 使用串口2' e& u1 _! s4 V. w& i
UARTStdioInit();
# o! m! c3 a! |% C
9 u9 ~% U+ b5 T // GPIO 管脚复用配置- R" w/ o6 f3 b2 P1 W
GPIOBankPinMuxSet();
1 Z( _( k7 M8 v9 q2 Q2 L& s I0 Z4 d# V/ i( M) s' e5 O: }
// ARM 中断初始化
' M5 T9 w0 L+ h InterruptInit();
9 j+ _7 W1 M! g, ^8 M; r* d7 O! ?# Q- C3 j+ H' p: L
// PWM 中断初始化
/ [ {. A" X+ o* F PWMInterruptInit();8 @" F0 J- C$ c7 {4 ?# [9 U
/ ^* s1 E+ |8 K6 j" Q unsigned char i;
) R8 E! l* y- ~, q1 r unsigned int j;
* _. a O6 Z: e) o2 y. k A6 O3 h$ q* `
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);/ @, T9 ]% \3 c* m: O( q3 U, n
UARTPuts("------------------------------------------------------------\r\n", -1);
1 H2 U1 l- W+ l# S5 u UARTPuts(" C6748 PWM Test\r\n\r\n", -1);! U& e- g+ O- T
// 产生波形3 Z% R1 A8 f2 x3 E: h' n
PWM1ABasic(25000,50);
8 M# u2 _0 ]. c
2 n8 M" ~3 F7 {# B UARTPuts(" C6748 PWM Test Over!\r\n",-1);" U+ A/ Y5 L9 Q s4 Y6 Z9 w4 e
UARTPuts("------------------------------------------------------------\r\n", -1);
. G u: b: z6 U- ~$ t
# H# l% G$ h8 N( j2 B# t1 T2 [
: }7 J+ Z8 E( ^
* f5 \% k/ W3 |2 g* _- R( {, } UARTPuts("------------------------------------------------------------\r\n", -1);
$ f* ?4 }/ Z1 k3 t2 q" v2 _ UARTPuts(" C6748 ECAP Test\r\n", -1);& v' e1 @) ?9 o% p7 `( S1 j0 ^# f
// ECAP 捕获初始化6 Q; J* ?( _! X4 k: N
ECAPInit();# e/ L% a9 z# `# l3 L$ @' F0 t1 C
UARTPuts("Initialize ECAP.......\r\n",-1);
9 E% C! S8 L# f, N5 {6 M for(i=0;i<5;i++); _0 P9 s& m) P. E" M; K
{6 }- R4 q$ O' q. {! ?. B, @
for(j=0x00FFFFFF;j>0;j--); // 延时2 |( S3 D& O+ ~- |% ^
ECAPRead();
2 T+ b5 C" S& E1 g. H }( C G2 T/ x, i; `: Z/ b
UARTPuts("\r\n",-1);& ~, H; i; P& ^6 c4 p) h9 v2 Y
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);8 d, h: m% I) d1 v6 N
UARTPuts("------------------------------------------------------------\r\n", -1);
* i) \+ X% C( M* s! }7 ?
8 x- I) `: O+ Y7 y }$ | // 主循环
9 X( i4 L! X" n: q9 q6 Q7 m for(;;)
1 y+ M p6 E) V% i; H {
' U- |+ Q2 p+ E5 q2 D I5 f/ i% ]7 t8 i! h! X# x1 S( N* W" v
}
3 K. ]6 w8 Y. T# p3 A; s" \% W, S}2 S+ @$ M C T' x3 \/ _. r
& V, P2 `- [6 U, j, Q( h/****************************************************************************/
1 `2 g0 J3 A* T* E6 Q, |( R" B* _% U# i/* */
7 {2 m/ T9 D' K5 v0 V/* PSC 初始化 */
. g l8 |, j% o) j/* */8 S8 A9 K! h. O9 ], D( @ Q. ~
/****************************************************************************/0 N" Y8 P5 Z A3 @- F
void PSCInit(void), t6 k/ x4 N% @
{# C* o6 X5 ~8 c/ ]% q* i' _
// 使能 EHRPWM 和 ECAP 模块, c- |( [0 Z/ g s5 t% D
// 对相应外设模块的使能也可以在 BootLoader 中完成1 K( ]) C0 ~' }) t
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
" U% `/ r7 [6 B" r$ g0 P PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);/ b: [ E* W: L6 b( X
}# i' r+ d3 D1 e' m8 ~ ^* q
' Z# u+ m0 T- o6 ]) s( P
/****************************************************************************/
* p$ q! E" C6 E" M1 _) z: X/* */
3 w6 H8 z. K- E/* GPIO 管脚复用配置 */
+ k) b- T7 E- R5 }8 T/* */- f6 M' _) ^6 @& z, g- x+ n
/****************************************************************************/" i* Q/ r. r& \8 \. L( M `
void GPIOBankPinMuxSet(void)
- ^: O; K* w( z7 Z3 b{1 M2 H. d0 W- E- Z R
EHRPWM1PinMuxSetup();# n$ h' D4 V1 g( V, Z- I
" {4 _; g' V3 g& ~, Y
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
; T0 Z# w0 K# P7 e* C2 e // 作为捕获功能时管脚方向为输入
" n0 ^8 A1 E; n) J. g) N6 H // 作为辅助脉宽调制时管脚方向为输出9 h+ ^% a, q/ `7 Q$ ^, r
// ECAP2 / APWM2
}2 z: D' [' C ^) q ECAPPinMuxSetup(2);
; ` N* |, c5 [) i- _1 g5 B& ~# e# N4 y6 h1 m8 T5 u) c
// ECAP2 / APWM2方向设置为输入 b4 o4 K: p- N! y
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]& @4 e% |9 ~+ \) A8 l
}
' d! k% C4 Y) G+ {2 y9 X7 ^; Q* q/ X3 @" J6 q) B0 Z, a1 w
/****************************************************************************/ C5 J8 e' z, y! ]8 @
/* */# x" q7 o7 U! Z: @) C/ V( a+ V
/* PWM 输出波形 */
- }6 D% T. W( P) A/* */
5 d, m0 M- G4 o# u5 ?/****************************************************************************/4 b6 Y3 X ~& _! j2 W" y8 v# w
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)* c" g5 K, K5 e+ c. V
{
- [& W, y7 ~7 e; Q6 y // 时间基准配置- Z1 L+ v1 X- I7 F
// 时钟配置1 ?. U, d- U$ G
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);! o3 p( \" ]6 R4 x* Q
$ o; \0 Y1 y" S% m // 配置周期3 N/ _$ b l* A, C7 y0 k& m
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
1 j7 i+ L9 {/ B) k& ] pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);1 H: x( X1 \+ e+ ~: `
. j! y5 N0 g6 I4 Z, p7 f8 V: c
// 禁用输入同步信号* q# p# V, b+ H5 m- E0 H' y/ E
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
) \6 n6 i3 w/ y, J: a: ?
( E1 \* }" w! ^( |( ?4 J // 禁用输出同步信号
8 _- q) C0 B. D+ E EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
( I$ t+ H/ G( P+ z) \9 R* X, f) W5 ~
" a% i: \3 n+ }* D! D+ B, M // 仿真(DEBUG)模式行为配置
+ ]: i: }/ \( j ]9 }' p( U EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
, q0 n5 h% n9 Y! H# |
0 b% U6 y" u9 B; o, ?$ \7 C! l. F% R // 配置计数比较器子模块7 `" `2 J$ Z4 @
// 加载比较器 A 值
: V5 g) u0 H& Z. r, k, W" R8 M, h EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
% j: B* \4 V, m/ `- e7 m8 K EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);; M; h$ R% |2 d8 m$ |. q6 d+ l
7 R/ Q+ R5 S7 ] I
// 加载比较器 B 值
' b( @7 Z7 P5 G6 @' N EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
* q, m* a' r/ p EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);. d k& K& |. D. ~- M. A' J
6 q/ t) W# `$ H2 `0 e6 I( o2 j X // 功能限定配置(输出引脚触发方式设定)) d) u# p l# V0 k+ N( k( R
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
' m8 E' y- O! m6 n* N, t2 H6 y EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
0 _2 ~$ g9 A& l, b$ B, q* f7 M EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
% I# p) u2 K: z+ X% L8 Y/ U+ ?4 m EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);9 G& z& q3 V7 |/ J6 ~' ?
' L* E1 n; r) w6 P' h. ] // 禁用(旁路,信号直接输出到斩波子模块)死区模块
3 E% m% s0 O7 @! K5 l EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
1 l' \$ c( H( K5 _- j% j6 K; m2 L3 l+ ?* t0 S$ b- b
// 禁用斩波子模块
( `. [0 K" v1 O. x! ~ EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
. D8 a: ^0 T/ i# S+ B$ E6 d" F" g- r: o7 [) `- d, n8 Y
// 禁用错误控制事件6 M5 X8 i8 L! e, h( s2 s' o
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
0 w4 j8 x% J- j+ { EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);3 a o" a0 L, }) R, T5 H
9 O8 p) _, B' X% V# z' `% H
// 事件触发配置
1 y6 V( i! N$ @% z0 K // 每三次事件发生产生中断
# P5 ]' l9 o. F- l" D( h' t EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);& c- g# ?, y& Q% v) j
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
! y2 u' H: `7 }6 R9 n EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);$ g1 v4 |% I h5 t2 B. d. ^
// 使能中断
7 U" f* u7 N% b, J, w: _ EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);0 v7 G) Q8 X7 G- P% W
( N, K* n6 w. `& d1 s8 ^7 z1 y // 禁用高精度子模块! D$ n! P. O( M! i; m3 F. c1 p, j0 w
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);9 f1 A/ P; x" n' Y7 ?6 I+ J; x, h
' w# C" }7 K2 M9 _! Z3 ]+ `# O UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
) ~* S$ k0 k/ {5 q* N}
! R6 e- p+ a; R6 M
2 Q( z9 e8 B0 l1 ^: y3 `void ChopperWaveform(void)' T3 U8 b' y' q$ }" q7 `9 ~
{
: U* c' y# |6 v5 d, h5 h // 50% 占空比" N8 }3 w, r4 E- G) A
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
; ?/ R1 {% n. E // 4 分频
8 o: ?+ P. q h0 Y EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
/ k% ^: W. S9 F$ k$ W // 单个脉冲宽度
6 F' _: N+ l# X- \# ^ EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);5 E7 R; g5 _: A% _; Z
// 使能斩波子模块
- k% _$ U! f9 a! a: H' i A EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);/ j# ^5 @ @. j8 a z" S2 |
}
$ V. e g' c$ `9 h2 J2 M$ L* d$ `/ C
/****************************************************************************/
5 B/ i/ H7 s O/* */
" s a( Z' G }! L; K) T, T/* PWM 中断初始化 */
* G" t: A+ d7 u8 r/* */
" r. s- M" [; Z/****************************************************************************/
4 S( `. M* m e) X! lvoid PWMInterruptInit(void)
2 f* t( ]) M0 ~# J5 h, h$ H% n0 t{
8 d$ Q. U$ M1 ? // 注册中断服务函数+ N; V' x$ p5 ], ]# j; f* U
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
7 L! D( b, O) V; S+ ^ IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);8 T! C6 s) ? a
1 m- o0 X3 V; {' n$ G // 映射中断4 X V( a* C0 {7 k
IntChannelSet(SYS_INT_EHRPWM1, 2);! ~- [- K2 Q5 T
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
& z- O2 Z4 U9 z' n; j3 M7 y
6 @2 T2 g; ^/ B& Y( h. N // 使能中断
" J1 n+ U E3 |' V$ ?. Q2 t5 y IntSystemEnable(SYS_INT_EHRPWM1);
# m b V8 B! S" t' A( ?+ t0 x IntSystemEnable(SYS_INT_EHRPWM1TZ);
' s2 i) W5 u8 R, @}5 z4 q( o' t) [9 P% {1 ]
+ C2 ?* ]7 u; f4 L
/****************************************************************************/ H8 k: C( M6 u; q; t
/* */; E; Z% {" S" m/ q3 N/ ?$ l
/* ARM 中断初始化 */
n: k' I5 |5 r& N* \ }/* */
4 O) _1 W3 P% w/****************************************************************************/
/ z/ |% c* |! N' m7 gvoid InterruptInit(void)
# h% x! k0 Y) l" `, j{
& x: u y3 e" D& L Q/ _" { // 初始化 ARM 中断控制器
: f1 _+ a* Z2 O$ W7 S% b IntAINTCInit();. B; L/ w; q: {
5 ~2 r! s; s _( g
// 使能 IRQ(CPSR)
6 m/ x2 u7 c6 H; _ }- [- { IntMasterIRQEnable();
7 g+ S# X; b4 i4 m" Y5 [( k+ {0 V, c, f
// 使能中断(AINTC GER)
: B8 U4 T3 [& L IntGlobalEnable();
3 O7 S% ?& V' ?4 Z8 ?% g% l3 A6 V3 R f# B+ N
// 使能中断(AINTC HIER)
- U. n4 l+ ?7 U9 r! H" _ IntIRQEnable();: V) W- {0 N4 C9 S! v, }1 |
}. W) Q3 ^5 |6 h7 T6 D
a+ T! ]; {! V# `$ u' i4 S2 B
|
|