【发布时间】:2020-10-09 14:29:08
【问题描述】:
我正在尝试使用硬件计时器实现两个独立的任务。 我需要任务 1 每 100us 重复一次,另一个重复 10us。我从 STM32cubemx 生成了代码。 定时器功能如下
static void MX_TIM2_Init(void) {
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 100;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 800;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK) {
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) {
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) {
Error_Handler();
}
}
我正在进一步处理如下功能:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim-> Instance == TIM2)
{
ledBlueBlink();
}
}
我有一个任务 ledGreenBlink() 应该在每 10 次任务 ledBlueBlink() 运行后运行。
谁能告诉我如何实现这个?
【问题讨论】:
-
APB总线频率是多少?
-
频率为 32MHz。
-
这是 XY 问题的经典示例:您需要以时间间隔的整数比运行两个任务,您可以通过计算计时器中断而不是读取硬件计时器子区间。
-
每 10us/100us 需要做什么?因为 10us 是一个非常短的时间来完成很多工作 - 这是运行在 32MHz 的 RTOS 的上下文切换的数量级你确定你的时间吗?如果“任务”是 LED 闪烁,您将不会察觉到任何闪烁速度。最好只解释 what 你想做什么,然后让别人告诉你 如何 去做,因为看起来你把这件事复杂化了。
标签: c assembly arm embedded stm32