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; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律