最近准备搞直流无刷项目,使用stm32G070的定时器3 PA6 PA7 PB0做输入捕获 霍尔状态
/* 霍尔传感器相关定时器初始出 */
TIM_HandleTypeDef htimx_hall;
void hall_gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/* 定时器通道 1 引脚初始化 */
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* 定时器通道 2 引脚初始化 */
GPIO_InitStruct.Pin = GPIO_PIN_7;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* 定时器通道 3 引脚初始化 */
GPIO_InitStruct.Pin = GPIO_PIN_0;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
static void hall_tim_init(void)
{
TIM_HallSensor_InitTypeDef hall_sensor_onfig;
/* 基本定时器外设时钟使能 */
__TIM3_CLK_ENABLE();
/* 定时器基本功能配置 */
htimx_hall.Instance = TIM3;
htimx_hall.Init.Prescaler = 63999; // 预分频
htimx_hall.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数
htimx_hall.Init.Period = 999; // 计数周期
htimx_hall.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 时钟分频
hall_sensor_onfig.IC1Prescaler = TIM_ICPSC_DIV1; // 输入捕获分频
hall_sensor_onfig.IC1Polarity = TIM_ICPOLARITY_BOTHEDGE; // 输入捕获极性
hall_sensor_onfig.IC1Filter = 10; // 输入滤波
hall_sensor_onfig.Commutation_Delay = 0U; // 不使用延迟触发
HAL_TIMEx_HallSensor_Init(&htimx_hall,&hall_sensor_onfig);
HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); // 设置中断优先级
HAL_NVIC_EnableIRQ(TIM3_IRQn); // 使能中断
}
/**
* @brief 初始化霍尔传感器定时器
* @param 无
* @retval 无
*/
void bsp_hall_tim_config(void)
{
hall_gpio_init(); // 初始化引脚
hall_tim_init(); // 初始化定时器
/* 使能霍尔传感器接口 */
__HAL_TIM_ENABLE_IT(&htimx_hall, TIM_IT_TRIGGER);
__HAL_TIM_ENABLE_IT(&htimx_hall, TIM_IT_UPDATE);
HAL_TIMEx_HallSensor_Start(&htimx_hall);
}
/**
* @brief 霍尔传感器触发回调函数
* @param htim:定时器句柄
* @retval 无
*/
void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim)
{
/* 获取霍尔传感器引脚状态,作为换相的依据 */
uint8_t step = 0;
if (htim == &htimx_hall) // 判断是否由触发中断产生
{
}
//HAL_TIM_GenerateEvent(&htimx_bldcm, TIM_EVENTSOURCE_COM); // 软件产生换相事件,此时才将配置写入
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//更新事件
{
}
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htimx_hall);
}
[点击并拖拽以移动]