E015.D.011-FXLS90230/Drivers/BSP/timer.c

188 lines
4.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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); // 自动清除中断标志
}