/** **************************************************************************************************** * @file gtim.c * @author 正点原子团队(ALIENTEK) * @version V1.1 * @date 2021-10-15 * @brief 通用定时器 驱动代码 * @license Copyright (c) 2020-2032, 广州市星翼电子科技有限公司 **************************************************************************************************** * @attention * * 实验平台:正点原子 探索者 F407开发板 * 在线视频:www.yuanzige.com * 技术论坛:www.openedv.com * 公司网址:www.alientek.com * 购买地址:openedv.taobao.com * * 修改说明 * V1.0 20211015 * 第一次发布 * V1.1 20211015 * 1,新增gtim_timx_pwm_chy_init函数 * **************************************************************************************************** */ #include "./SYSTEM/pwm/pwm.h" TIM_HandleTypeDef g_timx_handle; /* 定时器x句柄 */ /** * @brief 通用定时器TIMX定时中断初始化函数 * @note * 通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候 * 通用定时器的时钟为APB1时钟的2倍, 而APB1为42M, 所以定时器时钟 = 84Mhz * 定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us. * Ft=定时器工作频率,单位:Mhz * * @param arr: 自动重装值。 * @param psc: 预分频系数 * @retval 无 */ void gtim_timx_int_init(uint16_t arr, uint16_t psc) { GTIM_TIMX_INT_CLK_ENABLE(); /* 使能TIMx时钟 */ g_timx_handle.Instance = GTIM_TIMX_INT; /* 通用定时器x */ g_timx_handle.Init.Prescaler = psc; /* 预分频系数 */ g_timx_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 向上计数器 */ g_timx_handle.Init.Period = arr; /* 递增计数模式 */ HAL_TIM_Base_Init(&g_timx_handle); HAL_NVIC_SetPriority(GTIM_TIMX_INT_IRQn, 1, 3); /* 设置中断优先级,抢占优先级1,子优先级3 */ HAL_NVIC_EnableIRQ(GTIM_TIMX_INT_IRQn); /* 开启ITMx中断 */ HAL_TIM_Base_Start_IT(&g_timx_handle); /* 使能定时器x和定时器x更新中断 */ } /** * @brief 定时器中断服务函数 * @param 无 * @retval 无 */ /*********************************以下是通用定时器PWM输出实验程序*************************************/ TIM_HandleTypeDef g_timx_pwm_chy_handle; /* 定时器x句柄 */ /** * @brief 通用定时器TIMX 通道Y PWM输出 初始化函数(使用PWM模式1) * @note * 通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候 * 通用定时器的时钟为APB1时钟的2倍, 而APB1为42M, 所以定时器时钟 = 84Mhz * 定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us. * Ft = 定时器工作频率,单位:Mhz * * @param arr: 自动重装值 * @param psc: 预分频系数 * @retval 无 */ void gtim_timx_pwm_chy_init(uint16_t arr, uint16_t psc) { TIM_OC_InitTypeDef timx_oc_pwm_chy = {0}; /* 定时器输出句柄 */ g_timx_pwm_chy_handle.Instance = GTIM_TIMX_PWM; /* 定时器x */ g_timx_pwm_chy_handle.Init.Prescaler = psc; /* 预分频系数 */ g_timx_pwm_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */ g_timx_pwm_chy_handle.Init.Period = arr; /* 自动重装载值 */ HAL_TIM_PWM_Init(&g_timx_pwm_chy_handle); /* 初始化PWM */ timx_oc_pwm_chy.OCMode = TIM_OCMODE_PWM1; /* 模式选择PWM1 */ timx_oc_pwm_chy.Pulse = arr / 2; /* 设置比较值,此值用来确定占空比 */ timx_oc_pwm_chy.OCPolarity = TIM_OCPOLARITY_LOW; /* 输出比较极性为低 */ HAL_TIM_PWM_ConfigChannel(&g_timx_pwm_chy_handle, &timx_oc_pwm_chy, GTIM_TIMX_PWM_CHY); /* 配置TIMx通道y */ HAL_TIM_PWM_Start(&g_timx_pwm_chy_handle, GTIM_TIMX_PWM_CHY); /* 开启对应PWM通道 */ } /** * @brief 定时器底层驱动,时钟使能,引脚配置 此函数会被HAL_TIM_PWM_Init()调用 * @param htim:定时器句柄 * @retval 无 */ void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) { if (htim->Instance == GTIM_TIMX_PWM) { GPIO_InitTypeDef gpio_init_struct; GTIM_TIMX_PWM_CHY_GPIO_CLK_ENABLE(); /* 开启通道y的CPIO时钟 */ GTIM_TIMX_PWM_CHY_CLK_ENABLE(); /* 使能定时器时钟 */ gpio_init_struct.Pin = GTIM_TIMX_PWM_CHY_GPIO_PIN; /* 通道y的CPIO口 */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 复用推完输出 */ gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */ gpio_init_struct.Alternate = GTIM_TIMX_PWM_CHY_GPIO_AF; /* IO口REMAP设置, 是否必要查看头文件配置的说明! */ HAL_GPIO_Init(GTIM_TIMX_PWM_CHY_GPIO_PORT, &gpio_init_struct); } }