F0定时器应用

基于STM32F030单片机+FreeRTOS系统

记得#include  "stm32f0xx_conf.h" 这个文件

要使用定时器需要以下几个步骤:

  1. 初始化定时器
    1. 系统主时钟配置情况:48Mhz
      void RCC_Configuration(void)
      {
              RCC_ClocksTypeDef  FFF;
      	RCC_DeInit();
      	RCC_HSICmd(ENABLE);  //8Mhz
      	while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
      	FLASH_PrefetchBufferCmd(ENABLE);
      	FLASH_SetLatency(FLASH_Latency_1);
      	RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB时钟为系统时钟SYSCLK
      	//设置 PLL 时钟源及倍频系数
      	RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);//8/2*12Mhz=48
      	//使能或者失能 PLL,这个参数可以取:ENABLE或者DISABLE
      	RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,那么它不能被失能
      	//等待指定的 RCC 标志位设置成功 等待PLL初始化成功
      	while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
      	//设置系统时钟(SYSCLK) 设置PLL为系统时钟源  
      	RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
      	//等待PLL成功用作于系统时钟的时钟源
      	while(RCC_GetSYSCLKSource() != 0x08);
              
              RCC_GetClocksFreq(&FFF);
      }
      
      
      需要根据时钟图,算出对于主时钟的TIM时钟分频数,此处1:1
      TIM14初始化:
      void UART_TimersInit(void)   
      {    
      	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
      	NVIC_InitTypeDef NVIC_InitStructure;
      	/* backup T35 ticks */
      	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14 , ENABLE);
      	TIM_TimeBaseStructure.TIM_Prescaler = 48000;//tim14 clk 1K
      	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
      	TIM_TimeBaseStructure.TIM_Period = 1;///3ms//中断一次
      	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
      	TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
      	TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);
      	TIM_Cmd(TIM14, DISABLE);
      	NVIC_InitStructure.NVIC_IRQChannel = TIM14_IRQn;
      	NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      	NVIC_Init(&NVIC_InitStructure);
      	TIM_ITConfig(TIM14, TIM_IT_Update, ENABLE);//允许更新中断 ,允许CC4IE捕获中断								 
      }

       

  2. 在stm32f0xx_it.c文件中计时或置位事件标志组,并清除定时器中断标志位(事件标志组就不举例了)
    1. 普通应用
      void TIM14_IRQHandler(void)
      {
            	if (TIM_GetITStatus(TIM14, TIM_IT_Update) != RESET)
      		{
      		
                       Time_Ms++;//dbg
      		TIM_ClearITPendingBit(TIM14, TIM_IT_Update);
      	}
      }
      
      
      事件组应用
      void TIM14_IRQHandler(void)
      {
      	static BaseType_t xHigherPriorityTaskWoken = pdTRUE;
      	static uint16_t len;//当前数组已接收数据的长度
      	if (TIM_GetITStatus(TIM14, TIM_IT_Update) != RESET)
      		{
      		//清除定时器T4溢出中断标志位
      		TIM_ClearITPendingBit(TIM14, TIM_IT_Update);
      					if(EventGroup_VCU != NULL)
      						{
      						if(pdPASS == xEventGroupSetBitsFromISR(EventGroup_VCU,VCU_UARTREV_BMS_485_Status,&xHigherPriorityTaskWoken))
      							{
      
      						}
      					}
      				}
      			}
      

       

  3. 在RTOS中做时间差一般都是利用xTaskGetTickCount ()函数
    1.  TickType_t xLastWakeTime1000ms=0;
      
        if(xTaskGetTickCount () - xLastWakeTime1000ms > 1000/portTICK_PERIOD_MS )
      			{
      			xLastWakeTime1000ms = xTaskGetTickCount ();
      
                  }

       

你可能感兴趣的:(STM32F0底层驱动)