/**********************************************************************/
/* 利用定时器3通道4发PWM波 */
/* 引脚PB1发出PWM波 */
/**********************************************************************/
#include "stm32f10x.h"
#include "stm32f10x_flash.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_tim.h"
/**********************************************************************/
/*变量声明 */
/* */
/**********************************************************************/
/**********************************************************************/
/*函数声明 */
/* */
/**********************************************************************/
void Rcc_Init(void);
//时钟初始化函数
void Gpio_Init(void);
//端口初始化函数
void Time_Init(void);
//定时器配置
void Delay_ms(unsigned int delay_ms);
void Delay_us(unsigned int delay_us);
//延迟函数
/**********************************************************************/
/* 时钟设置 */
/* */
/**********************************************************************/
void Rcc_Init(void)
{
ErrorStatus HSEStartUpStatus;
RCC_HSEConfig(RCC_HSE_ON);
//外部高速时钟使能
HSEStartUpStatus = RCC_WaitForHSEStartUp();
//获取HSE时钟状态
if(HSEStartUpStatus ==SUCCESS)
//等待高速时钟稳定
{
FLASH_SetLatency(FLASH_Latency_2);
//FALSH时序延迟几个周期,等待总线同步操作
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//开启FLASH预读缓冲功能,加速FLASH的读取。
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
//PLL时钟为HSE时钟,9倍频(72MHZ)
RCC_PLLCmd(ENABLE);
//使能PLL时钟
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//AHB时钟=系统时钟
RCC_PCLK1Config(RCC_HCLK_Div2);
//AHB1时钟=系统时钟/2
RCC_PCLK2Config(RCC_HCLK_Div1);
//APB2时钟=系统时钟
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
//等待PLL稳定
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//选择PLL为系统时钟
while(RCC_GetSYSCLKSource()!=0x08);
//切换时钟后等待系统时钟稳定
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//使能GPIOB的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//使能定时器3
}
/**********************************************************************/
/* 端口设置 */
/* */
/**********************************************************************/
void Gpio_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/**********************************************************************/
/* 定时器配置 */
/* */
/**********************************************************************/
void Time_Init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//定时器初始化结构
TIM_OCInitTypeDef TIM_OCInitStructure;
//定时器通道输出初始化结构
TIM_TimeBaseStructure.TIM_Period=2;
//定时器装入初值
TIM_TimeBaseStructure.TIM_Prescaler=1;
//定时器预分频值
TIM_TimeBaseStructure.TIM_ClockDivision=0;
//时钟分割
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
//定时器向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
//配置定时器3
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
//输出比较时间模式
TIM_OCInitStructure.TIM_Pulse=1;
//设置待装入捕捉比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//设定为输出
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
//输出比较极性设置为高
TIM_OC4Init(TIM3,&TIM_OCInitStructure);
//通道4初始化
TIM_Cmd(TIM3,ENABLE);
//启动TIM3
}
/**********************************************************************/
/* 延迟函数 */
/* */
/**********************************************************************/
void Delay_ms(unsigned int delay_ms)
{
unsigned int ms;
while(delay_ms--)
{
ms=10000;
while(ms--);
}
}
void Delay_us(unsigned int delay_us)
{
unsigned int us;
while(delay_us--)
{
us=10;
while(us--);
}
}
/**********************************************************************/
/* 主函数 */
/* */
/**********************************************************************/
int main(void)
{
Rcc_Init();
//初始化时钟
Gpio_Init();
//初始化端口
Time_Init();
//定时器初始化
while(1)
{
}
}
评论0