#include "timer.h" #include "system.h" /** * @brief * @param None * @retval None *configure as ext counter,but the pin is error */ unsigned char datain = 0; /* USER CODE END 0 */ //static TIM2_Callback_t user_callback = NULL; //初始化定时器1 void TIM1_Init(uint32_t prescaler, uint32_t period) { // 1. 使能时钟 RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; // 2. 配置预分频和自动重载 TIM1->PSC = prescaler; TIM1->ARR = period; // 3. 生成更新事件(确保配置立即生效) TIM1->EGR = TIM_EGR_UG; // 4. 配置中断 TIM1->DIER |= TIM_DIER_UIE; // 使能更新中断 //NVIC_SetPriority(TIM1_UP_TIM16_IRQn,TIM1_IRQ_PRIORITY); // 设置优先级 NVIC_SetPriority(TIM1_UP_TIM16_IRQn,0); // 设置优先级 NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn); // 使能NVIC中断 TIM1->CR1 |= TIM_CR1_CEN; // 启动计数器 // 5. 保存用户配置 //tim1_config = *config; } //初始化定时器2 void TIM2_Reg_Init(uint32_t prescaler, uint32_t period) { // 1. 使能时钟 RCC->APB1ENR1 |= RCC_APB1ENR1_TIM2EN; // 2. 配置基础参数 TIM2->PSC = prescaler; TIM2->ARR = period; // 3. 使能更新中断 TIM2->DIER |= TIM_DIER_UIE; // 4. 配置NVIC NVIC_SetPriority(TIM2_IRQn, TIM2_IRQ_PRIORITY); NVIC_EnableIRQ(TIM2_IRQn); TIM2_Reg_Start(); } void TIM2_Reg_Start(void) { TIM2->CR1 |= TIM_CR1_CEN; // 启动计数器2 } void TIM2_Reg_Stop(void) { TIM2->CR1 &= ~TIM_CR1_CEN; // 停止计数器2 } void TIM1_Start(void) { TIM1->CR1 |= TIM_CR1_CEN; // 启动计数器1 } void TIM1_Stop(void) { TIM1->CR1 &= ~TIM_CR1_CEN; // 停止计数器1 } void TIM2_Reg_SetPeriod(uint32_t period) { TIM2->ARR = period; // 动态修改周期值 } void TIM1_SetPeriod(uint32_t period) { TIM1->ARR = period; // 直接修改自动重载值 TIM1->EGR = TIM_EGR_UG; // 触发更新事件 } /*定时器1中断服务函数*/ void TIM1_UP_TIM16_IRQHandler(void) { if (TIM1->SR & TIM_SR_UIF) { // 检查更新中断标志 TIM1->SR &= ~TIM_SR_UIF; // 清除中断标志 g_Data.Tim1Num0++; if(g_Data.Tim1Num0 >= VIB_GETDATAMAXTIME) { g_Data.Tim1Num0 = VIB_GETDATAMAXTIME; } g_Data.Tim1Num1++; if(g_Data.Tim1Num1 >= VIB_INTERVAl_TIME) //计数值为100 { g_Data.Tim1Num1=0; // g_Data.GetadDataFlag=_TRUE; //50ms左右计时时间标志 g_Data.Tim1Num2++; //if(g_Data.Tim1Num2 >= g_Data.Tim1Count1s) //计时1s if(g_Data.Tim1Num2 >= VIB_INTERVAl) //计时1s 10次计数 { g_Data.Tim1Num2 = 0; // g_Data.Tim1Num3++; g_Data.Tim1Count1sFlag=_TRUE; //1s计时时间标志 } } } } //定时器2中断服务函数 void TIM2_IRQHandler(void) { if (TIM2->SR & TIM_SR_UIF) { TIM2->SR &= ~TIM_SR_UIF; // 清除标志 g_Data.Tim2Num0++; if(g_Data.Tim2Num0 >= VIB_GETWOBMAXTIME) //定时5ms g_Data.Tim2Num0 = VIB_GETWOBMAXTIME; g_Data.Tim2Num1++; g_Data.Uart1OverCount++; g_Data.Uart3OverCount++; if(g_Data.Uart1OverCount > UARTOVERTIME) //300ms接收超时 { g_Data.Uart1OverCount = 0; g_Data.GetUart1OverFlag = 1; //允许发送 } if(g_Data.Uart3OverCount > UARTOVERTIME) //300ms接收超时 { g_Data.Uart3OverCount = 0; g_Data.GetUart3OverFlag = 1; //运行发送 } if(g_Data.Tim2Num1 >= VIB_GETWOBMAXTIME) //计数值为200 1s { g_Data.Tim2Num1 = 0; g_Data.Tim2Num3 ++; } if(g_Data.Uart1RcvOverTime) //串口1接收超时处理 { g_Data.Uart1RcvOverTime--; if(!g_Data.Uart1RcvOverTime) { if(s_Data.UartStaus!=Receive_busy) { s_Data.UartStaus = Receive_head; s_Data.ReceiveOffset = 0; s_Data.ReceiveOKFlag=_FALSE; } } } } } /** * @brief 配置PB10为下降沿触发的外部中断 * @note 包含GPIO初始化、NVIC配置 */ void PB10_EXTI_Init(void) { // 1. 启用GPIOB和SYSCFG时钟 __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_SYSCFG_CLK_ENABLE(); // 2. 配置GPIO GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; // 下降沿触发 GPIO_InitStruct.Pull = GPIO_PULLUP; // 上拉模式(根据硬件设计调整) //GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速度(降低功耗) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // 3. 配置NVIC(中断控制器) HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 2); // 设置优先级(抢占2,子优先级2) HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); // 使能中断通道 } /** * @brief EXTI10-15中断服务函数 * @note 在stm32l4xx_it.c中调用此函数 */ void EXTI15_10_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10); // 自动清除中断标志 }