#include "stm32c0xx.h" // Ensure this is the correct header file
void timer3_init(void) {
// Enable clock for TIM3
RCC->APBENR1 |= RCC_APBENR1_TIM3EN; // TIM3 is in APBENR1 for STM32C0
// Configure TIM3
TIM3->CR1 = 0; // Disable TIM3
TIM3->PSC = 15999; // Prescaler (assuming 16 MHz clock)
TIM3->ARR = 999; // Auto-reload value for 1 ms delay
TIM3->EGR = TIM_EGR_UG; // Generate an update event
TIM3->SR &= ~TIM_SR_UIF; // Clear any previous update interrupt flag
TIM3->CR1 |= TIM_CR1_CEN; // Enable TIM3
}
void timer3_delay(uint32_t milliseconds) {
for (uint32_t i = 0; i < milliseconds; i++) {
while (!(TIM3->SR & TIM_SR_UIF)) {} // Wait for update interrupt flag
TIM3->SR &= ~TIM_SR_UIF; // Clear update interrupt flag
}
TIM3->CR1 &= ~TIM_CR1_CEN; // Disable TIM3 after delay
}
int main(void) {
// Enable clock for GPIOA
RCC->IOPENR |= RCC_IOPENR_GPIOAEN; // Enable GPIOA clock
// Set PA5 as output
GPIOA->MODER &= ~(3 << (5 * 2)); // Clear mode bits for PA5
GPIOA->MODER |= (1 << (5 * 2)); // Set PA5 as output mode (01)
while (1) {
GPIOA->ODR ^= (1 << 5); // Toggle PA5 (LED on/off)
timer3_init(); // Initialize TIM3
timer3_delay(500); // 500 ms delay
GPIOA->ODR ^= (1 << 5); // Toggle PA5 (LED off)
timer3_init(); // Reinitialize TIM3 for next delay
timer3_delay(500); // 500 ms delay
}
}
Loading
st-nucleo-c031c6
st-nucleo-c031c6
led2:A
led2:C