Air001 TIM1高级定时器单脉冲输出模式使用  
  ✨本例程基于合宙官方提供的标准库以及Demo工程作为验证参考。 📍官方提供的SDK包资源:https://gitee.com/openLuat/luatos-soc-air001 🌿想了解STM32高级定时器单脉冲输出模式了解可以参考阅读:https://shequ.stmicroelectronics.cn/thread-622823-1-1.html 🚩TIM1高级定时器基本功能:  
   
🌿可以通过从模式控制器启动计数器,在输出比较模式或者 PWM 模式下产生波形。设置 TIMx_CR1 寄存器的 OPM 位将选择单脉冲模式,这样可以让计数器自动的在产生下一个更新事件 UEV 时停止。 🔖用户手册给出的例子说明:  
 例如,当需要在从 TI2 输入脚上检测到一个上升沿开始,延迟 tDELAY 之后,在 OC1 上产生一个长度为tPULSE 的正脉冲。   
 
 ⚡需要注意的是,通道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