Air001 TIM1高级定时器单脉冲输出模式使用
✨本例程基于合宙官方提供的标准库以及Demo工程作为验证参考。 📍官方提供的SDK包资源:https://gitee.com/openLuat/luatos-soc-air001
🌿想了解STM32高级定时器单脉冲输出模式了解可以参考阅读:https://shequ.stmicroelectronics.cn/thread-622823-1-1.html
🚩TIM1高级定时器基本功能:
📓Air001单脉冲模式简介
单脉冲模式(OPM)是之前所述众多模式中的一个特例。这种模式允许计数器响应一个激励,并在一个程序可控的延时之后,产生一个脉宽可被程序控制的脉冲。
🌿可以通过从模式控制器启动计数器,在输出比较模式或者 PWM 模式下产生波形。设置 TIMx_CR1 寄存器的 OPM 位将选择单脉冲模式,这样可以让计数器自动的在产生下一个更新事件 UEV 时停止。 🔖用户手册给出的例子说明:
例如,当需要在从 TI2 输入脚上检测到一个上升沿开始,延迟 tDELAY 之后,在 OC1 上产生一个长度为tPULSE 的正脉冲。 使用 TI2FP2 作为触发 1: ◼ 置 TIMx_CCMR1 寄存器中的 CC2S=01,把 TI2FP2 映像到 TI2。 ◼ 置 TIMx_CCER 寄存器中的 CC2P=0,使 TI2FP2 能够检测上升沿。 ◼ 置 TIMx_SMCR 寄存器中的 TS=110,TI2FP2 作为从模式控制器的触发(TRGI)。 ◼ 置 TIMx_SMCR 寄存器中的 SMS=110(触发模式),TI2FP2 被用来启动计数器。 OPM 的波形由写入比较寄存器的数值决定(要考虑时钟频率和计数器预分频器) ◼ tDELAY 由 TIMx_CCR1 寄存器中的值定义。 ◼ tPULSE 由自动装载值和比较值之间的差值定义(TIMx_ARR -TIMx_CCR1)。 ◼ 假定当发生比较匹配时要产生从 0 到 1 的波形,当计数器达到预装载值时要产生一个从 1 到 0 的波形;首先要置TIMx_CCMR1 寄存器的OC1M=111,进入 PWM 模式 2;根据需要有选择地使能预装载寄存器:置TIMx_CCMR1 中的OC1PE=1 和TIMx_CR1 寄存器中的ARPE;然后在TIMx_CCR1 寄存器中填写比较值,在 TIMx_ARR 寄存器中填写自动装载值,设置 UG 位来产生一个更新事件,然后等待在 TI2 上的一个外部触发事件。本例中,CC1P=0。 在这个例子中,TIMx_CR1 寄存器中的 DIR 和 CMS 位应该置低。 因为只需要一个脉冲,所以必须设置 TIMx_CR1 寄存器中的 OPM=1,在下一个更新事件(当计数器从自动装载值翻转到 0)时停止计数。
📗实例测试工程
- ✨功能说明:使用TIM1定时器通道1作为信号输出,通道2作为输入信号,当检测到通道2,每接收到一个上升沿信号时,将延时80ms,输出一个20ms的高电平脉冲.(延时时间+高电平时间=计数器TIM1_ARR装载值以及TIM1_CCR1比较值)。
⚡需要注意的是,通道2的检测信号频率,不能超出输出通道1的频率,否则通道1输出的信号会被截断。根据本例程配置,通道2的信号间隔需要大于100ms。 🔰如需响应更高频率信号的接收和输出,可以将分频系数改小。(TimHandle.Init.Prescaler
)
🌿TIM1定时器通道1:TIM1_CH1 ------> GPIO_AF13_TIM1----->PA3
🌿TIM1定时器通道2: TIM1_CH2 ------> GPIO_AF1_TIM1----->PB3
🖍对应通道引脚配置初始化:
void TIM1_GPIO_Configuration ( void )
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE ( ) ;
__HAL_RCC_GPIOB_CLK_ENABLE ( ) ;
GPIO_InitStruct. Pin = GPIO_PIN_3;
GPIO_InitStruct. Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct. Pull = GPIO_PULLUP;
GPIO_InitStruct. Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct. Alternate = GPIO_AF13_TIM1;
HAL_GPIO_Init ( GPIOA, & GPIO_InitStruct) ;
GPIO_InitStruct. Pin = GPIO_PIN_3;
GPIO_InitStruct. Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct. Pull = GPIO_PULLUP;
GPIO_InitStruct. Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct. Alternate = GPIO_AF1_TIM1;
HAL_GPIO_Init ( GPIOB, & GPIO_InitStruct) ;
}
TIM_HandleTypeDef TimHandle;
TIM_OnePulse_InitTypeDef sConfig;
TimHandle. Instance = TIM1;
TimHandle. Init. Period = 1000 ;
TimHandle. Init. Prescaler = 800 - 1 ;
TimHandle. Init. ClockDivision = TIM_CLOCKDIVISION_DIV1;
TimHandle. Init. CounterMode = TIM_COUNTERMODE_UP;
TimHandle. Init. RepetitionCounter = 1 - 1 ;
TimHandle. Init. AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if ( HAL_TIM_OnePulse_Init ( & TimHandle, TIM_OPMODE_SINGLE) != HAL_OK)
{
Error_Handler ( ) ;
}
sConfig. OCMode = TIM_OCMODE_PWM1;
sConfig. OCPolarity = TIM_OCPOLARITY_LOW;
sConfig. Pulse = 200 ;
sConfig. ICPolarity = TIM_ICPOLARITY_RISING;
sConfig. ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfig. ICFilter = 0 ;
sConfig. OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfig. OCIdleState = TIM_OCIDLESTATE_RESET;
sConfig. OCNIdleState = TIM_OCNIDLESTATE_RESET;
if ( HAL_TIM_OnePulse_ConfigChannel ( & TimHandle, & sConfig, TIM_CHANNEL_1, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler ( ) ;
}
if ( HAL_TIM_OnePulse_Start ( & TimHandle, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler ( ) ;
}
TIM_HandleTypeDef TimHandle;
TIM_OnePulse_InitTypeDef sConfig;
TimHandle. Instance = TIM1;
TimHandle. Init. Period = 1000 ;
TimHandle. Init. Prescaler = 800 - 1 ;
TimHandle. Init. ClockDivision = TIM_CLOCKDIVISION_DIV1;
TimHandle. Init. CounterMode = TIM_COUNTERMODE_UP;
TimHandle. Init. RepetitionCounter = 1 - 1 ;
TimHandle. Init. AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if ( HAL_TIM_OnePulse_Init ( & TimHandle, TIM_OPMODE_SINGLE) != HAL_OK)
{
Error_Handler ( ) ;
}
sConfig. OCMode = TIM_OCMODE_PWM2;
sConfig. OCPolarity = TIM_OCPOLARITY_HIGH;
sConfig. Pulse = 200 ;
sConfig. ICPolarity = TIM_ICPOLARITY_RISING;
sConfig. ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfig. ICFilter = 0 ;
sConfig. OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfig. OCIdleState = TIM_OCIDLESTATE_RESET;
sConfig. OCNIdleState = TIM_OCNIDLESTATE_RESET;
if ( HAL_TIM_OnePulse_ConfigChannel ( & TimHandle, & sConfig, TIM_CHANNEL_1, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler ( ) ;
}
if ( HAL_TIM_OnePulse_Start ( & TimHandle, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler ( ) ;
}
📚测试工程:
链接:https:
提取码:beda