中级会员
 
- 积分
- 208
- 金钱
- 208
- 注册时间
- 2018-4-9
- 在线时间
- 111 小时
|
5金钱
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "PWM.h"
/***************************************************************************
*名 称:TIM3_PWM_Init() 2018.4.14
*功 能:初始化定时器3
*输 入:无
*输 出:无
*说 明:使用TIM3 CH输出PWM波
**************************************************************************/
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//使能初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能PA7
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|
RCC_APB2Periph_AFIO, ENABLE); //使能 GPIO 和 AFIO 复用功能时钟
//GPIO口初始化 //设置该引脚为复用输出功能,输出 TIM3 CH2 的 PWM 脉冲波形
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM_CH2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速率50Hz
GPIO_Init(GPIOA, &GPIO_InitStructure); //①初始化 GPIO
//初始化 TIM3
RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //①使能定时器 3 时钟
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE); //
TIM_TimeBaseStructure.TIM_Period = arr; //设置在自动重装载周期值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //③初始化 TIM3
//初始化 TIM3 Channel2 PWM 模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择 PWM 模式 1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
TIM_OCInitStructure.TIM_Pulse = 145; //设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
TIM_OC2Init(TIM1, &TIM_OCInitStructure); //④初始化外设 TIM3 OC2
TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能预装载寄存器
TIM_ARRPreloadConfig(TIM1, ENABLE); // 使能 TIM3 重载寄存器 ARR
TIM_Cmd(TIM1, ENABLE); //⑤使能 TIM3
}
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08);
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO, ENABLE);
}
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "PWM.h"
int main(void)
{
u16 pwmval=0;
u8 dir=1;
delay_init();
RCC_Configuration();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置 NVIC 中断分组 2
TIM3_PWM_Init(899,1430);
while(1)
{
delay_ms(100);
if(dir)
pwmval++;
else
pwmval--;
if(pwmval>949)
dir=0;
if(pwmval==899)
dir=1;
TIM_SetCompare2(TIM3,100);
}
}
请问大佬为啥不能用啊
|
|