[应用相关] STM32PWM输出实现LED灯渐亮渐灭

[复制链接]
 楼主| huangcunxiake 发表于 2017-1-13 23:24 | 显示全部楼层 |阅读模式
本帖最后由 huangcunxiake 于 2017-1-13 23:29 编辑

  1. *说明:
  2. *PA0:KEY1;PA1:KEY2;
  3. *PA2:LED1;PA3:LED2;
  4. *PA9:USART1_TX;PA10:USART1_RX
  5. */
  6. #include "stm32f10x.h"
  7. #include "stm32f10x_rcc.h"
  8. #include "stm32f10x_gpio.h"
  9. #include "stm32f10x_tim.h"
  10. #include "stm32f10x_pwr.h"
  11. #include "stm32f10x_exti.h"
  12. #include "system_stm32f10x.h"
  13. #include "misc.h"

  14. void RCC_Configuration(void);
  15. void GPIO_Configuration(void);
  16. void TIM2_Configuration(void);
  17. void delay_ms(u16 time);

  18. int main()
  19. {
  20.     u8 led_fx=1;
  21.     u16 led_dt=0;
  22.    
  23.     RCC_Configuration();
  24.     GPIO_Configuration();
  25.     TIM2_Configuration();
  26.                
  27.     while(1)
  28.     {
  29.       delay_ms(10);
  30.       if(led_fx==1)
  31.       {
  32.         led_dt++;
  33.       }else{
  34.         led_dt--;
  35.       }
  36.       
  37.       if(led_dt>100) led_fx=0;//可以和初始值一样
  38.       if(led_dt==0)  led_fx=1;
  39.       
  40.       TIM_SetCompare3(TIM2,led_dt);//通道3没有重影像是PA2对应LED1
  41.       TIM_SetCompare4(TIM2,led_dt);//通道4没有重影像是PA3对应LED2
  42.     }
  43. }

  44. void RCC_Configuration(void)  
  45. {   
  46.   SystemInit();
  47.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   
  48.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
  49.   //GPIO_AFIODeInit();和下面相同效果,可以查看源码证明
  50.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  51. }

  52. void GPIO_Configuration(void)  
  53. {  
  54.   GPIO_InitTypeDef GPIO_InitStructure;  
  55.   
  56.   //GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2,ENABLE);//端口映射函数
  57.   
  58.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;//GPIO_Pin_3对应channel3,主函数改为:TIM_SetCompare3
  59.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  60.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  61.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  62. }

  63. void TIM2_Configuration(void)  
  64. {
  65.   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  66.   TIM_OCInitTypeDef TIM_OCInitStructure;
  67.   
  68.   TIM_DeInit(TIM2);
  69.   TIM_InternalClockConfig(TIM2);
  70.   //定时器初始化
  71.   TIM_TimeBaseStructure.TIM_Period = 100-1;//初始值是100,2MHz=2000KHz,2MHz/100=0.02MHz,所有周期T=1/0.02MHz=50us,示波器显示周期应该为50us
  72.   TIM_TimeBaseStructure.TIM_Prescaler = 36-1;//36倍分频,72MHz/36=2MHz
  73.   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  74.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  75.   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  76.   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  77.   
  78.   //PWM初始化
  79.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  80.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  81.   TIM_OCInitStructure.TIM_Pulse = 50;//占空比值是50,所以占空比是:50/100=50%
  82.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  83.   TIM_OC3Init(TIM2,&TIM_OCInitStructure);
  84.   
  85.   TIM_OCInitStructure.TIM_Pulse = 20;
  86.   TIM_OC4Init(TIM2,&TIM_OCInitStructure);
  87.   //TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);
  88.   //TIM_ARRPreloadConfig(TIM2, ENABLE);
  89.   TIM_Cmd(TIM2,ENABLE);
  90.   TIM_CtrlPWMOutputs(TIM2,ENABLE);
  91. }
  92. void delay_ms(u16 time)   
  93. {  
  94.   u16 i=0;  
  95.   while(time--)   
  96.   {  
  97.     i=12000;  
  98.     while(i--);  
  99.   }  
  100. }  
  101. </font>


 楼主| huangcunxiake 发表于 2017-1-13 23:31 | 显示全部楼层

Stm32共有11个定时器:

1.两个高级定时器:TIM1、TIM8-------------------------APB2

2.四个通用定时器:TIM2~TIM5-------------------------APB1

3.两个基本定时器:TIM6、TIM7-------------------------APB1

4.两个看门狗

5.一个系统嘀嗒定时器(SysTick)

/*
*说明:
*PA0:KEY1;PA1:KEY2;
*PA2:LED1;PA3:LED2;
*PA9:USART1_TX;PA10:USART1_RX
*/
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_exti.h"
#include "system_stm32f10x.h"
#include "misc.h"


void RCC_Configuration(void);
void GPIO_Configuration(void);
void TIM3_Configuration(void);
void NVIC_Configuration(void);


int main()
{
    SystemInit();
   
    RCC_Configuration();
    GPIO_Configuration();
    TIM3_Configuration();
    NVIC_Configuration();
                                                            
    while(1);
}


void RCC_Configuration(void)  
{   
  ////USART2和USART3都在在APB1上而USART1是在APB2上的
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);   
}


void GPIO_Configuration(void)  
{  
  GPIO_InitTypeDef GPIO_InitStructure;  
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}


void TIM3_Configuration(void)  
{
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  
  TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
  
  TIM_TimeBaseStructure.TIM_Period = 2000;//频率:72MHz  72000000/36000=2000
  TIM_TimeBaseStructure.TIM_Prescaler = 35999;//36000-1=35999
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  
  TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE );
  TIM_Cmd(TIM3,ENABLE);
}


void NVIC_Configuration(void)//配置中断优先级  
{  
  NVIC_InitTypeDef NVIC_InitStructure;  
   
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  
   
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  NVIC_Init(&NVIC_InitStructure);  
}  


 楼主| huangcunxiake 发表于 2017-1-13 23:31 | 显示全部楼层
中断函数stm32f10x_it.c


#include "..\include\stm32f10x.h"
#include "..\include\stm32f10x_it.h"
#include "..\include\stm32f10x_gpio.h"
#include "..\include\stm32f10x_tim.h"

void TIM3_IRQHandler(void)
{
  TIM_ClearITPendingBit(TIM3, TIM_IT_Update);

  if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)==Bit_RESET)
  {
    GPIO_SetBits(GPIOA,GPIO_Pin_2);
  }else{
    GPIO_ResetBits(GPIOA,GPIO_Pin_2);
  }
}


 楼主| huangcunxiake 发表于 2017-1-13 23:34 | 显示全部楼层
中断函数声明头文件stm32f10x_it.h:
  1. #ifndef __STM32F10x_IT_H
  2. #define __STM32F10x_IT_H

  3. /* Includes ------------------------------------------------------------------*/
  4. /* Exported types ------------------------------------------------------------*/
  5. /* Exported constants --------------------------------------------------------*/
  6. /* Exported macro ------------------------------------------------------------*/
  7. /* Exported functions ------------------------------------------------------- */  
  8. void NMIException(void);
  9. void HardFaultException(void);
  10. void MemManageException(void);
  11. void BusFaultException(void);
  12. void UsageFaultException(void);
  13. void DebugMonitor(void);
  14. void SVCHandler(void);
  15. void PendSVC(void);
  16. void SysTickHandler(void);
  17. void WWDG_IRQHandler(void);
  18. void PVD_IRQHandler(void);
  19. void TAMPER_IRQHandler(void);
  20. void RTC_IRQHandler(void);
  21. void FLASH_IRQHandler(void);
  22. void RCC_IRQHandler(void);
  23. void EXTI0_IRQHandler(void);
  24. void EXTI1_IRQHandler(void);
  25. void EXTI2_IRQHandler(void);
  26. void EXTI3_IRQHandler(void);
  27. void EXTI4_IRQHandler(void);
  28. void DMA1_Channel1_IRQHandler(void);
  29. void DMA1_Channel2_IRQHandler(void);
  30. void DMA1_Channel3_IRQHandler(void);
  31. void DMA1_Channel4_IRQHandler(void);
  32. void DMA1_Channel5_IRQHandler(void);
  33. void DMA1_Channel6_IRQHandler(void);
  34. void DMA1_Channel7_IRQHandler(void);
  35. void ADC1_2_IRQHandler(void);
  36. void USB_HP_CAN_TX_IRQHandler(void);
  37. void USB_LP_CAN_RX0_IRQHandler(void);
  38. void CAN_RX1_IRQHandler(void);
  39. void CAN_SCE_IRQHandler(void);
  40. void EXTI9_5_IRQHandler(void);
  41. void TIM1_BRK_IRQHandler(void);
  42. void TIM1_UP_IRQHandler(void);
  43. void TIM1_TRG_COM_IRQHandler(void);
  44. void TIM1_CC_IRQHandler(void);
  45. void TIM2_IRQHandler(void);
  46. void TIM3_IRQHandler(void);
  47. void TIM4_IRQHandler(void);
  48. void I2C1_EV_IRQHandler(void);
  49. void I2C1_ER_IRQHandler(void);
  50. void I2C2_EV_IRQHandler(void);
  51. void I2C2_ER_IRQHandler(void);
  52. void SPI1_IRQHandler(void);
  53. void SPI2_IRQHandler(void);
  54. void USART1_IRQHandler(void);
  55. void USART2_IRQHandler(void);
  56. void USART3_IRQHandler(void);
  57. void EXTI15_10_IRQHandler(void);
  58. void RTCAlarm_IRQHandler(void);
  59. void USBWakeUp_IRQHandler(void);
  60. void TIM8_BRK_IRQHandler(void);
  61. void TIM8_UP_IRQHandler(void);
  62. void TIM8_TRG_COM_IRQHandler(void);
  63. void TIM8_CC_IRQHandler(void);
  64. void ADC3_IRQHandler(void);
  65. void FSMC_IRQHandler(void);
  66. void SDIO_IRQHandler(void);
  67. void TIM5_IRQHandler(void);
  68. void SPI3_IRQHandler(void);
  69. void UART4_IRQHandler(void);
  70. void UART5_IRQHandler(void);
  71. void TIM6_IRQHandler(void);
  72. void TIM7_IRQHandler(void);
  73. void DMA2_Channel1_IRQHandler(void);
  74. void DMA2_Channel2_IRQHandler(void);
  75. void DMA2_Channel3_IRQHandler(void);
  76. void DMA2_Channel4_5_IRQHandler(void);
  77.                                          
  78. #endif /* __STM32F10x_IT_H */

  79. /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/


您需要登录后才可以回帖 登录 | 注册

本版积分规则

222

主题

3700

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部

222

主题

3700

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部