| 复用功能 | 没有重映射 | 部分重映射 | 完全重映射 | | TIM3_CH1 | PA6 | PB4 | PC6 | | CH2 | PA7 | PB5 | PC7 | | CH3 | PB0 | PB0 | PC8 | | CH4 | PB1 | PB1 | PC9 |
- /**重映射 tim3 使得PC7 PC8输出Pwm波
8 ~9 d+ `. r6 @7 W6 G; u& w' k9 s! g2 _ - ******************************************************************************
& ~4 l9 U2 X+ f - * @file Project/Template/main.c7 d6 h* q% C. u4 I+ U, J, E
- * @author MCD Application Team
* S5 X1 L6 e$ K0 t A2 f$ Z - * @version V3.0.0
- G5 T) f& [- y/ e8 H4 n% z+ w - * @date 04/06/2009
4 r+ E' J2 ?4 l2 z! M - * @brief Main program body, U- _. J" h5 C ^6 V1 z& W
- ******************************************************************************
2 b; C8 J* T8 w' i; a; ? - * @copy: a8 R; m; A: Q! S
- *
! A' j5 r- t- ] - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS1 m4 v& a+ U! W4 _5 p) {
- * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE7 J7 {9 Q) ~7 Z( B# Z, D0 t
- * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY, n% p! a+ Z! ^5 j: e" I
- * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING) M' a! D2 p: L+ {7 t
- * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE8 W( }1 O: y, i! A2 F- W
- * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.! }% j) b& A" _2 U
- *+ A- M4 Z. N9 n5 z2 f* V' U- y4 t! B
- * <h2><center>© COPYRIGHT 2009 STMicroelectronics</center></h2>! T/ G& |; ?1 S5 w! u) J7 L/ p& S
- */. ~8 R3 k3 E6 z5 { V% u; f
- /* Includes ------------------------------------------------------------------*/
. K( ~- z7 |0 B - #include "stm32f10x.h"4 n/ G3 L. [ e) B
- #include "stm32f10x_tim.h"
5 j/ M/ @4 }! t( h% W - #include "misc.h"1 h4 [- v) I! ]$ B* c
- void GPIO_AFIODeInit(void);//这个函数不能落下,否则不能成功 d1 G# ^5 J# ]2 o. O
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//配置PWM需要使用的结构体声名
- H+ X3 s; ^; J6 L9 m( w8 g0 ^# e - TIM_OCInitTypeDef TIM_OCInitStructure;. y! }/ ~9 D, n0 ^
- u16 CCR3_Val =250;# I) r, L! |9 x, N! _; r6 Z
- u16 CCR4_Val =250;2 T% A2 m5 V% i# y' c7 p8 z
- & P& y5 {: A5 w% z2 a$ n+ O
- void GPIO_Config(void);
+ w$ s; @( ~7 d+ x. M5 h) L - void Timer_Config(void);0 p% d7 y1 M5 p4 i2 e1 s; c
- /**: D0 [- j* @8 e$ }0 ?$ Y
- * @brief Delay program.
3 H0 w f9 Z8 }, p3 T' Q - * @param None
, O( @" ^; g8 [ - * @retval : None8 x7 G+ c' w) z) Z% H3 b0 t
- */
5 D% d( s) X( q* g, x7 H - void Delay (u32 nCount)* S1 h/ A1 l4 h
- {# g- w+ z4 @/ S# k. T+ q8 t: F6 ?
- for(; nCount != 0; nCount--);
/ K+ ]- S1 t6 ]+ n/ q - }
- f1 Q# b( q5 c. ? - /**9 Q, e1 e& I3 A& ~# J
- * @brief Main program.' {+ J5 x- c4 A: @, D* ^1 q- ~7 \1 l
- * @param None& @/ U e; d8 [; ]5 E
- * @retval : None
, j7 V& I/ X* Z# w - */6 a. @1 C% @( E
- int main(void)
2 \1 `8 f/ j& }9 U: _ - {
, L' E6 J' j) f6 u* Y - /* Setup STM32 system (clock, PLL and Flash configuration) */% D( |! Q6 V, L5 P8 }
- SystemInit();
9 ^+ j1 q3 B+ x: A: a& [7 y - GPIO_Config(); c4 k; E# P) R$ b& Q& n1 T
- Timer_Config();# d& q+ R" k+ [; ?
- /* Infinite loop */
) R$ r$ J# D% Z - while (1) {
P+ A, T R! d7 {5 A f - }3 i; [1 Q. @6 O2 U/ y/ ]
- }5 h2 R' c N: {" u
- /**, N6 D) q4 ^8 E5 J5 D. i
- * @brief GPIO_Config program.
4 Y% J' o- J# L1 h - * @param None
) ^# N7 C, k5 I$ E9 @7 U - * @retval : None
* A- |1 j' t: y9 t& f - */
8 Y+ O7 k. R, l5 O" `8 J7 r8 @ - void GPIO_Config(void), ]1 G) [! o4 v9 |
- {( `& i4 y$ v1 F# f6 I
- GPIO_InitTypeDef GPIO_InitStructure; M+ M9 u! ^9 W4 l$ n O* p
- 1 d" C3 y% O \4 N$ ~) K1 g
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
3 S- V2 Q+ d+ \/ \. W -
! `- B& P( k$ D: U, Z5 N- j* H3 V - GPIO_AFIODeInit(); //刚开始没有这个语句,所以一直没有重映射成功
9 X( s& B# [) l0 }% S - GPIO_PinRemapConfig(GPIO_FullRemap_TIM3 , ENABLE); //这个就是重映射功能函数; T' x# S6 v" l- |
- /*GPIOA Configuration: TIM3 channel 3 and 4 as alternate function push-pull */
9 T7 {$ z! h* b" ~! d& P1 Q; }7 U4 k - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;: U$ v3 `; {" C" H9 ~- o& m
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //这里也要注意
! [- ?. @- B; R - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
: a& `3 P- F( I3 M - GPIO_Init(GPIOB, &GPIO_InitStructure); //这四句是为了校验究竟PB0,PB1是否还有PWM输出 & s) |, y# i+ l2 h8 L
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
1 J7 A. F& `/ j: ?! V6 _ - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;7 ], V% f; h6 o8 E0 c5 b! i
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; * ^. R+ q$ c) H4 b/ s! B3 u; X
- GPIO_Init(GPIOC, &GPIO_InitStructure);
( C- g- c* @0 W, A4 p% x$ e - ( J5 W' j5 r$ G4 {1 S
-
W7 N% l- y4 f1 G - }
8 R* k0 L2 U/ z* `3 A8 [ - void Timer_Config(void)
7 l& c$ G& K% ^% j% g/ e+ S - {) x% Z ?' K4 s, x# ~. g
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);1 w- u0 ~( J! h" Q
- 7 f. [+ w* J, `! W% J
- TIM_DeInit(TIM3);; G ~: C. \ R) S9 i
- TIM_TimeBaseStructure.TIM_Period = 999; //在下一个更新事件装入活动的自动重装载寄存器周期的值+ \: d' a) l! n# P* f* l
- TIM_TimeBaseStructure.TIM_Prescaler = 0; // 设置了用来作为 TIMx 时钟频率除数的预分频值! l- F: O2 b: p3 r. M
- TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; + m7 K5 Q0 _. u" P
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
; g3 I9 B0 D. r. v2 c" D - /* PWM1 Mode configuration: Channel3 */2 K* | i: ?* |
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //TIM_OCMode
: Q/ D) [$ C. j4 W% m8 L - TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;3 F6 I; b, J; }" J
- TIM_OCInitStructure.TIM_Pulse = CCR3_Val; //设置了待装入捕获比较寄存器的值8 q. O* p) b0 s) Q( r* X
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //TIM_OCPolarity :TIM 输出比较极性高. Q2 G: P" H1 i# k
- TIM_OC3Init(TIM3, &TIM_OCInitStructure);. e0 W) _# l9 z& X5 p
- TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能或者失能 TIM3 在 CCR3 上的预装载寄存器/ s/ k+ n- ^& b8 ]9 ]2 r
- /* PWM1 Mode configuration: Channel4 */
$ y: _' w# C; G4 u4 c% ^% R% n/ s - TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
* M6 ?; N9 D, @2 }) O% g: Y - TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
. [! q9 a6 e, S3 J7 W - TIM_OC4Init(TIM3, &TIM_OCInitStructure);/ Y. ^' y9 P; g- S2 @0 q
- TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
3 T+ R0 ^# Y5 G4 I - /* TIM3 enable counter */
# B. N. ~4 m7 b% m9 E - TIM_Cmd(TIM3, ENABLE); //开启时钟,别落下
+ L& T8 L0 \$ i: ? - }
4 `" D9 z; K+ ]& b4 m - /**
. `) Y* Q* k2 ]7 I/ P/ }9 S+ N - * @brief EXTI_Config Program.
" Z% \5 Y& t* S+ \8 j - * @param None1 B, `8 H: c5 s6 b: Z! M! F# S
- * @retval : None. }4 L/ I* f! f; s' m5 q+ j
- */7 M& C6 Z$ ~* E& u* \0 n
-
9 F* Z/ E: L7 A) R5 U. n8 \1 x1 n - /**5 J5 f. F7 W# t; d2 b0 |
- * @brief Configures the nested vectored interrupt controller.
4 w, Y3 c$ d4 N* a- q - * @param None _" t3 k1 I- Y. I% z
- * @retval : None/ `' ~. y* o) p$ g$ c6 @
- */1 J" G1 {% _6 T, X) g3 b0 g% D, F
- 5 B1 I- k! ]8 }) Y# [
- #ifdef USE_FULL_ASSERT
3 }, T+ B5 k6 ^( Q2 U - /**
% i# ]4 f( n' m, }7 S3 a - * @brief Reports the name of the source file and the source line number
0 k; A& U k' e4 q( I: a4 X* Y h - * where the assert_param error has occurred./ \4 t" }' T( R- _& {9 h
- * @param file: pointer to the source file name
9 K' G3 Q0 \! g) d" z b p( V - * @param line: assert_param error line source number" S( d' Y- R+ M7 ~' n6 E! z, G
- * @retval : None
2 n( N! i. b! x0 x - */
4 a+ W0 y! p" A1 H - void assert_failed(uint8_t* file, uint32_t line)
& T8 h/ a8 W" n. {. y - {% T& H0 d* o! `- n. m
- /* User can add his own implementation to report the file name and line number,
3 {' } F7 m4 j9 u- e. ^$ f - ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */7 g6 l4 ^2 G" u8 e8 Q0 @
- /* Infinite loop */
) Z9 Z- S6 C1 a r - while (1)
$ E4 T! {; U: n - {
' L. _& F: t! ?$ C' L - }8 |0 L5 |' t4 a
- }. E, T( F* b9 `
- #endif+ ~5 F' w# ~; n
- /**
& b$ I4 ` C& C+ q1 f) h0 n - * @}1 y0 _: d& s/ v9 f/ l
- */
- }8 \' `% E7 m5 }. Z9 ? - ( N4 |8 N8 u" _+ P( _: f: B% d w
- /******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
复制代码
4 ~* l8 b. {3 N1 F! T |