Şöyle yapabilirsiniz.
bir tane timer kullanın ve bu timer de iki adet compara no output seçin.birinci compare duty cyle için,ikinci compare ise frekansı ayarlamak için kullanılacak.ikinci comparede counteri sıfırlayarak sayacın tekrar saymasını saglayacan.
static void MX_TIM2_Init(void)
{
static void MX_TIM3_Init(void)
{
/* USER CODE BEGIN TIM3_Init 0 */
/* USER CODE END TIM3_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* USER CODE BEGIN TIM3_Init 1 */
/* USER CODE END TIM3_Init 1 */
htim3.Instance = TIM3;
htim3.Init.Prescaler = 36000-1;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 65535;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_OC_Init(&htim3) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_TIMING;
sConfigOC.Pulse = 10000;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_OC_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
sConfigOC.Pulse = 12000;
if (HAL_TIM_OC_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM3_Init 2 */
/* USER CODE END TIM3_Init 2 */
}
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim == &htim3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) {
HAL_GPIO_WritePin(OU5_DISK_ENB_GPIO_Port, OU5_DISK_ENB_Pin, 1);
}
if (htim == &htim3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) {
HAL_GPIO_WritePin(OU5_DISK_ENB_GPIO_Port, OU5_DISK_ENB_Pin, 0);
TIM3->CNT = 0;
}
}
//***********
sConfigOC.Pulse = 3000; bu degerleri degiştirerek nezaman intterupa girecegini yani frekans ve duty i ayarlayabilirsiniz.
Yani işin mantıgı şu şekilde:
Bir tane sayacınız var,ilk degere ulastıgında birinci interrup olusuyor(duty),ikinci degere ulastıgında ikinci interrup oluşmuş oluyor.ikinci interrupa ulaştıgı deger sizin frekansınız olmuş oluyor.ikinci interrupta sayacı tekrar sıfırlayarak baştan saymasını saglayabiliyorsunuz.
Halledemezseniz arayın yardımcı olmaya çalışayım.