|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/, P0 w) B9 z" |$ P' ^$ a
/* */
7 k6 ?" f9 s+ w G8 b F8 o/* 宏定义 */
7 A1 |5 M8 |3 V/* */1 U7 Q9 T, c% n6 m1 u/ s. @
/****************************************************************************/% [ W7 N' h+ v/ c, s
// 软件断点
( z o0 {* m+ m4 q i#define SW_BREAKPOINT asm(" SWBP 0 ");7 `8 V- }9 I/ v; e
' |& O1 j2 J/ s5 C, v" m) b
// 时钟分频
& s8 r3 _4 r$ I' @#define CLOCK_DIV_VAL 228
5 {, f! w* ^/ d2 s+ M5 O8 r
! R4 P$ b6 v. S/ |0 E: b/****************************************************************************/
4 m4 E* x3 A" H5 e3 t0 a# e/* */9 i( s( I! t! X2 j+ P7 d) P
/* 全局变量 */, v. _9 z* j @2 E1 _9 X+ g! l) b) g
/* */8 O; u7 {4 B4 @) e
/****************************************************************************/9 J) j/ _# S" o7 V9 o" C% w
ECAPCONTEXT ECAPResult;
& \6 ?, h. `# m! C$ Q0 R0 O n' b: O* Y% Q0 z
/****************************************************************************/
$ W: J5 _( T- O1 h/* */
& `0 E4 u! I- _1 @( c& g/ l( l/* 函数声明 */
8 y4 F$ o. ]+ r% g8 _/ V5 Z/* */ d; S2 B# g# b3 {( P7 d# {, k) U
/****************************************************************************/1 Q' U. M+ R9 n) p" ?
// 外设使能配置" c+ X# ~1 K3 S7 f4 j2 _
void PSCInit(void);
0 R7 ~% t: u$ Z1 I1 s$ [7 i7 u7 L5 `- K) J2 o4 n+ ?) L
// GPIO 管脚复用配置
3 h4 Q8 z; _! `% e% `; H7 ~ Avoid GPIOBankPinMuxSet();
( @0 x" G6 J1 e. `# R
+ y+ o7 L/ g: i% x! G// 产生波形1 X" v2 v7 p/ |9 Q# O* p- |
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
e& i# w+ S3 s# u; a8 v, dvoid ChopperWaveform(void);# V4 m7 R4 V( W |, a& j2 u$ e* V
9 @. [. t# R8 B& A2 J% r0 b6 L& T2 ~
// ECAP初始化和读函数
, E B+ H$ f( F8 gvoid ECAPInit(void);
# Q, s- T3 q' _- U: Funsigned int ECAPRead(void);0 m# b7 R0 I8 _3 [
; [! c& V4 L( D1 r8 Y% E$ i" A, ~//ARM 中断初始化9 ]3 [6 u; X) ^$ a- O. Q) w0 D( G
void InterruptInit(void);
; q& l9 ] i" p$ ]/ G) [ [* ?! o+ F( @! B" F
// PWM 中断初始化
. W1 p1 V2 ~6 pvoid PWMInterruptInit(void);
! w5 p8 M3 {5 X// 中断服务函数* q4 f9 }( e: e6 }+ v
// PWM 事件$ {1 d! e: H' D! U9 g$ w. D( |
void PWMEventIsr(void);5 o2 s2 s7 f6 x2 F- a% F3 c
// PWM 错误控制事件, N) ]5 T0 @7 f- L: d% {
void PWMTZIsr(void);7 q+ V y4 z& ~# C
/ w+ a/ r# ]3 r1 g! S
/****************************************************************************/
" L0 e* p7 m+ B9 L/* *// R/ E1 {% L ^# X' h. G
/* 主函数 */' P9 j" f% w: U" L3 D9 J3 e+ |
/* */
8 I1 W2 Q% f b7 V/****************************************************************************/) }* S1 o$ t2 \3 \
int main(void)! a( J% M8 g A0 s. q- H! \( T2 b
{7 H- C4 @9 _+ |$ {. z& M& @; g' @
// 外设使能配置, h# n/ i- Z) b& _
PSCInit(); H* ]' f7 ^7 d0 {* j9 Q
- }. }5 v1 m2 v) {3 r4 n0 }+ i& W5 `
// 初始化串口终端 使用串口2
, ^: k% t) h1 T- f) c# l UARTStdioInit();
# Y7 c7 K7 k; v. w l
. @( O J+ N7 }- s- ~4 k6 ^% z6 A // GPIO 管脚复用配置
6 @4 v R ]# g* Z5 Y GPIOBankPinMuxSet();4 C1 X5 V0 C" T' Z
$ @& Z% S, R/ Q _
// ARM 中断初始化
# D5 S( h" c6 m9 m$ f, E InterruptInit();! @7 G* o, S; a2 ? m3 W( P
* d6 `7 P* W+ g: Q // PWM 中断初始化
/ {' H5 m8 q# g3 ]3 p PWMInterruptInit();( I% B! D3 d" W# X5 |9 I2 |* \
! W4 m0 F, m- b, j
unsigned char i;
# V U- Z" f' K+ B# D) p3 Z unsigned int j;
3 x7 _" }1 Z: Q$ ^8 M9 I4 r
$ a7 I, i1 G0 D5 ^. w UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
2 ~. F3 M) J9 l, c2 _, U UARTPuts("------------------------------------------------------------\r\n", -1);; J6 r8 k/ Z) ]
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);/ ~/ [ H9 R0 f4 L0 q( }
// 产生波形
, c0 _0 O+ m3 o. u PWM1ABasic(25000,50);
- T; d+ B% X, @( x8 t+ H7 v
$ o1 b0 \. e9 U UARTPuts(" C6748 PWM Test Over!\r\n",-1);7 ]* U3 Z' h: M) ]8 a+ j
UARTPuts("------------------------------------------------------------\r\n", -1);
" P" F; Y+ w5 A5 N
) Y* E+ P o5 l( P$ C7 Y5 M* X8 Q. m1 K6 Q6 _3 s, p" X! i0 N& T
% L- A& L3 f* H. I
UARTPuts("------------------------------------------------------------\r\n", -1); o$ R+ w8 u, k) K% B8 u( z
UARTPuts(" C6748 ECAP Test\r\n", -1);+ n7 R' Z4 M- @$ F& s6 c
// ECAP 捕获初始化
7 n; b, s4 M$ p" m; W" A7 s! U* t ECAPInit();- o8 \! f& F1 W4 m
UARTPuts("Initialize ECAP.......\r\n",-1);
5 ?& C& w+ ?3 T# f x$ ~2 L for(i=0;i<5;i++)1 H- E X/ C+ G# a2 d9 {
{! j, p! z# o9 u5 m3 o( P z
for(j=0x00FFFFFF;j>0;j--); // 延时
; T* T. g5 j6 [' {5 ~9 Z ECAPRead();
' M! b+ R5 v8 S' b+ h* v }/ O' F) ]& ?' o) d; z
UARTPuts("\r\n",-1);; F1 l- D( O3 _3 t$ G" t# U7 P( V
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
- A* H8 p, @7 o) |9 l UARTPuts("------------------------------------------------------------\r\n", -1);" H7 o2 y1 p0 A* d2 Y
. l, \& a" E& u5 _1 s( M$ {
// 主循环: W0 e1 ~+ _6 @
for(;;)" n! G* H8 d* C# }" Z+ Q8 g5 O
{1 r" X! c9 \# R: Q
# d8 E4 ?/ K' Q T- _ }+ i6 n$ y* o# P; n! }0 l
}' G9 U. K& v6 P& R; S
' O# R/ T" U5 z6 N% ^! g
/****************************************************************************/4 q* I7 r1 j- V6 W% a
/* */! t+ D8 I( l& H& P( H9 Z# s
/* PSC 初始化 */
( u4 N$ p6 U+ R2 e/* */! w7 L5 J7 Y* Y6 S& F" X
/****************************************************************************/, `7 v5 I: x) b& K
void PSCInit(void)4 O7 a' n$ Z: o, C
{1 g; t1 _& r" \1 `3 B
// 使能 EHRPWM 和 ECAP 模块
+ W, ~0 t: V9 x2 E // 对相应外设模块的使能也可以在 BootLoader 中完成
& P' K* k1 w0 Y9 O# Q# z$ Z4 O! `2 o( [ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);( @5 R: y# I5 g' h8 O" W8 A
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);7 K9 G; z$ J9 T' y9 |8 o
}, J* S5 r# c$ U/ [5 j8 W
; U0 t Y' z2 \) @# T0 }0 C/****************************************************************************/" @& g+ ?, e0 @' X
/* */
6 S% x1 X1 N! N `5 P( Y/* GPIO 管脚复用配置 */
3 m$ Z: }7 ]; u& \0 n/* */
: z/ I' u" P* H. I1 `$ c/****************************************************************************/
4 T7 P5 o+ e* F2 L* I4 A1 b1 qvoid GPIOBankPinMuxSet(void)2 b& K }2 S% w, R
{
3 P# U, k( c6 D3 ~5 z- M EHRPWM1PinMuxSetup();
& L- [7 Q% u- L3 ^0 Y6 ]& p- g& x9 p# P4 V& g
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
$ `# A5 E" t N' {. E // 作为捕获功能时管脚方向为输入- Y0 q% g2 K* M; K7 i9 V% c0 b7 `
// 作为辅助脉宽调制时管脚方向为输出- F/ t0 s/ v2 y0 F" @! m
// ECAP2 / APWM2
! t3 b8 U/ d- r3 ] ECAPPinMuxSetup(2);$ ?6 z# M5 k/ m' ^& |9 x0 |
8 J- v( M: R1 p! q+ T* k5 S1 b$ S // ECAP2 / APWM2方向设置为输入& ~# j4 p- O: p
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]0 {9 M5 b* H3 X& `+ B
}' L& J Y7 ~: N. g7 X: w0 P
$ w/ |* @8 k# J2 r& M
/****************************************************************************/
9 B) w1 f. A$ R+ V: I' p/* */
& n& ~9 m2 M6 s- N1 {2 {, y/* PWM 输出波形 */
" J M/ O) E* D* U# H/* */
* x9 |( y* C' E9 Z l/****************************************************************************/
- z* F) W0 Q! a/ P7 k9 yvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)" I/ w5 }* H# ]. A) u& E4 V
{$ b% c* p2 l9 G- L
// 时间基准配置# ~% x+ @7 {( k( m/ N
// 时钟配置, v: s; Q; @ D
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
& C3 v" p i, Z' {- u! X9 X) ^
3 _9 H9 P1 M, }7 _* z$ U3 p& | // 配置周期) C" q' o- n6 l, l- b
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
4 S& \ X; ~, w- Z( H) r7 d pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
# m: @ T$ U8 d$ ]2 E, [' ~4 u" b% J
// 禁用输入同步信号
5 g# k# o( d% D" ^9 y( B) p EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
0 _2 Q, C ~7 ]% d" m* g
# e8 k! y u' k a$ H( y5 k" [ // 禁用输出同步信号7 k" d1 R, o4 `* Q* `
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);4 y8 h) M" `( L1 w! S
/ V0 m8 W( E# Y! r( [. p+ H6 o
// 仿真(DEBUG)模式行为配置/ ^2 X( Z1 e" r) M U; ?
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
- O) ]+ l1 Q6 i7 Z- u: G, h/ ~. V, Q9 w
// 配置计数比较器子模块
1 u9 F2 K2 v* J+ @8 h. g# y // 加载比较器 A 值
, A2 w u: ~% V& D" E& j! ?. a% I EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
" |7 k2 T+ T: a8 q EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);5 I0 I8 B% r% P6 Y; }" c
, {5 F7 l5 z) G! v% D" V$ i* `. H
// 加载比较器 B 值
: [+ D0 u; B& J# L3 u EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
/ T" _: x8 g# q) a' d2 |! Q EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);1 }! N- x+ J a5 D) l
; A4 M6 e( y+ S% }; U
// 功能限定配置(输出引脚触发方式设定); |6 H- Z9 G2 H
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
4 C# f3 E9 S, y, P* r/ x EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
5 ]/ i9 N2 v q( c4 Q6 q. P9 G+ y EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
6 R1 r7 Z8 ]7 T; b9 q- M! W r EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);! R3 i" `# U, T m, P
9 W5 {. c% U$ D. Y1 o& y* t6 D8 f' U6 e
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
- I8 f4 Y( Z( ?, p EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
. h9 ]- e5 ]9 j0 h
; }# w% d, Q9 H& Z) E6 M" n // 禁用斩波子模块
& F+ q* A0 {" K4 A6 l EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);+ M2 B4 P5 C& Q$ {/ S+ B% x O: H
7 n2 _' N9 x1 F5 f- T // 禁用错误控制事件
5 R1 G& E4 V$ U! R5 K. M EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);4 H* c( _4 Y' s) `* N8 a
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);3 I6 m8 t# V: [) C4 }" _( ~# b
& `- p/ Z- c& Y& @ // 事件触发配置' R" a% F+ m# C
// 每三次事件发生产生中断; }7 |/ X7 v" m% q! A
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
0 P# A9 j. G, M& Z // 时间基准计数等于有效计数比较寄存器 B 值 产生事件' ?1 C2 h+ Y6 E# |
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);. T* E& y( o9 Q& `5 O
// 使能中断5 |5 |3 @: E n
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
8 O! W. v0 Z, {* s
) J5 C, s4 N5 T5 x9 x2 L: I // 禁用高精度子模块. j5 Y- F$ ~0 ]; y
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);0 y$ H8 j2 S8 K2 H9 q5 U
6 P3 `) R0 U( y
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
; V+ S9 ?0 v% }}
: s: J7 n) S& N: w: ^4 h" ~5 }& _ d4 a
void ChopperWaveform(void)
& R4 M5 ~" ^ K( W" \, V6 P2 N, w{9 O* c' F8 ]1 ]; S P y/ k
// 50% 占空比
4 J8 t9 n8 `( I9 P# r4 s EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
4 ^8 z! r2 t" a F& E+ _5 W // 4 分频
1 h( W5 c- T, V L* k6 q EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);& V! Z7 r1 I. \6 O0 Z0 Z, ^
// 单个脉冲宽度, q) Q/ y% \, Q- U% e* ]" I9 z
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);% X+ o; q, d* B. r+ T# z$ A
// 使能斩波子模块3 l: ]/ ~1 n+ V7 a* m
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
, e! V: i" x) b# s5 ?. x1 O1 y% T}
* c/ ~6 `! `* U' ?
9 Q% u6 W+ T- ^1 C9 J& U/****************************************************************************/
1 r0 w9 D( M+ A7 ~/ Q/* */; z" F/ k0 X/ H; s5 m1 u
/* PWM 中断初始化 */* o$ q7 }5 Y) \. X u
/* */
# T; N8 L. n- V: ~/****************************************************************************/
4 T. y% [% H, Pvoid PWMInterruptInit(void)
4 n1 l' r+ A) v{% e+ p0 a1 ^2 f5 T
// 注册中断服务函数' h- I6 f% [9 Z' a
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
6 N0 ` l3 ]( n' q3 _3 l7 C8 X IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);: C6 J* O8 b; b8 h4 V. R0 y
: n* b2 U8 i: B( Y5 V6 T( H3 T! g
// 映射中断
, q* q2 H* I! u8 d, Y" D5 ^- @4 ~ IntChannelSet(SYS_INT_EHRPWM1, 2);
: [( M7 j" \0 `' f" K IntChannelSet(SYS_INT_EHRPWM1TZ, 3);3 y* o% @0 l& d! q' ]
+ p4 [% k. q$ b1 h
// 使能中断. A2 [' f+ z; G- C/ `( T
IntSystemEnable(SYS_INT_EHRPWM1);# q7 s* ~6 g: m/ f" q' c# k
IntSystemEnable(SYS_INT_EHRPWM1TZ);9 n3 y2 \) M( U& z- z0 E
}
, L* Q: z* ] p
1 s, M& }; {9 o+ }/****************************************************************************/
- d& p7 \0 e/ v; J) {( i$ F/ R7 H* a/* */
" i0 P% T ]. L/* ARM 中断初始化 */
1 y U% h% U: V' ]/* */
4 l) M( B( c0 u+ ?/****************************************************************************/5 k* \; Y- W2 B( k- \
void InterruptInit(void)8 x" g: e' d* V F( @
{( k3 T; w5 R8 {; }$ b% U
// 初始化 ARM 中断控制器
1 R4 E4 c1 C% [! N# W( K2 a IntAINTCInit();- ?8 Q1 S) h! P; V5 ~( ^
* g$ M2 `* y7 z! o S4 @ // 使能 IRQ(CPSR)
- m7 `* l$ ^7 B, K. v IntMasterIRQEnable();
) b H& O$ J2 d. Y6 `' A! j, ~8 c
// 使能中断(AINTC GER)' s# F. d1 t7 R9 ~7 @1 y
IntGlobalEnable();
( x. C1 u' R0 n2 x/ ? t; ]* d/ A
// 使能中断(AINTC HIER)
7 P9 R" x/ y/ y* u( ~/ H4 X- Y5 U! y IntIRQEnable();
- |; m2 K# U) @; V}
6 ^9 ~/ H' f6 Y) l: r! q1 r
: `! ^7 Q( G1 S2 [/ o |
|