TIM定时器与PWM使用

鸽了有小半年,前段时间一直忙于项目上的事情,离职与找工作的一系列事情,目前工作已找到,稳定下来了,有更多的时间专注学习,继续提升自己。
工作三年硬件软件都做过,目前职业规划是深耕于嵌入式软件,兼顾学习嵌入式硬件,最后独立开发项目,目前个人水平自认为勉强算是个初级软硬件工程师吧,找工作时由于硬件软件都不精,只能拿个入门工资,现在找准一个深耕下去,目前十年规划是成为高级嵌入式软件工程师,工资十年月入2W目标,继续努力!
在新公司有半个月了,感觉各方面都不错,新公司负责的第一个项目是CO2传感器,使用芯片型号STM32F051K8U6,之前一直用的是F1和F4型号,突然换芯片不适应,努力看了1周的芯片手册已经没问题了,各个功能模块已经调通,只剩下求取气体浓度的算法需要研究,加油!
写这篇文章算是对之前的一个总结与之后的工作部署!
新芯片的程序与之前用过的有很大区别,写这篇文章给大家一个参考
TIM定时器
定时器的作用这里不再叙述,说一下使用TIM定时器延时与systick定时器延时的区别:
定时器延时:打个比方,你正在烧水,突然手机铃声响了,你可以立即去接电话,等水烧开了在回来,这样的延时烧水和接电话两个都不耽误,可以同时进行
systick延时:你正在烧水,突然手机铃声响了,此时按照程序设定,你必须等水烧开了才能去接听电话,烧水和接听电话只能有一个在进行,不能同时执行
所以TIM延时要优于systick延时
TIM配置主要有NVIC配置和模式配置,模式配置要使能中断,最后在TIM3_IRQHandler中断函数

void  TIM_NVIC_Config(void)
{
	NVIC_InitTypeDef  NVIC_InitStructure;
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPriority=1;

	NVIC_Init(&NVIC_InitStructure);
}


void  TIM_Mode_Config(void)
{
	TIM_TimeBaseInitTypeDef  TIM_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

	TIM_InitStructure.TIM_Period = (1000-1);

	TIM_InitStructure.TIM_Prescaler = (48-1);

	TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1  ;//ʱÖÓ·ÖƵÒò×Ó
	TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;//¼ÆÊýģʽ
	TIM_InitStructure.TIM_RepetitionCounter =0;//Öظ´¼ÆÊýÖµ£¬Ã»ÓÐÓõ½²»ÓùÜ
	
	TIM_TimeBaseInit(TIM3,&TIM_InitStructure);
	
	TIM_ClearFlag(TIM3,TIM_FLAG_Update);
	
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);

	TIM_Cmd(TIM3, ENABLE);
}


void TIM_Config(void)
{
  TIM_NVIC_Config();
  TIM_Mode_Config();
}


uint32_t  gtime;
uint8_t   Utime;
void  TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
	{
		TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
		gtime++;
		Utime++;
		gtime100ms++;
       if(gtime>=10000)
		 {
			 gtime =0;
		 } 
		 
	   if(Utime>=100)
		 {
			 Utime=0;
			 USART1_Send_Array_HalfWord(USART1, RegularConvData_Tab,3);//
//			 USART1_Send_Array_Byte(USART1,test,6);
		 }
	}
}

PWM使用:
PWM概念这里也不再过多叙述,只讲下PWM最主要的几个点
1.PWM的周期
PWM周期由时钟频率,分频系数,计数周期决定
PWM周期=分频系数*计数周期/时钟频率
2.PWM占空比:
*占空比=TIM_Pulse 的值/(分频系数**计数周期)


```c
#include "PWM.H"


uint16_t TimerPeriod = 0;

uint16_t Channel1Pulse = 0;

void PWM_GPIO_Config(void)
{
	
  GPIO_InitTypeDef   GPIO_InitStructure;

  /* ʹÄÜGPIOʱÖÓ */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
  
  /* ÅäÖÃGPIO¹Ü½Å¸´ÓÃ*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_2);
}

void PWM_Mode_Config(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    
	  TimerPeriod= 9999;
	  Channel1Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);

    TIM_TimeBaseInitStructure.TIM_Period = TimerPeriod;
    TIM_TimeBaseInitStructure.TIM_Prescaler = 7400-1;
    TIM_TimeBaseInitStructure.TIM_ClockDivision =  TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, & TIM_TimeBaseInitStructure);
    
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;    
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
	TIM_OCInitStructure.TIM_Pulse = Channel1Pulse;  
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC2Init(TIM2, &TIM_OCInitStructure);
	
    TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
    TIM_ARRPreloadConfig(TIM2, ENABLE);
	  TIM_Cmd(TIM2, ENABLE);
//    TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
//    TIM_CtrlPWMOutputs(TIM2, ENABLE);
}


void  PWM_Config(void)
{
	PWM_GPIO_Config();
	PWM_Mode_Config();
}



  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值