stm32外部时钟模式1

基础了解

时钟选择计数器时钟可由下列时钟源提供:

● 内部时钟(CK_INT)

● 外部时钟模式1:外部输入脚(TIx)

● 外部时钟模式2:外部触发输入(ETR)

● 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器

在平常使用中我们系统复位 000 默认使用内部时钟源

 

外部时钟源1

 

 

来自定时器自身输入通道1或通道2的输入信号,经过极性选择和滤波以后生成的触发信号,连接到从模式控制器,进而控制计数器的工作;

来自通道1的输入信号经过上升沿、下降沿双沿检测而生成的脉冲信号进行逻辑相或以后的信号就是TI1F_ED信号,即TI1F_ED双沿脉冲信号。

//SIGNAL_COUNT(GPIO)
#define SIGNAL_COUNT_ENA_CLK_ENABLE()        __HAL_RCC_GPIOB_CLK_ENABLE()    //PB0
#define SIGNAL_COUNT_ENA_GPIO_Port            (GPIOB)
#define SIGNAL_COUNT_ENA_Pin                (GPIO_PIN_0)
#define SIGNAL_COUNT_DIR_CLK_ENABLE()        __HAL_RCC_GPIOA_CLK_ENABLE()    //PA7
#define SIGNAL_COUNT_DIR_GPIO_Port            (GPIOA)
#define SIGNAL_COUNT_DIR_Pin                (GPIO_PIN_7)
#define SIGNAL_COUNT_DIR_Get_IRQn            (EXTI9_5_IRQn)    //EXTI7中断
//SIGNAL_COUNT(AFIO & TIM)
#define SIGNAL_COUNT_PUL_CLK_ENABLE()        __HAL_RCC_GPIOA_CLK_ENABLE()    //PA6
#define SIGNAL_COUNT_PUL_GPIO_Port            (GPIOA)
#define SIGNAL_COUNT_PUL_Pin                (GPIO_PIN_6)
#define SIGNAL_COUNT_TIM_CLK_ENABLE()        __HAL_RCC_TIM3_CLK_ENABLE()        //TIM3
#define    SIGNAL_COUNT_Get_TIM                (TIM3)
#define    SIGNAL_COUNT_Get_HTIM                (htim3)
//GPIO输入
#define SIGNAL_COUNT_READ_DIR_IO()    (SIGNAL_DIR_GPIO_Port -> IDR & SIGNAL_DIR_Pin)
#define SIGNAL_COUNT_READ_ENA_IO()    (SIGNAL_ENA_GPIO_Port -> IDR & SIGNAL_ENA_Pin)
//TIM输入
#define SIGNAL_COUNT_READ_COUNT()    (SIGNAL_COUNT_Get_TIM -> CNT)
//TIM输出
#define SIGNAL_COUNT_UP()            (SIGNAL_COUNT_Get_TIM -> CR1 &= ~(TIM_CR1_DIR))
#define SIGNAL_COUNT_DOWN()            (SIGNAL_COUNT_Get_TIM -> CR1 |=  (TIM_CR1_DIR))
/**
  * @brief  TIM_SIGNAL_PUL初始化
  * @param  NULL
  * @retval NULL
**/
void REIN_TIM_SIGNAL_COUNT_Init(void)
{
    /* GPIO初始化 */
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  /* GPIO Ports Clock Enable*/
    SIGNAL_COUNT_PUL_CLK_ENABLE();            //启用SIGNAL_COUNT_PUL端口时钟
  /*Configure GPIO pin*/
    GPIO_InitStruct.Pin = SIGNAL_COUNT_PUL_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;        //输入模式
    GPIO_InitStruct.Pull = GPIO_NOPULL;                //禁用上下拉
    HAL_GPIO_Init(SIGNAL_COUNT_PUL_GPIO_Port, &GPIO_InitStruct);
    
    /* TIM初始化 */
  TIM_SlaveConfigTypeDef sSlaveConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
    SIGNAL_COUNT_TIM_CLK_ENABLE();        //启用TIM时钟
  SIGNAL_COUNT_Get_HTIM.Instance = SIGNAL_COUNT_Get_TIM;
  SIGNAL_COUNT_Get_HTIM.Init.Prescaler = 0;                                                        //预分频:0
  SIGNAL_COUNT_Get_HTIM.Init.CounterMode = TIM_COUNTERMODE_UP;                //向上计数
  SIGNAL_COUNT_Get_HTIM.Init.Period = 65535;                                                    //16位周期
  SIGNAL_COUNT_Get_HTIM.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;    //不分频
  SIGNAL_COUNT_Get_HTIM.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;    //禁用自动重新加载
  if (HAL_TIM_Base_Init(&SIGNAL_COUNT_Get_HTIM) != HAL_OK)
  {
    Error_Handler();
  }
  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1;                        //外部时钟模式
  sSlaveConfig.InputTrigger = TIM_TS_TI1FP1;                            //TI1FP1
  sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING;    //上升沿触发
  sSlaveConfig.TriggerFilter = 4;                                                            //滤波参数(FDIV2_N6)
  if (HAL_TIM_SlaveConfigSynchro(&SIGNAL_COUNT_Get_HTIM, &sSlaveConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;                //主机模式触发复位
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;        //禁用主机模式
  if (HAL_TIMEx_MasterConfigSynchronization(&SIGNAL_COUNT_Get_HTIM, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
    /*begin work*/
    HAL_TIM_Base_Start(&SIGNAL_COUNT_Get_HTIM);
}
static void Signal_Count_Capture_Goal(void)
{//SignalPort获取目标
    //读取En_Pin
    if(SIGNAL_COUNT_READ_ENA_IO())
    {
        if(sg_cut.en_inve)    
            sg_cut.en_valid = true;
        else                
            sg_cut.en_valid = false;
    }
    else
    {
        if(sg_cut.en_inve)    
            sg_cut.en_valid = false;
        else                
            sg_cut.en_valid = true;
    }
    
    //采样(对比上次的计数值)
    sg_cut.sampling_count_last = sg_cut.sampling_count;
    sg_cut.sampling_count = SIGNAL_COUNT_READ_COUNT();
    sg_cut.sampling_count_sub = sg_cut.sampling_count - sg_cut.sampling_count_last;
    //采样(缓冲输出)
    //(采样数/细分数)*Move_Divide_NUM = 电机输出步数
    sg_cut.interp_out = sg_cut.sampling_count_sub * sg_cut.subdivide_form;
    //输出
    if(sg_cut.en_valid)
    {
        signal_moreio.goal_location = sg_cut.interp_out;    //Count模式借用目标位置存放目标位置增量
        signal_moreio.goal_disable = false;
        signal_moreio.goal_brake = false;
    }
    else
    {
        signal_moreio.goal_location = 0;    //Count模式借用目标位置存放目标位置增量
        signal_moreio.goal_disable = true;
        signal_moreio.goal_brake = false;
    }
}

 

posted @ 2022-02-18 14:19  我是,一株蒜。  阅读(1548)  评论(0编辑  收藏  举报