|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/5 q' m: O/ I8 v: x6 P2 C
/* */5 Z# ]6 q/ x2 ]# Z: P/ C
/* 宏定义 */
$ y6 `+ ?6 W, |' G+ p/ I" I9 h/* */
+ {7 b8 i8 i" }/****************************************************************************/
5 ]" i$ S' L. ~/ b0 S// 软件断点
) O# `: g$ K- d#define SW_BREAKPOINT asm(" SWBP 0 ");9 S/ `2 W& [7 o5 H. r* \# Q
( A$ _# Q( h6 G# o
// 时钟分频. F1 r: ^* x3 J8 y; d& H
#define CLOCK_DIV_VAL 228' r. k/ O2 L0 r$ L' D) G
( W, i5 A, H; [# z3 V) R$ \* S/****************************************************************************/
' x6 j& r! ~: v/* */; W" t( S2 Y5 _) K) z5 j
/* 全局变量 */ @ c- E% H) z; D- z3 w) h% {
/* */
8 d2 S2 \# |; J* C8 k* l8 a/****************************************************************************/
* j+ p, _* }2 w" d2 w! rECAPCONTEXT ECAPResult;
% c. h/ l3 W. o. b
( l7 h U5 U" _% i; Z1 J: ~' q1 j/****************************************************************************/! t5 I, c' `9 ~! ^9 ?
/* */, Z& X" `! t0 K' H9 W) D% P! s
/* 函数声明 */. O# I0 ?8 F) v' A5 s
/* */& X' O% B7 U' l% J" P. V0 `
/****************************************************************************/# c* L$ {" B& H, K
// 外设使能配置
7 W1 I6 c3 j- ~void PSCInit(void);2 \) }3 X% ~. \" e1 X9 R2 Q
5 \1 a: ^2 R% \6 ]0 s& ]
// GPIO 管脚复用配置 D7 f4 `3 H/ Y
void GPIOBankPinMuxSet();$ l7 `" z- x3 K
' w/ c4 e' o% H$ `9 _/ W6 S9 T# A// 产生波形
; y8 a8 i0 }: l' ^5 dvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
" n& A) B+ j, Y% M! F9 U6 \void ChopperWaveform(void);$ Y& V: Q; p J: M! e @3 R
+ q; i$ j) v) a// ECAP初始化和读函数
* ]% A0 `6 M+ ^. e Y# R& \3 J7 v& ^: pvoid ECAPInit(void);7 G4 D8 V$ _. M8 m
unsigned int ECAPRead(void);
# F7 t7 e! X: s& e* L+ \8 i Y
//ARM 中断初始化2 d z3 p8 A0 c8 r
void InterruptInit(void);! B) V X2 G) E9 m/ B
' \6 W6 o. u0 w7 W/ V/ Z" l5 {* y2 Q// PWM 中断初始化
% X5 k, ?3 t( u# C% d: v' ~void PWMInterruptInit(void); i- c/ J. @; `1 X# V
// 中断服务函数1 Z7 A/ n; p7 j! E4 q# u! ~" u
// PWM 事件
b6 K6 s3 i3 c6 X2 {" P/ H# xvoid PWMEventIsr(void);5 C2 R# M! i& U
// PWM 错误控制事件
g: m4 K7 `8 z* m0 G: `void PWMTZIsr(void);) _+ i0 _; h- N% J
1 v/ `' z Q! [# G8 A/****************************************************************************/
; P" q8 V: x6 Z/ r" j k% m/* */
7 N7 x% F3 z. F" l$ ]4 ^6 Y5 M7 C% s/* 主函数 */% P: `3 W9 g. m, [1 n" y
/* */
" _- H# p6 B& }9 Z/****************************************************************************/
) e$ O6 }3 M: [$ Y0 }4 `( ^int main(void)
, [5 l% P. ~( ~- ]% _- G{* n3 ^( c k) |9 q; X
// 外设使能配置/ V- ]4 y \, P" o, ^, _3 r5 Y
PSCInit();
* j% h% n) J) ?
6 S9 @6 }+ Y$ ^) y8 k/ P // 初始化串口终端 使用串口2
: N1 h# X9 k0 y UARTStdioInit();
$ W) o: ]- j4 @' E- A C: i6 T 5 j0 D B2 @# F" T4 |4 b
// GPIO 管脚复用配置5 P) H. f3 X' B' q0 W2 R0 {0 |6 t8 i
GPIOBankPinMuxSet();
1 y2 b) q, V, H, n
; i7 ?' Z" h. q" ^5 J. ?' }# \' | // ARM 中断初始化
- Y# g" }- b. C InterruptInit();- }3 J, ]4 Q! R
1 `( y @' R7 A% c
// PWM 中断初始化* J+ ]) w! M/ e
PWMInterruptInit();
$ {4 C- U9 Y5 _5 I2 u: A) G3 c8 p5 d3 I( y
unsigned char i;
& ^3 H6 j; X3 T: Y unsigned int j;2 A/ E0 v' e3 {* @: i( B$ G: P9 t9 I
% k, s6 \0 }& ~% J3 r( x# |+ a UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);6 _) N" T% x$ J& C' e
UARTPuts("------------------------------------------------------------\r\n", -1);
# W4 S3 ?9 i6 W) f, D P4 o UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
" ?8 R9 u& t0 }: m3 c7 S/ _/ k // 产生波形
* _3 y. a0 b6 Z. z8 N$ G: ? PWM1ABasic(25000,50);$ I3 i8 C5 \7 G4 h
0 V; j( q) N6 _( g) w! b) U9 ^! Y
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
3 f, } K2 d4 g# N) r UARTPuts("------------------------------------------------------------\r\n", -1);3 v! d/ l% e# Q' s8 |. ], m) ]
. V: K: W% C. q$ D- ]% T
) ~! S- G o# b0 D. K6 g
( k, \6 q+ |/ I" z& h7 F UARTPuts("------------------------------------------------------------\r\n", -1);
1 m2 F$ I+ c3 y5 J/ _* r i( _% L UARTPuts(" C6748 ECAP Test\r\n", -1);7 }2 h: m* C, ] y$ R9 y' s- h+ l: O
// ECAP 捕获初始化- Y% I5 q: P* Q- R+ P
ECAPInit();
% }7 [% z4 _ d# {/ D, u: } UARTPuts("Initialize ECAP.......\r\n",-1);# l/ `7 u. V# d! q8 d3 `; W1 y
for(i=0;i<5;i++)
( E5 h# g( M- K' i' c {) {3 r% X/ H( O
for(j=0x00FFFFFF;j>0;j--); // 延时! ?" Z8 i: Z2 \& R; L3 [
ECAPRead();
+ W) s+ p; B7 C) |; u) G X3 Q }
2 B1 {$ Q1 S' @7 ^. b6 E UARTPuts("\r\n",-1);
) x1 d$ m7 o8 E5 i; N UARTPuts(" C6748 ECAP Test Over!\r\n",-1);& V6 y" ~+ j# ]' E( h3 G/ H2 P
UARTPuts("------------------------------------------------------------\r\n", -1);) l3 \% l: B! @
3 ^( K1 {3 N: f/ e% |% s
// 主循环6 @. l) L9 Z1 z5 I- r |" ], A
for(;;)
2 O/ }3 ]6 q3 S+ b r& O0 m {+ u, ]' h5 m, O' i) b9 J
3 ]7 _# W- W @: E, s }
& L! }$ B0 h) _9 a}, D) o; C$ i! g5 R
W: O! @) g* E7 \9 v1 y/****************************************************************************/
# y# i1 J7 ]* U/ [8 ~2 K; H/* */
; _ ^) C6 V* ~9 I. v/* PSC 初始化 */9 {! U" ^, h( |1 m; Z# L( w6 i
/* */
0 L4 Z, H" _* B+ i+ s& t+ b/****************************************************************************/
+ C: a, |. h5 evoid PSCInit(void)
# i9 q0 i; t# B% V; G{
6 u: ]: v$ w0 a! } // 使能 EHRPWM 和 ECAP 模块, X$ L% D4 N2 Q" ]2 m7 h
// 对相应外设模块的使能也可以在 BootLoader 中完成2 z4 a2 X; l- I& {
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% ]* R$ b1 H% z PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
) q5 _$ o9 ?6 g7 k' `! r) `& g* @}
% @4 e+ V9 [; i/ `% e3 N' Z: ]" j0 I# [8 x3 T" J' y; v e' O
/****************************************************************************/
9 S3 r0 u3 C) q/ i/* */
1 j' L" v3 B8 r) P# h& d5 T1 N/* GPIO 管脚复用配置 */
% t* K6 k$ T4 R5 A" x; R: M/* */# A! c2 p% o- Z& K& W7 x( t
/****************************************************************************/# X# @& G! Q n2 j
void GPIOBankPinMuxSet(void)
2 g/ a5 U A8 u( o0 ?& C5 x! l{
, S) l9 Y( O& N: y6 f EHRPWM1PinMuxSetup();
5 v5 \$ K: ?( A% Y7 [5 O4 A1 |6 X4 m& c1 c: p, Z; l" q3 u
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)( Q( I, \4 D# ~( E# V
// 作为捕获功能时管脚方向为输入3 {4 g5 T& f1 }( a. P
// 作为辅助脉宽调制时管脚方向为输出
" {+ a6 R, p D& |6 a+ m1 w // ECAP2 / APWM2
2 ^! W, Q+ R4 k8 A( g ECAPPinMuxSetup(2);% E5 k5 n4 Y' ?1 g
: s' D2 e. J; ?2 W0 R+ J( c
// ECAP2 / APWM2方向设置为输入
, d" G" l+ B: B5 o. ]! {% r- D GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
8 X/ G$ n, L/ C}; O! m o- ~, @( A( l6 K+ K, R/ B5 k" B
4 g9 H; E! h1 ]- o ~7 y
/****************************************************************************/" `8 X3 h8 d; Q+ o2 H
/* */
6 H5 d( |: J- o2 s! w3 p/* PWM 输出波形 */& \& i8 _% R9 c, e! G
/* */
3 U- Z9 d' G4 T- O0 r& S1 O/****************************************************************************/4 q3 Z8 a3 j' n/ n2 Q# G
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)" h8 }% n9 [( K
{5 e6 y' g. w6 c3 ~# W# j
// 时间基准配置
( M' t( u0 N/ P1 [( \ // 时钟配置+ l6 ?# }/ y: P a
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);2 }" O+ M2 o' R- B
_5 R$ i: s% M$ v9 R$ q8 h // 配置周期 {# z& i( m) X; ~) R+ R( x7 N" V
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
2 `& |" V# {( Z' m5 l) q$ ] pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);" w. b$ S( T# z* V5 C# g+ ~
w. p; @1 J/ k3 @ // 禁用输入同步信号6 |6 [% U& C( ?% P: S0 U
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);1 L6 s: |( `3 R
Q0 X6 J0 R6 |* r7 K // 禁用输出同步信号
- X! M) N: f% N C EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
# d% b. h$ u- c/ V
1 ^7 v1 i" M6 z" K8 B$ Z/ g // 仿真(DEBUG)模式行为配置
8 R% r) x. a4 |7 K EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
( i( a" F8 T; W% |: |0 e/ m
0 ] d# [0 g9 b8 f9 k w1 V& A // 配置计数比较器子模块
: b# z5 `5 t! [' z j // 加载比较器 A 值7 t4 `# x4 Q8 H8 T" f5 e
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
8 z1 C6 v( y+ `$ r7 d7 d/ B, P EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);3 o$ g! P+ |1 q
& a2 o% K7 m6 w0 W7 y2 D // 加载比较器 B 值
$ N; Y4 {) U c2 H. K& x; C EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
# u, J# R) x8 ^3 ~' n EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);$ k3 H& n4 L" t) J! j4 A5 \
2 f1 L: I$ Q2 h! ^ // 功能限定配置(输出引脚触发方式设定). B( M) _ ]; L: I6 D( K- N
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
- E( F; U. _) t& k$ n EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
( R! `: J" n8 c$ ? EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
* j) l2 A( [' F$ H |( @ EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);( W% ]8 N T6 }- u8 h* B
3 R$ J* z6 G0 T; z3 c/ z( U // 禁用(旁路,信号直接输出到斩波子模块)死区模块! V" O. L4 {$ L4 C$ Y
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
) ^- z+ i( ?8 Z7 Z c* P8 C2 f1 ]- V% i" B
// 禁用斩波子模块
& l2 t: B" B. f1 T/ `9 G- y, S/ _( c6 W EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);: d& h2 q) G: \# _
5 t1 E$ T2 @5 w. a
// 禁用错误控制事件. H8 P' s/ z% t
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
7 o0 s9 G3 F! ^3 |& {/ ?: b' }1 ]6 m EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
3 ]* J, k0 V. M g7 g6 R- r6 a
/ g5 o9 r. r, N( [' M6 M: G // 事件触发配置
9 u1 S$ X; r+ G0 J7 D$ ] // 每三次事件发生产生中断
( }# v; W2 n1 ^8 t* P3 |/ l. u! a EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
+ t+ ~# r- n+ ?+ Z! \" d // 时间基准计数等于有效计数比较寄存器 B 值 产生事件5 I0 w; a& a- C
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
# g- `* R& Q7 C1 e5 e // 使能中断
& ~+ ?, u1 w- H ?7 y EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);8 k1 O8 X( F' N' o' `: A2 Y9 Z
1 r, M. D4 ]; z6 r0 V9 s" ? // 禁用高精度子模块
$ |; \. C; q. i5 _0 l& L EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
; T8 Q: n4 J P, B( l1 d# H! G0 ?/ k% P/ }$ ? _! ^8 V1 O! _
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
1 N0 u% R3 N! O5 ^4 Z, g}: U" ]7 x5 d1 {5 @- e3 J
2 D& |+ {6 @* n" W0 ~. ~) Gvoid ChopperWaveform(void)1 o. v$ f3 ^- T& ~
{2 x: a# Y4 d; ^* E0 l; {. m! ?
// 50% 占空比
% c* Z% W0 Y' b8 M, v/ `# { EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);/ Y9 E( s$ n9 t! A# w) {9 _
// 4 分频
3 [# A) N# G2 d& y; q EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
" ~. V, }3 L4 v% |9 n7 W, T* b: S // 单个脉冲宽度
+ l3 z+ r+ F5 N0 P; {' s EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
& Q7 f' |1 }+ K! t* v // 使能斩波子模块
* l+ l* G6 L8 Z EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);) V- O. {8 f/ F Z
}
) e) Y5 u0 `: k$ N0 Q( ^
: v3 {* v/ y! d3 m6 }/****************************************************************************/6 z3 H) C8 s* f: N" v& u$ L
/* */# \" L. B! u7 c6 Y
/* PWM 中断初始化 */: B' X! s* I" x* O* d- M% k6 P
/* */8 W' t8 T/ E; p5 @, t5 l" `4 Q
/****************************************************************************/# O5 ?9 t3 ]5 W
void PWMInterruptInit(void)
' R( B( o6 D; I{: j! ?. C4 w1 l6 o: q' f
// 注册中断服务函数
% j8 {2 D# J% @8 b IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);" j7 R' D6 ~: t
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);* g2 C4 ]5 n2 G, W2 b
: S, W9 b1 s/ w( ?
// 映射中断
$ A7 Z( i2 a" b$ A- J/ R IntChannelSet(SYS_INT_EHRPWM1, 2);/ a8 \/ H- }, `% e; l8 x' A0 m& B
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
$ K: i, G3 D$ F2 P) \, j& }7 w/ C6 j* l9 L& }; ~) f2 I
// 使能中断
7 `# m7 M/ j; s ] IntSystemEnable(SYS_INT_EHRPWM1);
# X, W5 P6 v/ O3 L5 C, ] IntSystemEnable(SYS_INT_EHRPWM1TZ);
3 R9 |4 e7 l# u5 b7 c( U: y! Z}& Z0 H3 T6 L! V# @8 e& u
) T, e* b9 X. F" e k' G9 t/****************************************************************************/
) p# F/ `0 k1 p5 K: r0 E/* */
3 r' }; X+ e5 Q; V+ F/* ARM 中断初始化 */
6 }7 o8 ~ o3 j. u: U7 Z/* */( i! [# q- O9 c
/****************************************************************************/
d! H1 c# ?3 E9 u& M4 ovoid InterruptInit(void)
: l- ?4 |+ B6 _( g2 S& s{: O. Z2 L: f H9 A" i
// 初始化 ARM 中断控制器) Q$ Q: Y! ?* U, \ J( e
IntAINTCInit();
; {6 W4 o% x: s! _$ g( q# F: ~6 P' x0 O" l! j
// 使能 IRQ(CPSR)- a1 U: {7 O9 @# m
IntMasterIRQEnable();
# U& A4 ]: d5 Z9 g D* l0 ?1 n
' y8 x1 @8 w4 b4 N, ~: s3 G* ] // 使能中断(AINTC GER)
! V, ]/ E! S+ C4 d! {* E3 s IntGlobalEnable();. k+ @5 p5 G( J3 T: u- C
$ S0 T- O& ]- M, i5 @
// 使能中断(AINTC HIER)
% {1 ~+ }7 O0 J( \6 t IntIRQEnable();
M; p1 m& Q, L' U8 r}4 A: g% _8 |! F3 I- }' F
8 x8 K6 C! ]# I |
|