[STM32F1] STM32单片机PWM输出

[复制链接]
 楼主| 734774645 发表于 2016-3-23 10:33 | 显示全部楼层 |阅读模式

环境:

主机:XP

开发环境:MDK4.23

MCU:STM32F103CBT6

说明:

使用内部8M晶振,倍频到64M供给TIM3定时器,PA6(通道1)上产生640K,50%方波

初始化时钟:

  1. //初始化RCC时钟
  2. void init_rcc(void)
  3. {
  4.         //将外设 RCC寄存器重设为缺省值
  5.         RCC_DeInit();
  6.         //内部晶振使能
  7.         RCC_HSICmd(ENABLE);
  8.         //等待工作稳定
  9.         while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);

  10.         //LSI的启动,提供给看门狗时钟
  11.         RCC_LSICmd(ENABLE);                                                                                                //打开LSI
  12.         while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)==RESET);                                //等待直到LSI稳定

  13.         if(1)
  14.         {
  15.                 //使能预取指缓存
  16.                 FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable ) ;
  17.                 //设置 FLASH存储器延时时钟周期数。(设置为延时2个时钟周期)
  18.                 FLASH_SetLatency( FLASH_Latency_2 ) ;
  19.                 //设置AHB时钟(HCLK)(这时设置为=系统时钟)
  20.                 RCC_HCLKConfig( RCC_SYSCLK_Div1 ) ;
  21.                 //设置SDIO的AHB时钟(HCLK2)(这时设置为=HCLK),64M
  22.                 RCC_PCLK2Config( RCC_HCLK_Div1 ) ;
  23.                 //设置APB1外设时钟(HCLK1)(这时设置为=HCLK/2),32M
  24.                 RCC_PCLK1Config( RCC_HCLK_Div2 ) ;
  25.                 // ADCCLK = PCLK2/8,1M
  26.                 RCC_ADCCLKConfig( RCC_PCLK2_Div8 ) ;

  27.                 //PLL的时钟来源及倍频的倍数,此处设置为64MHz
  28.                 RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_16) ;

  29.                 //使能PLL
  30.                 RCC_PLLCmd( ENABLE ) ;
  31.                 //检测PLL是否就绪
  32.                 while( RCC_GetFlagStatus( RCC_FLAG_PLLRDY ) == RESET ) ;
  33.                 //设置PLL为系统时钟
  34.                 RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK ) ;
  35.                 //检测系统的时钟源是否是PLL
  36.                 while( RCC_GetSYSCLKSource() != 0x08 ) ;
  37.         }
  38. }

初始化IO口和定时器:

  1. //设置IO口
  2. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
  3. GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
  4. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  5. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
  6. GPIO_Init(GPIOA, &GPIO_InitStructure);

  7. //设置定时器3
  8. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  9. //重新将Timer设置为缺省值
  10. TIM_DeInit(TIM3);
  11. //采用内部时钟给TIM3提供时钟源
  12. TIM_InternalClockConfig(TIM3);

  13. timInitStruct.TIM_ClockDivision = TIM_CKD_DIV2;                          
  14. timInitStruct.TIM_Prescaler = 0;                                                   //计数频率为64M
  15. timInitStruct.TIM_CounterMode = TIM_CounterMode_Up;                 //向上计数
  16. timInitStruct.TIM_RepetitionCounter = 0;
  17. timInitStruct.TIM_Period = 100;                                                         //这个值实际上就是TIMX->ARR,延时开始时重新设定即可

  18. TIM_TimeBaseInit(TIM3, &timInitStruct);

  19. //设置PWM输出
  20. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  21. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  22. TIM_OCInitStructure.TIM_Pulse = 50;
  23. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  24. TIM_OC1Init(TIM3, &TIM_OCInitStructure);
  25. TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

  26. //ARR预装载缓冲器使能
  27. TIM_ARRPreloadConfig(TIM3, ENABLE);
  28. //开启定时器
  29. TIM_Cmd(TIM3, ENABLE);                                                                                


 楼主| 734774645 发表于 2016-3-23 10:34 | 显示全部楼层
输出波形:
1339571457_2262.jpg
Snow7 发表于 2016-3-23 22:19 | 显示全部楼层
波形很漂亮,感谢分享
mmuuss586 发表于 2016-3-24 08:15 | 显示全部楼层

谢谢分享;
 楼主| 734774645 发表于 2016-4-12 12:31 | 显示全部楼层
使用内部8M晶振,倍频到64M供给TIM3定时器,PA6(通道1)上产生640K,50%方波,根据需求还可以自己修改。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

210

主题

3585

帖子

15

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

210

主题

3585

帖子

15

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