查看 MX 设备配置工具中的时钟,它表示 204 到 APB1 定时器时钟 (MHz)。
要达到 10000 Hz,我必须将 204 MHz 除以 20400。
幸运的是,有很多方法可以做到这一点。但在我第一次尝试时
预分频器 51
计数器周期 100
内部时钟除以 4
我这样做的原因是我怀疑 10000 Hz 会太快,它们最终会达到 1000 Hz 或介于 1000 Hz 和 10000 Hz 之间的某个值,并且很容易更改新值的计数器周期。
我保存了它并生成了新代码。
- static void MX_TIM14_Init(void)
- {
- /* USER CODE BEGIN TIM14_Init 0 */
- /* USER CODE END TIM14_Init 0 */
- TIM_OC_InitTypeDef sConfigOC = {0};
- /* USER CODE BEGIN TIM14_Init 1 */
- /* USER CODE END TIM14_Init 1 */
- htim14.Instance = TIM14;
- htim14.Init.Prescaler = 51;
- htim14.Init.CounterMode = TIM_COUNTERMODE_UP;
- htim14.Init.Period = 100;
- htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV4;
- htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
- if (HAL_TIM_Base_Init(&htim14) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_TIM_OC_Init(&htim14) != HAL_OK)
- {
- Error_Handler();
- }
- sConfigOC.OCMode = TIM_OCMODE_TIMING;
- sConfigOC.Pulse = 0;
- sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
- sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
- if (HAL_TIM_OC_ConfigChannel(&htim14, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
- {
- Error_Handler();
- }
- /* USER CODE BEGIN TIM14_Init 2 */
- /* USER CODE END TIM14_Init 2 */
- }
生成的代码看起来不错。
中断会切换 GPIO,我可以看到时间。
我的 USB 逻辑分析仪设置为以 25 Msamples/sec 的速度采样
当我预期 100 微秒时,我正在读取 25.72 和 25.76 微秒 (us)。
它关闭了 4 倍。
这让我觉得这是除以 4。
所以我回到 MX 设备配置工具并将除以 4 更改为无除法。
结果是:
预分频器 51
计数器周期 100
内部时钟分频 无分频
我保存并生成了代码
- static void MX_TIM14_Init(void)
- {
- /* USER CODE BEGIN TIM14_Init 0 */
- /* USER CODE END TIM14_Init 0 */
- TIM_OC_InitTypeDef sConfigOC = {0};
- /* USER CODE BEGIN TIM14_Init 1 */
- /* USER CODE END TIM14_Init 1 */
- htim14.Instance = TIM14;
- htim14.Init.Prescaler = 51;
- htim14.Init.CounterMode = TIM_COUNTERMODE_UP;
- htim14.Init.Period = 100;
- htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
- htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
- if (HAL_TIM_Base_Init(&htim14) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_TIM_OC_Init(&htim14) != HAL_OK)
- {
- Error_Handler();
- }
- sConfigOC.OCMode = TIM_OCMODE_TIMING;
- sConfigOC.Pulse = 0;
- sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
- sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
- if (HAL_TIM_OC_ConfigChannel(&htim14, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
- {
- Error_Handler();
- }
- /* USER CODE BEGIN TIM14_Init 2 */
- /* USER CODE END TIM14_Init 2 */
- }
查看逻辑分析仪,我得到了完全相同的结果。每 25.72 和 25.76 us 中断一次,而应该是中断的 1/4。
正如我所说,有多种方法可以做到这一点,所以我将预分频器从 51 更改为 204。
预分频器 204
计数器周期 100
内部时钟分频 无分频
保存并生成新代码。
- static void MX_TIM14_Init(void)
- {
- /* USER CODE BEGIN TIM14_Init 0 */
- /* USER CODE END TIM14_Init 0 */
- TIM_OC_InitTypeDef sConfigOC = {0};
- /* USER CODE BEGIN TIM14_Init 1 */
- /* USER CODE END TIM14_Init 1 */
- htim14.Instance = TIM14;
- htim14.Init.Prescaler = 204;
- htim14.Init.CounterMode = TIM_COUNTERMODE_UP;
- htim14.Init.Period = 100;
- htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
- htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
- if (HAL_TIM_Base_Init(&htim14) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_TIM_OC_Init(&htim14) != HAL_OK)
- {
- Error_Handler();
- }
- sConfigOC.OCMode = TIM_OCMODE_TIMING;
- sConfigOC.Pulse = 0;
- sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
- sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
- if (HAL_TIM_OC_ConfigChannel(&htim14, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
- {
- Error_Handler();
- }
- /* USER CODE BEGIN TIM14_Init 2 */
- /* USER CODE END TIM14_Init 2 */
- }
这次我每隔 101.48 到 101.52 us 就收到一次中断,这是我所期望的。
我没有深入研究您的代码以找出除以 4 不起作用的原因。我只是说它不起作用。
关于说我正在跑步:
版本:1.8.0
内部版本:11526_20211125_0815 (UTC)
0