9回答

0收藏

【魔方团】STM32F4之PWM配置

#竞赛 #竞赛 10509 人阅读 | 9 人回复 | 2013-08-15

我用的编译器是IAR,至于怎么在IAR下建立工程文件,就按照附件中“我的stm32f4学习历程”跟着建立。
另外,如果是用官方的F4-DISCOVERY板子,需注意,板子上的HSE为8M,而我们下载的官方库文件下默认为25M,在启动文件中会自动调用system_init()这个函数讲系统时钟设为168M,我们需要修改的地方有两处
1.system_stm32f4xx.c文件中
#define PLL_M      8原本为25。改为8(也可根据自己想设定的总线时钟进行修改,但最高不超过168M)
2.stm32f4xx.h文件中
#define HSE_VALUE    ((uint32_t)8000000)原本为25000000现在改为8000000.这样时钟配置就完成了。
接下来看PWM的配置:
使用通用定时器3,4,每个定时器有4个通道,来产生8路PWM。




PS.第一次发帖,可能有些错误,望指出共同学习参考。

分享到:
回复

使用道具 举报

回答|共 9 个

倒序浏览

沙发

dsgthlr_3008853

发表于 2013-8-15 09:00:54 | 只看该作者

附件附件附件附件

我的stm32f4学习历程.pdf

4.95 MB, 下载次数: 82

板凳

lijian891126

发表于 2013-8-15 09:02:12 | 只看该作者

看看。。。。。。。。。。
地板

KdianC

发表于 2013-8-15 09:11:13 | 只看该作者

参观一下的路过
5#

蒲公英哭泣三毛

发表于 2013-8-15 20:33:49 | 只看该作者

飘过。。。。。。。。。。。。
6#

Fortware-424250

发表于 2013-8-16 12:28:45 | 只看该作者

参观一下的路过
7#

lsj306

发表于 2013-8-16 13:01:27 | 只看该作者

这是什么开发环境呢。。。。。。
8#

corecode

发表于 2013-8-18 23:43:15 来自手机 | 只看该作者

lsj306 发表于 2013-8-16 13:01
这是什么开发环境呢。。。。。。


iar自己改了改配色
9#

crazy78

发表于 2017-1-29 05:50:33 | 只看该作者

  1. #include <stm32f4xx.h>

  2. volatile u8 state = 0;
  3. const u16 TIM3_CCR1[] = {240,240,60,60,60,60,60,60,60,540};
  4. #define STATE_COUNT (sizeof(TIM3_CCR1)/sizeof(u16 ))
  5. static void TIM3_Config(void);
  6. int main()
  7. {
  8.   TIM3_Config();
  9.   TIM3->ARR = 65535;//Prescaler               
  10.   TIM3->PSC = 100;//Period         
  11.   TIM3->CCMR1 |= 0x3030;//ToggleMode
  12.   TIM3->CCMR2 |= 0x3030;//Toggle Mode
  13.   TIM3->CCER |= 0x1111;//Capture Compare 1 output enable //CaptureCompare 1 output PolarityHigh
  14.   TIM3->CCR1  = 240;// Duty  
  15.   TIM3->CCR2  = 140;// Duty  
  16.   TIM3->CCR3  = 540;// Duty
  17.   TIM3->CCR4  = 640;// Duty  
  18.   TIM3->CR1        |= 0x0001;//Counter enabled
  19.   TIM3->DIER |= 0x001E;//Capture Compare 1 interrupt enable
  20.   while(1)
  21.   {   
  22.   }
  23. }

  24. static void TIM3_Config(void)
  25. {            
  26.   NVIC_InitTypeDef NVIC_TIM3;  // NVIC structure
  27.   RCC->AHB1ENR   |= 0x00000004; //GPIOC Clock
  28.   RCC->APB1ENR   |= 0x00000002;//TIM3 Clock
  29. GPIOC->MODER   |= 0x000AA000;//PC6,7,8,9 AF Mode
  30. GPIOC->OSPEEDR |= 0x000AA000;//PC6,7,8,9 50MHz
  31. GPIOC->OTYPER  |= 0x00000000;//PC6,7,8,9 Push-pull
  32. GPIOC->PUPDR   |= 0x00055000;//PC6,7,8,9 Pull Up
  33. GPIOC->AFR[0]  |= 0x22000000;//AF2 (TIM3)  PC6-> TIM3_CH1,PC7->CH2
  34. GPIOC->AFR[1]  |= 0x00000022;// PC8->CH3,PC9->CH4
  35.   NVIC->ISER[0]  |= 0x20000000;
  36.   NVIC_TIM3.NVIC_IRQChannelPreemptionPriority = 0;            // Only matters for multiple interrupts
  37.   NVIC_TIM3.NVIC_IRQChannelSubPriority        = 0;            // Only matters for multiple interrupts
  38.   NVIC_TIM3.NVIC_IRQChannelCmd                = ENABLE;       // Enabling global interrupt
  39.   NVIC_Init(&NVIC_TIM3);                                      // Initializing NVIC structure
  40. }
  41. void TIM3_IRQHandler(void)
  42. {
  43.        
  44.    static uint8_t state = 0;
  45.    if(TIM3->SR &0x0002)//CC1
  46.   {
  47.         TIM3->SR &= ~0x0002;
  48.        TIM3->CCR1        += TIM3_CCR1[state];
  49.         if (++state >= STATE_COUNT)
  50.         state = 0;                               
  51.   }
  52. if(TIM3->SR &0x0004)//CC2
  53. {
  54.          static uint8_t state1 = 0;
  55.          TIM3->SR &= ~0x0004;
  56.       if (state1 < 2 || state1 > 8)

  57.       TIM3->CCR2 += 240;
  58.     else
  59.       TIM3->CCR2 += 60;

  60.     if (++state1 > 9)
  61.         state1 = 0;         
  62.          
  63. }
  64.   if(TIM3->SR &0x0008)//CC3
  65. {
  66.          static uint8_t state2 = 0;
  67.          TIM3->SR &= ~0x0008;
  68.    if (state2 < 2 || state2 > 8)

  69.       TIM3->CCR3 += 240;
  70.     else
  71.       TIM3->CCR3 += 60;

  72.     if (++state2 > 9)
  73.         state2 = 0;       
  74.          
  75. }
  76.   if(TIM3->SR &0x0010)//CC4
  77. {
  78.          static uint8_t state3 = 0;
  79.    TIM3->SR &= ~0x0010;
  80.    if (state3 < 2 || state3 > 8)

  81.       TIM3->CCR4 += 200;
  82.     else
  83.       TIM3->CCR4 += 100;

  84.     if (++state3 > 9)
  85.         state3 = 0;       
  86. }
  87. }
复制代码
10#

crazy78

发表于 2017-1-30 01:10:40 | 只看该作者

  1. #include <stm32f4xx.h>

  2. volatile u8 state = 0;
  3. const u16 TIM3_CCR1[] = {240,240,60,60,60,60,60,60,60,540};
  4. #define STATE_COUNT (sizeof(TIM3_CCR1)/sizeof(u16 ))
  5. static void TIM3_Config(void);
  6. int main()
  7. {
  8.   TIM3_Config();
  9.   TIM3->ARR = 65535;//Prescaler               
  10.   TIM3->PSC = 100;//Period         
  11.   TIM3->CCMR1 |= 0x3030;//Toggle Mode
  12.   TIM3->CCMR2 |= 0x3030;//Toggle Mode
  13.   TIM3->CCER |= 0x1111;//Capture Compare 1 output enable //CaptureCompare 1 output PolarityHigh
  14.   TIM3->CCR1  = 240;// Duty  
  15.   TIM3->CCR2  = 140;// Duty  
  16.   TIM3->CCR3  = 540;// Duty
  17.   TIM3->CCR4  = 640;// Duty  
  18.   TIM3->CR1        |= 0x0001;//Counter enabled
  19.   TIM3->DIER |= 0x001E;//Capture Compare 1 interrupt enable
  20.   while(1)
  21.   {   
  22.   }
  23. }

  24. static void TIM3_Config(void)
  25. {            
  26.   NVIC_InitTypeDef NVIC_TIM3;  // NVIC structure
  27.         RCC->AHB1ENR   |= 0x00000004; //GPIOC Clock
  28.   RCC->APB1ENR   |= 0x00000002;//TIM3 Clock
  29.         GPIOC->MODER   |= 0x000AA000;//PC6,7,8,9 AF Mode
  30.   GPIOC->OSPEEDR |= 0x000AA000;//PC6,7,8,9 50MHz
  31.   GPIOC->OTYPER  |= 0x00000000;//PC6,7,8,9 Push-pull
  32.   GPIOC->PUPDR   |= 0x00055000;//PC6,7,8,9 Pull Up
  33.   GPIOC->AFR[0]  |= 0x22000000;//AF2 (TIM3)  PC6-> TIM3_CH1,PC7->CH2
  34.         GPIOC->AFR[1]  |= 0x00000022;// PC8->CH3,PC9->CH4
  35.         NVIC->ISER[0]  |= 0x20000000;
  36.   NVIC_TIM3.NVIC_IRQChannelPreemptionPriority = 0;            // Only matters for multiple interrupts
  37.   NVIC_TIM3.NVIC_IRQChannelSubPriority        = 0;            // Only matters for multiple interrupts
  38.   NVIC_TIM3.NVIC_IRQChannelCmd                = ENABLE;       // Enabling global interrupt
  39.   NVIC_Init(&NVIC_TIM3);                                      // Initializing NVIC structure
  40. }
  41. void TIM3_IRQHandler(void)
  42. {
  43.        
  44.         static uint8_t state = 0;
  45.         if(TIM3->SR &0x0002)//CC1
  46.   {
  47.           TIM3->SR &= ~0x0002;
  48.           TIM3->CCR1        += TIM3_CCR1[state];
  49.     if (++state >= STATE_COUNT)
  50.      state = 0;                               
  51.   }
  52. if(TIM3->SR &0x0004)//CC2
  53. {
  54.          static uint8_t state1 = 0;
  55.          TIM3->SR &= ~0x0004;
  56.    if (state1 < 2 || state1 > 8)

  57.       TIM3->CCR2 += 240;
  58.     else
  59.       TIM3->CCR2 += 60;

  60.     if (++state1 > 9)
  61.         state1 = 0;         
  62.          
  63. }
  64.   if(TIM3->SR &0x0008)//CC3
  65. {
  66.          static uint8_t state2 = 0;
  67.          TIM3->SR &= ~0x0008;
  68.    if (state2 < 2 || state2 > 8)

  69.       TIM3->CCR3 += 240;
  70.     else
  71.       TIM3->CCR3 += 60;

  72.     if (++state2 > 9)
  73.         state2 = 0;       
  74.          
  75. }
  76.   if(TIM3->SR &0x0010)//CC4
  77. {
  78.    static uint8_t state3 = 0;
  79.    TIM3->SR &= ~0x0010;
  80.    if (state3 < 2 || state3 > 8)

  81.       TIM3->CCR4 += 200;
  82.     else
  83.       TIM3->CCR4 += 100;

  84.     if (++state3 > 9)
  85.         state3 = 0;       
  86. }
  87. }
复制代码
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条