2024-05-30 01:16 PM
Hello, I have an issue with my code where I have configured SysTick and it triggers on every clock cycle, but I dont know how to make things trigger inside the main while loop
#include "main.h"
#include "functions.h"
#include <stdbool.h>
#include <stdlib.h>
union InterruptFlag flag = { .bits_access.flag= 0,
.bits_access.direction=0,
.bits_access.debounce= 0,
.bits_access.press = 0}; // Initialize to 0
void EXTI15_10_IRQHandler(void){
flag.bits_access.flag = !flag.bits_access.flag; // Set the flag to indicate button press event
EXTI->PR |= (1<<13); // Clear PR to re-enable EXTI interrupt
};
#define MAX_DUTY 500
#define MIN_DUTY 0
#define DEBOUNCE_DELAY 500
volatile uint32_t duty_cycle;
volatile uint16_t incrementer = 1;
int main(void){
TIM2_INIT();
TIM3_INIT();
Interrupt_Init();
SysTick->CTRL = SysTick->CTRL | (1 << 0) | (1 << 1) | (1 << 2);
SysTick->LOAD = (84000 - 1); // 100 millisecond
while (1) {
//LED_PWM();
if(flag_check()==true){
incrementer=0;
}
}
}
void SysTick_Handler(void)
{
LED_PWM();
}
bool flag_check(){
return flag.bits_access.flag;
}
void LED_PWM() {
TIM2->CCR1 = duty_cycle;
incrementer=1;
if (duty_cycle >= MAX_DUTY) {
flag.bits_access.direction = false; // Change direction to decrement
} else if (duty_cycle <= MIN_DUTY) {
flag.bits_access.direction = true; // Change direction to increment
}
if (flag.bits_access.direction) {
duty_cycle += incrementer; // Increment
} else {
duty_cycle -= incrementer; // Decrement
}
}
2024-05-30 04:54 PM
If you're just trying to blink an LED at a different rate based off the System tick, then look at this tutorial
https://www.youtube.com/watch?v=o0qhmXR5LD0
You can keep the System tick at it's default 1 ms tick.