// Define the PWM pin (PA8 is connected to TIM1_CH1)
#define PWM_PIN PA8
void setup() {
// Initialize GPIO for PA8
pinMode(PWM_PIN, OUTPUT);
// Configure Timer1 for PWM on PA8
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; // Enable Timer1 clock
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Enable GPIOA clock
GPIOA->CRH &= ~GPIO_CRH_CNF8; // Clear CNF8 (PA8)
GPIOA->CRH |= GPIO_CRH_CNF8_1; // Set CNF8 as Alternate function push-pull
GPIOA->CRH |= GPIO_CRH_MODE8_1; // Set MODE8 as Output 2MHz
TIM1->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // PWM mode 1
TIM1->CCMR1 |= TIM_CCMR1_OC1PE; // Enable preload for TIM1 Channel 1
TIM1->CCER |= TIM_CCER_CC1E; // Enable TIM1 Channel 1 output
TIM1->ARR = 1000; // Set auto-reload value (PWM period)
TIM1->PSC = 72 - 1; // Set prescaler (1 MHz timer clock)
TIM1->CCR1 = 0; // Start with 0 duty cycle
TIM1->BDTR |= TIM_BDTR_MOE; // Enable Main Output
TIM1->CR1 |= TIM_CR1_CEN; // Start Timer1
}
void loop() {
// Gradually increase brightness
for (int duty = 0; duty <= 1000; duty += 10) {
TIM1->CCR1 = duty; // Set duty cycle
delay(10); // Delay to see brightness change
}
// Gradually decrease brightness
for (int duty = 1000; duty >= 0; duty -= 10) {
TIM1->CCR1 = duty; // Set duty cycle
delay(10); // Delay to see brightness change
}
}