#include "bsp_driver_GeneralTim.h" #include "bsp_led.h" #include#include "./usart/bsp_usart.h" static uint32_t s_time_count1; static uint32_t s_time_count2; static uint8_t s_timer50ms_flag; static uint8_t s_timer1000ms_flag; void BSP_GeneralTim2_Init(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); // 设置中断组为0 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn ;//全局中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;// 设置主优先级为 0 NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;// 设置抢占优先级为1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(GENERAL_TIM_CLK, ENABLE);// 开启定时器时钟,即内部时钟CK_INT=72M TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_Period;// 自动重装载寄存器的值 TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_Prescaler; // 时钟预分频数 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;// 时钟分频因子 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; // 计数器计数模式,设置为向上计数 TIM_TimeBaseStructure.TIM_RepetitionCounter=0; // 重复计数器的值 TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);// 初始化定时器 TIM_ClearFlag(GENERAL_TIM, TIM_FLAG_Update); TIM_ITConfig(GENERAL_TIM,TIM_IT_Update,ENABLE); } void BSP_GeneralTim3_Init(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); // 设置中断组为0 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn ;//全局中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;// 设置主优先级为 0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 设置抢占优先级为2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);// 开启定时器时钟,即内部时钟CK_INT=72M TIM_TimeBaseStructure.TIM_Period= (50000-1);// 自动重装载寄存器的值 TIM_TimeBaseStructure.TIM_Prescaler= 71; // 时钟预分频数 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;// 时钟分频因子 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; // 计数器计数模式,设置为向上计数 TIM_TimeBaseStructure.TIM_RepetitionCounter=0; // 重复计数器的值 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);// 初始化定时器 TIM_ClearFlag(TIM3, TIM_FLAG_Update); TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); } void Driver_GeneralTim2_Enable(void) { TIM_Cmd(GENERAL_TIM, ENABLE); } void Driver_GeneralTim2_Disable(void) { TIM_Cmd(GENERAL_TIM,DISABLE); } void Driver_GeneralTim3_Enable(void) { TIM_Cmd(TIM3, ENABLE); } void Driver_GeneralTim3_Disable(void) { TIM_Cmd(TIM3,DISABLE); } void TIM2_IRQHandler(void) { if ( TIM_GetITStatus( GENERAL_TIM, TIM_IT_Update) != RESET ) { s_time_count1++; if (s_time_count1 > 49) { s_time_count1 = 0; s_timer50ms_flag = true; } TIM_ClearITPendingBit(GENERAL_TIM , TIM_FLAG_Update); } } void TIM3_IRQHandler(void) { if ( TIM_GetITStatus( TIM3, TIM_IT_Update) != RESET ) { s_time_count2++; if (s_time_count2 > 19) { s_time_count2 = 0; s_timer1000ms_flag = true; } TIM_ClearITPendingBit( TIM3 , TIM_FLAG_Update); } } uint8_t TIM_Get50ms_Status(void) { return s_timer50ms_flag; } uint8_t TIM_Get1000ms_Status(void) { return s_timer1000ms_flag; } void TIM_Clear50ms_flag(void) { s_timer50ms_flag = false; } void TIM_Clear1000ms_flag(void) { s_timer1000ms_flag = false; }
#include "stm32f10x.h" #include "bsp_led.h" #include#include "bsp_driver_GeneralTim.h" #include "./usart/bsp_usart.h" int main(void) { uint32_t test_50ms_count; LED_GPIO_Config(); USART_Config(); BSP_GeneralTim2_Init(); BSP_GeneralTim3_Init(); Driver_GeneralTim2_Enable(); //Driver_GeneralTim2_Disable(); Driver_GeneralTim3_Enable(); test_50ms_count = 0; //Driver_GeneralTim3_Disable(); while(1) { if (TIM_Get1000ms_Status() == true) { TIM_Clear1000ms_flag(); LED1_TOGGLE; } if (TIM_Get50ms_Status() == true) { TIM_Clear50ms_flag(); test_50ms_count++; if (test_50ms_count > 9) { test_50ms_count = 0; printf("定时50ms计时1秒rn"); } } } }
#ifndef __BSP_GENERALTIME_H #define __BSP_GENERALTIME_H #include "stm32f10x.h" #define GENERAL_TIM2 1 #define GENERAL_TIM3 0 #define GENERAL_TIM4 0 #define GENERAL_TIM5 0 #if GENERAL_TIM2 #define GENERAL_TIM TIM2 #define GENERAL_TIM_CLK RCC_APB1Periph_TIM2 #define GENERAL_TIM_Period (1000-1) #define GENERAL_TIM_Prescaler 71 #define GENERAL_TIM_IRQ TIM2_IRQn #elif GENERAL_TIM3 #define GENERAL_TIM TIM3 #define GENERAL_TIM_CLK RCC_APB1Periph_TIM3 #define GENERAL_TIM_Period (1000-1) #define GENERAL_TIM_Prescaler 71 #define GENERAL_TIM_IRQ TIM3_IRQn #define GENERAL_TIM3_IRQHandler TIM3_IRQHandler #elif GENERAL_TIM4 #define GENERAL_TIM TIM4 #define GENERAL_TIM_CLK RCC_APB1Periph_TIM4 #define GENERAL_TIM_Period (1000-1) #define GENERAL_TIM_Prescaler 71 #define GENERAL_TIM_IRQ TIM4_IRQn #define GENERAL_TIM_IRQHandler TIM4_IRQHandler #elif GENERAL_TIM5 #define GENERAL_TIM TIM5 #define GENERAL_TIM_CLK RCC_APB1Periph_TIM5 #define GENERAL_TIM_Period (1000-1) #define GENERAL_TIM_Prescaler 71 #define GENERAL_TIM_IRQ TIM5_IRQn #define GENERAL_TIM_IRQHandler TIM5_IRQHandler #endif void BSP_GeneralTim2_Init(void); void BSP_GeneralTim3_Init(void); void Driver_GeneralTim2_Enable(void); void Driver_GeneralTim2_Disable(void); void Driver_GeneralTim3_Enable(void); void Driver_GeneralTim3_Disable(void); uint8_t TIM_Get50ms_Status(void); uint8_t TIM_Get1000ms_Status(void); void TIM_Clear50ms_flag(void); void TIM_Clear1000ms_flag(void); #endif



