void LED_BIG_Init(void)
{
// Configure signal pin (PA1) as alternate function for GPTIM2_CH1
HAL_PIN_Set(PAD_PA00 + LED_BIG_PIN, GPTIM2_CH1, PIN_NOPULL, 1);
HAL_RCC_EnableModule(RCC_MOD_GPTIM2);
// ================= Timer Base Configuration =================
gpt_led_big.Instance = (GPT_TypeDef *)LED_BIG_TIM;
gpt_led_big.core = CORE_ID_HCPU;
gpt_led_big.Channel = HAL_GPT_ACTIVE_CHANNEL_CLEARED;
gpt_led_big.Init.Prescaler = LED_BIG_PSC; // PSC: 24MHz / 24 = 1MHz
gpt_led_big.Init.CounterMode = GPT_COUNTERMODE_UP;
gpt_led_big.Init.Period = LED_BIG_ARR; // ARR: 1MHz / 1000 = 1kHz
if (HAL_GPT_Base_Init(&gpt_led_big) != HAL_OK) {
rt_kprintf("[LED] GPT Base Init Failed!\n");
return;
}
GPT_ClockConfigTypeDef clock_config = {0};
clock_config.ClockSource = GPT_CLOCKSOURCE_INTERNAL;
if (HAL_GPT_ConfigClockSource(&gpt_led_big, &clock_config) != HAL_OK) {
rt_kprintf("[LED] GPT Clock Config Failed!\n");
return;
}
// ================= PWM Mode Initialization =================
if (HAL_GPT_PWM_Init(&gpt_led_big) != HAL_OK) {
rt_kprintf("[LED] GPT PWM Init Failed!\n");
return;
}
GPT_OC_InitTypeDef oc_config = {0};
oc_config.OCMode = GPT_OCMODE_PWM1;
Pulse = (ARR + 1) * LED_BIG_DUTY_CYCLE / 100
oc_config.Pulse = (uint32_t)((LED_BIG_ARR + 1) * LED_BIG_DUTY_CYCLE / 100);
oc_config.OCPolarity = GPT_OCPOLARITY_HIGH;
oc_config.OCFastMode = GPT_OCFAST_DISABLE;
if (HAL_GPT_PWM_ConfigChannel(&gpt_led_big, &oc_config, LED_BIG_TIM_CHANNEL) != HAL_OK) {
rt_kprintf("[LED] GPT Channel Config Failed!\n");
return;
}
if (HAL_GPT_PWM_Start(&gpt_led_big, LED_BIG_TIM_CHANNEL) != HAL_OK) {
rt_kprintf("[LED] GPT PWM Start Failed!\n");
return;
}
rt_kprintf("Simple PWM Driver Initialized (Freq: 1kHz, Duty: %d%%)\n", LED_BIG_DUTY_CYCLE);
}
With the same code, it worked normally with a waveform when I originally set LED_BIG_PIN to 20 (PA20). However, after changing it to 1 (PA1), I found no waveform on the oscilloscope. I’m wondering if PA1 cannot be configured for Timer 2 Channel 1? But according to the datasheet, it should be supported.