#include "stm32f10x_lib.h"
void RCC_cfg();
void GPIO_cfg();
void TIMER_cfg();
void PWM_cfg();
//占空比,取值范围为 0-100
int dutyfactor = 50;
int main()
{
int Temp;
RCC_cfg();
GPIO_cfg();
TIMER_cfg();
PWM_cfg();
//使能 TIM3 计时器,开始输出 PWM
TIM_Cmd(TIM3, ENABLE);
while(1);
}
void RCC_cfg()
{
//定义错误状态变量
ErrorStatus HSEStartUpStatus;
//将 RCC 寄存器重新设置为默认值
RCC_DeInit();
//打开外部高速时钟晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待外部高速时钟晶振工作
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
//设置 AHB 时钟(HCLK)为系统时钟
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//设置高速 AHB 时钟(APB2)为 HCLK 时钟
RCC_PCLK2Config(RCC_HCLK_Div1);
//设置低速 AHB 时钟(APB1)为 HCLK 的 2 分频
RCC_PCLK1Config(RCC_HCLK_Div2);
//设置 FLASH 代码延时
FLASH_SetLatency(FLASH_Latency_2);
//使能预取指缓存
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//设置 PLL 时钟,为 HSE 的 9 倍频 8MHz * 9 = 72MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
//使能 PLL
RCC_PLLCmd(ENABLE);
//等待 PLL 准备就绪
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
//设置 PLL 为系统时钟源
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//判断 PLL 是否是系统时钟
while(RCC_GetSYSCLKSource() != 0x08);
}
//开启 TIM3 的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//开启 GPIOB 的时钟和复用功能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |
RCC_APB2Periph_AFIO,ENABLE);
}
void GPIO_cfg()
{
GPIO_InitTypeDef GPIO_InitStructure;
//部分映射,将 TIM3_CH2 映射到 PB5
//
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
//选择引脚 5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
//输出频率最大 50MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//复用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void TIMER_cfg()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//重新将 Timer 设置为缺省值
TIM_DeInit(TIM3);
//采用内部时钟给 TIM3 提供时钟源
TIM_InternalClockConfig(TIM3);
//预分频系数为 0,即不进行预分频,此时 TIMER 的频率为 72MHz
TIM_TimeBaseStructure.TIM_Prescaler = 0;
//设置时钟分割
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//设置计数器模式为向上计数模式
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//设置计数溢出大小,每计 7200 个数就产生一个更新事件,即 PWM 的输出频率
为 10kHz
TIM_TimeBaseStructure.TIM_Period = 7200 - 1;
//将配置应用到 TIM3 中
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
}
void PWM_cfg()
{
TIM_OCInitTypeDef TimOCInitStructure;
//设置缺省值
TIM_OCStructInit(&TimOCInitStructure);
//PWM 模式 1 输出
TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
//设置占空比,占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100%
TimOCInitStructure.TIM_Pulse = dutyfactor * 7200 / 100;
//TIM 输出比较极性高
TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//使能输出状态
TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//TIM3 的 CH2 输出
TIM_OC2Init(TIM3, &TimOCInitStructure);
//设置 TIM3 的 PWM 输出为使能
TIM_CtrlPWMOutputs(TIM3,ENABLE);
}