Stm32 设置PWN定时器(完整的定时器复用表)多通道设置

目录

定时器复用表:

1、高级定时器设置(tim1,tim8)

2、通用定时器设置(以tim3为例)

3、调用


定时器复用表:

STM32F1xx官方资料:

《STM32中文参考手册V10》-第14章  通用定时器

具体资料自己查看,这个表是自己统计的,不在其中,需要资料可以留个邮箱或者自己百度

1、高级定时器设置(tim1,tim8)

定时器1初始化:(通道1,PA8)(IO与通道号对应查看上表)


//高级定时器1中断初始化
//arr:自动重装值。
//psc:时钟预分频值。
//(((arr+1) * (7199+1)) / 72 )us

void timer1_init(u16 arr,u16 psc)
{
    GPIO_InitTypeDef		GPIO_InitStruct;
    TIM_TimeBaseInitTypeDef	TIM_InitStruct;
    TIM_BDTRInitTypeDef		TIM_BdtrStruct;
    TIM_OCInitTypeDef		TIM_OCInitStruct;
    NVIC_InitTypeDef		NVIC_InitStruct;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM1,ENABLE);

	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
    TIM_InitStruct.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_InitStruct.TIM_Period=arr;
    TIM_InitStruct.TIM_Prescaler=psc;
    TIM_InitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_InitStruct.TIM_RepetitionCounter=0;
    TIM_TimeBaseInit(TIM1,&TIM_InitStruct);

    TIM_BdtrStruct.TIM_AutomaticOutput=TIM_AutomaticOutput_Disable;
    TIM_BdtrStruct.TIM_LOCKLevel=TIM_LOCKLevel_OFF;
    TIM_BdtrStruct.TIM_DeadTime=0;
    TIM_BdtrStruct.TIM_Break=TIM_Break_Disable;
    TIM_BdtrStruct.TIM_BreakPolarity=TIM_BreakPolarity_Low;
    TIM_BdtrStruct.TIM_OSSIState=TIM_OSSIState_Enable;
    TIM_BdtrStruct.TIM_OSSRState=TIM_OSSRState_Enable;
    TIM_BDTRConfig(TIM1,&TIM_BdtrStruct);

    TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;
    TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
    //TIM_OCInitStruct.TIM_OutputNState=TIM_OutputNState_Enable;
    TIM_OCInitStruct.TIM_Pulse=0;
    TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;
    //TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCNPolarity_Low; 
    TIM_OCInitStruct.TIM_OCIdleState=TIM_OCIdleState_Set;
    TIM_OCInitStruct.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
	
    TIM_OC1Init(TIM1,&TIM_OCInitStruct);

    TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
    TIM_ClearFlag(TIM1,TIM_FLAG_Update); 
    TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
    TIM_GenerateEvent(TIM1,TIM_EventSource_Update);
    NVIC_InitStruct.NVIC_IRQChannel=TIM1_UP_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
    NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStruct);

    TIM_SetCompare1(TIM1,0);
    TIM_CtrlPWMOutputs(TIM1,ENABLE);
    TIM_ARRPreloadConfig(TIM1,ENABLE);
    TIM_Cmd(TIM1,ENABLE);        //不要忘了
}

定时器8初始化:(通道2,PC8、7)(IO与通道号对应查看上表)

void timer8_init(u16 arr,u16 psc)
{
    GPIO_InitTypeDef		GPIO_InitStruct;
    TIM_TimeBaseInitTypeDef	TIM_InitStruct;
    TIM_BDTRInitTypeDef		TIM_BdtrStruct;
    TIM_OCInitTypeDef		TIM_OCInitStruct;
    NVIC_InitTypeDef		NVIC_InitStruct;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_TIM8,ENABLE);

	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_8;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_Init(GPIOC,&GPIO_InitStruct);

    TIM_InitStruct.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_InitStruct.TIM_Period=arr;
    TIM_InitStruct.TIM_Prescaler=psc;
    TIM_InitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_InitStruct.TIM_RepetitionCounter=0;
    TIM_TimeBaseInit(TIM8,&TIM_InitStruct);

    TIM_BdtrStruct.TIM_AutomaticOutput=TIM_AutomaticOutput_Disable;
    TIM_BdtrStruct.TIM_LOCKLevel=TIM_LOCKLevel_OFF;
    TIM_BdtrStruct.TIM_DeadTime=0;
    TIM_BdtrStruct.TIM_Break=TIM_Break_Disable;
    TIM_BdtrStruct.TIM_BreakPolarity=TIM_BreakPolarity_Low;
    TIM_BdtrStruct.TIM_OSSIState=TIM_OSSIState_Enable;
    TIM_BdtrStruct.TIM_OSSRState=TIM_OSSRState_Enable;
    TIM_BDTRConfig(TIM8,&TIM_BdtrStruct);

    TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;
    TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
    //TIM_OCInitStruct.TIM_OutputNState=TIM_OutputNState_Enable;
    TIM_OCInitStruct.TIM_Pulse=0;
    TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;
    //TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCNPolarity_Low; 
    TIM_OCInitStruct.TIM_OCIdleState=TIM_OCIdleState_Set;
    TIM_OCInitStruct.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
	
    TIM_OC2Init(TIM8,&TIM_OCInitStruct);
    TIM_OC3Init(TIM8,&TIM_OCInitStruct);

    TIM_OC2PreloadConfig(TIM8,TIM_OCPreload_Enable);
	TIM_OC3PreloadConfig(TIM8,TIM_OCPreload_Enable);
    TIM_ClearFlag(TIM8,TIM_FLAG_Update); 
    TIM_ITConfig(TIM8,TIM_IT_Update,ENABLE);
    TIM_GenerateEvent(TIM8,TIM_EventSource_Update);
    NVIC_InitStruct.NVIC_IRQChannel=TIM8_UP_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
    NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStruct);

    TIM_SetCompare2(TIM8,0);
    TIM_SetCompare3(TIM8,0);
    TIM_CtrlPWMOutputs(TIM8,ENABLE);
    // TIM_CtrlPWMOutputs(TIM8,DISABLE);
    TIM_ARRPreloadConfig(TIM8,ENABLE);
    TIM_Cmd(TIM8,ENABLE);
}

中断

//----------中断----------
void TIM1_UP_IRQHandler(void)//TIM1中断
{
   
    if(TIM_GetITStatus(TIM1,TIM_IT_Update)!=RESET)
    {
        TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
    }
        
}
//----------中断----------
void TIM8_UP_IRQHandler(void)//TIM1中断
{
   
    if(TIM_GetITStatus(TIM8,TIM_IT_Update)!=RESET)
    {
        TIM_ClearITPendingBit(TIM8, TIM_IT_Update);
    }
        
}

2、通用定时器设置(以tim3为例)

//TIM3 PWM部分初始化 
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{  
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	//使能定时器3时钟
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
	
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5    
 
   //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形	GPIOB.5
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
 
   //初始化TIM3
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
	
	//初始化TIM3 Channel2 PWM模式	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
 
	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
 
	TIM_Cmd(TIM3, ENABLE);  //使能TIM3
	
 
}

中断

void TIM3_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
        //ProcessInTimerX();            //不启用y轴,暂做编码盘使用
   		CodeDisk_Count();
		//IO_MechanicalSWHandel();	//机械开关

    }
}

3、调用

int main(void)
 {		
	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	                     //串口初始化为115200
 	TIM3_PWM_Init(899,0);	                 //PWN3初始化
    timer8_init(9999,71);                 	 //PWN8初始化
	timer1_init(9999,71);                 	 //PWN1初始化
    TIM_SetCompare2(TIM3,1000);              //设置斩波频率,0:为关闭,1000为斩波频率
    TIM_SetCompare1(TIM1,0);		
    TIM_SetCompare3(TIM8,5000); 
    TIM_SetCompare3(TIM8,5000);       
   	while(1)
	{
									 
		   
	}	 
 }

 

  • 9
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用STM32F103定时器2通道3和4输出PWM波记高电平次数的标准库代码: ``` #include "stm32f10x.h" void TIM2_PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* 配置PA2和PA3为复用推挽输出 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* 定时器TIM2基本参数配置 */ TIM_TimeBaseStructure.TIM_Period = 999; // PWM波的周期 TIM_TimeBaseStructure.TIM_Prescaler = 71; // 定时器分频 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); /* PWM波通道3配置 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM波模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; TIM_OCInitStructure.TIM_Pulse = 499; // 高电平持续时间 TIM_OC3Init(TIM2, &TIM_OCInitStructure); /* PWM波通道4配置 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; // PWM波模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; TIM_OCInitStructure.TIM_Pulse = 499; // 高电平持续时间 TIM_OC4Init(TIM2, &TIM_OCInitStructure); /* 启动PWM波输出 */ TIM_Cmd(TIM2, ENABLE); TIM_CtrlPWMOutputs(TIM2, ENABLE); } int main(void) { TIM2_PWM_Init(); while (1) { // do something } return 0; } ``` 要计算PWM波的高电平持续时间,可以使用以下公式: 高电平持续时间 = (TIM_Pulse + 1) / (TIM_Period + 1) * PWM波周期 在上面的代码中,TIM_Pulse的值为499,TIM_Period的值为999,PWM波周期为1/(72MHz/72) ≈ 1us。因此,高电平持续时间为: (499 + 1) / (999 + 1) * 1us ≈ 500ns 如果要计算PWM波的周期,可以使用以下公式: PWM波周期 = (TIM_Period + 1) * 定时器分频 / TIMx时钟频率 在上面的代码中,TIM_Period的值为999,定时器分频为72,TIMx时钟频率为72MHz。因此,PWM波周期为: (999 + 1) * 72 / 72MHz ≈ 10us 要计算PWM波的频率,可以使用以下公式: PWM波频率 = 1 / PWM波周期 在上面的代码中,PWM波周期为10us。因此,PWM波频率为: 1 / 10us ≈ 100kHz 以上是使用STM32F103定时器2通道3和4输出PWM波记高电平次数的标准库代码,供参考。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值