| 复用功能 | 没有重映射 | 部分重映射 | 完全重映射 | | TIM3_CH1 | PA6 | PB4 | PC6 | | CH2 | PA7 | PB5 | PC7 | | CH3 | PB0 | PB0 | PC8 | | CH4 | PB1 | PB1 | PC9 |
- /**重映射 tim3 使得PC7 PC8输出Pwm波 @4 G$ v: j: w1 [6 g/ P
- ******************************************************************************- C6 P# n5 _* S! ~) D
- * @file Project/Template/main.c
, F. t S! I; @4 j1 Z- T( V - * @author MCD Application Team
S0 `( e, y8 e* v3 _: _) |& Y9 h - * @version V3.0.03 l* T8 e. S8 K o& H9 M6 o
- * @date 04/06/2009
3 s, G6 ^% I% x- V6 t. z- G - * @brief Main program body" y7 r+ c+ z5 p
- ******************************************************************************0 k$ O2 O `9 L1 h
- * @copy' U5 l5 x7 P: {
- */ p3 a/ G" j5 H+ t
- * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS5 W) o% M, ^ y6 c* k) |
- * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE% M8 M3 B+ {9 C, ^4 v o% s! \/ Y
- * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY" M2 I$ j5 G/ J) M5 r- V
- * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING3 H, W! r/ t, R% M6 q+ v$ L% \
- * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
_3 Y3 i& \1 M# l0 w1 ^ - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.4 F/ \4 I `& m# d1 }% W: t
- *
9 ]. `" D# _& o+ ` c% d& f0 t - * <h2><center>© COPYRIGHT 2009 STMicroelectronics</center></h2>
( e3 `' ]; |0 [6 t1 G1 {7 Z# f: w - */+ D1 ^. ^( D6 T, F+ Y# e
- /* Includes ------------------------------------------------------------------*/2 T# k: e; w! t& W
- #include "stm32f10x.h"; F) I8 f: Y3 X7 h
- #include "stm32f10x_tim.h", G, s( ~' }- P' k$ o; g
- #include "misc.h"$ C# L; G ?- b) K
- void GPIO_AFIODeInit(void);//这个函数不能落下,否则不能成功8 f2 U ] Z$ n/ C* o x: L
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//配置PWM需要使用的结构体声名
( J5 K( I: x$ U6 M! @ - TIM_OCInitTypeDef TIM_OCInitStructure;
" e' ?6 |- F; G! q - u16 CCR3_Val =250;+ `1 l, h, @1 ]% e/ x" s. \. x2 `* Y
- u16 CCR4_Val =250;
7 K$ ]; [, c6 y, \ - 6 _; C$ F' T+ S. I3 N3 C
- void GPIO_Config(void);
+ N, f7 M' [# H% W. J7 v - void Timer_Config(void);4 l9 N( T4 M6 f3 I& u4 Z
- /**/ r& R; }2 s" ?
- * @brief Delay program.
/ h4 R6 {' j C' v4 t - * @param None. L& l# Q2 u4 f) s" N8 h/ T
- * @retval : None
2 j8 d+ R; U5 B; R$ C6 L0 A - */0 y( O1 X) e' t
- void Delay (u32 nCount)- b2 ~8 R7 z* Z+ D) K; ~$ ]' u7 G2 I
- {; e" A# `) `- i }0 T h9 _2 ` h+ S
- for(; nCount != 0; nCount--);& f; F6 \& P5 Y& P/ ~$ h
- }% H2 o, j; [$ z: Y) m
- /**! ?) K: t! R) w, `, f- J: | y
- * @brief Main program.
* y% O* f$ H! Q- _. O - * @param None
5 q8 l" e4 `2 C! o" z J - * @retval : None, T6 W6 Z' c. n' X4 y
- */4 s3 h; E/ O% I8 T2 j% j; S
- int main(void)+ k3 h& N3 W6 j* V$ l& }# Q0 B
- {
# R' ]7 s- P6 H5 z" C- r- F - /* Setup STM32 system (clock, PLL and Flash configuration) */8 ~+ S' R/ V' i% f M. {
- SystemInit(); Z* d* `) q' U ~. Z5 S$ g) I* j% J
- GPIO_Config();( I$ l7 X) P( L& U
- Timer_Config();& b$ \& j6 V3 V2 V1 P8 |( e4 C
- /* Infinite loop */- v9 T$ [$ N4 D
- while (1) {, A% ~' o, ~! V4 M' q( V
- }
3 U" V: O, Z |1 e' o# }; | - }
; R2 M$ q6 J' J4 L8 a& q - /**, M( ~- Y" u4 F2 `2 l% [* B, P
- * @brief GPIO_Config program.7 l/ @# q0 C: `
- * @param None
0 H8 d8 \2 I0 K$ {- [ - * @retval : None; y/ \" l% n/ C& Z# S
- */3 e V2 L$ [7 I, [& i
- void GPIO_Config(void)6 g+ f' h8 B+ |9 U- Z" i- Y
- {* N; L9 b, O, }) E
- GPIO_InitTypeDef GPIO_InitStructure;
8 v4 _" e& o- _ M [" B C - ! \8 R! H% I5 W) e( N
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
% Y _# l c. H, I# |- d5 V e8 L -
3 g* k3 g3 C8 @. i - GPIO_AFIODeInit(); //刚开始没有这个语句,所以一直没有重映射成功7 X7 p L+ f% G( D( d; _
- GPIO_PinRemapConfig(GPIO_FullRemap_TIM3 , ENABLE); //这个就是重映射功能函数6 C$ g% o% u9 Q' T' ]4 M* D& H, B
- /*GPIOA Configuration: TIM3 channel 3 and 4 as alternate function push-pull */7 r$ \. D; P+ v* u
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
2 A. |4 W3 G/ l - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //这里也要注意. z* f* {, J8 V$ n2 x& G
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 2 ^5 p9 T+ B, ]: E' o0 H
- GPIO_Init(GPIOB, &GPIO_InitStructure); //这四句是为了校验究竟PB0,PB1是否还有PWM输出
0 U6 S& L5 c4 c. L" u - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
8 J* Y2 `/ S t A& |) s- k - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;- @# S$ f9 }2 q
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
6 m1 k. Z6 o; ^, ? - GPIO_Init(GPIOC, &GPIO_InitStructure);
' r0 A3 t/ A1 E6 O n -
q/ X: r# y b: } -
" j" _- d1 g0 B8 u: H1 f - }! z' r9 X! b W+ e1 l, {
- void Timer_Config(void): V' {" m* s0 b$ K
- {
! R- c! o0 m- U5 w( N0 v: o - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);* N6 p. \1 f5 G- a, P
- 7 ?8 B/ a: | a( [0 y$ C" S0 h
- TIM_DeInit(TIM3);
+ m0 z, G& ?; e7 m& J% J5 r - TIM_TimeBaseStructure.TIM_Period = 999; //在下一个更新事件装入活动的自动重装载寄存器周期的值. n$ C: j; w) C! e
- TIM_TimeBaseStructure.TIM_Prescaler = 0; // 设置了用来作为 TIMx 时钟频率除数的预分频值
2 L8 Q8 _! P4 R) I# f8 d - TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
" ?3 f& `" j/ D @5 Y& i - TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
+ a0 e: ?7 K2 q9 S3 J( K - /* PWM1 Mode configuration: Channel3 */1 ]& s M! w: k- E0 [3 `0 O- _8 v8 c
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //TIM_OCMode: f3 Q U5 e% n {1 O, n) C" }
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
& c0 ?# _, f) E( B& f - TIM_OCInitStructure.TIM_Pulse = CCR3_Val; //设置了待装入捕获比较寄存器的值. b& ]) u3 s7 c1 h/ _- I
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //TIM_OCPolarity :TIM 输出比较极性高/ E* W+ y! b# d9 |$ l3 t* Z
- TIM_OC3Init(TIM3, &TIM_OCInitStructure);
% W3 n2 w. x; z- W8 s3 M - TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能或者失能 TIM3 在 CCR3 上的预装载寄存器9 n$ _* f$ A7 ?9 U* n
- /* PWM1 Mode configuration: Channel4 */5 g3 n; O: o* W9 Z
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; . F5 _+ q2 _4 {
- TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
: |6 Y- f& i6 m( T" A - TIM_OC4Init(TIM3, &TIM_OCInitStructure);
1 W2 q% r9 y# [# F2 ^ - TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
( o7 m: w1 F. z9 J; Y - /* TIM3 enable counter */
1 ^$ q1 w' |: C( l - TIM_Cmd(TIM3, ENABLE); //开启时钟,别落下% a& Y/ u! L7 d1 b, [+ E
- }
* R, |# O W) l* P - /** J5 B: w+ t" V b+ Y( a; f6 t
- * @brief EXTI_Config Program.
0 q: F" s# ^7 A( b. M6 N - * @param None5 I9 ^- M) p3 l3 c
- * @retval : None1 z$ h' y# V3 \; J. Y8 h) u
- */1 c3 ?9 u# _" a- h7 `0 k
- 2 _5 H& R; }2 f& v$ E" N, W
- /**
( F, o" a' s* X# K p/ y" k - * @brief Configures the nested vectored interrupt controller.. A8 I( q, T4 Q
- * @param None
0 t) T: K8 O. ^* l+ a6 J* I$ O" @ - * @retval : None
$ b. o# y+ |9 B4 ` - */- j: Z4 I2 p- r& X
- ) m& R5 q" e+ ]0 e/ h
- #ifdef USE_FULL_ASSERT
3 g+ }* o, s9 H9 ~$ z: O - /**
. l& [& P, r3 ?! a% Y& _ - * @brief Reports the name of the source file and the source line number
3 M* f+ v- o% H, G Q - * where the assert_param error has occurred.; R& f0 q& K/ S( v- P) s
- * @param file: pointer to the source file name
! a1 H A4 ?& S3 R/ j2 I+ n - * @param line: assert_param error line source number6 k% F) m- _ s8 Z2 s* b6 O
- * @retval : None
. O. A" }9 G& G% `' S; G - */, g1 [8 }, Z4 u6 |& D1 t3 s: s1 b v
- void assert_failed(uint8_t* file, uint32_t line), D( ]% N- q7 [, e. j; s. k
- {
6 h* n8 _5 \- O# k; M e! { - /* User can add his own implementation to report the file name and line number,
@3 K; @: ~9 ]7 j/ w2 x - ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
' ]5 ^) B' G( u2 Z+ @ - /* Infinite loop */! V2 F2 L% I6 V5 Z+ R. J- P
- while (1)
9 W# h0 B4 j- S+ v! W - {
$ ^" ~( ^$ U! x. f7 C, O8 g5 } - }, w# d7 V6 v; O7 Z
- }3 I/ `9 W4 Q/ |; B' e
- #endif
0 j8 H/ p4 `. } A - /**
2 Z; k) L, H$ ~0 ~ - * @}* }+ Q- }7 T8 i6 i8 Q; \
- */0 ~& N9 h& L/ {* A4 T6 B3 C
-
. Q. z, I0 i* o" o5 x1 m9 Y6 } - /******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
复制代码
) p. f& ~7 [6 y t |