基于STM32F030单片机+FreeRTOS系统
记得#include "stm32f0xx_conf.h" 这个文件
要使用定时器需要以下几个步骤:
- 初始化定时器
-
系统主时钟配置情况: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捕获中断 }
-
- 在stm32f0xx_it.c文件中计时或置位事件标志组,并清除定时器中断标志位(事件标志组就不举例了)
-
普通应用 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)) { } } } }
-
- 在RTOS中做时间差一般都是利用xTaskGetTickCount ()函数
-
TickType_t xLastWakeTime1000ms=0; if(xTaskGetTickCount () - xLastWakeTime1000ms > 1000/portTICK_PERIOD_MS ) { xLastWakeTime1000ms = xTaskGetTickCount (); }
-