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